code: func (eth *Ethereum) startBloomHandlers(sectionSize uint64) {
  	for i := 0; i < bloomServiceThreads; i++ {
  		go func() {
  			for {
  				select {
  				case <-eth.shutdownChan:
  					return
  
  				case request := <-eth.bloomRequests:
  					task := <-request
  					task.Bitsets = make([][]byte, len(task.Sections))
  					for i, section := range task.Sections {
  						head := rawdb.ReadCanonicalHash(eth.chainDb, (section+1)*sectionSize-1)
  						if compVector, err := rawdb.ReadBloomBits(eth.chainDb, task.Bit, section, head); err == nil {
  							if blob, err := bitutil.DecompressBytes(compVector, int(sectionSize/8)); err == nil {
  								task.Bitsets[i] = blob
  							} else {
  								task.Error = err
  							}
  						} else {
  							task.Error = err
  						}
  					}
  					request <- task
  				}
  			}
  		}()
  	}
  }
docs: // startBloomHandlers starts a batch of goroutines to accept bloom bit database
  // retrievals from possibly a range of filters and serving the data to satisfy.