/* cutWALUntil is a small utility for cutting a WAL until the given height (inclusively). Note it does not include last cs.EndHeightMessage. Usage: cutWALUntil height-to-stop */ package main import ( "fmt" "io" "os" "strconv" cs "github.com/tendermint/tendermint/consensus" ) func main() { if len(os.Args) < 4 { fmt.Println("3 arguments required: ") os.Exit(1) } var heightToStop uint64 var err error if heightToStop, err = strconv.ParseUint(os.Args[2], 10, 64); err != nil { panic(fmt.Errorf("failed to parse height: %v", err)) } in, err := os.Open(os.Args[1]) if err != nil { panic(fmt.Errorf("failed to open input WAL file: %v", err)) } defer in.Close() out, err := os.Create(os.Args[3]) if err != nil { panic(fmt.Errorf("failed to open output WAL file: %v", err)) } defer out.Close() enc := cs.NewWALEncoder(out) dec := cs.NewWALDecoder(in) for { msg, err := dec.Decode() if err == io.EOF { break } else if err != nil { panic(fmt.Errorf("failed to decode msg: %v", err)) } if m, ok := msg.Msg.(cs.EndHeightMessage); ok { if m.Height == heightToStop { break } } err = enc.Encode(msg) if err != nil { panic(fmt.Errorf("failed to encode msg: %v", err)) } } }