54 lines
1.3 KiB
Go
54 lines
1.3 KiB
Go
package build
|
|
|
|
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 `<node>`, 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]
|
|
}
|