Skip to content

Commit

Permalink
Merge #349
Browse files Browse the repository at this point in the history
349: Refactor peer store r=jjyr a=jjyr

1. change modules layout.
2. remove unnecessary code.
3. enable file storage mode.

Co-authored-by: jjy <[email protected]>
  • Loading branch information
bors[bot] and jjyr committed Mar 22, 2019
2 parents 89dd69d + 017d674 commit 21e76e0
Show file tree
Hide file tree
Showing 21 changed files with 383 additions and 362 deletions.
45 changes: 23 additions & 22 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

11 changes: 6 additions & 5 deletions network/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -20,17 +20,18 @@ bytes = "0.4.12"
tokio = "0.1.17"
futures = { version = "0.1.19", features = ["use_std"] }
snap = "0.2"
p2p = { git = "https://github.com/nervosnetwork/p2p", rev="9c42be05724c3e2decb73716d0f515c36a7af1cb", package="tentacle" }
secio = { git = "https://github.com/nervosnetwork/p2p", rev="9c42be05724c3e2decb73716d0f515c36a7af1cb", package="tentacle-secio" }
p2p-ping = { git = "https://github.com/nervosnetwork/p2p", rev="9c42be05724c3e2decb73716d0f515c36a7af1cb", package="tentacle-ping" }
p2p-discovery = { git = "https://github.com/nervosnetwork/p2p", rev="9c42be05724c3e2decb73716d0f515c36a7af1cb", package="tentacle-discovery" }
p2p-identify = { git = "https://github.com/nervosnetwork/p2p", rev="9c42be05724c3e2decb73716d0f515c36a7af1cb", package="tentacle-identify" }
p2p = { git = "https://github.com/nervosnetwork/p2p", rev="6c1f778914dae864d13c1d9110a08b46fb4d38fe", package="tentacle" }
secio = { git = "https://github.com/nervosnetwork/p2p", rev="6c1f778914dae864d13c1d9110a08b46fb4d38fe", package="tentacle-secio" }
p2p-ping = { git = "https://github.com/nervosnetwork/p2p", rev="6c1f778914dae864d13c1d9110a08b46fb4d38fe", package="tentacle-ping" }
p2p-discovery = { git = "https://github.com/nervosnetwork/p2p", rev="6c1f778914dae864d13c1d9110a08b46fb4d38fe", package="tentacle-discovery" }
p2p-identify = { git = "https://github.com/nervosnetwork/p2p", rev="6c1f778914dae864d13c1d9110a08b46fb4d38fe", package="tentacle-identify" }
faketime = "0.2.0"
rusqlite = {version = "0.16.0", features = ["bundled"]}
lazy_static = "1.3.0"
r2d2 = "0.8.3"
r2d2_sqlite = "0.8.0"
generic-channel = { version = "0.2.0", features = ["all"] }
sha2 = "0.8.0"

[dev-dependencies]
criterion = "0.2"
Expand Down
42 changes: 24 additions & 18 deletions network/src/benches/sqlite_peer_store.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ extern crate ckb_util;
use ckb_network::{
multiaddr::ToMultiaddr,
peer_store::{PeerStore, SqlitePeerStore},
random_peer_id, SessionType,
PeerId, SessionType,
};
use ckb_util::Mutex;
use criterion::Criterion;
Expand All @@ -15,24 +15,28 @@ use std::rc::Rc;
fn insert_peer_info_benchmark(c: &mut Criterion) {
c.bench_function("insert 100 peer_info", |b| {
b.iter({
let mut peer_store = SqlitePeerStore::default();
let peer_ids = (0..100).map(|_| random_peer_id()).collect::<Vec<_>>();
let mut peer_store =
SqlitePeerStore::memory("bench_db_insert_100_peer_info".to_string())
.expect("memory");
let peer_ids = (0..100).map(|_| PeerId::random()).collect::<Vec<_>>();
let addr = "/ip4/127.0.0.1".to_multiaddr().unwrap();
move || {
for peer_id in peer_ids.clone() {
peer_store.new_connected_peer(&peer_id, addr.clone(), SessionType::Client);
peer_store.add_connected_peer(&peer_id, addr.clone(), SessionType::Client);
}
}
})
});
c.bench_function("insert 1000 peer_info", |b| {
b.iter({
let mut peer_store = SqlitePeerStore::default();
let peer_ids = (0..1000).map(|_| random_peer_id()).collect::<Vec<_>>();
let mut peer_store =
SqlitePeerStore::memory("bench_db_insert_1000_peer_info".to_string())
.expect("memory");
let peer_ids = (0..1000).map(|_| PeerId::random()).collect::<Vec<_>>();
let addr = "/ip4/127.0.0.1".to_multiaddr().unwrap();
move || {
for peer_id in peer_ids.clone() {
peer_store.new_connected_peer(&peer_id, addr.clone(), SessionType::Client);
peer_store.add_connected_peer(&peer_id, addr.clone(), SessionType::Client);
}
}
})
Expand All @@ -41,12 +45,12 @@ fn insert_peer_info_benchmark(c: &mut Criterion) {
// filesystem benchmark
c.bench_function("insert 100 peer_info on filesystem", move |b| {
b.iter({
let mut peer_store = SqlitePeerStore::temp();
let peer_ids = (0..100).map(|_| random_peer_id()).collect::<Vec<_>>();
let mut peer_store = SqlitePeerStore::temp().expect("temp");
let peer_ids = (0..100).map(|_| PeerId::random()).collect::<Vec<_>>();
let addr = "/ip4/127.0.0.1".to_multiaddr().unwrap();
move || {
for peer_id in peer_ids.clone() {
peer_store.new_connected_peer(&peer_id, addr.clone(), SessionType::Client);
peer_store.add_connected_peer(&peer_id, addr.clone(), SessionType::Client);
}
}
})
Expand All @@ -55,14 +59,16 @@ fn insert_peer_info_benchmark(c: &mut Criterion) {

fn random_order_benchmark(c: &mut Criterion) {
{
let peer_store = Rc::new(Mutex::new(SqlitePeerStore::default()));
let peer_store = Rc::new(Mutex::new(
SqlitePeerStore::memory("bench_db_random_order".to_string()).expect("memory"),
));
let addr = "/ip4/127.0.0.1".to_multiaddr().unwrap();
{
let mut peer_store = peer_store.lock();
for _ in 0..8000 {
let peer_id = random_peer_id();
peer_store.new_connected_peer(&peer_id, addr.clone(), SessionType::Client);
let _ = peer_store.add_discovered_address(&peer_id, addr.clone());
let peer_id = PeerId::random();
peer_store.add_connected_peer(&peer_id, addr.clone(), SessionType::Client);
let _ = peer_store.add_discovered_addr(&peer_id, addr.clone());
}
}
c.bench_function("random order 1000 / 8000 peer_info", {
Expand Down Expand Up @@ -104,12 +110,12 @@ fn random_order_benchmark(c: &mut Criterion) {
"random order 1000 / 8000 peer_info on filesystem",
move |b| {
b.iter({
let mut peer_store = SqlitePeerStore::temp();
let mut peer_store = SqlitePeerStore::temp().expect("temp");
let addr = "/ip4/127.0.0.1".to_multiaddr().unwrap();
for _ in 0..8000 {
let peer_id = random_peer_id();
peer_store.new_connected_peer(&peer_id, addr.clone(), SessionType::Client);
let _ = peer_store.add_discovered_address(&peer_id, addr.clone());
let peer_id = PeerId::random();
peer_store.add_connected_peer(&peer_id, addr.clone(), SessionType::Client);
let _ = peer_store.add_discovered_addr(&peer_id, addr.clone());
}
move || {
let count = 1000;
Expand Down
35 changes: 21 additions & 14 deletions network/src/errors.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
use crate::{PeerIndex, ProtocolId};
use p2p::{error::Error as P2PError, secio::PeerId, service::ServiceTask};
use std::error;
use crate::{peer_store::sqlite::DBError, PeerIndex, ProtocolId};
use p2p::secio::PeerId;
use std::fmt;
use std::fmt::Display;
use std::io::Error as IoError;
Expand All @@ -11,7 +10,8 @@ pub enum Error {
Config(ConfigError),
Protocol(ProtocolError),
Io(IoError),
P2P(P2PError<ServiceTask>),
P2P(String),
DB(DBError),
Shutdown,
}

Expand Down Expand Up @@ -63,25 +63,32 @@ impl From<ProtocolError> for Error {
}
}

impl From<P2PError<ServiceTask>> for Error {
fn from(err: P2PError<ServiceTask>) -> Error {
Error::P2P(err)
impl From<DBError> for Error {
fn from(err: DBError) -> Error {
Error::DB(err)
}
}

impl Display for Error {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "{}", self)
write!(f, "{:?}", self)
}
}

impl error::Error for Error {
fn description(&self) -> &str {
"ckb network error"
impl Display for ConfigError {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "{:?}", self)
}
}

fn cause(&self) -> Option<&error::Error> {
// Generic error, underlying cause isn't tracked.
None
impl Display for PeerError {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "{:?}", self)
}
}

impl Display for ProtocolError {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "{:?}", self)
}
}
15 changes: 5 additions & 10 deletions network/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,8 @@ pub type PeerIndex = usize;
#[derive(Clone, Debug, PartialEq, Deserialize)]
pub struct Config {
pub listen_addresses: Vec<multiaddr::Multiaddr>,
pub secret_file: Option<String>,
pub secret_file: String,
pub peer_store_path: String,
pub try_outbound_connect_secs: Option<u64>,
/// List of initial node addresses
pub bootnodes: Vec<String>,
Expand Down Expand Up @@ -81,9 +82,9 @@ impl From<Config> for NetworkConfig {
_ => false,
};
}
if let Some(dir_path) = config.config_dir_path {
cfg.config_dir_path = Some(dir_path.clone());
cfg.secret_key_path = Some(format!("{}/secret_key", dir_path))
if let Some(dir_path) = &config.config_dir_path {
cfg.secret_key_path = Some(format!("{}/{}", dir_path, config.secret_file));
cfg.peer_store_path = Some(format!("{}/{}", dir_path, config.peer_store_path));
}
cfg.client_version = "ckb network".to_string();
match cfg.read_secret_key() {
Expand All @@ -96,9 +97,3 @@ impl From<Config> for NetworkConfig {
cfg
}
}

pub fn random_peer_id() -> PeerId {
use p2p::secio::SecioKeyPair;
let pubkey = SecioKeyPair::secp256k1_generated().to_public_key();
PeerId::from_public_key(&pubkey)
}
Loading

0 comments on commit 21e76e0

Please sign in to comment.