Browse Source

Remove unneeded locking from MempoolStore

refactor-mempool
Roman Zeyde 6 years ago
parent
commit
c86245751e
No known key found for this signature in database GPG Key ID: 87CAE5FA46917CBB
  1. 23
      src/mempool.rs

23
src/mempool.rs

@ -4,7 +4,7 @@ use hex;
use std::collections::{BTreeMap, HashMap, HashSet};
use std::iter::FromIterator;
use std::ops::Bound;
use std::sync::{Mutex, RwLock};
use std::sync::Mutex;
use daemon::{Daemon, MempoolEntry};
use index::index_transaction;
@ -17,34 +17,33 @@ use errors::*;
const VSIZE_BIN_WIDTH: u32 = 100_000; // in vbytes
struct MempoolStore {
map: RwLock<BTreeMap<Bytes, Vec<Bytes>>>,
map: BTreeMap<Bytes, Vec<Bytes>>,
}
impl MempoolStore {
fn new() -> MempoolStore {
MempoolStore {
map: RwLock::new(BTreeMap::new()),
map: BTreeMap::new(),
}
}
fn add(&mut self, tx: &Transaction) {
let mut map = self.map.write().unwrap();
let mut rows = vec![];
index_transaction(tx, 0, &mut rows);
for row in rows {
let (key, value) = row.into_pair();
map.entry(key).or_insert(vec![]).push(value);
self.map.entry(key).or_insert(vec![]).push(value);
}
}
fn remove(&mut self, tx: &Transaction) {
let mut map = self.map.write().unwrap();
let mut rows = vec![];
index_transaction(tx, 0, &mut rows);
for row in rows {
let (key, value) = row.into_pair();
let no_values_left = {
let values = map
let values = self
.map
.get_mut(&key)
.expect(&format!("missing key {} in mempool", hex::encode(&key)));
let last_value = values
@ -61,7 +60,7 @@ impl MempoolStore {
values.is_empty()
};
if no_values_left {
map.remove(&key).unwrap();
self.map.remove(&key).unwrap();
}
}
}
@ -69,12 +68,12 @@ impl MempoolStore {
impl ReadStore for MempoolStore {
fn get(&self, key: &[u8]) -> Option<Bytes> {
let map = self.map.read().unwrap();
Some(map.get(key)?.last()?.to_vec())
Some(self.map.get(key)?.last()?.to_vec())
}
fn scan(&self, prefix: &[u8]) -> Vec<Row> {
let map = self.map.read().unwrap();
let range = map.range((Bound::Included(prefix.to_vec()), Bound::Unbounded));
let range = self
.map
.range((Bound::Included(prefix.to_vec()), Bound::Unbounded));
let mut rows = vec![];
for (key, values) in range {
if !key.starts_with(prefix) {

Loading…
Cancel
Save