mirror of
https://github.com/VictoriaMetrics/VictoriaMetrics.git
synced 2025-02-09 15:27:11 +00:00
app/vmselect/netstorage: properly process -search.maxSamplesPerQuery
limit (#4472)
Properly return the error to user when `-search.maxSamplesPerQuery` limit is exceeded. Before, user could have received a partial response instead. Signed-off-by: hagen1778 <roman@victoriametrics.com>
This commit is contained in:
parent
a39f065a12
commit
324f5eca63
2 changed files with 20 additions and 2 deletions
|
@ -1498,6 +1498,16 @@ func SearchMetricNames(qt *querytracer.Tracer, denyPartialResponse bool, sq *sto
|
|||
return metricNames, isPartial, nil
|
||||
}
|
||||
|
||||
// limitExceededErr error generated by vmselect
|
||||
// on checking complexity limits during processing responses
|
||||
// from storage nodes.
|
||||
type limitExceededErr struct {
|
||||
err error
|
||||
}
|
||||
|
||||
// Error satisfies error interface
|
||||
func (e limitExceededErr) Error() string { return e.err.Error() }
|
||||
|
||||
// ProcessSearchQuery performs sq until the given deadline.
|
||||
//
|
||||
// Results.RunParallel or Results.Cancel must be called on the returned Results.
|
||||
|
@ -1522,9 +1532,9 @@ func ProcessSearchQuery(qt *querytracer.Tracer, denyPartialResponse bool, sq *st
|
|||
blocksRead.Add(workerID, 1)
|
||||
n := samples.Add(workerID, uint64(mb.Block.RowsCount()))
|
||||
if *maxSamplesPerQuery > 0 && n > maxSamplesPerWorker && samples.GetTotal() > uint64(*maxSamplesPerQuery) {
|
||||
return fmt.Errorf("cannot select more than -search.maxSamplesPerQuery=%d samples; possible solutions: "+
|
||||
return &limitExceededErr{err: fmt.Errorf("cannot select more than -search.maxSamplesPerQuery=%d samples; possible solutions: "+
|
||||
"to increase the -search.maxSamplesPerQuery; to reduce time range for the query; "+
|
||||
"to use more specific label filters in order to select lower number of series", *maxSamplesPerQuery)
|
||||
"to use more specific label filters in order to select lower number of series", *maxSamplesPerQuery)}
|
||||
}
|
||||
if err := tbfw.RegisterAndWriteBlock(mb, workerID); err != nil {
|
||||
return fmt.Errorf("cannot write MetricBlock to temporary blocks file: %w", err)
|
||||
|
@ -1718,6 +1728,13 @@ func (snr *storageNodesRequest) collectResults(partialResultsCounter *metrics.Co
|
|||
snr.finishQueryTracers("cancel request because of error in other vmstorage nodes")
|
||||
return false, err
|
||||
}
|
||||
var limitErr *limitExceededErr
|
||||
if errors.As(err, &limitErr) {
|
||||
// Immediately return the error, since complexity limits are already exceeded,
|
||||
// and we don't need to process the rest of results.
|
||||
snr.finishQueryTracers("cancel request because query complexity limit was exceeded")
|
||||
return false, err
|
||||
}
|
||||
errsPartial = append(errsPartial, err)
|
||||
if snr.denyPartialResponse && len(errsPartial) >= *replicationFactor {
|
||||
// Return the error to the caller if partial responses are denied
|
||||
|
|
|
@ -20,6 +20,7 @@ The following tip changes can be tested by building VictoriaMetrics components f
|
|||
|
||||
* BUGFIX: [vmagent](https://docs.victoriametrics.com/vmagent.html): properly apply `if` filters during [relabeling](https://docs.victoriametrics.com/vmagent.html#relabeling-enhancements). Previously the `if` filter could improperly work. See [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/4806) and [this pull request](https://github.com/VictoriaMetrics/VictoriaMetrics/pull/4816).
|
||||
* BUGFIX: [vmauth](https://docs.victoriametrics.com/vmauth.html): Properly handle LOCAL command for proxy protocol. See [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/3335#issuecomment-1569864108).
|
||||
* BUGFIX: properly return the error to user when `-search.maxSamplesPerQuery` limit is exceeded. Before, user could have received a partial response instead.
|
||||
* BUGFIX: [vmalert](https://docs.victoriametrics.com/vmalert.html): Properly set datasource query params. See [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/4340). Thanks to @gsakun for [the pull request](https://github.com/VictoriaMetrics/VictoriaMetrics/pull/4341).
|
||||
* BUGFIX: [vmalert](https://docs.victoriametrics.com/vmalert.html): Properly form path to static assets in WEB UI if `http.pathPrefix` set. See [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/4349).
|
||||
* BUGFIX: [vmalert](https://docs.victoriametrics.com/vmalert.html): properly return empty slices instead of nil for `/api/v1/rules` for groups with present name but absent `rules`. See [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/4221).
|
||||
|
|
Loading…
Reference in a new issue