openraft/storage/
log_store_ext.rs

1use std::fmt::Debug;
2use std::ops::RangeBounds;
3
4use openraft_macros::add_async_trait;
5
6use crate::defensive::check_range_matches_entries;
7use crate::LogId;
8use crate::OptionalSend;
9use crate::OptionalSync;
10use crate::RaftLogId;
11use crate::RaftLogReader;
12use crate::RaftTypeConfig;
13use crate::StorageError;
14
15#[add_async_trait]
16pub trait RaftLogReaderExt<C>: RaftLogReader<C>
17where C: RaftTypeConfig
18{
19    /// Try to get an log entry.
20    ///
21    /// It does not return an error if the log entry at `log_index` is not found.
22    async fn try_get_log_entry(&mut self, log_index: u64) -> Result<Option<C::Entry>, StorageError<C::NodeId>> {
23        let mut res = self.try_get_log_entries(log_index..(log_index + 1)).await?;
24        Ok(res.pop())
25    }
26
27    /// Get a series of log entries from storage.
28    ///
29    /// Similar to `try_get_log_entries` except an error will be returned if there is an entry not
30    /// found in the specified range.
31    async fn get_log_entries<RB: RangeBounds<u64> + Clone + Debug + OptionalSend + OptionalSync>(
32        &mut self,
33        range: RB,
34    ) -> Result<Vec<C::Entry>, StorageError<C::NodeId>> {
35        let res = self.try_get_log_entries(range.clone()).await?;
36
37        check_range_matches_entries::<C, _>(range, &res)?;
38
39        Ok(res)
40    }
41
42    /// Get the log id of the entry at `index`.
43    async fn get_log_id(&mut self, log_index: u64) -> Result<LogId<C::NodeId>, StorageError<C::NodeId>> {
44        let entries = self.get_log_entries(log_index..=log_index).await?;
45
46        Ok(entries[0].get_log_id().clone())
47    }
48}
49
50impl<C, LR> RaftLogReaderExt<C> for LR
51where
52    C: RaftTypeConfig,
53    LR: RaftLogReader<C>,
54{
55}