package buildrun import ( "sync" "git.novox.be/novox/mesh-sdk/go/delivery" ) // PresenceSet holds which nodes are online, as the watchman writes it (mesh-delivery-watchman_presence, key ``, the // node-engine's connection): a node asleep or off the bus is offline and its build module cannot answer. A node the // watchman has no key of is not online. Safe for use from the watch and from a build at once. type PresenceSet struct { mu sync.Mutex online map[string]bool } // Put takes a change of the presence bucket in and answers whether a node's online state changed. A part's key and a // value that is not a presence are left out. func (s *PresenceSet) Put(key string, value []byte, deleted bool) bool { node, part, _, err := delivery.ParsePresenceKey(key) if err != nil || part != "" { return false } on := false if !deleted { p, err := delivery.DecodePresence(value) if err != nil { return false } on = p.Online } s.mu.Lock() defer s.mu.Unlock() if s.online[node] == on { return false } if s.online == nil { s.online = map[string]bool{} } if on { s.online[node] = true } else { delete(s.online, node) } return true } // Online is whether the watchman last saw the node online. func (s *PresenceSet) Online(node string) bool { s.mu.Lock() defer s.mu.Unlock() return s.online[node] }