5
0
mirror of https://github.com/cwinfo/yggdrasil-go.git synced 2024-12-23 08:45:39 +00:00

Merge pull request #207 from Arceliar/chord

Tune DHT a little better
This commit is contained in:
Arceliar 2018-11-16 20:35:11 -06:00 committed by GitHub
commit ae4107a3b2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 13 additions and 6 deletions

View File

@ -267,6 +267,7 @@ func pingNodes(store map[[32]byte]*Node) {
copy(packet[8:24], sourceAddr)
copy(packet[24:40], destAddr)
copy(packet[40:], bs)
packet[0] = 6 << 4
source.send <- packet
}
destCount := 0
@ -438,7 +439,7 @@ func main() {
pingNodes(kstore)
//pingBench(kstore) // Only after disabling debug output
//stressTest(kstore)
time.Sleep(120 * time.Second)
//time.Sleep(120 * time.Second)
dumpDHTSize(kstore) // note that this uses racey functions to read things...
if false {
// This connects the sim to the local network

View File

@ -82,10 +82,16 @@ func (t *dht) lookup(nodeID *NodeID, everything bool) []*dhtInfo {
for _, info := range t.table {
results = append(results, info)
}
sort.SliceStable(results, func(i, j int) bool {
return dht_ordered(nodeID, results[i].getNodeID(), results[j].getNodeID())
})
if len(results) > dht_lookup_size {
// Drop the middle part, so we keep some nodes before and after.
// This should help to bootstrap / recover more quickly.
sort.SliceStable(results, func(i, j int) bool {
return dht_ordered(nodeID, results[i].getNodeID(), results[j].getNodeID())
})
newRes := make([]*dhtInfo, 0, len(results))
newRes = append(newRes, results[len(results)-dht_lookup_size/2:]...)
newRes = append(newRes, results[:len(results)-dht_lookup_size/2]...)
results = newRes
results = results[:dht_lookup_size]
}
return results
@ -168,7 +174,7 @@ func (t *dht) handleReq(req *dhtReq) {
coords: req.Coords,
}
if _, isIn := t.table[*info.getNodeID()]; !isIn && t.isImportant(&info) {
t.insert(&info)
t.ping(&info, nil)
}
}
@ -276,7 +282,7 @@ func (t *dht) doMaintenance() {
}
for _, info := range t.getImportant() {
if now.Sub(info.recv) > info.throttle {
t.ping(info, info.getNodeID())
t.ping(info, nil)
info.pings++
info.throttle += time.Second
if info.throttle > 30*time.Second {