use std::sync::{Arc, LazyLock};
use feldera_types::{
checkpoint::{CheckpointMetadata, CheckpointSyncMetrics, HostInfo, RemoteCheckpoint},
config::SyncConfig,
};
use crate::StorageBackend;
pub trait CheckpointSynchronizer: Sync {
fn push(
&self,
checkpoint: uuid::Uuid,
storage: Arc<dyn StorageBackend>,
remote_config: SyncConfig,
host_info: Option<HostInfo>,
) -> anyhow::Result<Option<CheckpointSyncMetrics>>;
fn pull(
&self,
storage: Arc<dyn StorageBackend>,
remote_config: SyncConfig,
host_info: Option<HostInfo>,
standby: bool,
) -> anyhow::Result<(CheckpointMetadata, Option<CheckpointSyncMetrics>)>;
fn list_remote(&self, remote_config: SyncConfig) -> anyhow::Result<Vec<RemoteCheckpoint>>;
}
inventory::collect!(&'static dyn CheckpointSynchronizer);
pub static SYNCHRONIZER: LazyLock<&'static dyn CheckpointSynchronizer> = LazyLock::new(|| {
*inventory::iter::<&dyn CheckpointSynchronizer>
.into_iter()
.next()
.expect("no checkpoint synchronizer found; are enterprise features enabled?")
});