code: func (db *DB) expireNodes() {
  	it := db.lvl.NewIterator(util.BytesPrefix([]byte(dbNodePrefix)), nil)
  	defer it.Release()
  	if !it.Next() {
  		return
  	}
  
  	var (
  		threshold    = time.Now().Add(-dbNodeExpiration).Unix()
  		youngestPong int64
  		atEnd        = false
  	)
  	for !atEnd {
  		id, ip, field := splitNodeItemKey(it.Key())
  		if field == dbNodePong {
  			time, _ := binary.Varint(it.Value())
  			if time > youngestPong {
  				youngestPong = time
  			}
  			if time < threshold {
  				// Last pong from this IP older than threshold, remove fields belonging to it.
  				deleteRange(db.lvl, nodeItemKey(id, ip, ""))
  			}
  		}
  		atEnd = !it.Next()
  		nextID, _ := splitNodeKey(it.Key())
  		if atEnd || nextID != id {
  			// We've moved beyond the last entry of the current ID.
  			// Remove everything if there was no recent enough pong.
  			if youngestPong > 0 && youngestPong < threshold {
  				deleteRange(db.lvl, nodeKey(id))
  			}
  			youngestPong = 0
  		}
  	}
  }
docs: // expireNodes iterates over the database and deletes all nodes that have not
  // been seen (i.e. received a pong from) for some time.