use std::sync::atomic::Ordering;
use std::sync::Arc;
use std::time::Duration;
use super::{AsyncWalError, Lsn, SegmentSyncManager};
pub struct SyncHandle {
target_lsn: Lsn,
sync_manager: Arc<SegmentSyncManager>,
}
impl SyncHandle {
pub(super) fn new(target_lsn: Lsn, sync_manager: Arc<SegmentSyncManager>) -> Self {
Self {
target_lsn,
sync_manager,
}
}
pub(super) fn already_synced(target_lsn: Lsn, sync_manager: Arc<SegmentSyncManager>) -> Self {
Self {
target_lsn,
sync_manager,
}
}
pub fn target_lsn(&self) -> Lsn {
self.target_lsn
}
pub fn is_synced(&self) -> bool {
self.sync_manager.global_synced_lsn.load(Ordering::Acquire) >= self.target_lsn
}
pub fn wait(&self) -> Result<(), AsyncWalError> {
self.sync_manager.wait_for_lsn(self.target_lsn)
}
pub fn wait_timeout(&self, timeout: Duration) -> Result<bool, AsyncWalError> {
self.sync_manager
.wait_for_lsn_timeout(self.target_lsn, timeout)
}
}
impl std::fmt::Debug for SyncHandle {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("SyncHandle")
.field("target_lsn", &self.target_lsn)
.field("is_synced", &self.is_synced())
.finish()
}
}