Merge branch 'lmdb_update' into grim
This commit is contained in:
+25
-19
@@ -20,7 +20,7 @@ use rand::prelude::*;
|
||||
|
||||
use crate::core::ser::{self, DeserializationMode, Readable, Reader, Writeable, Writer};
|
||||
use crate::types::{Capabilities, PeerAddr, ReasonForBan};
|
||||
use grin_store::{self, option_to_not_found, to_key, Error};
|
||||
use grin_store::{self, option_to_not_found, Error};
|
||||
|
||||
const DB_NAME: &str = "peer";
|
||||
const STORE_SUBPATH: &str = "peers";
|
||||
@@ -118,7 +118,13 @@ pub struct PeerStore {
|
||||
impl PeerStore {
|
||||
/// Instantiates a new peer store under the provided root path.
|
||||
pub fn new(db_root: &str) -> Result<PeerStore, Error> {
|
||||
let db = grin_store::Store::new(db_root, Some(DB_NAME), Some(STORE_SUBPATH), None)?;
|
||||
let db = grin_store::Store::new(
|
||||
db_root,
|
||||
Some(DB_NAME),
|
||||
Some(STORE_SUBPATH),
|
||||
vec![PEER_PREFIX],
|
||||
None,
|
||||
)?;
|
||||
Ok(PeerStore { db })
|
||||
}
|
||||
|
||||
@@ -126,7 +132,8 @@ impl PeerStore {
|
||||
debug!("save_peer: {:?} marked {:?}", p.addr, p.flags);
|
||||
|
||||
let mut batch = self.db.batch()?;
|
||||
batch.put_ser(&peer_key(p.addr)[..], p)?;
|
||||
let key = p.addr.as_key();
|
||||
batch.put_ser(Some(PEER_PREFIX), key.as_bytes(), p)?;
|
||||
batch.commit()
|
||||
}
|
||||
|
||||
@@ -134,19 +141,23 @@ impl PeerStore {
|
||||
let mut batch = self.db.batch()?;
|
||||
for pd in p {
|
||||
debug!("save_peers: {:?} marked {:?}", pd.addr, pd.flags);
|
||||
batch.put_ser(&peer_key(pd.addr)[..], &pd)?;
|
||||
let key = pd.addr.as_key();
|
||||
batch.put_ser(Some(PEER_PREFIX), key.as_bytes(), &pd)?;
|
||||
}
|
||||
batch.commit()
|
||||
}
|
||||
|
||||
pub fn get_peer(&self, peer_addr: PeerAddr) -> Result<PeerData, Error> {
|
||||
option_to_not_found(self.db.get_ser(&peer_key(peer_addr)[..], None), || {
|
||||
format!("Peer at address: {}", peer_addr)
|
||||
})
|
||||
let key = peer_addr.as_key();
|
||||
option_to_not_found(
|
||||
self.db.get_ser(Some(PEER_PREFIX), key.as_bytes(), None),
|
||||
|| format!("Peer at address: {}", peer_addr),
|
||||
)
|
||||
}
|
||||
|
||||
pub fn exists_peer(&self, peer_addr: PeerAddr) -> Result<bool, Error> {
|
||||
self.db.exists(&peer_key(peer_addr)[..])
|
||||
let key = peer_addr.as_key();
|
||||
self.db.exists(Some(PEER_PREFIX), key.as_bytes())
|
||||
}
|
||||
|
||||
/// Convenience method to load a peer data, update its status and save it
|
||||
@@ -154,9 +165,9 @@ impl PeerStore {
|
||||
/// If new state is Defunct last connection attempt will be updated too.
|
||||
pub fn update_state(&self, peer_addr: PeerAddr, new_state: State) -> Result<(), Error> {
|
||||
let mut batch = self.db.batch()?;
|
||||
|
||||
let key = peer_addr.as_key();
|
||||
let mut peer = option_to_not_found(
|
||||
batch.get_ser::<PeerData>(&peer_key(peer_addr)[..], None),
|
||||
batch.get_ser::<PeerData>(Some(PEER_PREFIX), key.as_bytes(), None),
|
||||
|| format!("Peer at address: {}", peer_addr),
|
||||
)?;
|
||||
peer.flags = new_state;
|
||||
@@ -166,7 +177,7 @@ impl PeerStore {
|
||||
peer.last_attempt = Utc::now().timestamp();
|
||||
}
|
||||
|
||||
batch.put_ser(&peer_key(peer_addr)[..], &peer)?;
|
||||
batch.put_ser(Some(PEER_PREFIX), key.as_bytes(), &peer)?;
|
||||
batch.commit()
|
||||
}
|
||||
|
||||
@@ -185,9 +196,8 @@ pub struct PeersIterBatch<'a> {
|
||||
impl<'a> PeersIterBatch<'a> {
|
||||
/// Iterator over all known peers.
|
||||
pub fn peers_iter(&self) -> Result<impl Iterator<Item = PeerData>, Error> {
|
||||
let key = to_key(PEER_PREFIX, "");
|
||||
let protocol_version = self.db.protocol_version();
|
||||
self.db.iter(&key, move |_, mut v| {
|
||||
self.db.iter(Some(PEER_PREFIX), move |_, mut v| {
|
||||
ser::deserialize(&mut v, protocol_version, DeserializationMode::default())
|
||||
.map_err(From::from)
|
||||
})
|
||||
@@ -230,7 +240,8 @@ impl<'a> PeersIterBatch<'a> {
|
||||
// Delete peers in single batch
|
||||
if !to_remove.is_empty() {
|
||||
for peer in to_remove {
|
||||
self.db.delete(&peer_key(peer.addr)[..])?;
|
||||
let key = peer.addr.as_key();
|
||||
self.db.delete(Some(PEER_PREFIX), key.as_bytes())?;
|
||||
}
|
||||
self.db.commit()?;
|
||||
}
|
||||
@@ -238,8 +249,3 @@ impl<'a> PeersIterBatch<'a> {
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
|
||||
// Ignore the port unless ip is loopback address.
|
||||
fn peer_key(peer_addr: PeerAddr) -> Vec<u8> {
|
||||
to_key(PEER_PREFIX, &peer_addr.as_key())
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user