pub trait Storage:
Send
+ Sync
+ 'static {
type Blob: Blob;
// Required methods
fn open_versioned(
&self,
partition: &str,
name: &[u8],
versions: RangeInclusive<u16>,
) -> impl Future<Output = Result<(Self::Blob, u64, u16), Error>> + Send;
fn remove(
&self,
partition: &str,
name: Option<&[u8]>,
) -> impl Future<Output = Result<(), Error>> + Send;
fn scan(
&self,
partition: &str,
) -> impl Future<Output = Result<Vec<Vec<u8>>, Error>> + Send;
// Provided method
fn open(
&self,
partition: &str,
name: &[u8],
) -> impl Future<Output = Result<(Self::Blob, u64), Error>> + Send { ... }
}Expand description
Interface to interact with storage.
To support storage implementations that enable concurrent reads and writes, blobs are responsible for maintaining synchronization.
Storage can be backed by a local filesystem, cloud storage, etc.
§Durability
Runtimes must ensure that any data readable when user code starts
executing is crash-durable. Storage structures may rely on this during
recovery: data read at initialization can be assumed to survive a
subsequent crash without an explicit Blob::sync.
§Partition Names
Partition names must be non-empty and contain only ASCII alphanumeric
characters, dashes (-), or underscores (_). Names containing other
characters (e.g., /, ., spaces) will return an error.
Required Associated Types§
Required Methods§
Sourcefn open_versioned(
&self,
partition: &str,
name: &[u8],
versions: RangeInclusive<u16>,
) -> impl Future<Output = Result<(Self::Blob, u64, u16), Error>> + Send
fn open_versioned( &self, partition: &str, name: &[u8], versions: RangeInclusive<u16>, ) -> impl Future<Output = Result<(Self::Blob, u64, u16), Error>> + Send
Open an existing blob in a given partition or create a new one, returning the blob and its length.
Multiple instances of the same blob can be opened concurrently, however, writing to the same blob concurrently may lead to undefined behavior.
An Ok result indicates the blob is durably created (or already exists).
§Versions
Blobs are versioned. If the blob’s version is not in versions, returns
Error::BlobVersionMismatch.
§Returns
A tuple of (blob, logical_size, blob_version).
Sourcefn remove(
&self,
partition: &str,
name: Option<&[u8]>,
) -> impl Future<Output = Result<(), Error>> + Send
fn remove( &self, partition: &str, name: Option<&[u8]>, ) -> impl Future<Output = Result<(), Error>> + Send
Remove a blob from a given partition.
If no name is provided, the entire partition is removed.
An Ok result indicates the blob is durably removed.
§Read-after-remove
Removal unlinks the blob’s name but does not invalidate previously opened handles: they remain fully readable until dropped, whether the blob was removed by name or by removing its entire partition. This includes bytes written but never synced. Physical resources are reclaimed once the last handle is dropped.
Re-opening a removed blob’s name creates a new, independent blob; handles opened before the removal continue to observe the removed blob’s contents.
Mutating a removed blob (e.g. via Blob::write_at, Blob::resize, or
Blob::sync) is unspecified: implementations may succeed or return an error.
Provided Methods§
Dyn Compatibility§
This trait is not dyn compatible.
In older versions of Rust, dyn compatibility was called "object safety".