-
Notifications
You must be signed in to change notification settings - Fork 3.9k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
release-22.2: constraint: perform cancel checking when combining constraints #112075
Conversation
Previously, the combining of constraint spans when one constraint is a suffix of the other could take a long time and cause the `statement_timeout` session setting to not be honored when each constraint has hundreds or thousands of spans. The issue is that `constraint.Combine` has double nested loops to consider every combination of one span from one constraint with one span of the other constraint. The building of possibly millions of spans may take excessive CPU time and allocate excessive amounts of memory. The fix is to maintain a counter in `constraint.Combine` and call the query cancel check function every 16 iterations. The cancel check function itself will check for query timeout every 1024 iterations, so effectively every 16K iterations `constraint.Combine` will perform cancel checking and abort the query if the timeout has been reached. Epic: none Fixes: #111862 Release note (bug fix): This patch fixes an issue where the optimizer fails to honor the `statement_timeout` session setting when generating constrained index scans for queries with large IN lists or `= ANY` predicates on multiple index key columns, which may lead to an out of memory condition on the node.
c003f83
to
5e43c33
Compare
8cd8255
to
96bcc65
Compare
Thanks for opening a backport. Please check the backport criteria before merging:
If some of the basic criteria cannot be satisfied, ensure that the exceptional criteria are satisfied within.
Add a brief release justification to the body of your PR to justify this backport. Some other things to consider:
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Reviewed 4 of 4 files at r1, all commit messages.
Reviewable status: complete! 0 of 0 LGTMs obtained (waiting on @cucaroach, @DrewKimball, and @msirek)
Backport 1/1 commits from #111979 on behalf of @msirek.
/cc @cockroachdb/release
Previously, the combining of constraint spans when one constraint is a
suffix of the other could take a long time and cause the
statement_timeout
session setting to not be honored when eachconstraint has hundreds or thousands of spans.
The issue is that
constraint.Combine
has double nested loops toconsider every combination of one span from one constraint with one span
of the other constraint. The building of possibly millions of spans
may take excessive CPU time and allocate excessive amounts of memory.
The fix is to maintain a counter in
constraint.Combine
and call thequery cancel check function every 16 iterations. The cancel check
function itself will check for query timeout every 1024 iterations, so
effectively every 16K iterations
constraint.Combine
will performcancel checking and abort the query if the timeout has been reached.
Epic: none
Fixes: #111862
Release note (bug fix): This patch fixes an issue where the optimizer
fails to honor the
statement_timeout
session setting when generatingconstrained index scans for queries with large IN lists or
= ANY
predicates on multiple index key columns, which may lead to an out
of memory condition on the node.
Release justification: Critical fix which allows the
statement_timeout
setting to be honored and avoid OOMs on queries with many constants in= ANY
orIN
list predicates.