Populate memo in blockstore signatures-for-address (#19515)
* Add TransactionMemos column family * Traitify extract_memos * Write TransactionMemos in TransactionStatusService * Populate memos from column * Dedupe and add unit test
This commit is contained in:
@ -140,6 +140,7 @@ pub struct Blockstore {
|
||||
code_shred_cf: LedgerColumn<cf::ShredCode>,
|
||||
transaction_status_cf: LedgerColumn<cf::TransactionStatus>,
|
||||
address_signatures_cf: LedgerColumn<cf::AddressSignatures>,
|
||||
transaction_memos_cf: LedgerColumn<cf::TransactionMemos>,
|
||||
transaction_status_index_cf: LedgerColumn<cf::TransactionStatusIndex>,
|
||||
active_transaction_status_index: RwLock<u64>,
|
||||
rewards_cf: LedgerColumn<cf::Rewards>,
|
||||
@ -342,6 +343,7 @@ impl Blockstore {
|
||||
let code_shred_cf = db.column();
|
||||
let transaction_status_cf = db.column();
|
||||
let address_signatures_cf = db.column();
|
||||
let transaction_memos_cf = db.column();
|
||||
let transaction_status_index_cf = db.column();
|
||||
let rewards_cf = db.column();
|
||||
let blocktime_cf = db.column();
|
||||
@ -391,6 +393,7 @@ impl Blockstore {
|
||||
code_shred_cf,
|
||||
transaction_status_cf,
|
||||
address_signatures_cf,
|
||||
transaction_memos_cf,
|
||||
transaction_status_index_cf,
|
||||
active_transaction_status_index: RwLock::new(active_transaction_status_index),
|
||||
rewards_cf,
|
||||
@ -2112,6 +2115,14 @@ impl Blockstore {
|
||||
Ok(())
|
||||
}
|
||||
|
||||
pub fn read_transaction_memos(&self, signature: Signature) -> Result<Option<String>> {
|
||||
self.transaction_memos_cf.get(signature)
|
||||
}
|
||||
|
||||
pub fn write_transaction_memos(&self, signature: &Signature, memos: String) -> Result<()> {
|
||||
self.transaction_memos_cf.put(*signature, &memos)
|
||||
}
|
||||
|
||||
fn check_lowest_cleanup_slot(&self, slot: Slot) -> Result<std::sync::RwLockReadGuard<Slot>> {
|
||||
// lowest_cleanup_slot is the last slot that was not cleaned up by LedgerCleanupService
|
||||
let lowest_cleanup_slot = self.lowest_cleanup_slot.read().unwrap();
|
||||
@ -2612,12 +2623,13 @@ impl Blockstore {
|
||||
let transaction_status =
|
||||
self.get_transaction_status(signature, &confirmed_unrooted_slots)?;
|
||||
let err = transaction_status.and_then(|(_slot, status)| status.status.err());
|
||||
let memo = self.read_transaction_memos(signature)?;
|
||||
let block_time = self.get_block_time(slot)?;
|
||||
infos.push(ConfirmedTransactionStatusWithSignature {
|
||||
signature,
|
||||
slot,
|
||||
err,
|
||||
memo: None,
|
||||
memo,
|
||||
block_time,
|
||||
});
|
||||
}
|
||||
|
@ -61,6 +61,8 @@ const CODE_SHRED_CF: &str = "code_shred";
|
||||
const TRANSACTION_STATUS_CF: &str = "transaction_status";
|
||||
/// Column family for Address Signatures
|
||||
const ADDRESS_SIGNATURES_CF: &str = "address_signatures";
|
||||
/// Column family for TransactionMemos
|
||||
const TRANSACTION_MEMOS_CF: &str = "transaction_memos";
|
||||
/// Column family for the Transaction Status Index.
|
||||
/// This column family is used for tracking the active primary index for columns that for
|
||||
/// query performance reasons should not be indexed by Slot.
|
||||
@ -164,6 +166,10 @@ pub mod columns {
|
||||
/// The address signatures column
|
||||
pub struct AddressSignatures;
|
||||
|
||||
#[derive(Debug)]
|
||||
// The transaction memos column
|
||||
pub struct TransactionMemos;
|
||||
|
||||
#[derive(Debug)]
|
||||
/// The transaction status index column
|
||||
pub struct TransactionStatusIndex;
|
||||
@ -333,6 +339,10 @@ impl Rocks {
|
||||
AddressSignatures::NAME,
|
||||
get_cf_options::<AddressSignatures>(&access_type, &oldest_slot),
|
||||
);
|
||||
let transaction_memos_cf_descriptor = ColumnFamilyDescriptor::new(
|
||||
TransactionMemos::NAME,
|
||||
get_cf_options::<TransactionMemos>(&access_type, &oldest_slot),
|
||||
);
|
||||
let transaction_status_index_cf_descriptor = ColumnFamilyDescriptor::new(
|
||||
TransactionStatusIndex::NAME,
|
||||
get_cf_options::<TransactionStatusIndex>(&access_type, &oldest_slot),
|
||||
@ -373,6 +383,7 @@ impl Rocks {
|
||||
(ShredCode::NAME, shred_code_cf_descriptor),
|
||||
(TransactionStatus::NAME, transaction_status_cf_descriptor),
|
||||
(AddressSignatures::NAME, address_signatures_cf_descriptor),
|
||||
(TransactionMemos::NAME, transaction_memos_cf_descriptor),
|
||||
(
|
||||
TransactionStatusIndex::NAME,
|
||||
transaction_status_index_cf_descriptor,
|
||||
@ -495,6 +506,7 @@ impl Rocks {
|
||||
ShredCode::NAME,
|
||||
TransactionStatus::NAME,
|
||||
AddressSignatures::NAME,
|
||||
TransactionMemos::NAME,
|
||||
TransactionStatusIndex::NAME,
|
||||
Rewards::NAME,
|
||||
Blocktime::NAME,
|
||||
@ -595,6 +607,10 @@ impl TypedColumn for columns::AddressSignatures {
|
||||
type Type = blockstore_meta::AddressSignatureMeta;
|
||||
}
|
||||
|
||||
impl TypedColumn for columns::TransactionMemos {
|
||||
type Type = String;
|
||||
}
|
||||
|
||||
impl TypedColumn for columns::TransactionStatusIndex {
|
||||
type Type = blockstore_meta::TransactionStatusIndexMeta;
|
||||
}
|
||||
@ -709,6 +725,37 @@ impl ColumnName for columns::AddressSignatures {
|
||||
const NAME: &'static str = ADDRESS_SIGNATURES_CF;
|
||||
}
|
||||
|
||||
impl Column for columns::TransactionMemos {
|
||||
type Index = Signature;
|
||||
|
||||
fn key(signature: Signature) -> Vec<u8> {
|
||||
let mut key = vec![0; 64]; // size_of Signature
|
||||
key[0..64].clone_from_slice(&signature.as_ref()[0..64]);
|
||||
key
|
||||
}
|
||||
|
||||
fn index(key: &[u8]) -> Signature {
|
||||
Signature::new(&key[0..64])
|
||||
}
|
||||
|
||||
fn primary_index(_index: Self::Index) -> u64 {
|
||||
unimplemented!()
|
||||
}
|
||||
|
||||
fn slot(_index: Self::Index) -> Slot {
|
||||
unimplemented!()
|
||||
}
|
||||
|
||||
#[allow(clippy::wrong_self_convention)]
|
||||
fn as_index(_index: u64) -> Self::Index {
|
||||
Signature::default()
|
||||
}
|
||||
}
|
||||
|
||||
impl ColumnName for columns::TransactionMemos {
|
||||
const NAME: &'static str = TRANSACTION_MEMOS_CF;
|
||||
}
|
||||
|
||||
impl Column for columns::TransactionStatusIndex {
|
||||
type Index = u64;
|
||||
|
||||
@ -1374,6 +1421,7 @@ fn excludes_from_compaction(cf_name: &str) -> bool {
|
||||
let no_compaction_cfs: HashSet<&'static str> = vec![
|
||||
columns::TransactionStatusIndex::NAME,
|
||||
columns::ProgramCosts::NAME,
|
||||
columns::TransactionMemos::NAME,
|
||||
]
|
||||
.into_iter()
|
||||
.collect();
|
||||
@ -1441,6 +1489,7 @@ pub mod tests {
|
||||
columns::TransactionStatusIndex::NAME
|
||||
));
|
||||
assert!(excludes_from_compaction(columns::ProgramCosts::NAME));
|
||||
assert!(excludes_from_compaction(columns::TransactionMemos::NAME));
|
||||
assert!(!excludes_from_compaction("something else"));
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user