// processTileStream processes the first tile instantly and starts a background // process to recalculate the blame lists as tiles and expectations change. func (b *Blamer) processTileStream() error { expChanges := make(chan []string) b.storages.EventBus.SubscribeAsync(expstorage.EV_EXPSTORAGE_CHANGED, func(e interface{}) { expChanges <- e.([]string) }) tileStream := b.storages.GetTileStreamNow(2*time.Minute, false) lastTile := <-tileStream if err := b.updateBlame(lastTile); err != nil { return err } // Schedule a background process to keep updating the blame lists. go func() { for { select { case tile := <-tileStream: if err := b.updateBlame(tile); err != nil { glog.Errorf("Error updating blame lists: %s", err) } else { lastTile = tile } case <-expChanges: storage.DrainChangeChannel(expChanges) if err := b.updateBlame(lastTile); err != nil { glog.Errorf("Error updating blame lists: %s", err) } } } }() return nil }
func (s *StatusWatcher) calcAndWatchStatus() error { expChanges := make(chan []string) s.storages.EventBus.SubscribeAsync(expstorage.EV_EXPSTORAGE_CHANGED, func(e interface{}) { expChanges <- e.([]string) }) tileStream := s.storages.GetTileStreamNow(2*time.Minute, false) lastTile := <-tileStream if err := s.calcStatus(lastTile); err != nil { return err } liveness := imetrics.NewLiveness("status-monitoring") go func() { for { select { case <-tileStream: tile, err := s.storages.GetLastTileTrimmed(false) if err != nil { glog.Errorf("Error retrieving tile: %s", err) continue } if err := s.calcStatus(tile); err != nil { glog.Errorf("Error calculating status: %s", err) } else { lastTile = tile liveness.Update() } case <-expChanges: storage.DrainChangeChannel(expChanges) if err := s.calcStatus(lastTile); err != nil { glog.Errorf("Error calculating tile after expectation update: %s", err) } liveness.Update() } } }() return nil }
func (h *historian) start() error { expChanges := make(chan []string) h.storages.EventBus.SubscribeAsync(expstorage.EV_EXPSTORAGE_CHANGED, func(e interface{}) { expChanges <- e.([]string) }) tileStream := h.storages.GetTileStreamNow(2*time.Minute, true) lastTile := <-tileStream if err := h.updateDigestInfo(lastTile); err != nil { return err } liveness := metrics.NewLiveness("digest-history-monitoring") // Keep processing tiles and feed them into the process channel. go func() { for { select { case tile := <-tileStream: if err := h.updateDigestInfo(tile); err != nil { glog.Errorf("Error calculating status: %s", err) continue } else { lastTile = tile } case <-expChanges: storage.DrainChangeChannel(expChanges) if err := h.updateDigestInfo(lastTile); err != nil { glog.Errorf("Error calculating tile after expectation udpate: %s", err) continue } } liveness.Update() } }() return nil }