From f57961b0f5016c2d16db96b6ef7cab1888b99dbf Mon Sep 17 00:00:00 2001 From: Anton Kaliaev Date: Thu, 5 Nov 2020 17:18:18 +0400 Subject: [PATCH] add main.go for running the application server --- test/jepsen/README.md | 23 +++++++++++++++++++ test/jepsen/app/app.go | 2 ++ test/jepsen/app/main.go | 50 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 75 insertions(+) create mode 100644 test/jepsen/app/main.go diff --git a/test/jepsen/README.md b/test/jepsen/README.md index e69de29bb..5015097c1 100644 --- a/test/jepsen/README.md +++ b/test/jepsen/README.md @@ -0,0 +1,23 @@ +# Jepsen Tests + +[Jepsen](https://github.com/jepsen-io/jepsen) is a framework for distributed +systems verification, with fault injection, written in Clojure. + +For more information, visit their [website](https://jepsen.io/). + +## Test scenarios + +Jepsen tests should give us some assurance that Tendermint produces +linearizable history in the presence of: + +* Network partitions +* Clock skews +* Crashes +* Changing validators +* Truncating logs + +NOTE: e2e tests check Tendermint recovers after crashes, but they do not check +the transaction history. Jepsen test suite can be viewed as an extension in +this way. + +## Running diff --git a/test/jepsen/app/app.go b/test/jepsen/app/app.go index 073a13b43..449102c9c 100644 --- a/test/jepsen/app/app.go +++ b/test/jepsen/app/app.go @@ -68,6 +68,8 @@ type MerkleEyesState struct { Validators *ValidatorSetState `json:"validators"` } +// ValidatorSetState contains the validator set and its version (~ the number +// of times it was changed). type ValidatorSetState struct { Version uint64 `json:"version"` Validators []*Validator `json:"validators"` diff --git a/test/jepsen/app/main.go b/test/jepsen/app/main.go new file mode 100644 index 000000000..a10277b0e --- /dev/null +++ b/test/jepsen/app/main.go @@ -0,0 +1,50 @@ +package app + +import ( + "flag" + "fmt" + "os" + + "github.com/tendermint/tendermint/abci/server" + "github.com/tendermint/tendermint/libs/log" + tmos "github.com/tendermint/tendermint/libs/os" +) + +var ( + logger = log.NewTMLogger(log.NewSyncWriter(os.Stdout)) + + dbName string + laddr string +) + +func init() { + flag.StringVar(&dbName, "dbname", "", "database name") + flag.StringVar(&laddr, "laddr", "unix://data.sock", "listen address") +} + +func main() { + flag.Parse() + + app := NewMerkleEyesApp(dbName, 0) + srv, err := server.NewServer(laddr, "socket", app) + if err != nil { + fmt.Fprintf(os.Stderr, "can't create server: %v", err) + os.Exit(-1) + } + srv.SetLogger(logger.With("module", "abci-server")) + + if err := srv.Start(); err != nil { + fmt.Fprintf(os.Stderr, "can't start server: %v", err) + os.Exit(-1) + } + + // Stop upon receiving SIGTERM or CTRL-C. + tmos.TrapSignal(logger, func() { + // Cleanup + srv.Stop() + app.CloseDB() + }) + + // Run forever. + select {} +}