示例#1
0
文件: server.go 项目: hlandau/ctmon
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)
}