use std::sync::{Arc, LazyLock};
use feldera_types::{
checkpoint::{CheckpointMetadata, CheckpointSyncMetrics},
config::SyncConfig,
};
use crate::StorageBackend;
pub trait CheckpointSynchronizer: Sync {
fn push(
&self,
checkpoint: uuid::Uuid,
storage: Arc<dyn StorageBackend>,
remote_config: SyncConfig,
) -> anyhow::Result<Option<CheckpointSyncMetrics>>;
fn pull(
&self,
storage: Arc<dyn StorageBackend>,
remote_config: SyncConfig,
) -> anyhow::Result<(CheckpointMetadata, Option<CheckpointSyncMetrics>)>;
}
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?")
});