Skip to content
This repository has been archived by the owner on Mar 28, 2020. It is now read-only.

Commit

Permalink
*: make each new member name unique (#1875)
Browse files Browse the repository at this point in the history
  • Loading branch information
hongchaodeng committed Jan 23, 2018
1 parent 4bc99c8 commit 70d3bd7
Show file tree
Hide file tree
Showing 7 changed files with 15 additions and 39 deletions.
6 changes: 2 additions & 4 deletions pkg/cluster/cluster.go
Original file line number Diff line number Diff line change
Expand Up @@ -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{}
Expand Down Expand Up @@ -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(),
Expand All @@ -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))
Expand Down
12 changes: 3 additions & 9 deletions pkg/cluster/member.go
Original file line number Diff line number Diff line change
Expand Up @@ -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"

Expand All @@ -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,
Expand All @@ -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,
Expand Down
3 changes: 1 addition & 2 deletions pkg/cluster/reconcile.go
Original file line number Diff line number Diff line change
Expand Up @@ -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()
Expand All @@ -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 {
Expand Down
9 changes: 3 additions & 6 deletions pkg/cluster/self_hosted.go
Original file line number Diff line number Diff line change
Expand Up @@ -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)

Expand Down Expand Up @@ -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())
Expand Down Expand Up @@ -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)
Expand Down
2 changes: 1 addition & 1 deletion pkg/controller/restore-operator/sync.go
Original file line number Diff line number Diff line change
Expand Up @@ -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(),
Expand Down
17 changes: 0 additions & 17 deletions pkg/util/etcdutil/member.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,6 @@ import (
"fmt"
"net/url"
"regexp"
"strconv"
"strings"
)

Expand Down Expand Up @@ -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) {
Expand All @@ -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 {
Expand Down
5 changes: 5 additions & 0 deletions pkg/util/k8sutil/k8sutil.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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))
}

0 comments on commit 70d3bd7

Please sign in to comment.