diff --git a/etcdctl/README.md b/etcdctl/README.md index 7b4bd2908..e8a03e615 100644 --- a/etcdctl/README.md +++ b/etcdctl/README.md @@ -1,3 +1,5 @@ + + etcdctl ======== @@ -134,7 +136,9 @@ RPC: Range - min-mod-revision -- restrict results to kvs with modified revision greater or equal than the supplied revision #### Output + Prints the data in format below, + ``` \\n\\n\\n\... ``` @@ -143,7 +147,6 @@ Note serializable requests are better for lower latency requirement, but stale data might be returned if serializable option (`--consistency=s`) is specified. - #### Examples First, populate etcd with some keys: @@ -283,6 +286,7 @@ RPC: Txn - interactive -- input transaction with interactive prompting. #### Input Format + ```ebnf ::= * "\n" "\n" "\n" ::= (||||) "\n" @@ -309,6 +313,7 @@ RPC: Txn #### Examples txn in interactive mode: + ```bash ./etcdctl txn -i # compares: @@ -329,6 +334,7 @@ put key2 "some extra key" ``` txn in non-interactive mode: + ```bash ./etcdctl txn <<<'mod("key1") > "0" @@ -384,6 +390,7 @@ RPC: Compact Prints the compacted revision. #### Example + ```bash ./etcdctl compaction 1234 # compacted revision 1234 @@ -642,6 +649,7 @@ RPC: LeaseKeepAlive Prints a message for every keep alive sent or prints a message indicating the lease is gone. #### Example + ```bash ./etcdctl lease keep-alive 32695410dcc0ca0 # lease 32695410dcc0ca0 keepalived with TTL(100) @@ -727,6 +735,7 @@ MEMBER LIST prints the member details for all members associated with an etcd cl RPC: MemberList #### Options + - consistency -- Linearizable(l) or Serializable(s), defaults to Linearizable(l). #### Output @@ -990,7 +999,6 @@ DEFRAG defragments the backend database file for a set of given endpoints while **Note that defragmentation request does not get replicated over cluster. That is, the request is only applied to the local node. Specify all members in `--endpoints` flag or `--cluster` flag to automatically find all cluster members.** - #### Output For each endpoints, prints a message indicating whether the endpoint was successfully defragmented. @@ -1031,6 +1039,7 @@ The backend snapshot is written to the given file path. #### Example Save a snapshot to "snapshot.db": + ``` ./etcdctl snapshot save snapshot.db ``` @@ -1039,7 +1048,6 @@ Save a snapshot to "snapshot.db": Removed in v3.6. Use `etcdutl snapshot restore` instead. - ### SNAPSHOT STATUS \ Removed in v3.6. Use `etcdutl snapshot status` instead. @@ -1079,6 +1087,7 @@ New members will refuse joining cluster with cluster version newer than theirs, Downgrade commands allow cluster administrator to force cluster version to be lowered to previous minor version, thus allowing to downgrade the cluster. Downgrade should be executed in stages: + 1. Verify that cluster is ready to be downgraded by running `etcdctl downgrade validate ` 2. Start the downgrade process by running `etcdctl downgrade enable ` 3. For each cluster member: @@ -1129,6 +1138,7 @@ DOWNGRADE CANCEL cancels the ongoing downgrade action to cluster. ./etcdctl downgrade cancel Downgrade cancel success, cluster version 3.5 ``` + ### DIAGNOSIS `etcdctl diagnosis [flags]` - Collects and analyzes troubleshooting data from a running etcd cluster. @@ -1166,7 +1176,6 @@ etcdctl diagnosis -o report.json Example output: see [ctlv3/command/diagnosis/examples/etcd_diagnosis_report.json](ctlv3/command/diagnosis/examples/etcd_diagnosis_report.json) - ## Concurrency commands ### LOCK [options] \ [command arg1 arg2 ...] @@ -1200,6 +1209,7 @@ Acquire lock and execute `echo lock acquired`: ``` Acquire lock and execute `etcdctl put` command + ```bash ./etcdctl lock mylock ./etcdctl put foo bar # OK @@ -1588,7 +1598,6 @@ The approximate total number of keys transferred to the destination cluster, upd [mirror]: ./doc/mirror_maker.md - ### VERSION Prints the version of etcdctl. @@ -1615,7 +1624,6 @@ CHECK PERF checks the performance of the etcd cluster for 60 seconds. Running th Notice that different workload models use different configurations in terms of number of clients and throughput. Here is the configuration for each load: - | Load | Number of clients | Number of put requests (requests/sec) | |---------|------|---------| | Small | 50 | 10000 | @@ -1629,10 +1637,8 @@ The test checks for the following conditions: - All the requests should be done in less than 500 ms - The standard deviation of the requests should be less than 100 ms - Hence, a workload model may work while another one might fail. - RPC: CheckPerf #### Options @@ -1746,7 +1752,4 @@ backward compatibility for `JSON` format and the format in non-interactive mode. [etcd]: https://github.com/coreos/etcd [READMEv2]: READMEv2.md -[v2key]: ../store/node_extern.go#L28-L37 -[v3key]: ../api/mvccpb/kv.proto#L12-L29 [etcdrpc]: ../api/etcdserverpb/rpc.proto -[storagerpc]: ../api/mvccpb/kv.proto diff --git a/etcdctl/ctlv3/command/diagnosis/plugins/common/checker.go b/etcdctl/ctlv3/command/diagnosis/plugins/common/checker.go index f59f1f5e9..8818fb37f 100644 --- a/etcdctl/ctlv3/command/diagnosis/plugins/common/checker.go +++ b/etcdctl/ctlv3/command/diagnosis/plugins/common/checker.go @@ -27,6 +27,6 @@ type Checker struct { Cfg *clientv3.ConfigSpec Endpoints []string CommandTimeout time.Duration - DbQuotaBytes int + DbQuotaBytes int64 Name string } diff --git a/etcdctl/ctlv3/command/diagnosis/plugins/epstatus/plugin.go b/etcdctl/ctlv3/command/diagnosis/plugins/epstatus/plugin.go index a83cfd6e9..e15b8c3ef 100644 --- a/etcdctl/ctlv3/command/diagnosis/plugins/epstatus/plugin.go +++ b/etcdctl/ctlv3/command/diagnosis/plugins/epstatus/plugin.go @@ -21,7 +21,6 @@ import ( "time" clientv3 "go.etcd.io/etcd/client/v3" - "go.etcd.io/etcd/etcdctl/v3/ctlv3/command/diagnosis/engine/intf" "go.etcd.io/etcd/etcdctl/v3/ctlv3/command/diagnosis/plugins/common" ) @@ -41,7 +40,7 @@ type checkResult struct { EpStatusList []epStatus `json:"epStatusList,omitempty"` } -func NewPlugin(cfg *clientv3.ConfigSpec, eps []string, timeout time.Duration, dbQuota int) intf.Plugin { +func NewPlugin(cfg *clientv3.ConfigSpec, eps []string, timeout time.Duration, dbQuota int64) intf.Plugin { return &epStatusChecker{ Checker: common.Checker{ Cfg: cfg, @@ -174,14 +173,14 @@ func compareSoftInfo(s1, s2 *clientv3.StatusResponse) bool { s1.Leader == s2.Leader } -func checkDBSize(chkResult *checkResult, dbQuota int) { +func checkDBSize(chkResult *checkResult, dbQuota int64) { for _, sts := range chkResult.EpStatusList { if sts.EpStatus == nil { continue } freeSize := sts.EpStatus.DbSize - sts.EpStatus.DbSizeInUse - if freeSize > sts.EpStatus.DbSizeInUse && freeSize > 1_000_000_000 /* about 1GB */ || sts.EpStatus.DbSize >= int64(dbQuota*80/100) { + if freeSize > sts.EpStatus.DbSizeInUse && freeSize > 1_000_000_000 /* about 1GB */ || sts.EpStatus.DbSize >= dbQuota*80/100 { appendSummary(chkResult, "Detected large amount of db [free] space for endpoint %q, dbQuota: %d, dbSize: %d, dbSizeInUse: %d, dbSizeFree: %d", sts.Endpoint, dbQuota, sts.EpStatus.DbSize, sts.EpStatus.DbSizeInUse, freeSize) } } diff --git a/etcdctl/ctlv3/command/diagnosis/plugins/membership/plugin.go b/etcdctl/ctlv3/command/diagnosis/plugins/membership/plugin.go index a9c605d89..1b651284b 100644 --- a/etcdctl/ctlv3/command/diagnosis/plugins/membership/plugin.go +++ b/etcdctl/ctlv3/command/diagnosis/plugins/membership/plugin.go @@ -21,7 +21,6 @@ import ( "time" clientv3 "go.etcd.io/etcd/client/v3" - "go.etcd.io/etcd/etcdctl/v3/ctlv3/command/diagnosis/engine/intf" "go.etcd.io/etcd/etcdctl/v3/ctlv3/command/diagnosis/plugins/common" ) diff --git a/etcdctl/ctlv3/command/diagnosis/plugins/metrics/plugin.go b/etcdctl/ctlv3/command/diagnosis/plugins/metrics/plugin.go index 911791de0..24d2e1e7d 100644 --- a/etcdctl/ctlv3/command/diagnosis/plugins/metrics/plugin.go +++ b/etcdctl/ctlv3/command/diagnosis/plugins/metrics/plugin.go @@ -27,7 +27,6 @@ import ( "time" clientv3 "go.etcd.io/etcd/client/v3" - "go.etcd.io/etcd/etcdctl/v3/ctlv3/command/diagnosis/engine/intf" "go.etcd.io/etcd/etcdctl/v3/ctlv3/command/diagnosis/plugins/common" ) @@ -145,13 +144,13 @@ func fetchMetrics(cfg *clientv3.ConfigSpec, ep string, timeout time.Duration) ([ client := &http.Client{Timeout: timeout} if strings.HasPrefix(urlPath, "https://") && cfg.Secure != nil { - cert, err := tls.LoadX509KeyPair(cfg.Secure.Cert, cfg.Secure.Key) - if err != nil { - return nil, fmt.Errorf("failed to load certificate: %w", err) + cert, certErr := tls.LoadX509KeyPair(cfg.Secure.Cert, cfg.Secure.Key) + if certErr != nil { + return nil, fmt.Errorf("failed to load certificate: %w", certErr) } - caCert, err := os.ReadFile(cfg.Secure.Cacert) - if err != nil { - return nil, fmt.Errorf("failed to load CA: %w", err) + caCert, caErr := os.ReadFile(cfg.Secure.Cacert) + if caErr != nil { + return nil, fmt.Errorf("failed to load CA: %w", caErr) } caCertPool := x509.NewCertPool() caCertPool.AppendCertsFromPEM(caCert) diff --git a/etcdctl/ctlv3/command/diagnosis/plugins/read/plugin.go b/etcdctl/ctlv3/command/diagnosis/plugins/read/plugin.go index 5d7bcec71..e6565151d 100644 --- a/etcdctl/ctlv3/command/diagnosis/plugins/read/plugin.go +++ b/etcdctl/ctlv3/command/diagnosis/plugins/read/plugin.go @@ -22,7 +22,6 @@ import ( "go.etcd.io/etcd/api/v3/v3rpc/rpctypes" clientv3 "go.etcd.io/etcd/client/v3" - "go.etcd.io/etcd/etcdctl/v3/ctlv3/command/diagnosis/engine/intf" "go.etcd.io/etcd/etcdctl/v3/ctlv3/command/diagnosis/plugins/common" ) diff --git a/etcdctl/ctlv3/command/diagnosis_command.go b/etcdctl/ctlv3/command/diagnosis_command.go index 4e62c2afc..69748254e 100644 --- a/etcdctl/ctlv3/command/diagnosis_command.go +++ b/etcdctl/ctlv3/command/diagnosis_command.go @@ -31,7 +31,7 @@ import ( var ( useCluster bool - dbQuotaBytes int + dbQuotaBytes int64 outputFile string ) @@ -45,7 +45,7 @@ func NewDiagnosisCommand() *cobra.Command { } cmd.Flags().BoolVar(&useCluster, "cluster", false, "use all endpoints from the cluster member list") - cmd.Flags().IntVar(&dbQuotaBytes, "etcd-storage-quota-bytes", 2*1024*1024*1024, "etcd storage quota in bytes (the value passed to etcd instance by flag --quota-backend-bytes)") + cmd.Flags().Int64Var(&dbQuotaBytes, "etcd-storage-quota-bytes", 2*1024*1024*1024, "etcd storage quota in bytes (the value passed to etcd instance by flag --quota-backend-bytes)") cmd.Flags().StringVarP(&outputFile, "output", "o", "", "write report to file instead of stdout") return cmd