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

Loading…
Cancel
Save