From 7c377fa7032913f89d910c6001d5d20016d99d58 Mon Sep 17 00:00:00 2001 From: Xiang Li Date: Thu, 10 Mar 2016 09:29:30 -0800 Subject: [PATCH] *: add client.defrag and defrag cmd for etcdctl --- clientv3/client.go | 2 ++ clientv3/maintenance.go | 52 +++++++++++++++++++++++++++++ etcdctlv3/command/defrag_command.go | 44 ++++++++++++++++++++++++ etcdctlv3/main.go | 1 + 4 files changed, 99 insertions(+) create mode 100644 clientv3/maintenance.go create mode 100644 etcdctlv3/command/defrag_command.go diff --git a/clientv3/client.go b/clientv3/client.go index c266f36f2..0fa443526 100644 --- a/clientv3/client.go +++ b/clientv3/client.go @@ -39,6 +39,7 @@ type Client struct { Lease Watcher Auth + Maintenance conn *grpc.ClientConn cfg Config @@ -178,6 +179,7 @@ func newClient(cfg *Config) (*Client, error) { client.Lease = NewLease(client) client.Watcher = NewWatcher(client) client.Auth = NewAuth(client) + client.Maintenance = &maintenance{c: client} return client, nil } diff --git a/clientv3/maintenance.go b/clientv3/maintenance.go new file mode 100644 index 000000000..bec7c3813 --- /dev/null +++ b/clientv3/maintenance.go @@ -0,0 +1,52 @@ +// Copyright 2016 CoreOS, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package clientv3 + +import ( + "github.com/coreos/etcd/Godeps/_workspace/src/golang.org/x/net/context" + pb "github.com/coreos/etcd/etcdserver/etcdserverpb" +) + +type ( + DefragmentResponse pb.DefragmentResponse +) + +type Maintenance interface { + // Defragment defragments storage backend of the etcd member with given endpoint. + // Defragment is only needed when deleting a large number of keys and want to reclaim + // the resources. + // Defragment is an expensive operation. User should avoid defragmenting multiple members + // at the same time. + // To defragment multiple members in the cluster, user need to call defragment multiple + // times with different endpoints. + Defragment(ctx context.Context, endpoint string) (*DefragmentResponse, error) +} + +type maintenance struct { + c *Client +} + +func (m *maintenance) Defragment(ctx context.Context, endpoint string) (*DefragmentResponse, error) { + conn, err := m.c.Dial(endpoint) + if err != nil { + return nil, err + } + remote := pb.NewMaintenanceClient(conn) + resp, err := remote.Defragment(ctx, &pb.DefragmentRequest{}) + if err != nil { + return nil, err + } + return (*DefragmentResponse)(resp), nil +} diff --git a/etcdctlv3/command/defrag_command.go b/etcdctlv3/command/defrag_command.go new file mode 100644 index 000000000..37f4ecfd0 --- /dev/null +++ b/etcdctlv3/command/defrag_command.go @@ -0,0 +1,44 @@ +// Copyright 2016 CoreOS, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package command + +import ( + "fmt" + "os" + + "github.com/coreos/etcd/Godeps/_workspace/src/github.com/spf13/cobra" + "github.com/coreos/etcd/Godeps/_workspace/src/golang.org/x/net/context" +) + +// NewDefragCommand returns the cobra command for "Defrag". +func NewDefragCommand() *cobra.Command { + return &cobra.Command{ + Use: "defrag", + Short: "defrag defragments the storage of the etcd members with given endpoints.", + Run: defragCommandFunc, + } +} + +func defragCommandFunc(cmd *cobra.Command, args []string) { + c := mustClientFromCmd(cmd) + for _, ep := range c.Endpoints() { + _, err := c.Defragment(context.TODO(), ep) + if err != nil { + fmt.Fprintf(os.Stderr, "Failed to defragment etcd member[%s] (%v)\n", ep, err) + } else { + fmt.Printf("Finished defragmenting etcd member[%s]\n", ep) + } + } +} diff --git a/etcdctlv3/main.go b/etcdctlv3/main.go index c76b795bc..135c458d0 100644 --- a/etcdctlv3/main.go +++ b/etcdctlv3/main.go @@ -56,6 +56,7 @@ func init() { command.NewDelCommand(), command.NewTxnCommand(), command.NewCompactionCommand(), + command.NewDefragCommand(), command.NewWatchCommand(), command.NewVersionCommand(), command.NewLeaseCommand(),