pub mod aligned;
#[cfg(any(test, all(target_os = "linux", feature = "io-uring")))]
mod buffer_pool;
pub mod file;
pub mod memory;
pub use aligned::AlignedBlobBuf;
#[cfg(all(target_os = "linux", feature = "io-uring"))]
pub(crate) use buffer_pool::BlobBufPool;
pub use file::FileBlobStore;
pub use memory::MemoryBlobStore;
use crate::api::errors::Result;
use crate::layout::BlobGuid;
pub trait BlobStore: Send + Sync {
fn alloc_blob_buf_zeroed(&self) -> AlignedBlobBuf {
AlignedBlobBuf::zeroed()
}
fn alloc_blob_buf_uninit(&self) -> AlignedBlobBuf {
AlignedBlobBuf::uninit()
}
fn read_blob(&self, guid: BlobGuid, dst: &mut AlignedBlobBuf) -> Result<()>;
fn write_blob(&self, guid: BlobGuid, src: &AlignedBlobBuf) -> Result<()>;
fn write_blobs(&self, writes: &[(BlobGuid, &AlignedBlobBuf)]) -> Result<()> {
for (guid, src) in writes {
self.write_blob(*guid, src)?;
}
Ok(())
}
fn write_blobs_with_data_sync(&self, writes: &[(BlobGuid, &AlignedBlobBuf)]) -> Result<()> {
self.write_blobs(writes)
}
fn delete_blob(&self, guid: BlobGuid) -> Result<()>;
fn list_blobs(&self) -> Result<Vec<BlobGuid>>;
fn flush(&self) -> Result<()>;
fn needs_flush(&self) -> bool {
true
}
fn has_blob(&self, guid: BlobGuid) -> Result<bool> {
self.list_blobs().map(|v| v.contains(&guid))
}
}