code: func (q *queue) expire(timeout time.Duration, pendPool map[string]*fetchRequest, taskQueue *prque.Prque, timeoutMeter metrics.Meter) map[string]int {
  	// Iterate over the expired requests and return each to the queue
  	expiries := make(map[string]int)
  	for id, request := range pendPool {
  		if time.Since(request.Time) > timeout {
  			// Update the metrics with the timeout
  			timeoutMeter.Mark(1)
  
  			// Return any non satisfied requests to the pool
  			if request.From > 0 {
  				taskQueue.Push(request.From, -int64(request.From))
  			}
  			for _, header := range request.Headers {
  				taskQueue.Push(header, -int64(header.Number.Uint64()))
  			}
  			// Add the peer to the expiry report along the number of failed requests
  			expiries[id] = len(request.Headers)
  
  			// Remove the expired requests from the pending pool directly
  			delete(pendPool, id)
  		}
  	}
  	return expiries
  }
docs: // expire is the generic check that move expired tasks from a pending pool back
  // into a task pool, returning all entities caught with expired tasks.
  //
  // Note, this method expects the queue lock to be already held. The
  // reason the lock is not obtained in here is because the parameters already need
  // to access the queue, so they already need a lock anyway.