guard import order
This commit is contained in:
parent
e57ab96731
commit
2c0f456e4d
@ -104,13 +104,16 @@ impl HeaderChain {
|
||||
let number = view.number();
|
||||
let parent_hash = view.parent_hash();
|
||||
|
||||
// hold candidates the whole time to guard import order.
|
||||
let mut candidates = self.candidates.write();
|
||||
|
||||
// find parent details.
|
||||
let parent_td = {
|
||||
if number == 1 {
|
||||
let g_view = HeaderView::new(&self.genesis_header);
|
||||
g_view.difficulty()
|
||||
} else {
|
||||
let maybe_td = self.candidates.read().get(&(number - 1))
|
||||
let maybe_td = candidates.get(&(number - 1))
|
||||
.and_then(|entry| entry.candidates.iter().find(|c| c.hash == parent_hash))
|
||||
.map(|c| c.total_difficulty);
|
||||
|
||||
@ -124,7 +127,6 @@ impl HeaderChain {
|
||||
let total_difficulty = parent_td + view.difficulty();
|
||||
|
||||
// insert headers and candidates entries.
|
||||
let mut candidates = self.candidates.write();
|
||||
candidates.entry(number).or_insert_with(|| Entry { candidates: SmallVec::new(), canonical_hash: hash})
|
||||
.candidates.push(Candidate {
|
||||
hash: hash,
|
||||
|
@ -76,6 +76,7 @@ pub struct Client {
|
||||
queue: HeaderQueue,
|
||||
chain: HeaderChain,
|
||||
tx_pool: Mutex<H256FastMap<SignedTransaction>>,
|
||||
import_lock: Mutex<()>,
|
||||
}
|
||||
|
||||
impl Client {
|
||||
@ -85,6 +86,7 @@ impl Client {
|
||||
queue: HeaderQueue::new(config.queue, spec.engine.clone(), io_channel, true),
|
||||
chain: HeaderChain::new(&::rlp::encode(&spec.genesis_header())),
|
||||
tx_pool: Mutex::new(Default::default()),
|
||||
import_lock: Mutex::new(()),
|
||||
}
|
||||
}
|
||||
|
||||
@ -149,15 +151,17 @@ impl Client {
|
||||
pub fn import_verified(&self) {
|
||||
const MAX: usize = 256;
|
||||
|
||||
let _lock = self.import_lock.lock();
|
||||
|
||||
let mut bad = Vec::new();
|
||||
let mut good = Vec::new();
|
||||
for verified_header in self.queue.drain(MAX) {
|
||||
let hash = verified_header.hash();
|
||||
let (num, hash) = (verified_header.number(), verified_header.hash());
|
||||
|
||||
match self.chain.insert(::rlp::encode(&verified_header).to_vec()) {
|
||||
Ok(()) => good.push(hash),
|
||||
Err(e) => {
|
||||
debug!(target: "client", "Error importing header {}: {}", hash, e);
|
||||
debug!(target: "client", "Error importing header {:?}: {}", (num, hash), e);
|
||||
bad.push(hash);
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user