diff --git a/runtime/src/accounts_db/geyser_plugin_utils.rs b/runtime/src/accounts_db/geyser_plugin_utils.rs index de2f6340d53124..8c49ac65000218 100644 --- a/runtime/src/accounts_db/geyser_plugin_utils.rs +++ b/runtime/src/accounts_db/geyser_plugin_utils.rs @@ -1,5 +1,8 @@ use { - crate::{accounts_db::AccountsDb, append_vec::StoredAccountMeta}, + crate::{ + accounts_db::AccountsDb, + append_vec::{StoredAccountMeta, StoredMeta}, + }, solana_measure::measure::Measure, solana_metrics::*, solana_sdk::{account::AccountSharedData, clock::Slot, pubkey::Pubkey, signature::Signature}, @@ -112,14 +115,14 @@ impl AccountsDb { measure_filter.stop(); notify_stats.elapsed_filtering_us += measure_filter.as_us() as usize; - self.notify_filtered_accounts(slot, notified_accounts, &accounts_to_stream, notify_stats); + self.notify_filtered_accounts(slot, notified_accounts, accounts_to_stream, notify_stats); } fn notify_filtered_accounts( &self, slot: Slot, notified_accounts: &mut HashSet, - accounts_to_stream: &HashMap, + mut accounts_to_stream: HashMap, notify_stats: &mut GeyserPluginNotifyAtSnapshotRestoreStats, ) { let notifier = self @@ -130,9 +133,20 @@ impl AccountsDb { .unwrap(); let mut measure_notify = Measure::start("accountsdb-plugin-notifying-accounts"); - for account in accounts_to_stream.values() { + let local_write_version = 0; + for (_, mut account) in accounts_to_stream.drain() { + // We do not need to rely on the specific write_version read from the append vec. + // So, overwrite the write_version with something that works. + // 'accounts_to_stream' is already a hashmap, so there is already only entry per pubkey. + // write_version is only used to order multiple entries with the same pubkey, so it doesn't matter what value it gets here. + // Passing 0 for everyone's write_version is sufficiently correct. + let meta = StoredMeta { + write_version_obsolete: local_write_version, + ..*account.meta + }; + account.meta = &meta; let mut measure_pure_notify = Measure::start("accountsdb-plugin-notifying-accounts"); - notifier.notify_account_restore_from_snapshot(slot, account); + notifier.notify_account_restore_from_snapshot(slot, &account); measure_pure_notify.stop(); notify_stats.total_pure_notify += measure_pure_notify.as_us() as usize;