use std::num::NonZeroU64; use serde::{Deserialize, Serialize}; use serde_with::{serde_as, DisplayFromStr}; use utils::{ lsn::Lsn, zid::{NodeId, ZTenantId, ZTimelineId}, }; // These enums are used in the API response fields. use crate::repository::LocalTimelineState; use crate::tenant_mgr::TenantState; #[serde_as] #[derive(Serialize, Deserialize)] pub struct TimelineCreateRequest { #[serde(default)] #[serde_as(as = "Option")] pub new_timeline_id: Option, #[serde(default)] #[serde_as(as = "Option")] pub ancestor_timeline_id: Option, #[serde(default)] #[serde_as(as = "Option")] pub ancestor_start_lsn: Option, } #[serde_as] #[derive(Serialize, Deserialize, Default)] pub struct TenantCreateRequest { #[serde(default)] #[serde_as(as = "Option")] pub new_tenant_id: Option, pub checkpoint_distance: Option, pub checkpoint_timeout: Option, pub compaction_target_size: Option, pub compaction_period: Option, pub compaction_threshold: Option, pub gc_horizon: Option, pub gc_period: Option, pub image_creation_threshold: Option, pub pitr_interval: Option, pub walreceiver_connect_timeout: Option, pub lagging_wal_timeout: Option, pub max_lsn_wal_lag: Option, } #[serde_as] #[derive(Serialize, Deserialize)] #[serde(transparent)] pub struct TenantCreateResponse(#[serde_as(as = "DisplayFromStr")] pub ZTenantId); #[derive(Serialize)] pub struct StatusResponse { pub id: NodeId, } impl TenantCreateRequest { pub fn new(new_tenant_id: Option) -> TenantCreateRequest { TenantCreateRequest { new_tenant_id, ..Default::default() } } } #[serde_as] #[derive(Serialize, Deserialize)] pub struct TenantConfigRequest { pub tenant_id: ZTenantId, #[serde(default)] #[serde_as(as = "Option")] pub checkpoint_distance: Option, pub checkpoint_timeout: Option, pub compaction_target_size: Option, pub compaction_period: Option, pub compaction_threshold: Option, pub gc_horizon: Option, pub gc_period: Option, pub image_creation_threshold: Option, pub pitr_interval: Option, pub walreceiver_connect_timeout: Option, pub lagging_wal_timeout: Option, pub max_lsn_wal_lag: Option, } impl TenantConfigRequest { pub fn new(tenant_id: ZTenantId) -> TenantConfigRequest { TenantConfigRequest { tenant_id, checkpoint_distance: None, checkpoint_timeout: None, compaction_target_size: None, compaction_period: None, compaction_threshold: None, gc_horizon: None, gc_period: None, image_creation_threshold: None, pitr_interval: None, walreceiver_connect_timeout: None, lagging_wal_timeout: None, max_lsn_wal_lag: None, } } } #[serde_as] #[derive(Serialize, Deserialize, Clone)] pub struct TenantInfo { #[serde_as(as = "DisplayFromStr")] pub id: ZTenantId, pub state: Option, pub current_physical_size: Option, // physical size is only included in `tenant_status` endpoint pub has_in_progress_downloads: Option, } #[serde_as] #[derive(Debug, Serialize, Deserialize, Clone)] pub struct LocalTimelineInfo { #[serde_as(as = "Option")] pub ancestor_timeline_id: Option, #[serde_as(as = "Option")] pub ancestor_lsn: Option, #[serde_as(as = "DisplayFromStr")] pub last_record_lsn: Lsn, #[serde_as(as = "Option")] pub prev_record_lsn: Option, #[serde_as(as = "DisplayFromStr")] pub latest_gc_cutoff_lsn: Lsn, #[serde_as(as = "DisplayFromStr")] pub disk_consistent_lsn: Lsn, pub current_logical_size: Option, // is None when timeline is Unloaded pub current_physical_size: Option, // is None when timeline is Unloaded pub current_logical_size_non_incremental: Option, pub current_physical_size_non_incremental: Option, pub timeline_state: LocalTimelineState, pub wal_source_connstr: Option, #[serde_as(as = "Option")] pub last_received_msg_lsn: Option, /// the timestamp (in microseconds) of the last received message pub last_received_msg_ts: Option, } #[serde_as] #[derive(Debug, Serialize, Deserialize, Clone)] pub struct RemoteTimelineInfo { #[serde_as(as = "DisplayFromStr")] pub remote_consistent_lsn: Lsn, pub awaits_download: bool, } /// /// This represents the output of the "timeline_detail" API call. /// #[serde_as] #[derive(Debug, Serialize, Deserialize, Clone)] pub struct TimelineInfo { #[serde_as(as = "DisplayFromStr")] pub tenant_id: ZTenantId, #[serde_as(as = "DisplayFromStr")] pub timeline_id: ZTimelineId, pub local: Option, pub remote: Option, }