Created
October 18, 2016 09:00
-
-
Save tomusdrw/eb0878f8ce2f4f103d58f594ac6725a8 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| // now let's rebuild the blooms | |
| if !request.enacted.is_empty() { | |
| let range_start = request.block_number as Number + 1 - request.enacted.len(); | |
| let range_end = range_start + request.retracted; | |
| let replaced_range = range_start..range_end; | |
| let enacted_blooms = request.enacted | |
| .iter() | |
| // all traces are expected to be found here. That's why `expect` has been used | |
| // instead of `filter_map`. If some traces haven't been found, it meens that | |
| // traces database is corrupted or incomplete. | |
| .map(|block_hash| if block_hash == &request.block_hash { | |
| request.traces.bloom() | |
| } else { | |
| self.traces(block_hash).expect("Traces database is incomplete.").bloom() | |
| }) | |
| .map(blooms::Bloom::from) | |
| .map(Into::into) | |
| .collect(); | |
| let chain = BloomGroupChain::new(self.bloom_config, self); | |
| let trace_blooms = chain.replace(&replaced_range, enacted_blooms); | |
| let blooms_to_insert = trace_blooms.into_iter() | |
| .map(|p| (From::from(p.0), From::from(p.1))) | |
| .collect::<HashMap<TraceGroupPosition, blooms::BloomGroup>>(); | |
| let blooms_keys: Vec<_> = blooms_to_insert.keys().cloned().collect(); | |
| let mut blooms = self.blooms.write(); | |
| batch.extend_with_cache(db::COL_TRACE, &mut *blooms, blooms_to_insert, CacheUpdatePolicy::Remove); | |
| // note_used must be called after locking blooms to avoid cache/traces deadlock on garbage collection | |
| for key in blooms_keys.into_iter() { | |
| self.note_used(CacheID::Bloom(key)); | |
| } | |
| } | |
| // insert new block traces into the cache and the database | |
| { | |
| let mut traces = self.traces.write(); | |
| // it's important to use overwrite here, | |
| // cause this value might be queried by hash later | |
| batch.write_with_cache(db::COL_TRACE, &mut *traces, request.block_hash, request.traces, CacheUpdatePolicy::Overwrite); | |
| // note_used must be called after locking traces to avoid cache/traces deadlock on garbage collection | |
| self.note_used(CacheID::Trace(request.block_hash.clone())); | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment