use std::sync::Arc;
use crate::api::errors::Result;
use crate::layout::{frame_created_epoch, BlobGuid};
use crate::store::{BlobWriteGuard, BufferManager, CachedBlob};
use super::fresh_blob_guid;
use super::writers::repoint_blob_node;
pub(super) fn child_is_snapshot_shared(bm: &BufferManager, child: &CachedBlob) -> bool {
let barrier = bm.fork_barrier();
barrier != 0 && {
let probe = child.read();
frame_created_epoch(probe.as_slice()) <= barrier
}
}
pub(super) fn fork_child_if_shared(
bm: &BufferManager,
parent: &mut BlobWriteGuard<'_>,
child_guid: BlobGuid,
child_bytes: &[u8],
parent_off: u32,
seq: u64,
) -> Result<Option<(BlobGuid, Arc<CachedBlob>)>> {
let barrier = bm.fork_barrier();
let child_epoch = frame_created_epoch(child_bytes);
if barrier == 0 || child_epoch > barrier {
return Ok(None);
}
let fork_guid = fresh_blob_guid();
let fork_pin = bm.fork_frame(child_bytes, fork_guid, seq)?;
{
let mut frame = parent.frame();
repoint_blob_node(&mut frame, parent_off, fork_guid)?;
}
bm.record_orphan(child_guid, child_epoch);
Ok(Some((fork_guid, fork_pin)))
}