deduplication/src/interface.rs (9 lines of code) (raw):
use std::result::Result;
use async_trait::async_trait;
use mdb_shard::file_structs::FileDataSequenceEntry;
use merklehash::MerkleHash;
use progress_tracking::upload_tracking::FileXorbDependency;
use crate::raw_xorb_data::RawXorbData;
/// The interface needed for the deduplication routines to run. To use the deduplication code,
/// define a struct that implements these methods. This struct must be given by value to the FileDeduper
/// struct on creation.
///
/// The two primary methods are chunk_hash_dedup_query, which determines whether and how a chunk can be deduped,
/// and register_new_xorb, which is called intermittently when a new block of data is available for upload.
///
/// The global dedup query functions are optional but needed if global dedup is to be enabled.
#[cfg_attr(not(target_family = "wasm"), async_trait)]
#[cfg_attr(target_family = "wasm", async_trait(?Send))]
pub trait DeduplicationDataInterface: Send + Sync + 'static {
/// The error type used for the interface
type ErrorType;
/// Query for possible shards that
async fn chunk_hash_dedup_query(
&self,
query_hashes: &[MerkleHash],
) -> std::result::Result<Option<(usize, FileDataSequenceEntry, bool)>, Self::ErrorType>;
/// Registers a new query for more information about the
/// global deduplication. This is expected to run in the background. Simply return Ok(()) to
/// disable global dedup queries.
async fn register_global_dedup_query(&mut self, _chunk_hash: MerkleHash) -> Result<(), Self::ErrorType>;
/// Waits for all the current queries to complete, then returns true if there is
/// new deduplication information available.
async fn complete_global_dedup_queries(&mut self) -> Result<bool, Self::ErrorType>;
/// Registers a Xorb of new data that has no deduplication references.
async fn register_new_xorb(&mut self, xorb: RawXorbData) -> Result<(), Self::ErrorType>;
/// Register a set of xorb dependencies; this is called periodically during the dedup
/// process with a list of (xorb hash, n_bytes). As the final bit may get
/// returned as a partial xorb without a hash yet, it is not gauranteed that the
/// sum of the n_bytes across all the dependencies will equal the size of the file.
async fn register_xorb_dependencies(&mut self, dependencies: &[FileXorbDependency]);
}