-
Notifications
You must be signed in to change notification settings - Fork 3.8k
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-23.2.0-rc: sql: do not re-run optbuild before collecting index recommendations #117454
release-23.2.0-rc: sql: do not re-run optbuild before collecting index recommendations #117454
Conversation
In #85343 for 22.2 we added automatic collection of index recommendations for DML statements. This collection occurred after execution, and initially re-ran optbuild for the query, before doing the usual index recommendation generation steps of (1) detaching the memo, (2) optimizing with hypothetical indexes, and then (3) restoring the detached memo. In #99081 for 23.2 we moved collection of index recommendations from after execution to between planning and execution, which simplified some things. But this revealed that some queries refer to the memo (and its metadata) during execution, and re-running optbuild can change the contents of the memo (and its metadata) from how they were after planning, especially if the original memo was cached and re-used. I think this initial optbuild step was added to ensure we always have a root expression in the memo. This commit changes index recommendation collection to only run optbuild if the memo is empty, and otherwise use the memo that comes out of planning. Fixes: #117307 Release note (bug fix): Fix a bug introduced in 23.2 that causes internal errors and panics when certain queries run with automatic index recommendation collection enabled.
3eb2ba9
to
7dbe1b8
Compare
Thanks for opening a backport. Please check the backport criteria before merging:
If your backport adds new functionality, please ensure that the following additional criteria are satisfied:
Also, please add a brief release justification to the body of your PR to justify this |
The changes are all behind existing cluster setting
Risk is that automatic index recommendation collection would not work correctly for some statements.
Some prepared statements can panic the gateway note when running with automatic index recommendation collection.
This panic is new in 23.2 and might affect multiple kinds of queries. (Any query which uses the planning memo at execution time. So far we've only found one but there could be others.) |
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.
Great job tracking this tricky bug down!
This part of the logic around index recommendations is very hard to understand. That's likely a major reason the bug was caused in the first place—in SetIndexRecommendations
it's unclear what the state of opc.optimizer.factory
could be, and it's not obvious that rebuilding the memo could mess with the metadata. How can we untangle this code and make it hard or impossible to violate the invariants we've discovered with this bug?
Reviewed 4 of 4 files at r1, all commit messages.
Reviewable status: complete! 1 of 0 LGTMs obtained (waiting on @blathers-crl[bot] and @rafiss)
pkg/sql/instrumentation.go
line 1050 at r1 (raw file):
if f.Memo() == nil || f.Memo().IsEmpty() { // Run optbuild to create a memo with a root expression, if the current // memo is empty.
nit: In a follow-up PR explain when and why the factory's memo is empty here. It's when a cached memo is reused, correct?
Backport 1/1 commits from #117433 on behalf of @michae2.
/cc @cockroachdb/release
In #85343 for 22.2 we added automatic collection of index recommendations for DML statements. This collection occurred after execution, and initially re-ran optbuild for the query, before doing the usual index recommendation generation steps of (1) detaching the memo, (2) optimizing with hypothetical indexes, and then (3) restoring the detached memo.
In #99081 for 23.2 we moved collection of index recommendations from after execution to between planning and execution, which simplified some things. But this revealed that some queries refer to the memo (and its metadata) during execution, and re-running optbuild can change the contents of the memo (and its metadata) from how they were after planning, especially if the original memo was cached and re-used.
I think this initial optbuild step was added to ensure we always have a root expression in the memo. This commit changes index recommendation collection to only run optbuild if the memo is empty, and otherwise use the memo that comes out of planning.
Fixes: #117307
Release note (bug fix): Fix a bug introduced in 23.2 that causes internal errors and panics when certain queries run with automatic index recommendation collection enabled.
Release justification: fix for GA blocker.