event_delegate.go 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. package networkdb
  2. import (
  3. "encoding/json"
  4. "net"
  5. "github.com/hashicorp/memberlist"
  6. "github.com/sirupsen/logrus"
  7. )
  8. type eventDelegate struct {
  9. nDB *NetworkDB
  10. }
  11. func (e *eventDelegate) broadcastNodeEvent(addr net.IP, op opType) {
  12. value, err := json.Marshal(&NodeAddr{addr})
  13. if err == nil {
  14. e.nDB.broadcaster.Write(makeEvent(op, NodeTable, "", "", value))
  15. } else {
  16. logrus.Errorf("Error marshalling node broadcast event %s", addr.String())
  17. }
  18. }
  19. func (e *eventDelegate) NotifyJoin(mn *memberlist.Node) {
  20. logrus.Infof("Node %s/%s, joined gossip cluster", mn.Name, mn.Addr)
  21. e.broadcastNodeEvent(mn.Addr, opCreate)
  22. e.nDB.Lock()
  23. defer e.nDB.Unlock()
  24. // In case the node is rejoining after a failure or leave,
  25. // just add the node back to active
  26. if moved, _ := e.nDB.changeNodeState(mn.Name, nodeActiveState); moved {
  27. return
  28. }
  29. // Every node has a unique ID
  30. // Check on the base of the IP address if the new node that joined is actually a new incarnation of a previous
  31. // failed or shutdown one
  32. e.nDB.purgeReincarnation(mn)
  33. e.nDB.nodes[mn.Name] = &node{Node: *mn}
  34. logrus.Infof("Node %s/%s, added to nodes list", mn.Name, mn.Addr)
  35. }
  36. func (e *eventDelegate) NotifyLeave(mn *memberlist.Node) {
  37. logrus.Infof("Node %s/%s, left gossip cluster", mn.Name, mn.Addr)
  38. e.broadcastNodeEvent(mn.Addr, opDelete)
  39. e.nDB.Lock()
  40. defer e.nDB.Unlock()
  41. n, currState, _ := e.nDB.findNode(mn.Name)
  42. if n == nil {
  43. logrus.Errorf("Node %s/%s not found in the node lists", mn.Name, mn.Addr)
  44. return
  45. }
  46. // if the node was active means that did not send the leave cluster message, so it's probable that
  47. // failed. Else would be already in the left list so nothing else has to be done
  48. if currState == nodeActiveState {
  49. moved, err := e.nDB.changeNodeState(mn.Name, nodeFailedState)
  50. if err != nil {
  51. logrus.WithError(err).Errorf("impossible condition, node %s/%s not present in the list", mn.Name, mn.Addr)
  52. return
  53. }
  54. if moved {
  55. logrus.Infof("Node %s/%s, added to failed nodes list", mn.Name, mn.Addr)
  56. }
  57. }
  58. }
  59. func (e *eventDelegate) NotifyUpdate(n *memberlist.Node) {
  60. }