rpc: cleanup exit and blocking condition logic in blockingQuery

Remove some unnecessary comments around query_blocking metric. The only
line that needs any comments in the atomic decrement.

Cleanup the block and return comments and logic. The old comment about
AbandonCh may have been relevant before, but it is expected behaviour
now.

The logic was simplified by inverting the err condition.
This commit is contained in:
Daniel Nephin 2022-01-17 16:43:56 -05:00
parent 72a733bed8
commit 71767f1b3e

View File

@ -942,13 +942,10 @@ func (s *Server) blockingQuery(queryOpts structs.QueryOptionsCompat, queryMeta s
ctx, cancel := context.WithTimeout(ctx, timeout) ctx, cancel := context.WithTimeout(ctx, timeout)
defer cancel() defer cancel()
// instrument blockingQueries count := atomic.AddUint64(&s.queriesBlocking, 1)
// atomic inc our server's count of in-flight blockingQueries and store the new value metrics.SetGauge([]string{"rpc", "queries_blocking"}, float32(count))
queriesBlocking := atomic.AddUint64(&s.queriesBlocking, 1) // decrement the count when the function returns.
// atomic dec when we return from blockingQuery()
defer atomic.AddUint64(&s.queriesBlocking, ^uint64(0)) defer atomic.AddUint64(&s.queriesBlocking, ^uint64(0))
// set the gauge directly to the new value of s.blockingQueries
metrics.SetGauge([]string{"rpc", "queries_blocking"}, float32(queriesBlocking))
for { for {
if queryOpts.GetRequireConsistent() { if queryOpts.GetRequireConsistent() {
@ -977,24 +974,17 @@ func (s *Server) blockingQuery(queryOpts structs.QueryOptionsCompat, queryMeta s
return nil return nil
} }
// block up to the timeout if we don't see anything fresh. // block until something changes, or the timeout
if err := ws.WatchCtx(ctx); err == nil { if err := ws.WatchCtx(ctx); err != nil {
// a non-nil error only occurs when the context is cancelled // exit if we've reached the timeout, or other cancellation
return nil
// If a restore may have woken us up then bail out from
// the query immediately. This is slightly race-ey since
// this might have been interrupted for other reasons,
// but it's OK to kick it back to the caller in either
// case.
select {
case <-state.AbandonCh():
return nil
default:
}
} }
if ctx.Err() != nil { // exit if the state store has been abandoned
select {
case <-state.AbandonCh():
return nil return nil
default:
} }
} }
} }