1
0
Fork 0

Switch to error on self-join attempt

master
Philip O'Toole 3 years ago
parent a524ed4979
commit 9783ef24b1

@ -33,6 +33,10 @@ var (
// operation. // operation.
ErrNotLeader = errors.New("not leader") 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 // ErrStaleRead is returned if the executing the query would violate the
// requested freshness. // requested freshness.
ErrStaleRead = errors.New("stale read") ErrStaleRead = errors.New("stale read")
@ -891,8 +895,7 @@ func (s *Store) Join(id, addr string, voter bool) error {
return ErrNotLeader return ErrNotLeader
} }
if id == s.raftID { if id == s.raftID {
s.logger.Printf("ignoring join-request with same ID as this node") return ErrSelfJoin
return nil
} }
configFuture := s.raft.GetConfiguration() configFuture := s.raft.GetConfiguration()

@ -2,6 +2,7 @@ package store
import ( import (
"bytes" "bytes"
"errors"
"fmt" "fmt"
"io/ioutil" "io/ioutil"
"math/rand" "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) { func Test_MultiNodeJoinRemove(t *testing.T) {
s0, ln0 := mustNewStore(true) s0, ln0 := mustNewStore(true)
defer os.RemoveAll(s0.Path()) defer os.RemoveAll(s0.Path())

Loading…
Cancel
Save