1
0
Fork 0

join endpoint returns HTTP 301 if necessary

master
Philip O'Toole 8 years ago
parent 556fbd5d85
commit 729221bf57

@ -270,6 +270,18 @@ func (s *Service) handleJoin(w http.ResponseWriter, r *http.Request) {
}
if err := s.store.Join(remoteAddr); err != nil {
if err == store.ErrNotLeader {
leader := s.store.Peer(s.store.Leader())
if leader == "" {
http.Error(w, err.Error(), http.StatusServiceUnavailable)
return
}
redirect := s.FormRedirect(r, leader)
http.Redirect(w, r, redirect, http.StatusMovedPermanently)
return
}
b := bytes.NewBufferString(err.Error())
w.WriteHeader(http.StatusInternalServerError)
w.Write(b.Bytes())

@ -518,10 +518,16 @@ func (s *Store) UpdateAPIPeers(peers map[string]string) error {
// respond to Raft communications at that address.
func (s *Store) Join(addr string) error {
s.logger.Printf("received request to join node at %s", addr)
if s.raft.State() != raft.Leader {
return ErrNotLeader
}
f := s.raft.AddPeer(addr)
if f.Error() != nil {
return f.Error()
if e := f.(raft.Future); e.Error() != nil {
if e.Error() == raft.ErrNotLeader {
return ErrNotLeader
}
e.Error()
}
s.logger.Printf("node at %s joined successfully", addr)
return nil

Loading…
Cancel
Save