From b78886239e416aecfb74a989bfbb4a8e70b8b610 Mon Sep 17 00:00:00 2001 From: Gyu-Ho Lee Date: Wed, 13 Apr 2016 16:19:12 -0700 Subject: [PATCH 1/3] *: remove IsLeader field in Member API server side --- etcdserver/api/v3rpc/member.go | 3 +- etcdserver/etcdserverpb/rpc.pb.go | 55 +++++++------------------------ etcdserver/etcdserverpb/rpc.proto | 6 ++-- 3 files changed, 14 insertions(+), 50 deletions(-) diff --git a/etcdserver/api/v3rpc/member.go b/etcdserver/api/v3rpc/member.go index 351a998c2..aaf767e6b 100644 --- a/etcdserver/api/v3rpc/member.go +++ b/etcdserver/api/v3rpc/member.go @@ -62,7 +62,7 @@ func (cs *ClusterServer) MemberAdd(ctx context.Context, r *pb.MemberAddRequest) return &pb.MemberAddResponse{ Header: cs.header(), - Member: &pb.Member{ID: uint64(m.ID), IsLeader: m.ID == cs.server.Leader(), PeerURLs: m.PeerURLs}, + Member: &pb.Member{ID: uint64(m.ID), PeerURLs: m.PeerURLs}, }, nil } @@ -106,7 +106,6 @@ func (cs *ClusterServer) MemberList(ctx context.Context, r *pb.MemberListRequest protoMembs[i] = &pb.Member{ Name: membs[i].Name, ID: uint64(membs[i].ID), - IsLeader: membs[i].ID == cs.server.Leader(), PeerURLs: membs[i].PeerURLs, ClientURLs: membs[i].ClientURLs, } diff --git a/etcdserver/etcdserverpb/rpc.pb.go b/etcdserver/etcdserverpb/rpc.pb.go index 8a2f9d84a..a3b2468b7 100644 --- a/etcdserver/etcdserverpb/rpc.pb.go +++ b/etcdserver/etcdserverpb/rpc.pb.go @@ -8,20 +8,21 @@ import ( "fmt" proto "github.com/gogo/protobuf/proto" + + math "math" + + authpb "github.com/coreos/etcd/auth/authpb" + + io "io" ) -import math "math" - import storagepb "github.com/coreos/etcd/storage/storagepb" -import authpb "github.com/coreos/etcd/auth/authpb" import ( context "golang.org/x/net/context" grpc "google.golang.org/grpc" ) -import io "io" - // Reference imports to suppress errors if they are not otherwise used. var _ = proto.Marshal var _ = fmt.Errorf @@ -1094,11 +1095,10 @@ type Member struct { ID uint64 `protobuf:"varint,1,opt,name=ID,proto3" json:"ID,omitempty"` // If the member is not started, name will be an empty string. Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` - IsLeader bool `protobuf:"varint,3,opt,name=IsLeader,proto3" json:"IsLeader,omitempty"` - PeerURLs []string `protobuf:"bytes,4,rep,name=peerURLs" json:"peerURLs,omitempty"` + PeerURLs []string `protobuf:"bytes,3,rep,name=peerURLs" json:"peerURLs,omitempty"` // If the member is not started, client_URLs will be an zero length // string array. - ClientURLs []string `protobuf:"bytes,5,rep,name=clientURLs" json:"clientURLs,omitempty"` + ClientURLs []string `protobuf:"bytes,4,rep,name=clientURLs" json:"clientURLs,omitempty"` } func (m *Member) Reset() { *m = Member{} } @@ -4138,19 +4138,9 @@ func (m *Member) MarshalTo(data []byte) (int, error) { i = encodeVarintRpc(data, i, uint64(len(m.Name))) i += copy(data[i:], m.Name) } - if m.IsLeader { - data[i] = 0x18 - i++ - if m.IsLeader { - data[i] = 1 - } else { - data[i] = 0 - } - i++ - } if len(m.PeerURLs) > 0 { for _, s := range m.PeerURLs { - data[i] = 0x22 + data[i] = 0x1a i++ l = len(s) for l >= 1<<7 { @@ -4165,7 +4155,7 @@ func (m *Member) MarshalTo(data []byte) (int, error) { } if len(m.ClientURLs) > 0 { for _, s := range m.ClientURLs { - data[i] = 0x2a + data[i] = 0x22 i++ l = len(s) for l >= 1<<7 { @@ -5916,9 +5906,6 @@ func (m *Member) Size() (n int) { if l > 0 { n += 1 + l + sovRpc(uint64(l)) } - if m.IsLeader { - n += 2 - } if len(m.PeerURLs) > 0 { for _, s := range m.PeerURLs { l = len(s) @@ -9759,26 +9746,6 @@ func (m *Member) Unmarshal(data []byte) error { m.Name = string(data[iNdEx:postIndex]) iNdEx = postIndex case 3: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field IsLeader", wireType) - } - var v int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowRpc - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := data[iNdEx] - iNdEx++ - v |= (int(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - m.IsLeader = bool(v != 0) - case 4: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field PeerURLs", wireType) } @@ -9807,7 +9774,7 @@ func (m *Member) Unmarshal(data []byte) error { } m.PeerURLs = append(m.PeerURLs, string(data[iNdEx:postIndex])) iNdEx = postIndex - case 5: + case 4: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field ClientURLs", wireType) } diff --git a/etcdserver/etcdserverpb/rpc.proto b/etcdserver/etcdserverpb/rpc.proto index 8d4d9b93d..f1a5ed96c 100644 --- a/etcdserver/etcdserverpb/rpc.proto +++ b/etcdserver/etcdserverpb/rpc.proto @@ -417,11 +417,10 @@ message Member { uint64 ID = 1; // If the member is not started, name will be an empty string. string name = 2; - bool IsLeader = 3; - repeated string peerURLs = 4; + repeated string peerURLs = 3; // If the member is not started, client_URLs will be an zero length // string array. - repeated string clientURLs = 5; + repeated string clientURLs = 4; } message MemberAddRequest { @@ -459,7 +458,6 @@ message MemberListResponse { } message DefragmentRequest { - } message DefragmentResponse { From 2c6176b5f2520cf9e62dd91ea72a701cc76d26cd Mon Sep 17 00:00:00 2001 From: Gyu-Ho Lee Date: Wed, 13 Apr 2016 16:21:30 -0700 Subject: [PATCH 2/3] *: remove MemberLeader API in client side (fix examples) --- clientv3/cluster.go | 16 ------ clientv3/example_cluster_test.go | 18 ------- clientv3/example_maintenence_test.go | 51 +++++++++++++++++++ clientv3/example_test.go | 2 +- etcdctl/ctlv3/command/printer.go | 3 +- .../functional-tester/etcd-tester/cluster.go | 33 ++++++------ 6 files changed, 71 insertions(+), 52 deletions(-) create mode 100644 clientv3/example_maintenence_test.go diff --git a/clientv3/cluster.go b/clientv3/cluster.go index 8d1369cb3..3acc63e5f 100644 --- a/clientv3/cluster.go +++ b/clientv3/cluster.go @@ -34,9 +34,6 @@ type Cluster interface { // MemberList lists the current cluster membership. MemberList(ctx context.Context) (*MemberListResponse, error) - // MemberLeader returns the current leader member. - MemberLeader(ctx context.Context) (*Member, error) - // MemberAdd adds a new member into the cluster. MemberAdd(ctx context.Context, peerAddrs []string) (*MemberAddResponse, error) @@ -135,19 +132,6 @@ func (c *cluster) MemberList(ctx context.Context) (*MemberListResponse, error) { } } -func (c *cluster) MemberLeader(ctx context.Context) (*Member, error) { - resp, err := c.MemberList(ctx) - if err != nil { - return nil, err - } - for _, m := range resp.Members { - if m.IsLeader { - return (*Member)(m), nil - } - } - return nil, nil -} - func (c *cluster) getRemote() pb.ClusterClient { c.mu.Lock() defer c.mu.Unlock() diff --git a/clientv3/example_cluster_test.go b/clientv3/example_cluster_test.go index 666be25d8..891bbaf8e 100644 --- a/clientv3/example_cluster_test.go +++ b/clientv3/example_cluster_test.go @@ -40,24 +40,6 @@ func ExampleCluster_memberList() { // members: 3 } -func ExampleCluster_memberLeader() { - cli, err := clientv3.New(clientv3.Config{ - Endpoints: endpoints, - DialTimeout: dialTimeout, - }) - if err != nil { - log.Fatal(err) - } - defer cli.Close() - - resp, err := cli.MemberLeader(context.Background()) - if err != nil { - log.Fatal(err) - } - fmt.Println("leader:", resp.Name) - // leader: infra1 -} - func ExampleCluster_memberAdd() { cli, err := clientv3.New(clientv3.Config{ Endpoints: endpoints[:2], diff --git a/clientv3/example_maintenence_test.go b/clientv3/example_maintenence_test.go new file mode 100644 index 000000000..0f1e7c9ec --- /dev/null +++ b/clientv3/example_maintenence_test.go @@ -0,0 +1,51 @@ +// 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_test + +import ( + "fmt" + "log" + + "golang.org/x/net/context" + + "github.com/coreos/etcd/clientv3" +) + +func ExampleMaintenance_Status() { + for _, ep := range endpoints { + cli, err := clientv3.New(clientv3.Config{ + Endpoints: []string{ep}, + DialTimeout: dialTimeout, + }) + if err != nil { + log.Fatal(err) + } + defer cli.Close() + + // resp, err := cli.Status(context.Background(), ep) + // + // or + // + mapi := clientv3.NewMaintenance(cli) + resp, err := mapi.Status(context.Background(), ep) + if err != nil { + log.Fatal(err) + } + fmt.Printf("endpoint: %s / IsLeader: %v\n", ep, resp.Header.MemberId == resp.Leader) + } + // endpoint: localhost:2379 / IsLeader: false + // endpoint: localhost:22379 / IsLeader: false + // endpoint: localhost:32379 / IsLeader: true +} diff --git a/clientv3/example_test.go b/clientv3/example_test.go index 99fade677..208d1a9eb 100644 --- a/clientv3/example_test.go +++ b/clientv3/example_test.go @@ -25,7 +25,7 @@ import ( var ( dialTimeout = 5 * time.Second requestTimeout = 1 * time.Second - endpoints = []string{"localhost:2379", "localhost:22379", "http://localhost:32379"} + endpoints = []string{"localhost:2379", "localhost:22379", "localhost:32379"} ) func Example() { diff --git a/etcdctl/ctlv3/command/printer.go b/etcdctl/ctlv3/command/printer.go index 7c6c8a485..2c3eb332e 100644 --- a/etcdctl/ctlv3/command/printer.go +++ b/etcdctl/ctlv3/command/printer.go @@ -108,7 +108,7 @@ func (s *simplePrinter) Alarm(resp v3.AlarmResponse) { func (s *simplePrinter) MemberList(resp v3.MemberListResponse) { table := tablewriter.NewWriter(os.Stdout) - table.SetHeader([]string{"ID", "Status", "Name", "Peer Addrs", "Client Addrs", "Is Leader"}) + table.SetHeader([]string{"ID", "Status", "Name", "Peer Addrs", "Client Addrs"}) for _, m := range resp.Members { status := "started" @@ -122,7 +122,6 @@ func (s *simplePrinter) MemberList(resp v3.MemberListResponse) { m.Name, strings.Join(m.PeerURLs, ","), strings.Join(m.ClientURLs, ","), - fmt.Sprint(m.IsLeader), }) } diff --git a/tools/functional-tester/etcd-tester/cluster.go b/tools/functional-tester/etcd-tester/cluster.go index 86e02a231..94a7ac63d 100644 --- a/tools/functional-tester/etcd-tester/cluster.go +++ b/tools/functional-tester/etcd-tester/cluster.go @@ -185,24 +185,27 @@ func (c *cluster) GetLeader() (int, error) { if c.v2Only { return 0, nil } - cli, err := clientv3.New(clientv3.Config{ - Endpoints: c.GRPCURLs, - DialTimeout: 5 * time.Second, - }) - if err != nil { - return 0, err - } - defer cli.Close() - clus := clientv3.NewCluster(cli) - mem, err := clus.MemberLeader(context.Background()) - if err != nil { - return 0, err - } - for i, name := range c.Names { - if name == mem.Name { + + for i, ep := range c.GRPCURLs { + cli, err := clientv3.New(clientv3.Config{ + Endpoints: []string{ep}, + DialTimeout: 5 * time.Second, + }) + if err != nil { + return 0, err + } + defer cli.Close() + + mapi := clientv3.NewMaintenance(cli) + resp, err := mapi.Status(context.Background(), ep) + if err != nil { + return 0, err + } + if resp.Header.MemberId == resp.Leader { return i, nil } } + return 0, fmt.Errorf("no leader found") } From 7a2ef3eb00bbb55114bbb5f3674d748553297058 Mon Sep 17 00:00:00 2001 From: Gyu-Ho Lee Date: Wed, 13 Apr 2016 16:23:07 -0700 Subject: [PATCH 3/3] *: regenerate proto buffers --- auth/authpb/auth.pb.go | 4 ++-- etcdserver/etcdserverpb/etcdserver.pb.go | 4 ++-- etcdserver/etcdserverpb/raft_internal.pb.go | 4 ++-- lease/leasepb/lease.pb.go | 4 ++-- raft/raftpb/raft.pb.go | 4 ++-- snap/snappb/snap.pb.go | 4 ++-- storage/storagepb/kv.pb.go | 4 ++-- wal/walpb/record.pb.go | 4 ++-- 8 files changed, 16 insertions(+), 16 deletions(-) diff --git a/auth/authpb/auth.pb.go b/auth/authpb/auth.pb.go index 44ffc6400..00a5cfe64 100644 --- a/auth/authpb/auth.pb.go +++ b/auth/authpb/auth.pb.go @@ -19,9 +19,9 @@ import ( "fmt" proto "github.com/gogo/protobuf/proto" -) -import math "math" + math "math" +) import io "io" diff --git a/etcdserver/etcdserverpb/etcdserver.pb.go b/etcdserver/etcdserverpb/etcdserver.pb.go index 832168929..3060806fd 100644 --- a/etcdserver/etcdserverpb/etcdserver.pb.go +++ b/etcdserver/etcdserverpb/etcdserver.pb.go @@ -94,9 +94,9 @@ import ( "fmt" proto "github.com/gogo/protobuf/proto" -) -import math "math" + math "math" +) import io "io" diff --git a/etcdserver/etcdserverpb/raft_internal.pb.go b/etcdserver/etcdserverpb/raft_internal.pb.go index 3cefe8f3d..0b3a5fed6 100644 --- a/etcdserver/etcdserverpb/raft_internal.pb.go +++ b/etcdserver/etcdserverpb/raft_internal.pb.go @@ -8,9 +8,9 @@ import ( "fmt" proto "github.com/gogo/protobuf/proto" -) -import math "math" + math "math" +) import io "io" diff --git a/lease/leasepb/lease.pb.go b/lease/leasepb/lease.pb.go index b98ca98ca..9c0d77124 100644 --- a/lease/leasepb/lease.pb.go +++ b/lease/leasepb/lease.pb.go @@ -17,9 +17,9 @@ import ( "fmt" proto "github.com/gogo/protobuf/proto" -) -import math "math" + math "math" +) import io "io" diff --git a/raft/raftpb/raft.pb.go b/raft/raftpb/raft.pb.go index 3421e8196..d5abecb48 100644 --- a/raft/raftpb/raft.pb.go +++ b/raft/raftpb/raft.pb.go @@ -23,9 +23,9 @@ import ( "fmt" proto "github.com/gogo/protobuf/proto" -) -import math "math" + math "math" +) import io "io" diff --git a/snap/snappb/snap.pb.go b/snap/snappb/snap.pb.go index 5d1d21ab3..f83fd411a 100644 --- a/snap/snappb/snap.pb.go +++ b/snap/snappb/snap.pb.go @@ -17,9 +17,9 @@ import ( "fmt" proto "github.com/gogo/protobuf/proto" -) -import math "math" + math "math" +) import io "io" diff --git a/storage/storagepb/kv.pb.go b/storage/storagepb/kv.pb.go index 02588904c..2987b9be6 100644 --- a/storage/storagepb/kv.pb.go +++ b/storage/storagepb/kv.pb.go @@ -18,9 +18,9 @@ import ( "fmt" proto "github.com/gogo/protobuf/proto" -) -import math "math" + math "math" +) import io "io" diff --git a/wal/walpb/record.pb.go b/wal/walpb/record.pb.go index 638bdc3b6..7ae042a51 100644 --- a/wal/walpb/record.pb.go +++ b/wal/walpb/record.pb.go @@ -18,9 +18,9 @@ import ( "fmt" proto "github.com/gogo/protobuf/proto" -) -import math "math" + math "math" +) import io "io"