Skip to content
This repository was archived by the owner on Aug 23, 2023. It is now read-only.

Commit d792236

Browse files
authored
Merge pull request #948 from grafana/issue947
cluster: drop node updates that are old or about thisNode
2 parents 293f7db + 0f2f3ef commit d792236

File tree

1 file changed

+32
-7
lines changed

1 file changed

+32
-7
lines changed

cluster/manager.go

+32-7
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ type ClusterManager interface {
6565

6666
type MemberlistManager struct {
6767
sync.RWMutex
68-
members map[string]HTTPNode // all members in the cluster, including this node.
68+
members map[string]HTTPNode // all members in the cluster, guaranteed to always have this node
6969
nodeName string
7070
list *memberlist.Memberlist
7171
cfg *memberlist.Config
@@ -227,15 +227,28 @@ func (c *MemberlistManager) NotifyJoin(node *memberlist.Node) {
227227
unmarshalErrJoin.Inc()
228228
return
229229
}
230+
230231
member.RemoteAddr = node.Addr.String()
231-
if member.Name == c.nodeName {
232-
member.local = true
232+
member.local = (member.Name == c.nodeName)
233+
234+
// we never want anyone else in the cluster to tell us anything about ourselves
235+
// cause we know ourself best.
236+
if member.local {
237+
return
238+
}
239+
240+
existing, ok := c.members[node.Name]
241+
if ok && !member.Updated.After(existing.Updated) {
242+
return
233243
}
234244
c.members[node.Name] = member
235245
c.clusterStats()
236246
}
237247

238248
func (c *MemberlistManager) NotifyLeave(node *memberlist.Node) {
249+
if node.Name == c.nodeName {
250+
return
251+
}
239252
eventsLeave.Inc()
240253
c.Lock()
241254
defer c.Unlock()
@@ -256,8 +269,9 @@ func (c *MemberlistManager) NotifyUpdate(node *memberlist.Node) {
256269
if err != nil {
257270
log.Errorf("CLU manager: Failed to decode node meta from %s: %s", node.Name, err.Error())
258271
unmarshalErrUpdate.Inc()
259-
// if the node is known, lets mark it as notReady until it starts sending valid data again.
260-
if p, ok := c.members[node.Name]; ok {
272+
// if the node is known and it is not thisNode,
273+
// lets mark it as notReady until it starts sending valid data again.
274+
if p, ok := c.members[node.Name]; ok && node.Name != c.nodeName {
261275
p.State = NodeNotReady
262276
p.StateChange = time.Now()
263277
// we dont set Updated as we dont want the NotReady state to propagate incase we are the only node
@@ -266,9 +280,19 @@ func (c *MemberlistManager) NotifyUpdate(node *memberlist.Node) {
266280
}
267281
return
268282
}
283+
269284
member.RemoteAddr = node.Addr.String()
270-
if member.Name == c.nodeName {
271-
member.local = true
285+
member.local = (member.Name == c.nodeName)
286+
287+
// we never want anyone else in the cluster to tell us anything about ourselves
288+
// cause we know ourself best.
289+
if member.local {
290+
return
291+
}
292+
293+
existing, ok := c.members[node.Name]
294+
if ok && !member.Updated.After(existing.Updated) {
295+
return
272296
}
273297
c.members[node.Name] = member
274298
log.Infof("CLU manager: HTTPNode %s at %s has been updated - %s", node.Name, node.Addr.String(), node.Meta)
@@ -353,6 +377,7 @@ func (c *MemberlistManager) SetState(state NodeState) {
353377
node := c.members[c.nodeName]
354378
node.State = state
355379
node.Updated = time.Now()
380+
node.StateChange = time.Now()
356381
c.members[c.nodeName] = node
357382
c.Unlock()
358383
nodeReady.Set(state == NodeReady)

0 commit comments

Comments
 (0)