runtime: fix possible deadlock in bank (#10466)

This commit is contained in:
Boqin Qin
2020-06-11 01:02:08 +08:00
committed by GitHub
parent 6eb5ef6ac7
commit 1e3554b33d

View File

@ -63,6 +63,7 @@ use std::{
mem, mem,
ops::RangeInclusive, ops::RangeInclusive,
path::PathBuf, path::PathBuf,
ptr,
rc::Rc, rc::Rc,
sync::atomic::{AtomicBool, AtomicU64, Ordering}, sync::atomic::{AtomicBool, AtomicU64, Ordering},
sync::{Arc, RwLock, RwLockReadGuard}, sync::{Arc, RwLock, RwLockReadGuard},
@ -2508,6 +2509,9 @@ impl Bank {
} }
pub fn compare_bank(&self, dbank: &Bank) { pub fn compare_bank(&self, dbank: &Bank) {
if ptr::eq(self, dbank) {
return;
}
assert_eq!(self.slot, dbank.slot); assert_eq!(self.slot, dbank.slot);
assert_eq!(self.collector_id, dbank.collector_id); assert_eq!(self.collector_id, dbank.collector_id);
assert_eq!(self.epoch_schedule, dbank.epoch_schedule); assert_eq!(self.epoch_schedule, dbank.epoch_schedule);
@ -2523,21 +2527,29 @@ impl Bank {
dbank.is_delta.load(Ordering::Relaxed) dbank.is_delta.load(Ordering::Relaxed)
); );
let st = self.stakes.read().unwrap(); {
let dst = dbank.stakes.read().unwrap();
assert_eq!(*st, *dst);
let bh = self.hash.read().unwrap(); let bh = self.hash.read().unwrap();
let dbh = dbank.hash.read().unwrap(); let dbh = dbank.hash.read().unwrap();
assert_eq!(*bh, *dbh); assert_eq!(*bh, *dbh);
}
{
let st = self.stakes.read().unwrap();
let dst = dbank.stakes.read().unwrap();
assert_eq!(*st, *dst);
}
{
let bhq = self.blockhash_queue.read().unwrap(); let bhq = self.blockhash_queue.read().unwrap();
let dbhq = dbank.blockhash_queue.read().unwrap(); let dbhq = dbank.blockhash_queue.read().unwrap();
assert_eq!(*bhq, *dbhq); assert_eq!(*bhq, *dbhq);
}
{
let sc = self.src.status_cache.read().unwrap(); let sc = self.src.status_cache.read().unwrap();
let dsc = dbank.src.status_cache.read().unwrap(); let dsc = dbank.src.status_cache.read().unwrap();
assert_eq!(*sc, *dsc); assert_eq!(*sc, *dsc);
}
assert_eq!( assert_eq!(
self.rc.accounts.bank_hash_at(self.slot), self.rc.accounts.bank_hash_at(self.slot),
dbank.rc.accounts.bank_hash_at(dbank.slot) dbank.rc.accounts.bank_hash_at(dbank.slot)