etcdserver: forward member promote to leader

This commit is contained in:
Jingyi Hu
2019-04-30 15:51:36 -07:00
parent dfe296ac3c
commit f5eaaaf440
5 changed files with 307 additions and 21 deletions

View File

@ -15,11 +15,13 @@
package etcdserver
import (
"context"
"encoding/json"
"fmt"
"io/ioutil"
"net/http"
"sort"
"strings"
"time"
"go.etcd.io/etcd/etcdserver/api/membership"
@ -355,3 +357,47 @@ func getVersion(lg *zap.Logger, m *membership.Member, rt http.RoundTripper) (*ve
}
return nil, err
}
func promoteMemberHTTP(ctx context.Context, url string, id uint64, peerRt http.RoundTripper) ([]*membership.Member, error) {
cc := &http.Client{Transport: peerRt}
// TODO: refactor member http handler code
// cannot import etcdhttp, so manually construct url
requestUrl := url + "/members/promote/" + fmt.Sprintf("%d", id)
req, err := http.NewRequest("POST", requestUrl, nil)
if err != nil {
return nil, err
}
req = req.WithContext(ctx)
resp, err := cc.Do(req)
if err != nil {
return nil, err
}
defer resp.Body.Close()
b, err := ioutil.ReadAll(resp.Body)
if err != nil {
return nil, err
}
if resp.StatusCode == http.StatusRequestTimeout {
return nil, ErrTimeout
}
if resp.StatusCode == http.StatusPreconditionFailed {
// both ErrMemberNotLearner and ErrLearnerNotReady have same http status code
if strings.Contains(string(b), membership.ErrLearnerNotReady.Error()) {
return nil, membership.ErrLearnerNotReady
}
if strings.Contains(string(b), membership.ErrMemberNotLearner.Error()) {
return nil, membership.ErrMemberNotLearner
}
return nil, fmt.Errorf("member promote: unknown error(%s)", string(b))
}
if resp.StatusCode == http.StatusNotFound {
return nil, membership.ErrIDNotFound
}
var membs []*membership.Member
if err := json.Unmarshal(b, &membs); err != nil {
return nil, err
}
return membs, nil
}