Members should be called when serf members join or leave. Remove is set to true if nodes left. This method updates state, including the ring to reflect Nodes joining/leaving.
(members []serf.Member, remove bool)
| 232 | // true if nodes left. This method updates state, including the ring to reflect |
| 233 | // Nodes joining/leaving. |
| 234 | func (n *Node) memberStateUpdates(members []serf.Member, remove bool) { |
| 235 | n.lock.Lock() |
| 236 | |
| 237 | var peers []string |
| 238 | for _, m := range members { |
| 239 | p, err := buildPeerNode(m) |
| 240 | if err != nil { |
| 241 | n.logger.Printf("[ERROR] onecache: buildPeerNode(%v) failed: %v\n", m, err) |
| 242 | continue |
| 243 | } |
| 244 | peers = append(peers, p.name) |
| 245 | |
| 246 | if err := n.memberStateUpdate(p, remove); err != nil { |
| 247 | n.logger.Printf("[ERROR] onecache: memberStateUpdate(%v, %v) failed: %v\n", m, remove, err) |
| 248 | } |
| 249 | } |
| 250 | n.lock.Unlock() |
| 251 | |
| 252 | // Want to mark after all state updates have been applied because the state of replicas can be in flux. |
| 253 | if remove { |
| 254 | n.replicator.NodesRemoved(peers) |
| 255 | } else { |
| 256 | if err := n.replicator.MarkPeersDirty(peers); err != nil { |
| 257 | n.logger.Printf("[ERROR] onecache.replicator: %v", err) |
| 258 | } |
| 259 | } |
| 260 | |
| 261 | // The set of Nodes has changed so trigger garbage collection |
| 262 | n.gc.Reset(10 * time.Minute) |
| 263 | } |
| 264 | |
| 265 | // memberStateUpdate handles a single node joining or leaving. |
| 266 | func (n *Node) memberStateUpdate(p *peerNode, remove bool) error { |
no test coverage detected