2018-03-07 22:15:58 +01:00
|
|
|
package dht
|
|
|
|
|
2018-03-08 01:49:33 +01:00
|
|
|
import "sync"
|
2018-03-07 22:15:58 +01:00
|
|
|
|
|
|
|
type peer struct {
|
2018-03-08 01:49:33 +01:00
|
|
|
nodeID bitmap
|
2018-03-07 22:15:58 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
type peerStore struct {
|
2018-03-08 01:49:33 +01:00
|
|
|
data map[string][]peer
|
2018-03-07 22:15:58 +01:00
|
|
|
lock sync.RWMutex
|
|
|
|
}
|
|
|
|
|
|
|
|
func newPeerStore() *peerStore {
|
|
|
|
return &peerStore{
|
2018-03-09 01:50:18 +01:00
|
|
|
data: make(map[string][]peer),
|
2018-03-07 22:15:58 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-03-08 01:49:33 +01:00
|
|
|
func (s *peerStore) Insert(key string, nodeId bitmap) {
|
2018-03-07 22:15:58 +01:00
|
|
|
s.lock.Lock()
|
|
|
|
defer s.lock.Unlock()
|
2018-03-08 01:49:33 +01:00
|
|
|
newPeer := peer{nodeID: nodeId}
|
2018-03-07 22:15:58 +01:00
|
|
|
_, ok := s.data[key]
|
|
|
|
if !ok {
|
|
|
|
s.data[key] = []peer{newPeer}
|
|
|
|
} else {
|
|
|
|
s.data[key] = append(s.data[key], newPeer)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-03-08 01:49:33 +01:00
|
|
|
func (s *peerStore) Get(key string) []bitmap {
|
2018-03-07 22:15:58 +01:00
|
|
|
s.lock.RLock()
|
|
|
|
defer s.lock.RUnlock()
|
2018-03-09 01:50:18 +01:00
|
|
|
var nodes []bitmap
|
2018-03-07 22:15:58 +01:00
|
|
|
if peers, ok := s.data[key]; ok {
|
|
|
|
for _, p := range peers {
|
2018-03-08 01:49:33 +01:00
|
|
|
nodes = append(nodes, p.nodeID)
|
2018-03-07 22:15:58 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
return nodes
|
|
|
|
}
|