mirror of https://github.com/k3s-io/k3s
Fix MemberList error handling and incorrect etcd-arg passthrough
Signed-off-by: Brad Davidson <brad.davidson@rancher.com>
(cherry picked from commit e61fde93c1
)
pull/7536/head
parent
17727761ae
commit
a1162668ab
|
@ -424,8 +424,8 @@ func (e *ETCD) Start(ctx context.Context, clientAccessInfo *clientaccess.Info) e
|
||||||
if err := wait.PollImmediateUntilWithContext(ctx, time.Second, func(ctx context.Context) (bool, error) {
|
if err := wait.PollImmediateUntilWithContext(ctx, time.Second, func(ctx context.Context) (bool, error) {
|
||||||
if err := e.join(ctx, clientAccessInfo); err != nil {
|
if err := e.join(ctx, clientAccessInfo); err != nil {
|
||||||
// Retry the join if waiting for another member to be promoted, or waiting for peers to connect after promotion
|
// Retry the join if waiting for another member to be promoted, or waiting for peers to connect after promotion
|
||||||
if errors.Is(err, rpctypes.ErrTooManyLearners) || errors.Is(err, rpctypes.ErrGRPCUnhealthy) {
|
if errors.Is(err, rpctypes.ErrTooManyLearners) || errors.Is(err, rpctypes.ErrUnhealthy) {
|
||||||
logrus.Infof("Waiting for other members to finish joining etcd cluster")
|
logrus.Infof("Waiting for other members to finish joining etcd cluster: %v", err)
|
||||||
return false, nil
|
return false, nil
|
||||||
}
|
}
|
||||||
return false, err
|
return false, err
|
||||||
|
@ -465,19 +465,7 @@ func (e *ETCD) join(ctx context.Context, clientAccessInfo *clientaccess.Info) er
|
||||||
}
|
}
|
||||||
defer client.Close()
|
defer client.Close()
|
||||||
|
|
||||||
members, err := client.MemberList(clientCtx)
|
for _, member := range memberList.Members {
|
||||||
if err != nil {
|
|
||||||
logrus.Errorf("Failed to get member list from etcd cluster. Will assume this member is already added")
|
|
||||||
members = &clientv3.MemberListResponse{
|
|
||||||
Members: append(memberList.Members, &etcdserverpb.Member{
|
|
||||||
Name: e.name,
|
|
||||||
PeerURLs: []string{e.peerURL()},
|
|
||||||
}),
|
|
||||||
}
|
|
||||||
add = false
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, member := range members.Members {
|
|
||||||
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 {
|
||||||
|
@ -620,6 +608,7 @@ func (e *ETCD) handler(next http.Handler) http.Handler {
|
||||||
}
|
}
|
||||||
|
|
||||||
// infoHandler returns etcd cluster information. This is used by new members when joining the cluster.
|
// infoHandler returns etcd cluster information. This is used by new members when joining the cluster.
|
||||||
|
// If we can't retrieve an actual MemberList from etcd, we return a canned response with only the local node listed.
|
||||||
func (e *ETCD) infoHandler() http.Handler {
|
func (e *ETCD) infoHandler() http.Handler {
|
||||||
return http.HandlerFunc(func(rw http.ResponseWriter, req *http.Request) {
|
return http.HandlerFunc(func(rw http.ResponseWriter, req *http.Request) {
|
||||||
ctx, cancel := context.WithTimeout(req.Context(), 2*time.Second)
|
ctx, cancel := context.WithTimeout(req.Context(), 2*time.Second)
|
||||||
|
@ -627,7 +616,8 @@ func (e *ETCD) infoHandler() http.Handler {
|
||||||
|
|
||||||
members, err := e.client.MemberList(ctx)
|
members, err := e.client.MemberList(ctx)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
json.NewEncoder(rw).Encode(&Members{
|
logrus.Warnf("Failed to get etcd MemberList for %s: %v", req.RemoteAddr, err)
|
||||||
|
members = &clientv3.MemberListResponse{
|
||||||
Members: []*etcdserverpb.Member{
|
Members: []*etcdserverpb.Member{
|
||||||
{
|
{
|
||||||
Name: e.name,
|
Name: e.name,
|
||||||
|
@ -635,8 +625,7 @@ func (e *ETCD) infoHandler() http.Handler {
|
||||||
ClientURLs: []string{e.clientURL()},
|
ClientURLs: []string{e.clientURL()},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
})
|
}
|
||||||
return
|
|
||||||
}
|
}
|
||||||
|
|
||||||
rw.Header().Set("Content-Type", "application/json")
|
rw.Header().Set("Content-Type", "application/json")
|
||||||
|
@ -921,7 +910,7 @@ func (e *ETCD) StartEmbeddedTemporary(ctx context.Context) error {
|
||||||
Name: e.name,
|
Name: e.name,
|
||||||
LogOutputs: []string{"stderr"},
|
LogOutputs: []string{"stderr"},
|
||||||
ExperimentalInitialCorruptCheck: true,
|
ExperimentalInitialCorruptCheck: true,
|
||||||
}, append(e.config.ExtraAPIArgs, "--max-snapshots=0", "--max-wals=0"))
|
}, append(e.config.ExtraEtcdArgs, "--max-snapshots=0", "--max-wals=0"))
|
||||||
}
|
}
|
||||||
|
|
||||||
func addPort(address string, offset int) (string, error) {
|
func addPort(address string, offset int) (string, error) {
|
||||||
|
|
Loading…
Reference in New Issue