diff --git a/consul/serf.go b/consul/serf.go index 8a34cc9b3..c23c10c81 100644 --- a/consul/serf.go +++ b/consul/serf.go @@ -160,7 +160,7 @@ func (s *Server) nodeJoin(me serf.MemberEvent, wan bool) { addrs := make([]net.Addr, 0) for _, member := range members { valid, p := isConsulServer(member) - if valid { + if valid && p.Datacenter == parts.Datacenter { if p.Expect != parts.Expect { s.logger.Printf("[ERR] consul: '%v' and '%v' have different expect values. All expect nodes should have the same value, will never leave expect mode", m.Name, member.Name) return diff --git a/consul/server.go b/consul/server.go index d431ebd1d..d126e2343 100644 --- a/consul/server.go +++ b/consul/server.go @@ -234,7 +234,9 @@ func (s *Server) setupSerf(conf *serf.Config, ch chan serf.Event, path string, w if s.config.Bootstrap { conf.Tags["bootstrap"] = "1" } - conf.Tags["expect"] = fmt.Sprintf("%d", s.config.Expect) + if s.config.Expect != 0 { + conf.Tags["expect"] = fmt.Sprintf("%d", s.config.Expect) + } conf.MemberlistConfig.LogOutput = s.config.LogOutput conf.LogOutput = s.config.LogOutput conf.EventCh = ch diff --git a/consul/server_test.go b/consul/server_test.go index a00f7f34a..109f5081b 100644 --- a/consul/server_test.go +++ b/consul/server_test.go @@ -353,7 +353,7 @@ func TestServer_Expect(t *testing.T) { testutil.WaitForResult(func() (bool, error) { p2, _ = s2.raftPeers.Peers() - return len(p2) == 0, errors.New(fmt.Sprintf("%v", p1)) + return len(p2) == 0, errors.New(fmt.Sprintf("%v", p2)) }, func(err error) { t.Fatalf("should have 0 peers: %v", err) }) @@ -375,18 +375,20 @@ func TestServer_Expect(t *testing.T) { testutil.WaitForResult(func() (bool, error) { p2, _ = s2.raftPeers.Peers() - return len(p2) == 3, errors.New(fmt.Sprintf("%v", p1)) + return len(p2) == 3, errors.New(fmt.Sprintf("%v", p2)) }, func(err error) { t.Fatalf("should have 3 peers: %v", err) }) testutil.WaitForResult(func() (bool, error) { p3, _ = s3.raftPeers.Peers() - return len(p3) == 3, errors.New(fmt.Sprintf("%v", p1)) + return len(p3) == 3, errors.New(fmt.Sprintf("%v", p3)) }, func(err error) { t.Fatalf("should have 3 peers: %v", err) }) + // check if there is one leader now + testutil.WaitForLeader(t, s1.RPC, "dc1") } func TestServer_BadExpect(t *testing.T) { @@ -425,7 +427,7 @@ func TestServer_BadExpect(t *testing.T) { testutil.WaitForResult(func() (bool, error) { p2, _ = s2.raftPeers.Peers() - return len(p2) == 0, errors.New(fmt.Sprintf("%v", p1)) + return len(p2) == 0, errors.New(fmt.Sprintf("%v", p2)) }, func(err error) { t.Fatalf("should have 0 peers: %v", err) }) @@ -447,14 +449,14 @@ func TestServer_BadExpect(t *testing.T) { testutil.WaitForResult(func() (bool, error) { p2, _ = s2.raftPeers.Peers() - return len(p2) == 0, errors.New(fmt.Sprintf("%v", p1)) + return len(p2) == 0, errors.New(fmt.Sprintf("%v", p2)) }, func(err error) { t.Fatalf("should have 0 peers: %v", err) }) testutil.WaitForResult(func() (bool, error) { p3, _ = s3.raftPeers.Peers() - return len(p3) == 0, errors.New(fmt.Sprintf("%v", p1)) + return len(p3) == 0, errors.New(fmt.Sprintf("%v", p3)) }, func(err error) { t.Fatalf("should have 0 peers: %v", err) }) diff --git a/consul/util.go b/consul/util.go index dc5b6ef2a..00815ea10 100644 --- a/consul/util.go +++ b/consul/util.go @@ -86,10 +86,14 @@ func isConsulServer(m serf.Member) (bool, *serverParts) { datacenter := m.Tags["dc"] _, bootstrap := m.Tags["bootstrap"] - expect_str := m.Tags["expect"] - expect, err := strconv.Atoi(expect_str) - if err != nil { - return false, nil + expect := 0 + expect_str, ok := m.Tags["expect"] + var err error + if ok { + expect, err = strconv.Atoi(expect_str) + if err != nil { + return false, nil + } } port_str := m.Tags["port"] diff --git a/consul/util_test.go b/consul/util_test.go index e360f523c..107146b52 100644 --- a/consul/util_test.go +++ b/consul/util_test.go @@ -41,11 +41,10 @@ func TestIsConsulServer(t *testing.T) { Name: "foo", Addr: net.IP([]byte{127, 0, 0, 1}), Tags: map[string]string{ - "expect": "0", - "role": "consul", - "dc": "east-aws", - "port": "10000", - "vsn": "1", + "role": "consul", + "dc": "east-aws", + "port": "10000", + "vsn": "1", }, } valid, parts := isConsulServer(m)