struct DeadWriterReceiptStore;
impl ReceiptStore for DeadWriterReceiptStore {
fn append_chio_receipt(&self, _receipt: &ChioReceipt) -> Result<(), ReceiptStoreError> {
Ok(())
}
fn append_child_receipt(
&self,
_receipt: &ChildRequestReceipt,
) -> Result<(), ReceiptStoreError> {
Ok(())
}
fn writer_serving_closed(&self) -> bool {
true
}
}
struct RejectingDeadWriterReceiptStore;
impl ReceiptStore for RejectingDeadWriterReceiptStore {
fn append_chio_receipt(&self, _receipt: &ChioReceipt) -> Result<(), ReceiptStoreError> {
Err(ReceiptStoreError::Pool(
"receipt append rejected by a serving-closed commit writer".to_string(),
))
}
fn append_child_receipt(
&self,
_receipt: &ChildRequestReceipt,
) -> Result<(), ReceiptStoreError> {
Err(ReceiptStoreError::Pool(
"child receipt append rejected by a serving-closed commit writer".to_string(),
))
}
fn writer_serving_closed(&self) -> bool {
true
}
}
struct SnapshotTrackingDeadWriterStore {
snapshot_attempted: std::sync::Arc<AtomicBool>,
fail_snapshots: std::sync::Arc<AtomicBool>,
}
impl ReceiptStore for SnapshotTrackingDeadWriterStore {
fn append_chio_receipt(&self, _receipt: &ChioReceipt) -> Result<(), ReceiptStoreError> {
Ok(())
}
fn append_child_receipt(
&self,
_receipt: &ChildRequestReceipt,
) -> Result<(), ReceiptStoreError> {
Ok(())
}
fn writer_serving_closed(&self) -> bool {
true
}
fn record_capability_snapshot(
&self,
_token: &CapabilityToken,
_parent_capability_id: Option<&str>,
) -> Result<(), ReceiptStoreError> {
if self.fail_snapshots.load(Ordering::SeqCst) {
self.snapshot_attempted.store(true, Ordering::SeqCst);
return Err(ReceiptStoreError::Pool(
"capability lineage write rejected by a dead receipt writer".to_string(),
));
}
Ok(())
}
}