code: func (net *Network) refresh(done chan<- struct{}) {
  	var seeds []*Node
  	if net.db != nil {
  		seeds = net.db.querySeeds(seedCount, seedMaxAge)
  	}
  	if len(seeds) == 0 {
  		seeds = net.nursery
  	}
  	if len(seeds) == 0 {
  		log.Trace("no seed nodes found")
  		time.AfterFunc(time.Second*10, func() { close(done) })
  		return
  	}
  	for _, n := range seeds {
  		log.Debug("", "msg", log.Lazy{Fn: func() string {
  			var age string
  			if net.db != nil {
  				age = time.Since(net.db.lastPong(n.ID)).String()
  			} else {
  				age = "unknown"
  			}
  			return fmt.Sprintf("seed node (age %s): %v", age, n)
  		}})
  		n = net.internNodeFromDB(n)
  		if n.state == unknown {
  			net.transition(n, verifyinit)
  		}
  		// Force-add the seed node so Lookup does something.
  		// It will be deleted again if verification fails.
  		net.tab.add(n)
  	}
  	// Start self lookup to fill up the buckets.
  	go func() {
  		net.Lookup(net.tab.self.ID)
  		close(done)
  	}()
  }
docs: // Everything below runs on the Network.loop goroutine
  // and can modify Node, Table and Network at any time without locking.