mirror of
				https://github.com/yggdrasil-network/yggdrasil-go.git
				synced 2025-11-04 03:05:07 +03:00 
			
		
		
		
	add search for successor, via parent, to the dht maintenance cycle
This commit is contained in:
		
							parent
							
								
									d851d9afe7
								
							
						
					
					
						commit
						3dbffae99f
					
				
					 2 changed files with 33 additions and 2 deletions
				
			
		| 
						 | 
					@ -52,6 +52,7 @@ type dht struct {
 | 
				
			||||||
	table  map[NodeID]*dhtInfo
 | 
						table  map[NodeID]*dhtInfo
 | 
				
			||||||
	peers  chan *dhtInfo // other goroutines put incoming dht updates here
 | 
						peers  chan *dhtInfo // other goroutines put incoming dht updates here
 | 
				
			||||||
	reqs   map[boxPubKey]map[NodeID]time.Time
 | 
						reqs   map[boxPubKey]map[NodeID]time.Time
 | 
				
			||||||
 | 
						search time.Time
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Initializes the DHT
 | 
					// Initializes the DHT
 | 
				
			||||||
| 
						 | 
					@ -79,6 +80,7 @@ func (t *dht) reset() {
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	t.reqs = make(map[boxPubKey]map[NodeID]time.Time)
 | 
						t.reqs = make(map[boxPubKey]map[NodeID]time.Time)
 | 
				
			||||||
	t.table = make(map[NodeID]*dhtInfo)
 | 
						t.table = make(map[NodeID]*dhtInfo)
 | 
				
			||||||
 | 
						t.search = time.Now().Add(-time.Minute)
 | 
				
			||||||
	if successor != nil {
 | 
						if successor != nil {
 | 
				
			||||||
		t.ping(successor, &t.nodeID)
 | 
							t.ping(successor, &t.nodeID)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					@ -323,8 +325,37 @@ func (t *dht) doMaintenance() {
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if successor != nil &&
 | 
						if successor != nil &&
 | 
				
			||||||
		now.Sub(successor.recv) > successor.throttle &&
 | 
							now.Sub(successor.recv) > successor.throttle &&
 | 
				
			||||||
		now.Sub(successor.send) > 6*time.Second {
 | 
							now.Sub(successor.send) > 3*time.Second {
 | 
				
			||||||
		t.ping(successor, nil)
 | 
							t.ping(successor, nil)
 | 
				
			||||||
		successor.pings++
 | 
							successor.pings++
 | 
				
			||||||
 | 
							if now.Sub(t.search) > time.Minute {
 | 
				
			||||||
 | 
								// Start a search for our successor, beginning at this node's parent
 | 
				
			||||||
 | 
								// This should (hopefully) help bootstrap
 | 
				
			||||||
 | 
								t.core.switchTable.mutex.RLock()
 | 
				
			||||||
 | 
								parentPort := t.core.switchTable.parent
 | 
				
			||||||
 | 
								t.core.switchTable.mutex.RUnlock()
 | 
				
			||||||
 | 
								ports := t.core.peers.getPorts()
 | 
				
			||||||
 | 
								if parent, isIn := ports[parentPort]; isIn {
 | 
				
			||||||
 | 
									t.search = now
 | 
				
			||||||
 | 
									target := successor.getNodeID().prev()
 | 
				
			||||||
 | 
									sinfo, isIn := t.core.searches.searches[target]
 | 
				
			||||||
 | 
									if !isIn {
 | 
				
			||||||
 | 
										var mask NodeID
 | 
				
			||||||
 | 
										for idx := range mask {
 | 
				
			||||||
 | 
											mask[idx] = 0xff
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
										sinfo = t.core.searches.newIterSearch(&target, &mask)
 | 
				
			||||||
 | 
										toVisit := sinfo.toVisit
 | 
				
			||||||
 | 
										parentNodeID := getNodeID(&parent.box)
 | 
				
			||||||
 | 
										for _, ninfo := range toVisit {
 | 
				
			||||||
 | 
											if *ninfo.getNodeID() == *parentNodeID {
 | 
				
			||||||
 | 
												toVisit = append(toVisit, ninfo)
 | 
				
			||||||
 | 
											}
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
										sinfo.toVisit = toVisit
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
									t.core.searches.continueSearch(sinfo)
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -158,9 +158,9 @@ type switchTable struct {
 | 
				
			||||||
	core     *Core
 | 
						core     *Core
 | 
				
			||||||
	key      sigPubKey           // Our own key
 | 
						key      sigPubKey           // Our own key
 | 
				
			||||||
	time     time.Time           // Time when locator.tstamp was last updated
 | 
						time     time.Time           // Time when locator.tstamp was last updated
 | 
				
			||||||
	parent   switchPort          // Port of whatever peer is our parent, or self if we're root
 | 
					 | 
				
			||||||
	drop     map[sigPubKey]int64 // Tstamp associated with a dropped root
 | 
						drop     map[sigPubKey]int64 // Tstamp associated with a dropped root
 | 
				
			||||||
	mutex    sync.RWMutex        // Lock for reads/writes of switchData
 | 
						mutex    sync.RWMutex        // Lock for reads/writes of switchData
 | 
				
			||||||
 | 
						parent   switchPort          // Port of whatever peer is our parent, or self if we're root
 | 
				
			||||||
	data     switchData          //
 | 
						data     switchData          //
 | 
				
			||||||
	updater  atomic.Value        // *sync.Once
 | 
						updater  atomic.Value        // *sync.Once
 | 
				
			||||||
	table    atomic.Value        // lookupTable
 | 
						table    atomic.Value        // lookupTable
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue