From 70d3bd74960dc7127870a393affffbe1df94728e Mon Sep 17 00:00:00 2001 From: Hongchao Deng Date: Tue, 23 Jan 2018 11:16:48 -0800 Subject: [PATCH] *: make each new member name unique (#1875) --- pkg/cluster/cluster.go | 6 ++---- pkg/cluster/member.go | 12 +++--------- pkg/cluster/reconcile.go | 3 +-- pkg/cluster/self_hosted.go | 9 +++------ pkg/controller/restore-operator/sync.go | 2 +- pkg/util/etcdutil/member.go | 17 ----------------- pkg/util/k8sutil/k8sutil.go | 5 +++++ 7 files changed, 15 insertions(+), 39 deletions(-) diff --git a/pkg/cluster/cluster.go b/pkg/cluster/cluster.go index 08f3b95f8..2cbfe3992 100644 --- a/pkg/cluster/cluster.go +++ b/pkg/cluster/cluster.go @@ -73,8 +73,7 @@ type Cluster struct { // in memory state of the cluster // status is the source of truth after Cluster struct is materialized. - status api.ClusterStatus - memberCounter int + status api.ClusterStatus eventCh chan *clusterEvent stopCh chan struct{} @@ -326,7 +325,7 @@ func isSpecEqual(s1, s2 api.ClusterSpec) bool { func (c *Cluster) startSeedMember() error { m := &etcdutil.Member{ - Name: etcdutil.CreateMemberName(c.cluster.Name, c.memberCounter), + Name: k8sutil.UniqueMemberName(c.cluster.Name), Namespace: c.cluster.Namespace, SecurePeer: c.isSecurePeer(), SecureClient: c.isSecureClient(), @@ -335,7 +334,6 @@ func (c *Cluster) startSeedMember() error { if err := c.createPod(ms, m, "new"); err != nil { return fmt.Errorf("failed to create seed member (%s): %v", m.Name, err) } - c.memberCounter++ c.members = ms c.logger.Infof("cluster created with seed member (%s)", m.Name) _, err := c.eventsCli.Create(k8sutil.NewMemberAddEvent(m.Name, c.cluster)) diff --git a/pkg/cluster/member.go b/pkg/cluster/member.go index 11fce2d81..292551413 100644 --- a/pkg/cluster/member.go +++ b/pkg/cluster/member.go @@ -20,6 +20,7 @@ import ( api "github.com/coreos/etcd-operator/pkg/apis/etcd/v1beta2" "github.com/coreos/etcd-operator/pkg/util/etcdutil" + "github.com/coreos/etcd-operator/pkg/util/k8sutil" "github.com/coreos/etcd/etcdserver/etcdserverpb" "github.com/pkg/errors" @@ -37,13 +38,6 @@ func (c *Cluster) updateMembers(known etcdutil.MemberSet) error { if err != nil { return errors.Wrap(err, "get member name failed") } - ct, err := etcdutil.GetCounterFromMemberName(name) - if err != nil { - return newFatalError(fmt.Sprintf("get counter from member name (%s) failed: %v", name, err)) - } - if ct+1 > c.memberCounter { - c.memberCounter = ct + 1 - } members[name] = &etcdutil.Member{ Name: name, @@ -57,8 +51,8 @@ func (c *Cluster) updateMembers(known etcdutil.MemberSet) error { return nil } -func (c *Cluster) newMember(id int) *etcdutil.Member { - name := etcdutil.CreateMemberName(c.cluster.Name, id) +func (c *Cluster) newMember() *etcdutil.Member { + name := k8sutil.UniqueMemberName(c.cluster.Name) return &etcdutil.Member{ Name: name, Namespace: c.cluster.Namespace, diff --git a/pkg/cluster/reconcile.go b/pkg/cluster/reconcile.go index 1aa672c63..9bc310cf7 100644 --- a/pkg/cluster/reconcile.go +++ b/pkg/cluster/reconcile.go @@ -131,7 +131,7 @@ func (c *Cluster) addOneMember() error { } defer etcdcli.Close() - newMember := c.newMember(c.memberCounter) + newMember := c.newMember() ctx, cancel := context.WithTimeout(context.Background(), constants.DefaultRequestTimeout) resp, err := etcdcli.MemberAdd(ctx, []string{newMember.PeerURL()}) cancel() @@ -144,7 +144,6 @@ func (c *Cluster) addOneMember() error { if err := c.createPod(c.members, newMember, "existing"); err != nil { return fmt.Errorf("fail to create member's pod (%s): %v", newMember.Name, err) } - c.memberCounter++ c.logger.Infof("added member (%s)", newMember.Name) _, err = c.eventsCli.Create(k8sutil.NewMemberAddEvent(newMember.Name, c.cluster)) if err != nil { diff --git a/pkg/cluster/self_hosted.go b/pkg/cluster/self_hosted.go index a3049a518..e761d8b60 100644 --- a/pkg/cluster/self_hosted.go +++ b/pkg/cluster/self_hosted.go @@ -129,8 +129,7 @@ func (c *Cluster) addOneSelfHostedMember() error { c.status.SetScalingUpCondition(c.members.Size(), c.cluster.Spec.Size) - newMember := c.newMember(c.memberCounter) - c.memberCounter++ + newMember := c.newMember() peerURL := newMember.PeerURL() initialCluster := append(c.members.PeerURLPairs(), newMember.Name+"="+peerURL) @@ -159,8 +158,7 @@ func (c *Cluster) addOneSelfHostedMember() error { } func (c *Cluster) newSelfHostedSeedMember() error { - newMember := c.newMember(c.memberCounter) - c.memberCounter++ + newMember := c.newMember() initialCluster := []string{newMember.Name + "=" + newMember.PeerURL()} pod := k8sutil.NewSelfHostedEtcdPod(newMember, initialCluster, nil, c.cluster.Name, "new", uuid.New(), c.cluster.Spec, c.cluster.AsOwner()) @@ -196,8 +194,7 @@ func (c *Cluster) migrateBootMember() error { } // create the member inside Kubernetes for migration - newMember := c.newMember(c.memberCounter) - c.memberCounter++ + newMember := c.newMember() peerURL := newMember.PeerURL() initialCluster = append(initialCluster, newMember.Name+"="+peerURL) diff --git a/pkg/controller/restore-operator/sync.go b/pkg/controller/restore-operator/sync.go index 785e1141f..6a00f4798 100644 --- a/pkg/controller/restore-operator/sync.go +++ b/pkg/controller/restore-operator/sync.go @@ -212,7 +212,7 @@ func (r *Restore) prepareSeed(er *api.EtcdRestore) (err error) { func (r *Restore) createSeedMember(ec *api.EtcdCluster, svcAddr, clusterName string, owner metav1.OwnerReference) error { m := &etcdutil.Member{ - Name: etcdutil.CreateMemberName(clusterName, 0), + Name: k8sutil.UniqueMemberName(clusterName), Namespace: r.namespace, SecurePeer: ec.Spec.TLS.IsSecurePeer(), SecureClient: ec.Spec.TLS.IsSecureClient(), diff --git a/pkg/util/etcdutil/member.go b/pkg/util/etcdutil/member.go index ffc80c256..9e89977f3 100644 --- a/pkg/util/etcdutil/member.go +++ b/pkg/util/etcdutil/member.go @@ -19,7 +19,6 @@ import ( "fmt" "net/url" "regexp" - "strconv" "strings" ) @@ -149,18 +148,6 @@ func (ms MemberSet) ClientURLs() []string { return endpoints } -func GetCounterFromMemberName(name string) (int, error) { - i := strings.LastIndex(name, "-") - if i == -1 || i+1 >= len(name) { - return 0, fmt.Errorf("name (%s) does not contain '-' or anything after '-'", name) - } - c, err := strconv.Atoi(name[i+1:]) - if err != nil { - return 0, fmt.Errorf("could not atoi %s: %v", name[i+1:], err) - } - return c, nil -} - var validPeerURL = regexp.MustCompile(`^\w+:\/\/[\w\.\-]+(:\d+)?$`) func MemberNameFromPeerURL(pu string) (string, error) { @@ -177,10 +164,6 @@ func MemberNameFromPeerURL(pu string) (string, error) { return name, err } -func CreateMemberName(clusterName string, member int) string { - return fmt.Sprintf("%s-%04d", clusterName, member) -} - func clusterNameFromMemberName(mn string) string { i := strings.LastIndex(mn, "-") if i == -1 { diff --git a/pkg/util/k8sutil/k8sutil.go b/pkg/util/k8sutil/k8sutil.go index 272d6f022..87336febd 100644 --- a/pkg/util/k8sutil/k8sutil.go +++ b/pkg/util/k8sutil/k8sutil.go @@ -35,6 +35,7 @@ import ( "k8s.io/apimachinery/pkg/labels" "k8s.io/apimachinery/pkg/types" "k8s.io/apimachinery/pkg/util/intstr" + utilrand "k8s.io/apimachinery/pkg/util/rand" "k8s.io/apimachinery/pkg/util/strategicpatch" "k8s.io/client-go/kubernetes" _ "k8s.io/client-go/plugin/pkg/client/auth/gcp" // for gcp auth @@ -471,3 +472,7 @@ func mergeLabels(l1, l2 map[string]string) { l1[k] = v } } + +func UniqueMemberName(clusterName string) string { + return fmt.Sprintf("%s-%s", clusterName, utilrand.String(5)) +}