Skip to main content

linkrs_storage/engine/sync_wrapper/
transaction.rs

1use super::SyncWrapper;
2use crate::engine::graph_storage::AutoCommitBatchWindow;
3use crate::StorageClient;
4use linkrs_core::StorageResult;
5use std::sync::Arc;
6
7impl<S: StorageClient + crate::AutoCommitBatchOps> crate::AutoCommitBatchOps for SyncWrapper<S> {
8    fn begin_auto_commit_batch(&self) -> StorageResult<Arc<AutoCommitBatchWindow>> {
9        self.inner.begin_auto_commit_batch()
10    }
11
12    fn bind_auto_commit_statement(
13        &self,
14        window: &Arc<AutoCommitBatchWindow>,
15    ) -> StorageResult<Self> {
16        let inner = self.inner.bind_auto_commit_statement(window)?;
17        Ok(SyncWrapper {
18            inner,
19            sync_manager: self.sync_manager.clone(),
20            enabled: self.enabled,
21            auto_commit_owner: self.auto_commit_owner,
22        })
23    }
24
25    fn finalize_auto_commit_batch(&self, window: &AutoCommitBatchWindow) -> StorageResult<()> {
26        self.inner.finalize_auto_commit_batch(window)
27    }
28}
29
30impl<S: StorageClient + crate::AutoCommitGroupOps> crate::AutoCommitGroupOps for SyncWrapper<S> {
31    fn begin_auto_commit_group(&self) -> StorageResult<Arc<AutoCommitBatchWindow>> {
32        self.inner.begin_auto_commit_group()
33    }
34
35    fn finalize_auto_commit_group(&self, window: &AutoCommitBatchWindow) -> StorageResult<()> {
36        self.inner.finalize_auto_commit_group(window)
37    }
38}
39
40impl<S: StorageClient + linkrs_transaction::UndoTarget + 'static>
41    linkrs_transaction::TransactionCommitSink for SyncWrapper<S>
42{
43    fn commit_transaction(
44        &self,
45        transaction_id: linkrs_core::types::TransactionId,
46    ) -> Result<linkrs_core::types::CommitLsn, String> {
47        self.commit_transaction_fact(transaction_id)
48            .map_err(|error| error.to_string())
49    }
50
51    fn commit_transaction_with_descriptor(
52        &self,
53        descriptor: &linkrs_transaction::TransactionCommitDescriptor,
54    ) -> Result<linkrs_core::types::CommitLsn, String> {
55        self.commit_transaction_fact_with_durability(
56            descriptor.transaction_id,
57            descriptor.durability,
58        )
59        .map_err(|error| error.to_string())
60    }
61
62    fn finalize_commit(
63        &self,
64        descriptor: &linkrs_transaction::TransactionCommitDescriptor,
65        commit_lsn: linkrs_core::types::CommitLsn,
66    ) -> Result<(), String> {
67        self.finalize_commit_fact(descriptor.transaction_id, commit_lsn)
68            .map_err(|error| error.to_string())
69    }
70
71    fn abort_transaction(
72        &self,
73        transaction_id: linkrs_core::types::TransactionId,
74    ) -> Result<(), String> {
75        self.abort_transaction_fact(transaction_id)
76            .map_err(|error| error.to_string())
77    }
78
79    fn abort_transaction_with_descriptor(
80        &self,
81        descriptor: &linkrs_transaction::TransactionAbortDescriptor,
82    ) -> Result<(), String> {
83        descriptor
84            .context
85            .execute_undo_logs(&self.inner)
86            .map_err(|error| error.to_string())?;
87        descriptor
88            .context
89            .clear_undo_logs()
90            .map_err(|error| error.to_string())?;
91        self.abort_transaction_fact(descriptor.transaction_id)
92            .map_err(|error| error.to_string())
93    }
94
95    fn auto_checkpoint_if_needed(&self) -> Result<(), String> {
96        use crate::StoragePersistenceOps;
97        let _ = <Self as StoragePersistenceOps>::auto_checkpoint_if_needed(self)
98            .map_err(|error| error.to_string())?;
99        Ok(())
100    }
101
102    fn recover_unfinalized_commits(&self) -> Result<usize, String> {
103        // Page-level redo belongs to storage WAL replay on open; fact-table
104        // post-commit finalization (`finalize_commit_fact`) is idempotent, so
105        // same-process re-drive happens through the manager's pending queue
106        // (`recover_pending_finalization`). Nothing extra is durable here yet,
107        // report zero rather than silently inheriting the default no-op.
108        Ok(0)
109    }
110}