From 95ad0ef745a19da8d56a3e00fb8d621fbb17d371 Mon Sep 17 00:00:00 2001 From: SeongChan Lee Date: Thu, 16 May 2019 18:25:27 +0900 Subject: [PATCH] Add method to check the end of a term --- core/src/client/importer.rs | 21 +++++++++++++++++++++ core/src/consensus/mod.rs | 5 +++++ 2 files changed, 26 insertions(+) diff --git a/core/src/client/importer.rs b/core/src/client/importer.rs index e562022f24..e8a2f07c72 100644 --- a/core/src/client/importer.rs +++ b/core/src/client/importer.rs @@ -38,6 +38,7 @@ use crate::types::BlockId; use crate::verification::queue::{BlockQueue, HeaderQueue}; use crate::verification::{self, PreverifiedBlock, Verifier}; use crate::views::{BlockView, HeaderView}; +use blockchain::BlockChain; pub struct Importer { /// Lock used during block import @@ -206,6 +207,8 @@ impl Importer { client.db().write_buffered(batch); chain.commit(); + self.check_term_end(block.header(), &chain, client); + if hash == chain.best_block_hash() { let mut state_db = client.state_db().write(); let state = block.state(); @@ -215,6 +218,21 @@ impl Importer { route } + fn check_term_end(&self, header: &Header, chain: &BlockChain, client: &Client) { + let last_term_end = chain.last_term_end(); + if let Some(term_id) = self.engine.is_term_end(header, last_term_end) { + cdebug!(CLIENT, "Term end at block {}", header.hash()); + + let mut batch = DBTransaction::new(); + chain.update_last_term_end(&mut batch, term_id, header.number()); + + // always write the batch directly since term end are + // fetched from a DB iterator and DB iterators are only available on + // flushed data. + client.db().write(batch).expect("DB flush failed"); + } + } + fn check_and_close_block(&self, block: &PreverifiedBlock, client: &Client) -> Result { let engine = &*self.engine; let header = &block.header; @@ -404,6 +422,9 @@ impl Importer { client.db().write_buffered(batch); chain.commit(); + // FIXME: Check if this line is still necessary. + // self.check_term_end(&header, &chain, client); + route } } diff --git a/core/src/consensus/mod.rs b/core/src/consensus/mod.rs index 35137db88b..bb861b3f4b 100644 --- a/core/src/consensus/mod.rs +++ b/core/src/consensus/mod.rs @@ -55,6 +55,7 @@ use crate::error::Error; use crate::header::Header; use crate::transaction::{SignedTransaction, UnverifiedTransaction}; use crate::views::HeaderView; +use blockchain::TermEnd; use Client; pub enum Seal { @@ -199,6 +200,10 @@ pub trait ConsensusEngine: Sync + Send { Ok(()) } + fn is_term_end(&self, _chain_head: &M::Header, _last_term_end: Option) -> Option { + None + } + /// Populate a header's fields based on its parent's header. /// Usually implements the chain scoring rule based on weight. fn populate_from_parent(&self, _header: &mut Header, _parent: &Header) {}