@@ -65,7 +65,7 @@ type ClusterManager interface {
65
65
66
66
type MemberlistManager struct {
67
67
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
69
69
nodeName string
70
70
list * memberlist.Memberlist
71
71
cfg * memberlist.Config
@@ -227,15 +227,28 @@ func (c *MemberlistManager) NotifyJoin(node *memberlist.Node) {
227
227
unmarshalErrJoin .Inc ()
228
228
return
229
229
}
230
+
230
231
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
233
243
}
234
244
c .members [node .Name ] = member
235
245
c .clusterStats ()
236
246
}
237
247
238
248
func (c * MemberlistManager ) NotifyLeave (node * memberlist.Node ) {
249
+ if node .Name == c .nodeName {
250
+ return
251
+ }
239
252
eventsLeave .Inc ()
240
253
c .Lock ()
241
254
defer c .Unlock ()
@@ -256,8 +269,9 @@ func (c *MemberlistManager) NotifyUpdate(node *memberlist.Node) {
256
269
if err != nil {
257
270
log .Errorf ("CLU manager: Failed to decode node meta from %s: %s" , node .Name , err .Error ())
258
271
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 {
261
275
p .State = NodeNotReady
262
276
p .StateChange = time .Now ()
263
277
// 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) {
266
280
}
267
281
return
268
282
}
283
+
269
284
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
272
296
}
273
297
c .members [node .Name ] = member
274
298
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) {
353
377
node := c .members [c .nodeName ]
354
378
node .State = state
355
379
node .Updated = time .Now ()
380
+ node .StateChange = time .Now ()
356
381
c .members [c .nodeName ] = node
357
382
c .Unlock ()
358
383
nodeReady .Set (state == NodeReady )
0 commit comments