func (s *Server) logQueryLoop(logID int64, logURL string, start int64, entryChan chan<- entryBatch) { defer close(entryChan) numPerQuery := int64(10000) backoff := denet.Backoff{} client := ctclient.Client{ LogURL: logURL, } var sth *ctclient.STH ticker := time.NewTicker(2 * time.Minute) defer ticker.Stop() oneTick := make(chan struct{}, 1) oneTick <- struct{}{} var err error for { if atomic.LoadInt32(&s.stopping) != 0 { break } if sth == nil { select { case <-ticker.C: case <-oneTick: case <-s.stopChan: continue } log.Debug("getting STH...") sth, err = client.GetSTH() if err != nil { log.Errore(err, "failed to get STH") backoff.Sleep() continue } } end := start + numPerQuery if end > sth.TreeSize { end = sth.TreeSize } if start >= end { log.Debugf("log %d: at the end", logID) sth = nil continue } log.Debugf("get entries: %#v: (%d,%d)", logURL, start, end-1) entries, numEntries, err := client.GetEntries(start, end-1) if err == nil { backoff.Reset() entryChan <- entryBatch{ Entries: entries, NumEntries: numEntries, StartIndex: start, } start += int64(numEntries) //err := s.processEntries(logID, entries, &start, numEntries) //log.Fatale(err, "update log height") } else { log.Errore(err, "cannot get entries for log: ", logURL) backoff.Sleep() } } log.Debugf("log reader stopped: %#v", logURL) }