From 0c109a58b0483f80f372de134e07e2e007e4fec1 Mon Sep 17 00:00:00 2001 From: Hussein Galal Date: Thu, 7 Oct 2021 22:28:42 +0200 Subject: [PATCH] Make sure there are no duplicates in etcd member list (#4025) (#4050) * Make sure there are no duplicates in etcd member list Signed-off-by: galal-hussein * fix node names with hyphens Signed-off-by: galal-hussein * use full server name for etcd node name Signed-off-by: galal-hussein --- pkg/cli/server/server.go | 1 + pkg/daemons/config/types.go | 1 + pkg/etcd/etcd.go | 16 +++++++++++----- 3 files changed, 13 insertions(+), 5 deletions(-) diff --git a/pkg/cli/server/server.go b/pkg/cli/server/server.go index 18aeb67deb..be9a988553 100644 --- a/pkg/cli/server/server.go +++ b/pkg/cli/server/server.go @@ -226,6 +226,7 @@ func run(app *cli.Context, cfg *cmds.Server, leaderControllers server.CustomCont if err != nil { return err } + serverConfig.ControlConfig.ServerNodeName = nodeName serverConfig.ControlConfig.SANs = append(serverConfig.ControlConfig.SANs, "127.0.0.1", "localhost", nodeName) for _, ip := range nodeIPs { serverConfig.ControlConfig.SANs = append(serverConfig.ControlConfig.SANs, ip.String()) diff --git a/pkg/daemons/config/types.go b/pkg/daemons/config/types.go index d5055eb148..35aaacf14d 100644 --- a/pkg/daemons/config/types.go +++ b/pkg/daemons/config/types.go @@ -166,6 +166,7 @@ type Control struct { EtcdS3BucketName string EtcdS3Region string EtcdS3Folder string + ServerNodeName string BindAddress string SANs []string diff --git a/pkg/etcd/etcd.go b/pkg/etcd/etcd.go index 7c06fa1b4d..e1a5caa7ad 100644 --- a/pkg/etcd/etcd.go +++ b/pkg/etcd/etcd.go @@ -323,6 +323,16 @@ func (e *ETCD) join(ctx context.Context, clientAccessInfo *clientaccess.Info) er } for _, member := range members.Members { + lastHyphen := strings.LastIndex(member.Name, "-") + memberNodeName := member.Name[:lastHyphen] + if memberNodeName == e.config.ServerNodeName { + // make sure to remove the name file if a duplicate node name is used + nameFile := nameFile(e.config) + if err := os.Remove(nameFile); err != nil { + return err + } + return errors.New("Failed to join etcd cluster due to duplicate node names, please use unique node name for the server") + } for _, peer := range member.PeerURLs { u, err := url.Parse(peer) if err != nil { @@ -408,11 +418,7 @@ func (e *ETCD) setName(force bool) error { fileName := nameFile(e.config) data, err := ioutil.ReadFile(fileName) if os.IsNotExist(err) || force { - h, err := os.Hostname() - if err != nil { - return err - } - e.name = strings.SplitN(h, ".", 2)[0] + "-" + uuid.New().String()[:8] + e.name = e.config.ServerNodeName + "-" + uuid.New().String()[:8] if err := os.MkdirAll(filepath.Dir(fileName), 0700); err != nil { return err }