Commit a5c6e6a6 authored by Brad Davidson's avatar Brad Davidson Committed by Brad Davidson

Fix panic checking name of uninitialized etcd member

parent 02f862da
...@@ -361,32 +361,43 @@ func (e *ETCD) join(ctx context.Context, clientAccessInfo *clientaccess.Info) er ...@@ -361,32 +361,43 @@ func (e *ETCD) join(ctx context.Context, clientAccessInfo *clientaccess.Info) er
} }
for _, member := range members.Members { 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 {
logrus.Errorf("Failed to remove etcd name file %s: %v", nameFile, err)
}
return errors.New("duplicate node name found, please use a unique name for this node")
}
for _, peer := range member.PeerURLs { for _, peer := range member.PeerURLs {
u, err := url.Parse(peer) u, err := url.Parse(peer)
if err != nil { if err != nil {
return err return err
} }
// An uninitialized member won't have a name // An uninitialized joining member won't have a name; if it has our
if u.Hostname() == e.address && (member.Name == e.name || member.Name == "") { // address it must be us.
add = false
}
if member.Name == "" && u.Hostname() == e.address { if member.Name == "" && u.Hostname() == e.address {
member.Name = e.name member.Name = e.name
} }
// If we're already in the cluster, don't try to add ourselves.
if member.Name == e.name && u.Hostname() == e.address {
add = false
}
if len(member.PeerURLs) > 0 { if len(member.PeerURLs) > 0 {
cluster = append(cluster, fmt.Sprintf("%s=%s", member.Name, member.PeerURLs[0])) cluster = append(cluster, fmt.Sprintf("%s=%s", member.Name, member.PeerURLs[0]))
} }
} }
// Try to get the node name from the member name
memberNodeName := member.Name
if lastHyphen := strings.LastIndex(member.Name, "-"); lastHyphen > 1 {
memberNodeName = member.Name[:lastHyphen]
}
// Make sure there's not already a member in the cluster with a duplicate node name
if member.Name != e.name && memberNodeName == e.config.ServerNodeName {
// make sure to remove the name file if a duplicate node name is used, so that we
// generate a new member name when our node name is fixed.
nameFile := nameFile(e.config)
if err := os.Remove(nameFile); err != nil {
logrus.Errorf("Failed to remove etcd name file %s: %v", nameFile, err)
}
return errors.New("duplicate node name found, please use a unique name for this node")
}
} }
if add { if add {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment