use openraft_macros::add_async_trait;
use crate::OptionalSend;
use crate::RaftTypeConfig;
use crate::StorageError;
use crate::errors::StorageIOResult;
use crate::storage::IOFlushed;
use crate::storage::RaftLogStorage;
use crate::type_config::TypeConfigExt;
#[add_async_trait]
pub trait RaftLogStorageExt<C>: RaftLogStorage<C>
where C: RaftTypeConfig
{
async fn blocking_append<I>(&mut self, entries: I) -> Result<(), StorageError<C>>
where
I: IntoIterator<Item = C::Entry> + OptionalSend,
I::IntoIter: OptionalSend,
{
let entries = entries.into_iter().collect::<Vec<_>>();
let (tx, rx) = C::oneshot();
let callback = IOFlushed::<C>::signal(tx);
self.append(entries, callback).await.sto_write_logs()?;
let result = rx.await.map_err(|_e| StorageError::write_logs(C::err_from_string("callback channel closed")))?;
result.map_err(|e| StorageError::write_logs(C::err_from_error(&e)))
}
}
impl<C, T> RaftLogStorageExt<C> for T
where
T: RaftLogStorage<C>,
C: RaftTypeConfig,
{
}