mirror of
https://github.com/grafana/grafana.git
synced 2025-02-16 18:34:52 -06:00
52 lines
1.0 KiB
Go
52 lines
1.0 KiB
Go
|
package tsdb
|
||
|
|
||
|
func HandleRequest(req *Request) (*Response, error) {
|
||
|
context := NewQueryContext(req.Queries, req.TimeRange)
|
||
|
|
||
|
batches, err := getBatches(req)
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
|
||
|
currentlyExecuting := 0
|
||
|
|
||
|
for _, batch := range batches {
|
||
|
if len(batch.Depends) == 0 {
|
||
|
currentlyExecuting += 1
|
||
|
batch.Started = true
|
||
|
go batch.process(context)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
response := &Response{}
|
||
|
|
||
|
for currentlyExecuting != 0 {
|
||
|
select {
|
||
|
case batchResult := <-context.ResultsChan:
|
||
|
currentlyExecuting -= 1
|
||
|
|
||
|
response.BatchTimings = append(response.BatchTimings, batchResult.Timings)
|
||
|
|
||
|
for refId, result := range batchResult.QueryResults {
|
||
|
context.Results[refId] = result
|
||
|
}
|
||
|
|
||
|
for _, batch := range batches {
|
||
|
// not interested in started batches
|
||
|
if batch.Started {
|
||
|
continue
|
||
|
}
|
||
|
|
||
|
if batch.allDependenciesAreIn(context) {
|
||
|
currentlyExecuting += 1
|
||
|
batch.Started = true
|
||
|
go batch.process(context)
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
response.Results = context.Results
|
||
|
return response, nil
|
||
|
}
|