|
|
@ -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())
|
|
|
|