2018-03-07 22:15:58 +01:00
|
|
|
package dht
|
|
|
|
|
2018-06-14 17:48:02 +02:00
|
|
|
import (
|
|
|
|
"sync"
|
|
|
|
|
2019-10-10 05:07:33 +02:00
|
|
|
"github.com/lbryio/lbry.go/v2/dht/bits"
|
2018-06-14 17:48:02 +02:00
|
|
|
)
|
2018-03-07 22:15:58 +01:00
|
|
|
|
2018-05-22 18:16:01 +02:00
|
|
|
// TODO: expire stored data after tExpire time
|
|
|
|
|
2018-05-19 19:05:30 +02:00
|
|
|
type contactStore struct {
|
2018-04-04 17:43:27 +02:00
|
|
|
// map of blob hashes to (map of node IDs to bools)
|
2018-06-14 17:48:02 +02:00
|
|
|
hashes map[bits.Bitmap]map[bits.Bitmap]bool
|
2018-04-28 02:16:12 +02:00
|
|
|
// stores the peers themselves, so they can be updated in one place
|
2018-06-14 17:48:02 +02:00
|
|
|
contacts map[bits.Bitmap]Contact
|
2018-05-01 22:18:38 +02:00
|
|
|
lock sync.RWMutex
|
2018-03-07 22:15:58 +01:00
|
|
|
}
|
|
|
|
|
2018-05-19 19:05:30 +02:00
|
|
|
func newStore() *contactStore {
|
|
|
|
return &contactStore{
|
2018-06-14 17:48:02 +02:00
|
|
|
hashes: make(map[bits.Bitmap]map[bits.Bitmap]bool),
|
|
|
|
contacts: make(map[bits.Bitmap]Contact),
|
2018-03-07 22:15:58 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-07-13 18:49:41 +02:00
|
|
|
func (s *contactStore) Upsert(blobHash bits.Bitmap, contact Contact) {
|
2018-03-07 22:15:58 +01:00
|
|
|
s.lock.Lock()
|
|
|
|
defer s.lock.Unlock()
|
2018-04-28 02:16:12 +02:00
|
|
|
|
2018-04-05 17:35:57 +02:00
|
|
|
if _, ok := s.hashes[blobHash]; !ok {
|
2018-06-14 17:48:02 +02:00
|
|
|
s.hashes[blobHash] = make(map[bits.Bitmap]bool)
|
2018-03-07 22:15:58 +01:00
|
|
|
}
|
2018-05-19 19:05:30 +02:00
|
|
|
s.hashes[blobHash][contact.ID] = true
|
|
|
|
s.contacts[contact.ID] = contact
|
2018-03-07 22:15:58 +01:00
|
|
|
}
|
|
|
|
|
2018-06-14 17:48:02 +02:00
|
|
|
func (s *contactStore) Get(blobHash bits.Bitmap) []Contact {
|
2018-03-07 22:15:58 +01:00
|
|
|
s.lock.RLock()
|
|
|
|
defer s.lock.RUnlock()
|
2018-04-28 02:16:12 +02:00
|
|
|
|
|
|
|
var contacts []Contact
|
2018-04-05 17:35:57 +02:00
|
|
|
if ids, ok := s.hashes[blobHash]; ok {
|
2018-03-24 00:18:00 +01:00
|
|
|
for id := range ids {
|
2018-05-01 22:18:38 +02:00
|
|
|
contact, ok := s.contacts[id]
|
2018-03-24 00:18:00 +01:00
|
|
|
if !ok {
|
|
|
|
panic("node id in IDs list, but not in nodeInfo")
|
|
|
|
}
|
2018-07-13 18:49:41 +02:00
|
|
|
contacts = append(contacts, contact)
|
2018-03-07 22:15:58 +01:00
|
|
|
}
|
|
|
|
}
|
2018-04-28 02:16:12 +02:00
|
|
|
return contacts
|
|
|
|
}
|
|
|
|
|
2018-05-19 19:05:30 +02:00
|
|
|
func (s *contactStore) RemoveTODO(contact Contact) {
|
2018-04-28 02:16:12 +02:00
|
|
|
// TODO: remove peer from everywhere
|
2018-03-07 22:15:58 +01:00
|
|
|
}
|
2018-03-24 00:18:00 +01:00
|
|
|
|
2018-05-19 19:05:30 +02:00
|
|
|
func (s *contactStore) CountStoredHashes() int {
|
2018-03-24 00:18:00 +01:00
|
|
|
s.lock.RLock()
|
|
|
|
defer s.lock.RUnlock()
|
2018-04-05 17:35:57 +02:00
|
|
|
return len(s.hashes)
|
2018-03-24 00:18:00 +01:00
|
|
|
}
|