diff --git a/beacon_node/beacon_chain/src/beacon_chain.rs b/beacon_node/beacon_chain/src/beacon_chain.rs index 6d2973021a..095429faa5 100644 --- a/beacon_node/beacon_chain/src/beacon_chain.rs +++ b/beacon_node/beacon_chain/src/beacon_chain.rs @@ -3481,9 +3481,15 @@ impl BeaconChain { // would be difficult to check that they all lock fork choice first. let mut ops = { let _timer = metrics::start_timer(&metrics::BLOCK_PROCESSING_PUBKEY_CACHE_LOCK); - self.validator_pubkey_cache - .write() - .import_new_pubkeys(&state)? + let pubkey_cache = self.validator_pubkey_cache.upgradable_read(); + + // Only take a write lock if there are new keys to import. + if state.validators().len() > pubkey_cache.len() { + parking_lot::RwLockUpgradableReadGuard::upgrade(pubkey_cache) + .import_new_pubkeys(&state)? + } else { + vec![] + } }; // Apply the state to the attester cache, only if it is from the previous epoch or later.