1
0
Fork 0

Merge pull request #978 from rqlite/ignore-same-id-join

Return error on join request if node ID is same
master
Philip O'Toole 3 years ago committed by GitHub
commit ef546d64fa
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -33,6 +33,10 @@ var (
// operation.
ErrNotLeader = errors.New("not leader")
// ErrSelfJoin is returned when a join-request is received from a node
// with the same Raft ID as this node.
ErrSelfJoin = errors.New("self-join attempted")
// ErrStaleRead is returned if the executing the query would violate the
// requested freshness.
ErrStaleRead = errors.New("stale read")
@ -890,6 +894,9 @@ func (s *Store) Join(id, addr string, voter bool) error {
if s.raft.State() != raft.Leader {
return ErrNotLeader
}
if id == s.raftID {
return ErrSelfJoin
}
configFuture := s.raft.GetConfiguration()
if err := configFuture.Error(); err != nil {

@ -2,6 +2,7 @@ package store
import (
"bytes"
"errors"
"fmt"
"io/ioutil"
"math/rand"
@ -993,6 +994,32 @@ func Test_SingleNodeRecoverNetworkChangeSnapshot(t *testing.T) {
}
}
func Test_SingleNodeSelfJoinFail(t *testing.T) {
s0, ln0 := mustNewStore(true)
defer os.RemoveAll(s0.Path())
defer ln0.Close()
if err := s0.Open(); err != nil {
t.Fatalf("failed to open single-node store: %s", err.Error())
}
defer s0.Close(true)
if err := s0.Bootstrap(NewServer(s0.ID(), s0.Addr(), true)); err != nil {
t.Fatalf("failed to bootstrap single-node store: %s", err.Error())
}
if _, err := s0.WaitForLeader(10 * time.Second); err != nil {
t.Fatalf("Error waiting for leader: %s", err)
}
// Self-join should fail.
err := s0.Join(s0.ID(), s0.Addr(), true)
if err == nil {
t.Fatalf("failed to receive error for self-join")
}
if !errors.Is(err, ErrSelfJoin) {
t.Fatalf("received wrong error for self-join attempt: %s", err)
}
}
func Test_MultiNodeJoinRemove(t *testing.T) {
s0, ln0 := mustNewStore(true)
defer os.RemoveAll(s0.Path())

Loading…
Cancel
Save