From 785786bec4ea26668c6ec31f4058e7a6128e7213 Mon Sep 17 00:00:00 2001 From: bradyjoestar Date: Fri, 10 Aug 2018 13:09:40 +0800 Subject: [PATCH] add json2wal & fix wal2json (#2196) * add json2wal & fix wal2json * fix bug * Update main.go * add wal2JsonTest file * Delete wal2JsonTest --- docs/tendermint-core/running-in-production.md | 2 +- scripts/json2wal/main.go | 75 +++++++++++++++++++ scripts/wal2json/main.go | 13 +++- 3 files changed, 87 insertions(+), 3 deletions(-) create mode 100644 scripts/json2wal/main.go diff --git a/docs/tendermint-core/running-in-production.md b/docs/tendermint-core/running-in-production.md index 0c7ed4e2d..eeab25c3c 100644 --- a/docs/tendermint-core/running-in-production.md +++ b/docs/tendermint-core/running-in-production.md @@ -164,7 +164,7 @@ $EDITOR /tmp/corrupted_wal 5. After editing, convert this file back into binary form by running: ``` -./scripts/json2wal/json2wal /tmp/corrupted_wal > "$TMHOME/data/cs.wal/wal" +./scripts/json2wal/json2wal /tmp/corrupted_wal $TMHOME/data/cs.wal/wal ``` ## Hardware diff --git a/scripts/json2wal/main.go b/scripts/json2wal/main.go new file mode 100644 index 000000000..9b593f895 --- /dev/null +++ b/scripts/json2wal/main.go @@ -0,0 +1,75 @@ +/* + json2wal converts JSON file to binary WAL file. + + Usage: + json2wal +*/ + +package main + +import ( + "github.com/tendermint/go-amino" + "github.com/tendermint/tendermint/types" + cs "github.com/tendermint/tendermint/consensus" + "fmt" + "os" + "io" + "bufio" + "strings" +) + +var cdc = amino.NewCodec() + +func init() { + cs.RegisterConsensusMessages(cdc) + cs.RegisterWALMessages(cdc) + types.RegisterBlockAmino(cdc) +} + + +func main() { + if len(os.Args) < 3 { + fmt.Fprintln(os.Stderr, "missing arguments: Usage:json2wal ") + os.Exit(1) + } + + f, err := os.Open(os.Args[1]) + if err != nil { + panic(fmt.Errorf("failed to open WAL file: %v", err)) + } + defer f.Close() + + walFile, err := os.OpenFile(os.Args[2],os.O_EXCL|os.O_WRONLY|os.O_CREATE,0666) + if err != nil { + panic(fmt.Errorf("failed to open WAL file: %v", err)) + } + defer walFile.Close() + + br := bufio.NewReader(f) + dec := cs.NewWALEncoder(walFile) + + for { + msgJson, _, err := br.ReadLine() + if err == io.EOF{ + break + }else if err != nil { + panic(fmt.Errorf("failed to read file: %v", err)) + } + // ignore the ENDHEIGHT in json.File + if strings.HasPrefix(string(msgJson),"ENDHEIGHT"){ + continue + } + + var msg cs.TimedWALMessage + err = cdc.UnmarshalJSON(msgJson,&msg) + if err != nil{ + panic(fmt.Errorf("failed to unmarshal json: %v", err)) + } + + err = dec.Encode(&msg) + if err != nil{ + panic(fmt.Errorf("failed to encode msg: %v", err)) + } + } +} + diff --git a/scripts/wal2json/main.go b/scripts/wal2json/main.go index f6ffea431..80181bb14 100644 --- a/scripts/wal2json/main.go +++ b/scripts/wal2json/main.go @@ -8,14 +8,23 @@ package main import ( - "encoding/json" "fmt" "io" "os" cs "github.com/tendermint/tendermint/consensus" + "github.com/tendermint/go-amino" + "github.com/tendermint/tendermint/types" ) +var cdc = amino.NewCodec() + +func init() { + cs.RegisterConsensusMessages(cdc) + cs.RegisterWALMessages(cdc) + types.RegisterBlockAmino(cdc) +} + func main() { if len(os.Args) < 2 { fmt.Println("missing one argument: ") @@ -37,7 +46,7 @@ func main() { panic(fmt.Errorf("failed to decode msg: %v", err)) } - json, err := json.Marshal(msg) + json, err := cdc.MarshalJSON(msg) if err != nil { panic(fmt.Errorf("failed to marshal msg: %v", err)) }