From 275d99e1dcd22a96e5b2f1ffc6b2a453080abba7 Mon Sep 17 00:00:00 2001 From: Ryan Uber Date: Sun, 22 Feb 2015 18:24:10 -0800 Subject: [PATCH] consul: allow returning custom error for merge delegate --- consul/client.go | 2 +- consul/merge.go | 24 +++++++++--------------- consul/server.go | 4 ++-- 3 files changed, 12 insertions(+), 18 deletions(-) diff --git a/consul/client.go b/consul/client.go index c41cc78a2..c37ace6d7 100644 --- a/consul/client.go +++ b/consul/client.go @@ -139,7 +139,7 @@ func (c *Client) setupSerf(conf *serf.Config, ch chan serf.Event, path string) ( conf.SnapshotPath = filepath.Join(c.config.DataDir, path) conf.ProtocolVersion = protocolVersionMap[c.config.ProtocolVersion] conf.RejoinAfterLeave = c.config.RejoinAfterLeave - conf.Merge = &lanMergeDelegate{logger: c.logger, dc: c.config.Datacenter} + conf.Merge = &lanMergeDelegate{dc: c.config.Datacenter} if err := ensurePath(conf.SnapshotPath, false); err != nil { return nil, err } diff --git a/consul/merge.go b/consul/merge.go index 0efcb0cd3..c61b79f41 100644 --- a/consul/merge.go +++ b/consul/merge.go @@ -1,7 +1,7 @@ package consul import ( - "log" + "fmt" "github.com/hashicorp/serf/serf" ) @@ -10,47 +10,41 @@ import ( // ring. We check that the peers are in the same datacenter and abort the // merge if there is a mis-match. type lanMergeDelegate struct { - logger *log.Logger - dc string + dc string } -func (md *lanMergeDelegate) NotifyMerge(members []*serf.Member) (cancel bool) { +func (md *lanMergeDelegate) NotifyMerge(members []*serf.Member) error { for _, m := range members { ok, dc := isConsulNode(*m) if ok { if dc != md.dc { - md.logger.Printf("[WARN] consul: Canceling cluster merge, member '%s' part of wrong datacenter '%s'", + return fmt.Errorf("Member '%s' part of wrong datacenter '%s'", m.Name, dc) - return true } continue } ok, parts := isConsulServer(*m) if ok && parts.Datacenter != md.dc { - md.logger.Printf("[WARN] consul: Canceling cluster merge, member '%s' part of wrong datacenter '%s'", + return fmt.Errorf("Member '%s' part of wrong datacenter '%s'", m.Name, parts.Datacenter) - return true } } - return false + return nil } // wanMergeDelegate is used to handle a cluster merge on the WAN gossip // ring. We check that the peers are server nodes and abort the merge // otherwise. type wanMergeDelegate struct { - logger *log.Logger } -func (md *wanMergeDelegate) NotifyMerge(members []*serf.Member) (cancel bool) { +func (md *wanMergeDelegate) NotifyMerge(members []*serf.Member) error { for _, m := range members { ok, _ := isConsulServer(*m) if !ok { - md.logger.Printf("[WARN] consul: Canceling cluster merge, member '%s' is not a server", - m.Name) - return true + return fmt.Errorf("Member '%s' is not a server", m.Name) } } - return false + return nil } diff --git a/consul/server.go b/consul/server.go index e3e25a362..f8adba7b9 100644 --- a/consul/server.go +++ b/consul/server.go @@ -311,9 +311,9 @@ func (s *Server) setupSerf(conf *serf.Config, ch chan serf.Event, path string, w conf.ProtocolVersion = protocolVersionMap[s.config.ProtocolVersion] conf.RejoinAfterLeave = s.config.RejoinAfterLeave if wan { - conf.Merge = &wanMergeDelegate{logger: s.logger} + conf.Merge = &wanMergeDelegate{} } else { - conf.Merge = &lanMergeDelegate{logger: s.logger, dc: s.config.Datacenter} + conf.Merge = &lanMergeDelegate{dc: s.config.Datacenter} } // Until Consul supports this fully, we disable automatic resolution.