mirror of
				https://github.com/yggdrasil-network/yggdrasil-go.git
				synced 2025-11-04 11:15:07 +03:00 
			
		
		
		
	try to fix a few edge cases with searches that could lead them to ending without the callback being run or without cleaning up the old search info
This commit is contained in:
		
							parent
							
								
									ae05683c73
								
							
						
					
					
						commit
						7a28eb787e
					
				
					 2 changed files with 4 additions and 14 deletions
				
			
		| 
						 | 
				
			
			@ -130,9 +130,9 @@ func (c *Conn) doSearch() {
 | 
			
		|||
			searchCompleted := func(sinfo *sessionInfo, e error) {}
 | 
			
		||||
			sinfo = c.core.searches.newIterSearch(c.nodeID, c.nodeMask, searchCompleted)
 | 
			
		||||
			c.core.log.Debugf("%s DHT search started: %p", c.String(), sinfo)
 | 
			
		||||
			// Start the search
 | 
			
		||||
			sinfo.continueSearch()
 | 
			
		||||
		}
 | 
			
		||||
		// Continue the search
 | 
			
		||||
		sinfo.continueSearch()
 | 
			
		||||
	}
 | 
			
		||||
	go func() { c.core.router.admin <- routerWork }()
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -36,7 +36,6 @@ type searchInfo struct {
 | 
			
		|||
	core     *Core
 | 
			
		||||
	dest     crypto.NodeID
 | 
			
		||||
	mask     crypto.NodeID
 | 
			
		||||
	time     time.Time
 | 
			
		||||
	toVisit  []*dhtInfo
 | 
			
		||||
	visited  map[crypto.NodeID]bool
 | 
			
		||||
	callback func(*sessionInfo, error)
 | 
			
		||||
| 
						 | 
				
			
			@ -65,17 +64,10 @@ func (s *searches) init(core *Core) {
 | 
			
		|||
 | 
			
		||||
// Creates a new search info, adds it to the searches struct, and returns a pointer to the info.
 | 
			
		||||
func (s *searches) createSearch(dest *crypto.NodeID, mask *crypto.NodeID, callback func(*sessionInfo, error)) *searchInfo {
 | 
			
		||||
	now := time.Now()
 | 
			
		||||
	//for dest, sinfo := range s.searches {
 | 
			
		||||
	//	if now.Sub(sinfo.time) > time.Minute {
 | 
			
		||||
	//		delete(s.searches, dest)
 | 
			
		||||
	//	}
 | 
			
		||||
	//}
 | 
			
		||||
	info := searchInfo{
 | 
			
		||||
		core:     s.core,
 | 
			
		||||
		dest:     *dest,
 | 
			
		||||
		mask:     *mask,
 | 
			
		||||
		time:     now.Add(-time.Second),
 | 
			
		||||
		callback: callback,
 | 
			
		||||
	}
 | 
			
		||||
	s.searches[*dest] = &info
 | 
			
		||||
| 
						 | 
				
			
			@ -154,10 +146,6 @@ func (sinfo *searchInfo) doSearchStep() {
 | 
			
		|||
// If we've recenty sent a ping for this search, do nothing.
 | 
			
		||||
// Otherwise, doSearchStep and schedule another continueSearch to happen after search_RETRY_TIME.
 | 
			
		||||
func (sinfo *searchInfo) continueSearch() {
 | 
			
		||||
	if time.Since(sinfo.time) < search_RETRY_TIME {
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	sinfo.time = time.Now()
 | 
			
		||||
	sinfo.doSearchStep()
 | 
			
		||||
	// In case the search dies, try to spawn another thread later
 | 
			
		||||
	// Note that this will spawn multiple parallel searches as time passes
 | 
			
		||||
| 
						 | 
				
			
			@ -209,6 +197,8 @@ func (sinfo *searchInfo) checkDHTRes(res *dhtRes) bool {
 | 
			
		|||
		if sess == nil {
 | 
			
		||||
			// nil if the DHT search finished but the session wasn't allowed
 | 
			
		||||
			sinfo.callback(nil, errors.New("session not allowed"))
 | 
			
		||||
			// Cleanup
 | 
			
		||||
			delete(sinfo.core.searches.searches, res.Dest)
 | 
			
		||||
			return true
 | 
			
		||||
		}
 | 
			
		||||
		_, isIn := sinfo.core.sessions.getByTheirPerm(&res.Key)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue