1
0
Fork 0

Return redirect if remove on follower

Fixes issue #391.
master
Philip O'Toole 7 years ago
parent 9601e6eb18
commit efec4d4e42

@ -1,5 +1,6 @@
## 4.2.3 (unreleased)
- [PR #389](https://github.com/rqlite/rqlite/pull/389): Log Store directory path on startup.
- [PR #392](https://github.com/rqlite/rqlite/pull/392): Return redirect if node removal attempted on follower. Fixes [issue #391](https://github.com/rqlite/rqlite/issues/391).
## 4.2.2 (December 7th 2017)
- [PR #383](https://github.com/rqlite/rqlite/pull/383): Fix unit tests after underlying SQLite master table changes.

@ -355,6 +355,18 @@ func (s *Service) handleRemove(w http.ResponseWriter, r *http.Request) {
}
if err := s.store.Remove(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
}
w.WriteHeader(http.StatusInternalServerError)
return
}

@ -597,9 +597,15 @@ func (s *Store) Join(addr string) error {
// Remove removes a node from the store, specified by addr.
func (s *Store) Remove(addr string) error {
s.logger.Printf("received request to remove node %s", addr)
if s.raft.State() != raft.Leader {
return ErrNotLeader
}
f := s.raft.RemovePeer(addr)
if f.Error() != nil {
if f.Error() == raft.ErrNotLeader {
return ErrNotLeader
}
return f.Error()
}
s.logger.Printf("node %s removed successfully", addr)

Loading…
Cancel
Save