New DHT function IsNodeContact to check if node is in local routing table

This commit is contained in:
Kleissner
2021-07-07 02:50:12 +02:00
parent c1ccc3c344
commit 66ebf7c91e
3 changed files with 27 additions and 6 deletions

View File

@@ -163,3 +163,15 @@ func StoreDataDHT(data []byte) error {
}
return nodesDHT.Store(key, uint64(len(data)))
}
// ---- NODE FUNCTIONS ----
// IsNodeContact checks if the node is a contact in the local DHT routing table
func IsNodeContact(nodeID []byte) (node *dht.Node, peer *PeerInfo) {
node = nodesDHT.IsNodeContact(nodeID)
if node == nil {
return nil, nil
}
return node, node.Info.(*PeerInfo)
}

View File

@@ -96,6 +96,11 @@ func (dht *DHT) IsNodeCloser(node1, node2 []byte) bool {
return iDist.Cmp(jDist) == -1
}
// IsNodeContact checks if the given node is in the local routing table
func (dht *DHT) IsNodeContact(ID []byte) (node *Node) {
return dht.ht.doesNodeExist(ID)
}
// ---- Synchronous network query functions below ----
// Store informs the network about data stored locally.

View File

@@ -74,15 +74,19 @@ func (ht *hashTable) markNodeAsSeen(index int, ID []byte) {
ht.RoutingTable[index] = bucket
}
func (ht *hashTable) doesNodeExistInBucket(bucket int, node []byte) bool {
func (ht *hashTable) doesNodeExistInBucket(bucket int, ID []byte) (node *Node) {
ht.mutex.RLock()
defer ht.mutex.RUnlock()
for _, v := range ht.RoutingTable[bucket] {
if bytes.Compare(v.ID, node) == 0 {
return true
for _, node = range ht.RoutingTable[bucket] {
if bytes.Compare(node.ID, ID) == 0 {
return node
}
}
return false
return nil
}
func (ht *hashTable) doesNodeExist(ID []byte) (node *Node) {
return ht.doesNodeExistInBucket(ht.getBucketIndexFromDifferingBit(ID), ID)
}
// getClosestContacts returns the closest nodes to the target. filterFunc is optional and allows the caller to filter the nodes.
@@ -140,7 +144,7 @@ func (ht *hashTable) insertNode(node *Node, shouldEvict func(nodeOld *Node, node
index := ht.getBucketIndexFromDifferingBit(node.ID)
// If the node already exist, mark it as seen
if ht.doesNodeExistInBucket(index, node.ID) {
if ht.doesNodeExistInBucket(index, node.ID) != nil {
ht.markNodeAsSeen(index, node.ID)
return
}