v0.3.13-pre.009
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
// file: crates/ksp-worker-raw-transaction-ingest-lib/src/persistence.rs
|
||||
// version: 3
|
||||
// version: 4
|
||||
|
||||
/// Canonical entity disposition produced by one Worker Store persistence attempt.
|
||||
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
|
||||
@@ -92,11 +92,23 @@ struct RawTransactionIngestPersistenceKey {
|
||||
signature: ksp_store_lib::RawTransactionSignature,
|
||||
}
|
||||
|
||||
#[derive(Clone, Eq, PartialEq)]
|
||||
struct RawTransactionIngestCanonicalState {
|
||||
block_time: std::option::Option<ksp_store_lib::RawTimestamp>,
|
||||
content_hash: ksp_store_lib::RawContentHash,
|
||||
format_id: ksp_store_lib::RawFormatId,
|
||||
format_version: u32,
|
||||
slot: u64,
|
||||
}
|
||||
|
||||
/// Private bounded run-local cache serializing repeated canonical identities before Store writes.
|
||||
pub(crate) struct RawTransactionIngestPersistenceConvergence {
|
||||
max_entries: usize,
|
||||
entries: std::sync::Mutex<
|
||||
std::collections::BTreeMap<RawTransactionIngestPersistenceKey, std::sync::Arc<tokio::sync::Mutex<std::option::Option<ksp_store_lib::RawContentHash>>>>,
|
||||
std::collections::BTreeMap<
|
||||
RawTransactionIngestPersistenceKey,
|
||||
std::sync::Arc<tokio::sync::Mutex<std::option::Option<RawTransactionIngestCanonicalState>>>,
|
||||
>,
|
||||
>,
|
||||
}
|
||||
|
||||
@@ -110,7 +122,7 @@ impl crate::RawTransactionIngestPersistenceConvergence {
|
||||
fn entry(
|
||||
&self,
|
||||
key: RawTransactionIngestPersistenceKey,
|
||||
) -> std::option::Option<std::sync::Arc<tokio::sync::Mutex<std::option::Option<ksp_store_lib::RawContentHash>>>> {
|
||||
) -> std::option::Option<std::sync::Arc<tokio::sync::Mutex<std::option::Option<RawTransactionIngestCanonicalState>>>> {
|
||||
let mut entries = match self.entries.lock() {
|
||||
std::result::Result::Ok(value) => value,
|
||||
std::result::Result::Err(poisoned) => poisoned.into_inner(),
|
||||
@@ -177,16 +189,16 @@ where
|
||||
if acquisition.observation().transaction() != &reference {
|
||||
return std::result::Result::Err(crate::runtime_error("persistence.acquisition_reference_mismatch"));
|
||||
}
|
||||
let content_hash = acquisition.transaction().payload().content_hash();
|
||||
let canonical_state = canonical_state(acquisition.transaction());
|
||||
let key = RawTransactionIngestPersistenceKey { network: reference.network().clone(), signature: reference.signature() };
|
||||
let entry = convergence.entry(key);
|
||||
let entry = match entry {
|
||||
std::option::Option::Some(value) => value,
|
||||
std::option::Option::None => return crate::persist_raw_transaction_ingest_acquisition(port, acquisition).await,
|
||||
};
|
||||
let mut known_hash = entry.lock().await;
|
||||
if let std::option::Option::Some(known_hash_value) = *known_hash {
|
||||
if known_hash_value != content_hash {
|
||||
let mut known_state = entry.lock().await;
|
||||
if let std::option::Option::Some(known_state_value) = known_state.as_ref() {
|
||||
if known_state_value != &canonical_state {
|
||||
return std::result::Result::Err(crate::content_conflict_error());
|
||||
}
|
||||
let (_transaction, observation) = acquisition.into_parts();
|
||||
@@ -202,11 +214,21 @@ where
|
||||
std::result::Result::Err(error) => return std::result::Result::Err(error),
|
||||
};
|
||||
if outcome.entity() != crate::RawTransactionIngestEntityPersistence::SkippedPurged {
|
||||
*known_hash = std::option::Option::Some(content_hash);
|
||||
*known_state = std::option::Option::Some(canonical_state);
|
||||
}
|
||||
return std::result::Result::Ok(outcome);
|
||||
}
|
||||
|
||||
fn canonical_state(transaction: &ksp_store_lib::RawTransaction) -> RawTransactionIngestCanonicalState {
|
||||
return RawTransactionIngestCanonicalState {
|
||||
block_time: transaction.block_time(),
|
||||
content_hash: transaction.payload().content_hash(),
|
||||
format_id: transaction.payload().format_id().clone(),
|
||||
format_version: transaction.payload().format_version(),
|
||||
slot: transaction.slot(),
|
||||
};
|
||||
}
|
||||
|
||||
fn map_store_error(error: ksp_core_lib::Error) -> ksp_core_lib::Result<crate::RawTransactionIngestPersistenceOutcome> {
|
||||
if error.code() == ksp_store_lib::ERROR_CODE_RAW_CONFLICT {
|
||||
return std::result::Result::Err(crate::content_conflict_error());
|
||||
|
||||
Reference in New Issue
Block a user