From ed4e98a78e7d4a0468c3ea1a4c422be550e59619 Mon Sep 17 00:00:00 2001 From: woodsaj Date: Fri, 22 Jun 2018 12:00:56 +0800 Subject: [PATCH 1/4] drop node updates that are older then info we already have --- cluster/manager.go | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/cluster/manager.go b/cluster/manager.go index be2a0724b8..c79cfc3453 100644 --- a/cluster/manager.go +++ b/cluster/manager.go @@ -231,7 +231,10 @@ func (c *MemberlistManager) NotifyJoin(node *memberlist.Node) { if member.Name == c.nodeName { member.local = true } - c.members[node.Name] = member + existing, ok := c.members[node.Name] + if !ok || member.Updated.After(existing.Updated) { + c.members[node.Name] = member + } c.clusterStats() } @@ -270,8 +273,11 @@ func (c *MemberlistManager) NotifyUpdate(node *memberlist.Node) { if member.Name == c.nodeName { member.local = true } - c.members[node.Name] = member - log.Infof("CLU manager: HTTPNode %s at %s has been updated - %s", node.Name, node.Addr.String(), node.Meta) + existing, ok := c.members[node.Name] + if !ok || member.Updated.After(existing.Updated) { + c.members[node.Name] = member + log.Infof("CLU manager: HTTPNode %s at %s has been updated - %s", node.Name, node.Addr.String(), node.Meta) + } c.clusterStats() } @@ -353,6 +359,7 @@ func (c *MemberlistManager) SetState(state NodeState) { node := c.members[c.nodeName] node.State = state node.Updated = time.Now() + node.StateChange = time.Now() c.members[c.nodeName] = node c.Unlock() nodeReady.Set(state == NodeReady) From 76c3f280a913c3d1e42e754d05a2efff35c1b4e8 Mon Sep 17 00:00:00 2001 From: Dieter Plaetinck Date: Mon, 29 Oct 2018 12:23:35 +0100 Subject: [PATCH 2/4] don't update clusterStats() if there was no change. --- cluster/manager.go | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/cluster/manager.go b/cluster/manager.go index c79cfc3453..e07c85408e 100644 --- a/cluster/manager.go +++ b/cluster/manager.go @@ -232,9 +232,10 @@ func (c *MemberlistManager) NotifyJoin(node *memberlist.Node) { member.local = true } existing, ok := c.members[node.Name] - if !ok || member.Updated.After(existing.Updated) { - c.members[node.Name] = member + if ok && !member.Updated.After(existing.Updated) { + return } + c.members[node.Name] = member c.clusterStats() } @@ -274,10 +275,11 @@ func (c *MemberlistManager) NotifyUpdate(node *memberlist.Node) { member.local = true } existing, ok := c.members[node.Name] - if !ok || member.Updated.After(existing.Updated) { - c.members[node.Name] = member - log.Infof("CLU manager: HTTPNode %s at %s has been updated - %s", node.Name, node.Addr.String(), node.Meta) + if ok && !member.Updated.After(existing.Updated) { + return } + c.members[node.Name] = member + log.Infof("CLU manager: HTTPNode %s at %s has been updated - %s", node.Name, node.Addr.String(), node.Meta) c.clusterStats() } From 45384efd94aa8e4c014e2a3169b80fa3f34c4003 Mon Sep 17 00:00:00 2001 From: Dieter Plaetinck Date: Mon, 29 Oct 2018 12:33:27 +0100 Subject: [PATCH 3/4] simpler way to set local property --- cluster/manager.go | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/cluster/manager.go b/cluster/manager.go index e07c85408e..0dfcc47c25 100644 --- a/cluster/manager.go +++ b/cluster/manager.go @@ -227,10 +227,10 @@ func (c *MemberlistManager) NotifyJoin(node *memberlist.Node) { unmarshalErrJoin.Inc() return } + member.RemoteAddr = node.Addr.String() - if member.Name == c.nodeName { - member.local = true - } + member.local = (member.Name == c.nodeName) + existing, ok := c.members[node.Name] if ok && !member.Updated.After(existing.Updated) { return @@ -270,10 +270,10 @@ func (c *MemberlistManager) NotifyUpdate(node *memberlist.Node) { } return } + member.RemoteAddr = node.Addr.String() - if member.Name == c.nodeName { - member.local = true - } + member.local = (member.Name == c.nodeName) + existing, ok := c.members[node.Name] if ok && !member.Updated.After(existing.Updated) { return From 0f2f3ef497d4053821cb7c5fe4f2977d180c518f Mon Sep 17 00:00:00 2001 From: Dieter Plaetinck Date: Mon, 29 Oct 2018 12:50:19 +0100 Subject: [PATCH 4/4] ignore gossip about ourself --- cluster/manager.go | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/cluster/manager.go b/cluster/manager.go index 0dfcc47c25..10522e6486 100644 --- a/cluster/manager.go +++ b/cluster/manager.go @@ -65,7 +65,7 @@ type ClusterManager interface { type MemberlistManager struct { sync.RWMutex - members map[string]HTTPNode // all members in the cluster, including this node. + members map[string]HTTPNode // all members in the cluster, guaranteed to always have this node nodeName string list *memberlist.Memberlist cfg *memberlist.Config @@ -231,6 +231,12 @@ func (c *MemberlistManager) NotifyJoin(node *memberlist.Node) { member.RemoteAddr = node.Addr.String() member.local = (member.Name == c.nodeName) + // we never want anyone else in the cluster to tell us anything about ourselves + // cause we know ourself best. + if member.local { + return + } + existing, ok := c.members[node.Name] if ok && !member.Updated.After(existing.Updated) { return @@ -240,6 +246,9 @@ func (c *MemberlistManager) NotifyJoin(node *memberlist.Node) { } func (c *MemberlistManager) NotifyLeave(node *memberlist.Node) { + if node.Name == c.nodeName { + return + } eventsLeave.Inc() c.Lock() defer c.Unlock() @@ -260,8 +269,9 @@ func (c *MemberlistManager) NotifyUpdate(node *memberlist.Node) { if err != nil { log.Errorf("CLU manager: Failed to decode node meta from %s: %s", node.Name, err.Error()) unmarshalErrUpdate.Inc() - // if the node is known, lets mark it as notReady until it starts sending valid data again. - if p, ok := c.members[node.Name]; ok { + // if the node is known and it is not thisNode, + // lets mark it as notReady until it starts sending valid data again. + if p, ok := c.members[node.Name]; ok && node.Name != c.nodeName { p.State = NodeNotReady p.StateChange = time.Now() // we dont set Updated as we dont want the NotReady state to propagate incase we are the only node @@ -274,6 +284,12 @@ func (c *MemberlistManager) NotifyUpdate(node *memberlist.Node) { member.RemoteAddr = node.Addr.String() member.local = (member.Name == c.nodeName) + // we never want anyone else in the cluster to tell us anything about ourselves + // cause we know ourself best. + if member.local { + return + } + existing, ok := c.members[node.Name] if ok && !member.Updated.After(existing.Updated) { return