Quellcode durchsuchen

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 vor 7 Jahren
Ursprung
Commit
fc30b9844a
2 geänderte Dateien mit 47 neuen und 31 gelöschten Zeilen
  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)
+}