diff --git a/tools/benchmark/cmd/put.go b/tools/benchmark/cmd/put.go index ff4373e2d1a..611572461ec 100644 --- a/tools/benchmark/cmd/put.go +++ b/tools/benchmark/cmd/put.go @@ -21,11 +21,13 @@ import ( "math" "math/rand" "os" + "strings" "time" v3 "github.com/coreos/etcd/clientv3" "github.com/coreos/etcd/pkg/report" + "github.com/dustin/go-humanize" "github.com/spf13/cobra" "golang.org/x/time/rate" "gopkg.in/cheggaaa/pb.v1" @@ -51,6 +53,8 @@ var ( compactInterval time.Duration compactIndexDelta int64 + + checkHashkv bool ) func init() { @@ -64,6 +68,7 @@ func init() { putCmd.Flags().BoolVar(&seqKeys, "sequential-keys", false, "Use sequential keys") putCmd.Flags().DurationVar(&compactInterval, "compact-interval", 0, `Interval to compact database (do not duplicate this with etcd's 'auto-compaction-retention' flag) (e.g. --compact-interval=5m compacts every 5-minute)`) putCmd.Flags().Int64Var(&compactIndexDelta, "compact-index-delta", 1000, "Delta between current revision and compact revision (e.g. current revision 10000, compact at 9000)") + putCmd.Flags().BoolVar(&checkHashkv, "check-hashkv", false, "Check hashkv") } func putFunc(cmd *cobra.Command, args []string) { @@ -126,6 +131,11 @@ func putFunc(cmd *cobra.Command, args []string) { close(r.Results()) bar.Finish() fmt.Println(<-rc) + + // Check hashkv + if checkHashkv { + hashKV(cmd, clients) + } } func compactKV(clients []*v3.Client) { @@ -150,3 +160,39 @@ func max(n1, n2 int64) int64 { } return n2 } + +func hashKV(cmd *cobra.Command, clients []*v3.Client) { + var epHashKVRev int64 + eps, err := cmd.Flags().GetStringSlice("endpoints") + if err != nil { + panic(err) + } + for i, ip := range eps { + eps[i] = strings.TrimSpace(ip) + } + st := time.Now() + var results string + ctx, cancel := context.WithCancel(context.Background()) + clients[0].HashKV(ctx, eps[0], epHashKVRev) + host := eps[0] + + resphash, errhash := clients[0].HashKV(ctx, host, epHashKVRev) + respstatus, errstatus := clients[0].Status(ctx, host) + cancel() + if errhash != nil { + fmt.Fprintf(os.Stderr, "Failed to get the hashkv of endpoint %s (%v)\n", host, errhash) + panic(err) + } + results += fmt.Sprintf("\nHaskKV Summary:\n") + results += fmt.Sprintf(" HashKV: %v\n", resphash.Hash) + results += fmt.Sprintf(" Endpoint: %v\n", host) + results += fmt.Sprintf(" Time taken to get hashkv: %v\n", time.Since(st).String()) + + // Get the db size + if errstatus != nil { + fmt.Fprintf(os.Stderr, "Failed to get the status of endpoint %s (%v)\n", host, errstatus) + panic(err) + } + results += fmt.Sprintf(" DB size: %s", humanize.Bytes(uint64(respstatus.DbSize))) + fmt.Println(results) +}