From 138de19e1e6c7204f7fd7e835ef67f4c40f69ec4 Mon Sep 17 00:00:00 2001 From: Ethan Buchman Date: Thu, 25 Aug 2016 01:39:03 -0400 Subject: [PATCH] test: app persistence --- consensus/state.go | 3 +- state/execution.go | 1 + test/persist/test.sh | 68 ++++++++++++++++++++++++++++++++++++++++++++ test/run_test.sh | 3 ++ types/events.go | 4 ++- 5 files changed, 77 insertions(+), 2 deletions(-) create mode 100644 test/persist/test.sh diff --git a/consensus/state.go b/consensus/state.go index d26a3ed25..55f37df99 100644 --- a/consensus/state.go +++ b/consensus/state.go @@ -1251,7 +1251,8 @@ func (cs *ConsensusState) finalizeCommit(height int) { PanicConsensus(Fmt("+2/3 committed an invalid block: %v", err)) } - log.Notice(Fmt("Finalizing commit of block with %d txs", block.NumTxs), "height", block.Height, "hash", block.Hash()) + log.Notice(Fmt("Finalizing commit of block with %d txs", block.NumTxs), + "height", block.Height, "hash", block.Hash(), "root", block.AppHash) log.Info(Fmt("%v", block)) // Fire off event for new block. diff --git a/state/execution.go b/state/execution.go index f37ce9b42..37df55dc4 100644 --- a/state/execution.go +++ b/state/execution.go @@ -246,6 +246,7 @@ func (s *State) ReplayBlocks(header *types.Header, partsHeader types.PartSetHead // TODO: put validators in iavl tree so we can set the state with an older validator set lastVals, nextVals := stateCopy.GetValidators() stateCopy.SetBlockAndValidators(header, partsHeader, lastVals, nextVals) + stateCopy.AppHash = header.AppHash } // run the transactions diff --git a/test/persist/test.sh b/test/persist/test.sh new file mode 100644 index 000000000..c51fa7d0a --- /dev/null +++ b/test/persist/test.sh @@ -0,0 +1,68 @@ +#! /bin/bash + + +export TMROOT=$HOME/.tendermint_persist + +rm -rf $TMROOT +tendermint init + +function start_procs(){ + name=$1 + echo "Starting persistent dummy and tendermint" + dummy --persist $TMROOT/dummy &> "dummy_${name}.log" & + PID_DUMMY=$! + tendermint node &> tendermint_${name}.log & + PID_TENDERMINT=$! + sleep 5 +} + +function kill_procs(){ + kill -9 $PID_DUMMY $PID_TENDERMINT +} + + +function send_txs(){ + # send a bunch of txs over a few blocks + echo "Sending txs" +# for i in `seq 1 5`; do +# for j in `seq 1 100`; do + tx=`head -c 8 /dev/urandom | hexdump -ve '1/1 "%.2X"'` + curl -s 127.0.0.1:46657/broadcast_tx_async?tx=\"$tx\" &> /dev/null +# done + sleep 1 +# done +} + + +start_procs 1 +send_txs +kill_procs +start_procs 2 + +# wait for node to handshake and make a new block +addr="localhost:46657" +curl -s $addr/status > /dev/null +ERR=$? +i=0 +while [ "$ERR" != 0 ]; do + sleep 1 + curl -s $addr/status > /dev/null + ERR=$? + i=$(($i + 1)) + if [[ $i == 10 ]]; then + echo "Timed out waiting for tendermint to start" + exit 1 + fi +done + +# wait for a new block +h1=`curl -s $addr/status | jq .result[1].latest_block_height` +h2=$h1 +while [ "$h2" == "$h1" ]; do + sleep 1 + h2=`curl -s $addr/status | jq .result[1].latest_block_height` +done + +kill_procs + +echo "Passed Test: Persistence" diff --git a/test/run_test.sh b/test/run_test.sh index 9ef4388f2..6f625798c 100644 --- a/test/run_test.sh +++ b/test/run_test.sh @@ -11,6 +11,9 @@ bash test/test_cover.sh # run the app tests bash test/app/test.sh +# run the persistence test +bash test/persist.test.sh + if [[ "$BRANCH" == "master" || $(echo "$BRANCH" | grep "release-") != "" ]]; then echo "" echo "* branch $BRANCH; testing libs" diff --git a/types/events.go b/types/events.go index fc7e0ac6b..c6eb7611a 100644 --- a/types/events.go +++ b/types/events.go @@ -130,7 +130,9 @@ func NewEventCache(evsw EventSwitch) EventCache { // All events should be based on this FireEvent to ensure they are TMEventData func fireEvent(fireable events.Fireable, event string, data TMEventData) { - fireable.FireEvent(event, data) + if fireable != nil { + fireable.FireEvent(event, data) + } } func AddListenerForEvent(evsw EventSwitch, id, event string, cb func(data TMEventData)) {