code: func (f *Fetcher) enqueue(peer string, block *types.Block) {
  	hash := block.Hash()
  
  	// Ensure the peer isn't DOSing us
  	count := f.queues[peer] + 1
  	if count > blockLimit {
  		log.Debug("Discarded propagated block, exceeded allowance", "peer", peer, "number", block.Number(), "hash", hash, "limit", blockLimit)
  		propBroadcastDOSMeter.Mark(1)
  		f.forgetHash(hash)
  		return
  	}
  	// Discard any past or too distant blocks
  	if dist := int64(block.NumberU64()) - int64(f.chainHeight()); dist < -maxUncleDist || dist > maxQueueDist {
  		log.Debug("Discarded propagated block, too far away", "peer", peer, "number", block.Number(), "hash", hash, "distance", dist)
  		propBroadcastDropMeter.Mark(1)
  		f.forgetHash(hash)
  		return
  	}
  	// Schedule the block for future importing
  	if _, ok := f.queued[hash]; !ok {
  		op := &inject{
  			origin: peer,
  			block:  block,
  		}
  		f.queues[peer] = count
  		f.queued[hash] = op
  		f.queue.Push(op, -int64(block.NumberU64()))
  		if f.queueChangeHook != nil {
  			f.queueChangeHook(op.block.Hash(), true)
  		}
  		log.Debug("Queued propagated block", "peer", peer, "number", block.Number(), "hash", hash, "queued", f.queue.Size())
  	}
  }
docs: // enqueue schedules a new future import operation, if the block to be imported
  // has not yet been seen.