more insertIfNew bugfixes, and add peerOnly to getDHT output (true if a node is in the bucket.peers slice instead of bucket.others--it means they're not regularly pinged, they're only there to make sure DHT lookups include them as a result, for bootstrapping reasons)

This commit is contained in:
Arceliar 2018-05-17 21:43:26 -05:00
parent fe518f4e3f
commit ec8fe338d5
2 changed files with 13 additions and 6 deletions

View File

@ -344,20 +344,21 @@ func (a *admin) getData_getDHT() []admin_nodeInfo {
getDHT := func() {
for i := 0; i < a.core.dht.nBuckets(); i++ {
b := a.core.dht.getBucket(i)
getInfo := func(vs []*dhtInfo) {
getInfo := func(vs []*dhtInfo, isPeer bool) {
for _, v := range vs {
addr := *address_addrForNodeID(v.getNodeID())
info := admin_nodeInfo{
{"IP", net.IP(addr[:]).String()},
{"coords", fmt.Sprint(v.coords)},
{"bucket", fmt.Sprint(i)},
{"peerOnly", fmt.Sprint(isPeer)},
{"lastSeen", fmt.Sprint(now.Sub(v.recv))},
}
infos = append(infos, info)
}
}
getInfo(b.other)
getInfo(b.peers)
getInfo(b.other, false)
getInfo(b.peers, true)
}
}
a.core.router.doAdmin(getDHT)

View File

@ -197,8 +197,14 @@ func (t *dht) nBuckets() int {
func (t *dht) insertIfNew(info *dhtInfo, isPeer bool) {
//fmt.Println("DEBUG: dht insertIfNew:", info.getNodeID(), info.coords)
// Always inserts peers, inserts other nodes if not already present
if isPeer || t.shouldInsert(info) {
// Insert if no "other" entry already exists
nodeID := info.getNodeID()
bidx, isOK := t.getBucketIndex(nodeID)
if !isOK {
return
}
b := t.getBucket(bidx)
if (isPeer && !b.containsOther(info)) || t.shouldInsert(info) {
// We've never heard this node before
// TODO is there a better time than "now" to set send/recv to?
// (Is there another "natural" choice that bootstraps faster?)
@ -222,7 +228,7 @@ func (t *dht) insert(info *dhtInfo, isPeer bool) {
if !isPeer && !b.containsOther(info) {
// This is a new entry, give it an old age so it's pinged sooner
// This speeds up bootstrapping
info.recv = info.recv.Add(-time.Minute)
info.recv = info.recv.Add(-time.Hour)
}
// First drop any existing entry from the bucket
b.drop(&info.key)