From 0c8e273c629a1bded1853d656d8713f4f95f2720 Mon Sep 17 00:00:00 2001 From: zhangsoledad <787953403@qq.com> Date: Tue, 22 Jan 2019 18:05:37 +0800 Subject: [PATCH] feat: block template cache --- miner/src/block_assembler.rs | 33 +++++++++++++++++++-------------- 1 file changed, 19 insertions(+), 14 deletions(-) diff --git a/miner/src/block_assembler.rs b/miner/src/block_assembler.rs index 0a505be1d0..c313ab4f71 100644 --- a/miner/src/block_assembler.rs +++ b/miner/src/block_assembler.rs @@ -27,15 +27,16 @@ type BlockTemplateParams = (Option, Option, Option); type BlockTemplateResult = Result; const BLOCK_ASSEMBLER_SUBSCRIBER: &str = "block_assembler"; const BLOCK_TEMPLATE_TIMEOUT: u64 = 3000; +const TEMPLATE_CACHE_SIZE: usize = 10; -struct CurrentTemplate { +struct TemplateCache { pub time: u64, pub uncles_updated_at: u64, pub txs_updated_at: u64, pub template: BlockTemplate, } -impl CurrentTemplate { +impl TemplateCache { fn is_outdate( &self, last_uncles_updated_at: u64, @@ -57,7 +58,7 @@ pub struct BlockAssembler { type_hash: H256, work_id: AtomicUsize, last_uncles_updated_at: AtomicUsize, - current_template: Mutex>, + template_caches: Mutex>, } #[derive(Clone)] @@ -106,7 +107,7 @@ impl BlockAssembler { candidate_uncles: LruCache::new(MAX_CANDIDATE_UNCLES), work_id: AtomicUsize::new(0), last_uncles_updated_at: AtomicUsize::new(0), - current_template: Mutex::new(None), + template_caches: Mutex::new(LruCache::new(TEMPLATE_CACHE_SIZE)), } } @@ -228,15 +229,16 @@ impl BlockAssembler { let number = tip_header.number() + 1; let current_time = cmp::max(unix_time_as_millis(), header.timestamp() + 1); - let mut current_template = self.current_template.lock(); - if let Some(ref current_template) = *current_template { - if !current_template.is_outdate( + let mut template_caches = self.template_caches.lock(); + + if let Some(template_cache) = template_caches.get(&(cycles_limit, bytes_limit, version)) { + if !template_cache.is_outdate( last_uncles_updated_at, last_txs_updated_at, current_time, number, ) { - return Ok(current_template.template.clone()); + return Ok(template_cache.template.clone()); } } @@ -278,12 +280,15 @@ impl BlockAssembler { work_id: format!("{}", self.work_id.fetch_add(1, Ordering::SeqCst)), }; - *current_template = Some(CurrentTemplate { - time: current_time, - uncles_updated_at: last_uncles_updated_at, - txs_updated_at: last_txs_updated_at, - template: template.clone(), - }); + template_caches.insert( + (cycles_limit, bytes_limit, version), + TemplateCache { + time: current_time, + uncles_updated_at: last_uncles_updated_at, + txs_updated_at: last_txs_updated_at, + template: template.clone(), + }, + ); Ok(template) }