code: func (f *Fetcher) forgetHash(hash common.Hash) {
  	// Remove all pending announces and decrement DOS counters
  	for _, announce := range f.announced[hash] {
  		f.announces[announce.origin]--
  		if f.announces[announce.origin] == 0 {
  			delete(f.announces, announce.origin)
  		}
  	}
  	delete(f.announced, hash)
  	if f.announceChangeHook != nil {
  		f.announceChangeHook(hash, false)
  	}
  	// Remove any pending fetches and decrement the DOS counters
  	if announce := f.fetching[hash]; announce != nil {
  		f.announces[announce.origin]--
  		if f.announces[announce.origin] == 0 {
  			delete(f.announces, announce.origin)
  		}
  		delete(f.fetching, hash)
  	}
  
  	// Remove any pending completion requests and decrement the DOS counters
  	for _, announce := range f.fetched[hash] {
  		f.announces[announce.origin]--
  		if f.announces[announce.origin] == 0 {
  			delete(f.announces, announce.origin)
  		}
  	}
  	delete(f.fetched, hash)
  
  	// Remove any pending completions and decrement the DOS counters
  	if announce := f.completing[hash]; announce != nil {
  		f.announces[announce.origin]--
  		if f.announces[announce.origin] == 0 {
  			delete(f.announces, announce.origin)
  		}
  		delete(f.completing, hash)
  	}
  }
docs: // forgetHash removes all traces of a block announcement from the fetcher's
  // internal state.