func (r *Service) doLiveBatchReplay(id string, task *kapacitor.Task, clk clock.Clock, recTime bool, start, stop time.Time) error { runReplay := func(tm *kapacitor.TaskMaster) error { sources, recordErrC, err := r.startRecordBatch(task, start, stop) if err != nil { return err } collectors := tm.BatchCollectors(task.ID) replayErrC := kapacitor.ReplayBatchFromChan(clk, sources, collectors, recTime) for i := 0; i < 2; i++ { var err error select { case err = <-replayErrC: case err = <-recordErrC: } if err != nil { return err } } return nil } return r.doReplay(id, task, runReplay) }
func (r *Service) doLiveQueryReplay(id string, task *kapacitor.Task, clk clock.Clock, recTime bool, query, cluster string) error { runReplay := func(tm *kapacitor.TaskMaster) error { var replayErrC <-chan error runErrC := make(chan error, 1) switch task.Type { case kapacitor.StreamTask: source := make(chan models.Point) go func() { runErrC <- r.runQueryStream(source, query, cluster) }() stream, err := tm.Stream(id) if err != nil { return errors.Wrap(err, "stream start") } replayErrC = kapacitor.ReplayStreamFromChan(clk, source, stream, recTime) case kapacitor.BatchTask: source := make(chan models.Batch) go func() { runErrC <- r.runQueryBatch(source, query, cluster) }() collectors := tm.BatchCollectors(task.ID) replayErrC = kapacitor.ReplayBatchFromChan(clk, []<-chan models.Batch{source}, collectors, recTime) } for i := 0; i < 2; i++ { var err error select { case err = <-runErrC: case err = <-replayErrC: } if err != nil { return err } } return nil } return r.doReplay(id, task, runReplay) }