pub struct HopDataPool { /* private fields */ }Expand description
HOP data pool with disk-backed blob storage and in-memory metadata index.
Implementations§
Source§impl HopDataPool
impl HopDataPool
Sourcepub fn new(
max_size: u64,
max_user_size: u64,
retention_secs: u64,
data_dir: PathBuf,
rate_limit_cfg: RateLimitConfig,
) -> Result<Self, HopError>
pub fn new( max_size: u64, max_user_size: u64, retention_secs: u64, data_dir: PathBuf, rate_limit_cfg: RateLimitConfig, ) -> Result<Self, HopError>
Create a new disk-backed data pool.
Creates shard directories under data_dir and rebuilds the in-memory index
from existing .meta files on disk (recovery after restart).
Sourcepub fn insert(
&self,
data: Vec<u8>,
recipients: RecipientVec,
sender_id: SenderId,
signer: MultiSigner,
signature: MultiSignature,
submit_timestamp: u64,
) -> Result<HopHash, HopError>
pub fn insert( &self, data: Vec<u8>, recipients: RecipientVec, sender_id: SenderId, signer: MultiSigner, signature: MultiSignature, submit_timestamp: u64, ) -> Result<HopHash, HopError>
Insert data into the pool.
Returns the hash of the data.
Sourcepub fn get_with_auth(
&self,
hash: &HopHash,
) -> Option<(Vec<u8>, MultiSigner, MultiSignature, u64)>
pub fn get_with_auth( &self, hash: &HopHash, ) -> Option<(Vec<u8>, MultiSigner, MultiSignature, u64)>
Get data alongside the submitter’s MultiSigner, hop_submit signature,
and submit timestamp.
Used by the promoter so the unsigned promotion extrinsic can carry the user’s submit-time signature for runtime-side verification.
Sourcepub fn claim(
&self,
hash: &HopHash,
signature: &[u8],
) -> Result<Vec<u8>, HopError>
pub fn claim( &self, hash: &HopHash, signature: &[u8], ) -> Result<Vec<u8>, HopError>
Claim data from the pool (read-only). Verifies the signature against recipient public keys. Returns the data if the signature matches a recipient.
This does NOT mark the recipient as claimed — call ack after receiving the data
to confirm receipt.
Returns AlreadyClaimed if the recipient has already acked (data may be deleted).
Sourcepub fn ack(&self, hash: &HopHash, signature: &[u8]) -> Result<(), HopError>
pub fn ack(&self, hash: &HopHash, signature: &[u8]) -> Result<(), HopError>
Acknowledge receipt of claimed data. Marks the recipient as claimed and triggers cleanup when all recipients have acked.
Idempotent: acking a recipient that already acked returns Ok(()).
Sourcepub fn status(&self) -> PoolStatus
pub fn status(&self) -> PoolStatus
Get pool status.
Sourcepub fn cleanup_expired(&self) -> u64
pub fn cleanup_expired(&self) -> u64
Remove expired entries and release their user quotas. Returns the total bytes freed.
Processes entries in bounded batches to keep the index write lock from
being held across the full HashMap on huge pools. After all batches the
per-sender user_usage map is GC’d in a single pass.
Sourcepub fn get_promotable(
&self,
current_block: HopBlockNumber,
buffer_secs: u64,
limit: usize,
) -> Vec<HopHash> ⓘ
pub fn get_promotable( &self, current_block: HopBlockNumber, buffer_secs: u64, limit: usize, ) -> Vec<HopHash> ⓘ
Return hashes of entries within buffer_secs of expiry that have not yet been promoted.
Returns up to limit hashes. Use Self::get to read blob data when needed.
The maintenance task runs periodically, so remaining entries are picked up next cycle.
Sourcepub fn mark_promoted(&self, hash: &HopHash)
pub fn mark_promoted(&self, hash: &HopHash)
Mark an entry as promoted to permanent on-chain storage. Persists the updated metadata to disk.
Sourcepub fn record_promotion_attempt(
&self,
hash: &HopHash,
current_block: HopBlockNumber,
check_interval_blocks: u32,
)
pub fn record_promotion_attempt( &self, hash: &HopHash, current_block: HopBlockNumber, check_interval_blocks: u32, )
Record a promotion attempt: bumps the per-entry attempt counter and
schedules the next eligible block via exponential back-off. The
maintenance task will skip the entry until then. Once
MAX_PROMOTION_ATTEMPTS is reached the entry is left to expire.
Called on both an Err from submit_local (the tx pool rejected
us) and an Ok followed by a runtime check that the data is not yet
on-chain (the tx was accepted into the pool but never included). The
backoff schedule is identical for both cases.
Auto Trait Implementations§
impl !Freeze for HopDataPool
impl !RefUnwindSafe for HopDataPool
impl Send for HopDataPool
impl Sync for HopDataPool
impl Unpin for HopDataPool
impl !UnwindSafe for HopDataPool
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CheckedConversion for T
impl<T> CheckedConversion for T
§impl<T> Conv for T
impl<T> Conv for T
§impl<T> FmtForward for T
impl<T> FmtForward for T
§fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
self to use its Binary implementation when Debug-formatted.§fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
self to use its Display implementation when
Debug-formatted.§fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
self to use its LowerExp implementation when
Debug-formatted.§fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
self to use its LowerHex implementation when
Debug-formatted.§fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
self to use its Octal implementation when Debug-formatted.§fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
self to use its Pointer implementation when
Debug-formatted.§fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
self to use its UpperExp implementation when
Debug-formatted.§fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
self to use its UpperHex implementation when
Debug-formatted.§fn fmt_list(self) -> FmtList<Self>where
&'a Self: for<'a> IntoIterator,
fn fmt_list(self) -> FmtList<Self>where
&'a Self: for<'a> IntoIterator,
§impl<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more§impl<Src, Dest> IntoTuple<Dest> for Srcwhere
Dest: FromTuple<Src>,
impl<Src, Dest> IntoTuple<Dest> for Srcwhere
Dest: FromTuple<Src>,
fn into_tuple(self) -> Dest
Source§impl<T, Outer> IsWrappedBy<Outer> for T
impl<T, Outer> IsWrappedBy<Outer> for T
§impl<T> Pipe for Twhere
T: ?Sized,
impl<T> Pipe for Twhere
T: ?Sized,
§fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
§fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
self and passes that borrow into the pipe function. Read more§fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
self and passes that borrow into the pipe function. Read more§fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
§fn pipe_borrow_mut<'a, B, R>(
&'a mut self,
func: impl FnOnce(&'a mut B) -> R,
) -> R
fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
§fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
self, then passes self.as_ref() into the pipe function.§fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
self, then passes self.as_mut() into the pipe
function.§fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
self, then passes self.deref() into the pipe function.§impl<T> Pointable for T
impl<T> Pointable for T
Source§impl<T> SaturatedConversion for T
impl<T> SaturatedConversion for T
Source§fn saturated_from<T>(t: T) -> Selfwhere
Self: UniqueSaturatedFrom<T>,
fn saturated_from<T>(t: T) -> Selfwhere
Self: UniqueSaturatedFrom<T>,
Source§fn saturated_into<T>(self) -> Twhere
Self: UniqueSaturatedInto<T>,
fn saturated_into<T>(self) -> Twhere
Self: UniqueSaturatedInto<T>,
T. Read more§impl<T> Tap for T
impl<T> Tap for T
§fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
Borrow<B> of a value. Read more§fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
BorrowMut<B> of a value. Read more§fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
AsRef<R> view of a value. Read more§fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
AsMut<R> view of a value. Read more§fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
Deref::Target of a value. Read more§fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
Deref::Target of a value. Read more§fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
.tap() only in debug builds, and is erased in release builds.§fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
.tap_mut() only in debug builds, and is erased in release
builds.§fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
.tap_borrow() only in debug builds, and is erased in release
builds.§fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
.tap_borrow_mut() only in debug builds, and is erased in release
builds.§fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
.tap_ref() only in debug builds, and is erased in release
builds.§fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
.tap_ref_mut() only in debug builds, and is erased in release
builds.§fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
.tap_deref() only in debug builds, and is erased in release
builds.§impl<T> TryConv for T
impl<T> TryConv for T
Source§impl<S, T> UncheckedInto<T> for Swhere
T: UncheckedFrom<S>,
impl<S, T> UncheckedInto<T> for Swhere
T: UncheckedFrom<S>,
Source§fn unchecked_into(self) -> T
fn unchecked_into(self) -> T
unchecked_from.Source§impl<T, S> UniqueSaturatedInto<T> for S
impl<T, S> UniqueSaturatedInto<T> for S
Source§fn unique_saturated_into(self) -> T
fn unique_saturated_into(self) -> T
T.