49 lines
999 B
Go
49 lines
999 B
Go
|
package dht
|
||
|
|
||
|
import (
|
||
|
"sync"
|
||
|
"time"
|
||
|
)
|
||
|
|
||
|
type peer struct {
|
||
|
node *Node
|
||
|
lastPublished time.Time
|
||
|
originallyPublished time.Time
|
||
|
originalPublisherID bitmap
|
||
|
}
|
||
|
|
||
|
type peerStore struct {
|
||
|
data map[bitmap][]peer
|
||
|
lock sync.RWMutex
|
||
|
}
|
||
|
|
||
|
func newPeerStore() *peerStore {
|
||
|
return &peerStore{
|
||
|
data: map[bitmap][]peer{},
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func (s *peerStore) Insert(key bitmap, node *Node, lastPublished, originallyPublished time.Time, originaPublisherID bitmap) {
|
||
|
s.lock.Lock()
|
||
|
defer s.lock.Unlock()
|
||
|
newPeer := peer{node: node, lastPublished: lastPublished, originallyPublished: originallyPublished, originalPublisherID: originaPublisherID}
|
||
|
_, ok := s.data[key]
|
||
|
if !ok {
|
||
|
s.data[key] = []peer{newPeer}
|
||
|
} else {
|
||
|
s.data[key] = append(s.data[key], newPeer)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func (s *peerStore) GetNodes(key bitmap) []*Node {
|
||
|
s.lock.RLock()
|
||
|
defer s.lock.RUnlock()
|
||
|
nodes := []*Node{}
|
||
|
if peers, ok := s.data[key]; ok {
|
||
|
for _, p := range peers {
|
||
|
nodes = append(nodes, p.node)
|
||
|
}
|
||
|
}
|
||
|
return nodes
|
||
|
}
|