Browse Source

etcdctl/check: enable auto compact and defrag for check datascale

Running check datascale can create large history of keyspaces and
internal fragmentation. Allow user to run auto compact and defrag
when run check datascale.
Sahdev P. Zala 7 years ago
parent
commit
fc30b9844a
2 changed files with 47 additions and 31 deletions
  1. 21 31
      etcdctl/ctlv3/command/check.go
  2. 26 0
      etcdctl/ctlv3/command/util.go

+ 21 - 31
etcdctl/ctlv3/command/check.go

@@ -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 {
@@ -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
 }
@@ -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)
 		}
@@ -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{
@@ -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
 }
@@ -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 {

+ 26 - 0
etcdctl/ctlv3/command/util.go

@@ -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"
@@ -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)
+}