From 38528624f3e2de0e123a02fc857580e6a654e46d Mon Sep 17 00:00:00 2001 From: c0gent Date: Sat, 28 Jul 2018 15:43:13 -0700 Subject: [PATCH] Add some debugging goodies. --- .gitignore | 2 ++ Cargo.toml | 10 ++++++- README.md | 4 ++- gdb-node | 21 +++++++++---- ltrace-node | 54 +++++++++++++++++++++++++++++++++ run-node | 17 ++++++----- src/hydrabadger/handler.rs | 7 ++++- src/hydrabadger/hydrabadger.rs | 8 ++--- src/hydrabadger/state.rs | 4 +-- src/lib.rs | 7 +++++ valgrind-node | 55 ++++++++++++++++++++++++++++++++++ 11 files changed, 167 insertions(+), 22 deletions(-) mode change 100644 => 100755 gdb-node create mode 100755 ltrace-node create mode 100755 valgrind-node diff --git a/.gitignore b/.gitignore index 83e4977..5bd6240 100644 --- a/.gitignore +++ b/.gitignore @@ -23,3 +23,5 @@ Cargo.lock /src/junk /bak +*.gz +massif* \ No newline at end of file diff --git a/Cargo.toml b/Cargo.toml index a243885..b69d50d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -12,6 +12,10 @@ autobins = false name = "peer_node" path = "src/bin/peer_node.rs" +[features] +# Used for debugging memory usage. +exit_upon_epoch_1000 = [] + [dependencies] log = "*" env_logger = "*" @@ -51,4 +55,8 @@ git = "https://github.com/poanetwork/hbbft" # branch = "master" branch = "afck-agreement" # path = "../hbbft" -# features = ["serialization-protobuf"] \ No newline at end of file +# features = ["serialization-protobuf"] + +[profile.release] +debug = true +debug-assertions = true \ No newline at end of file diff --git a/README.md b/README.md index ba37d61..81b371c 100644 --- a/README.md +++ b/README.md @@ -28,7 +28,9 @@ Type `./run-node 0 --help` or `cargo run -- --help` for command line options. See the [`run-node`](https://github.com/poanetwork/hydrabadger/blob/master/run-node) -script for additional optional environment variables that can be set. +script for additional optional environment variables that can be set. To turn +on debug log output: `export HYDRABADGER_LOG_ADDTL=debug` and/or `echo "export +HYDRABADGER_LOG_ADDTL=debug" >> ~/.profile`. ### Current State diff --git a/gdb-node b/gdb-node old mode 100644 new mode 100755 index 23c8090..3c979b0 --- a/gdb-node +++ b/gdb-node @@ -16,23 +16,32 @@ # # -let HOST_PORT=300$1 -let PEER_0_PORT=$HOST_PORT-1 -let PEER_1_PORT=$HOST_PORT+1 +let HOST_ID=$1 +let PEER_0_ID=$HOST_ID==0?$HOST_ID+2:$HOST_ID-1 +let PEER_1_ID=$HOST_ID+1 + +printf -v HOST_PORT "3%03d" $HOST_ID +printf -v PEER_0_PORT "3%03d" $PEER_0_ID +printf -v PEER_1_PORT "3%03d" $PEER_1_ID HYDRABADGER_LOG=peer_node::hydrabadger=error,warn,info,$HYDRABADGER_LOG_ADDTL if [[ $HYDRABADGER_RELEASE ]] then case "$HYDRABADGER_RELEASE" in - 0) RELEASE="" ;; - false) RELEASE="" ;; - *) RELEASE="--release" ;; + 0|false) RELEASE=""; DIRECTORY="debug" ;; + *) RELEASE="--release"; DIRECTORY="release" ;; esac else RELEASE="--release" + DIRECTORY="release" fi +cargo build $RELEASE + +# printf "\nLimiting process memory limit to 400MiB...\n\n" +# ulimit -Sv 400000 + bash -c "\ HYDRABADGER_LOG=$HYDRABADGER_LOG gdb -ex=r --args target/release/peer_node \ -b localhost:$HOST_PORT \ diff --git a/ltrace-node b/ltrace-node new file mode 100755 index 0000000..7a3beb8 --- /dev/null +++ b/ltrace-node @@ -0,0 +1,54 @@ +#/bin/bash + +# Starts a Hydrabadger node +# ========================= +# +# Optional environment variables: +# +# * HYDRABADGER_LOG_ADDTL: +# +# Appends additional logging args (debug, trace, filters, etc.). +# +# * HYDRABADGER_RELEASE: +# +# Builds in debug mode if `HYDRABADGER_RELEASE` == `0` or `false`. +# Slows down output and makes reading log easier. +# +# + +let HOST_ID=$1 +let PEER_0_ID=$HOST_ID==0?$HOST_ID+2:$HOST_ID-1 +let PEER_1_ID=$HOST_ID+1 + +printf -v HOST_PORT "3%03d" $HOST_ID +printf -v PEER_0_PORT "3%03d" $PEER_0_ID +printf -v PEER_1_PORT "3%03d" $PEER_1_ID + +HYDRABADGER_LOG=peer_node::hydrabadger=error,warn,info,$HYDRABADGER_LOG_ADDTL + +if [[ $HYDRABADGER_RELEASE ]] +then + case "$HYDRABADGER_RELEASE" in + 0|false) RELEASE=""; DIRECTORY="debug" ;; + *) RELEASE="--release"; DIRECTORY="release" ;; + esac +else + RELEASE="--release" + DIRECTORY="release" +fi + +cargo build $RELEASE + +# printf "\nLimiting process memory limit to 400MiB...\n\n" +# ulimit -Sv 400000 + +mkdir tmp + +bash -c "\ +HYDRABADGER_LOG=$HYDRABADGER_LOG ltrace target/$DIRECTORY/peer_node \ + -b localhost:$HOST_PORT \ + -r localhost:$PEER_0_PORT \ + -r localhost:$PEER_1_PORT\ + $2 $3 $4 $5 $6 $7 $8 \ + 2>&1 | tee tmp/ltrace_peer_node_$1.log +" diff --git a/run-node b/run-node index 2931d16..c7aa987 100755 --- a/run-node +++ b/run-node @@ -17,7 +17,7 @@ # let HOST_ID=$1 -let PEER_0_ID=$HOST_ID-1 +let PEER_0_ID=$HOST_ID==0?$HOST_ID+2:$HOST_ID-1 let PEER_1_ID=$HOST_ID+1 printf -v HOST_PORT "3%03d" $HOST_ID @@ -29,18 +29,21 @@ HYDRABADGER_LOG=peer_node::hydrabadger=error,warn,info,$HYDRABADGER_LOG_ADDTL if [[ $HYDRABADGER_RELEASE ]] then case "$HYDRABADGER_RELEASE" in - 0) RELEASE="" ;; - false) RELEASE="" ;; - *) RELEASE="--release" ;; + 0|false) RELEASE=""; DIRECTORY="debug" ;; + *) RELEASE="--release"; DIRECTORY="release" ;; esac else RELEASE="--release" + DIRECTORY="release" fi +cargo build $RELEASE + +# printf "\nLimiting process memory limit to 400MiB...\n\n" +# ulimit -Sv 400000 + bash -c "\ -HYDRABADGER_LOG=$HYDRABADGER_LOG cargo run --bin peer_node \ - $RELEASE \ - -- \ +HYDRABADGER_LOG=$HYDRABADGER_LOG target/$DIRECTORY/peer_node \ -b localhost:$HOST_PORT \ -r localhost:$PEER_0_PORT \ -r localhost:$PEER_1_PORT\ diff --git a/src/hydrabadger/handler.rs b/src/hydrabadger/handler.rs index f9454af..7f06ac8 100644 --- a/src/hydrabadger/handler.rs +++ b/src/hydrabadger/handler.rs @@ -247,7 +247,7 @@ impl Handler { } }, s @ _ => panic!("::handle_key_gen_part: State must be `GeneratingKeys`. \ - State: \n{:?}", s.discriminant()), + State: \n{:?} \n\n[FIXME: Enqueue these parts!]\n\n", s.discriminant()), } } @@ -686,6 +686,11 @@ impl Future for Handler { for batch in step.output.drain(..) { info!(" BATCH: \n{:?}", batch); + + if cfg!(exit_upon_epoch_1000) && batch.epoch() >= 1000 { + return Ok(Async::Ready(())) + } + if let Some(jp) = batch.join_plan() { // FIXME: Only sent to unconnected nodes: debug!("Outputting join plan: {:?}", jp); diff --git a/src/hydrabadger/hydrabadger.rs b/src/hydrabadger/hydrabadger.rs index 9fc0b70..6aa7319 100644 --- a/src/hydrabadger/hydrabadger.rs +++ b/src/hydrabadger/hydrabadger.rs @@ -40,12 +40,12 @@ use super::{Error, State, StateDsct, Handler}; const EXTRA_DELAY_MS: u64 = 0; const BATCH_SIZE: usize = 200; -const NEW_TXNS_PER_INTERVAL: usize = 10; -const NEW_TXN_INTERVAL_MS: u64 = 2000; -const TXN_BYTES: usize = 8; +const NEW_TXNS_PER_INTERVAL: usize = 5; +const NEW_TXN_INTERVAL_MS: u64 = 5000; +const TXN_BYTES: usize = 2; // The minimum number of peers needed to spawn a HB instance. -const HB_PEER_MINIMUM_COUNT: usize = 9; +const HB_PEER_MINIMUM_COUNT: usize = 3; diff --git a/src/hydrabadger/state.rs b/src/hydrabadger/state.rs index f758a79..b5f6623 100644 --- a/src/hydrabadger/state.rs +++ b/src/hydrabadger/state.rs @@ -247,7 +247,7 @@ impl State { info!("== HONEY BADGER INITIALIZED =="); info!(""); - { + { // TODO: Consolidate or remove: let pk_set = qhb.dyn_hb().netinfo().public_key_set(); let pk_map = qhb.dyn_hb().netinfo().public_key_map(); info!(""); @@ -311,7 +311,7 @@ impl State { info!("== HONEY BADGER INITIALIZED =="); info!(""); - { + { // TODO: Consolidate or remove: let pk_set = qhb.dyn_hb().netinfo().public_key_set(); let pk_map = qhb.dyn_hb().netinfo().public_key_map(); info!(""); diff --git a/src/lib.rs b/src/lib.rs index 4ece9d2..98455b9 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,4 +1,6 @@ +#![feature(alloc_system, allocator_api)] +extern crate alloc_system; extern crate clap; extern crate env_logger; #[macro_use] extern crate log; @@ -26,6 +28,11 @@ extern crate parking_lot; extern crate clear_on_drop; extern crate hbbft; +use alloc_system::System; + +#[global_allocator] +static A: System = System; + // pub mod network; pub mod hydrabadger; pub mod blockchain; diff --git a/valgrind-node b/valgrind-node new file mode 100755 index 0000000..1a65acc --- /dev/null +++ b/valgrind-node @@ -0,0 +1,55 @@ +#/bin/bash + +# Starts a Hydrabadger node +# ========================= +# +# Optional environment variables: +# +# * HYDRABADGER_LOG_ADDTL: +# +# Appends additional logging args (debug, trace, filters, etc.). +# +# * HYDRABADGER_RELEASE: +# +# Builds in debug mode if `HYDRABADGER_RELEASE` == `0` or `false`. +# Slows down output and makes reading log easier. +# +# + +let HOST_ID=$1 +let PEER_0_ID=$HOST_ID==0?$HOST_ID+2:$HOST_ID-1 +let PEER_1_ID=$HOST_ID+1 + +printf -v HOST_PORT "3%03d" $HOST_ID +printf -v PEER_0_PORT "3%03d" $PEER_0_ID +printf -v PEER_1_PORT "3%03d" $PEER_1_ID + +HYDRABADGER_LOG=peer_node::hydrabadger=error,warn,info,$HYDRABADGER_LOG_ADDTL + +if [[ $HYDRABADGER_RELEASE ]] +then + case "$HYDRABADGER_RELEASE" in + 0|false) RELEASE=""; DIRECTORY="debug" ;; + *) RELEASE="--release"; DIRECTORY="release" ;; + esac +else + RELEASE="--release" + DIRECTORY="release" +fi + +cargo build $RELEASE + +# printf "\nLimiting process memory limit to 400MiB...\n\n" +# ulimit -Sv 400000 + +bash -c "\ +HYDRABADGER_LOG=$HYDRABADGER_LOG \ + valgrind --tool=massif --massif-out-file="tmp/massif.out.node_$HOST_ID" \ + target/$DIRECTORY/peer_node \ + -b localhost:$HOST_PORT \ + -r localhost:$PEER_0_PORT \ + -r localhost:$PEER_1_PORT\ + $2 $3 $4 $5 $6 $7 $8 +" + +# --pages-as-heap=yes \ \ No newline at end of file