event_delegate.go 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. package networkdb
  2. import (
  3. "encoding/json"
  4. "net"
  5. "github.com/Sirupsen/logrus"
  6. "github.com/hashicorp/memberlist"
  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. e.broadcastNodeEvent(mn.Addr, opCreate)
  21. e.nDB.Lock()
  22. // In case the node is rejoining after a failure or leave,
  23. // wait until an explicit join message arrives before adding
  24. // it to the nodes just to make sure this is not a stale
  25. // join. If you don't know about this node add it immediately.
  26. _, fOk := e.nDB.failedNodes[mn.Name]
  27. _, lOk := e.nDB.leftNodes[mn.Name]
  28. if fOk || lOk {
  29. e.nDB.Unlock()
  30. return
  31. }
  32. e.nDB.nodes[mn.Name] = &node{Node: *mn}
  33. e.nDB.Unlock()
  34. }
  35. func (e *eventDelegate) NotifyLeave(mn *memberlist.Node) {
  36. e.broadcastNodeEvent(mn.Addr, opDelete)
  37. e.nDB.deleteNodeTableEntries(mn.Name)
  38. e.nDB.deleteNetworkEntriesForNode(mn.Name)
  39. e.nDB.Lock()
  40. if n, ok := e.nDB.nodes[mn.Name]; ok {
  41. delete(e.nDB.nodes, mn.Name)
  42. n.reapTime = reapInterval
  43. e.nDB.failedNodes[mn.Name] = n
  44. }
  45. e.nDB.Unlock()
  46. }
  47. func (e *eventDelegate) NotifyUpdate(n *memberlist.Node) {
  48. }