Skip to content

Commit

Permalink
etcdctl/check: enable auto compact and defrag for check datascale
Browse files Browse the repository at this point in the history
Running check datascale can create large history of keyspaces and
internal fragmentation. Allow user to run auto compact and defrag
when run check datascale.
  • Loading branch information
spzala committed Feb 23, 2018
1 parent 4fd378e commit fc30b98
Show file tree
Hide file tree
Showing 2 changed files with 47 additions and 31 deletions.
52 changes: 21 additions & 31 deletions etcdctl/ctlv3/command/check.go
Original file line number Diff line number Diff line change
Expand Up @@ -36,10 +36,10 @@ import (
var (
checkPerfLoad string
checkPerfPrefix string
checkPerfAutoCompact bool
checkPerfAutoDefrag bool
checkDatascaleLoad string
checkDatascalePrefix string
autoCompact bool
autoDefrag bool
)

type checkPerfCfg struct {
Expand Down Expand Up @@ -126,8 +126,8 @@ func NewCheckPerfCommand() *cobra.Command {
// TODO: support customized configuration
cmd.Flags().StringVar(&checkPerfLoad, "load", "s", "The performance check's workload model. Accepted workloads: s(small), m(medium), l(large), xl(xLarge)")
cmd.Flags().StringVar(&checkPerfPrefix, "prefix", "/etcdctl-check-perf/", "The prefix for writing the performance check's keys.")
cmd.Flags().BoolVar(&checkPerfAutoCompact, "auto-compact", false, "Compact storage with last revision after test is finished.")
cmd.Flags().BoolVar(&checkPerfAutoDefrag, "auto-defrag", false, "Defragment storage after test is finished.")
cmd.Flags().BoolVar(&autoCompact, "auto-compact", false, "Compact storage with last revision after test is finished.")
cmd.Flags().BoolVar(&autoDefrag, "auto-defrag", false, "Defragment storage after test is finished.")

return cmd
}
Expand Down Expand Up @@ -219,11 +219,11 @@ func newCheckPerfCommand(cmd *cobra.Command, args []string) {
ExitWithError(ExitError, err)
}

if checkPerfAutoCompact {
if autoCompact {
compact(clients[0], dresp.Header.Revision)
}

if checkPerfAutoDefrag {
if autoDefrag {
for _, ep := range clients[0].Endpoints() {
defrag(clients[0], ep)
}
Expand Down Expand Up @@ -265,28 +265,6 @@ func newCheckPerfCommand(cmd *cobra.Command, args []string) {
}
}

func compact(c *v3.Client, rev int64) {
fmt.Printf("Compacting with revision %d\n", rev)
ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
_, err := c.Compact(ctx, rev, v3.WithCompactPhysical())
cancel()
if err != nil {
ExitWithError(ExitError, err)
}
fmt.Printf("Compacted with revision %d\n", rev)
}

func defrag(c *v3.Client, ep string) {
fmt.Printf("Defragmenting %q\n", ep)
ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
_, err := c.Defragment(ctx, ep)
cancel()
if err != nil {
ExitWithError(ExitError, err)
}
fmt.Printf("Defragmented %q\n", ep)
}

// NewCheckDatascaleCommand returns the cobra command for "check datascale".
func NewCheckDatascaleCommand() *cobra.Command {
cmd := &cobra.Command{
Expand All @@ -298,6 +276,8 @@ func NewCheckDatascaleCommand() *cobra.Command {

cmd.Flags().StringVar(&checkDatascaleLoad, "load", "s", "The datascale check's workload model. Accepted workloads: s(small), m(medium), l(large), xl(xLarge)")
cmd.Flags().StringVar(&checkDatascalePrefix, "prefix", "/etcdctl-check-datascale/", "The prefix for writing the datascale check's keys.")
cmd.Flags().BoolVar(&autoCompact, "auto-compact", false, "Compact storage with last revision after test is finished.")
cmd.Flags().BoolVar(&autoDefrag, "auto-defrag", false, "Defragment storage after test is finished.")

return cmd
}
Expand Down Expand Up @@ -389,10 +369,20 @@ func newCheckDatascaleCommand(cmd *cobra.Command, args []string) {

// delete the created kv pairs
ctx, cancel = context.WithCancel(context.Background())
_, err = clients[0].Delete(ctx, checkDatascalePrefix, v3.WithPrefix())
dresp, derr := clients[0].Delete(ctx, checkDatascalePrefix, v3.WithPrefix())
defer cancel()
if err != nil {
ExitWithError(ExitError, err)
if derr != nil {
ExitWithError(ExitError, derr)
}

if autoCompact {
compact(clients[0], dresp.Header.Revision)
}

if autoDefrag {
for _, ep := range clients[0].Endpoints() {
defrag(clients[0], ep)
}
}

if bytesAfter == 0 {
Expand Down
26 changes: 26 additions & 0 deletions etcdctl/ctlv3/command/util.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,9 @@ import (
"regexp"
"strconv"
"strings"
"time"

v3 "github.com/coreos/etcd/clientv3"
pb "github.com/coreos/etcd/internal/mvcc/mvccpb"

"github.com/spf13/cobra"
Expand Down Expand Up @@ -118,3 +120,27 @@ func endpointMemoryMetrics(host string) float64 {

return residentMemoryBytes
}

// compact keyspace history to a provided revision
func compact(c *v3.Client, rev int64) {
fmt.Printf("Compacting with revision %d\n", rev)
ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
_, err := c.Compact(ctx, rev, v3.WithCompactPhysical())
cancel()
if err != nil {
ExitWithError(ExitError, err)
}
fmt.Printf("Compacted with revision %d\n", rev)
}

// defrag a given endpoint
func defrag(c *v3.Client, ep string) {
fmt.Printf("Defragmenting %q\n", ep)
ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
_, err := c.Defragment(ctx, ep)
cancel()
if err != nil {
ExitWithError(ExitError, err)
}
fmt.Printf("Defragmented %q\n", ep)
}

0 comments on commit fc30b98

Please sign in to comment.