-
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
sql: do not close stmt buffer of internal executor in errCallback #80070
Conversation
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.
This seems fine but I don't feel qualified to sign off on it, can you get another reviewer more familiar with this code?
Reviewed 1 of 1 files at r1, all commit messages.
Reviewable status: complete! 0 of 0 LGTMs obtained (waiting on @yuzefovich)
Unfortunately, I don't think anyone on our team has any familiarity with this code. @jordanlewis was the main reviewer of #59330 when the code in question was introduced, so maybe you can take a quick look? |
@mgartner I think you mentioned that you need to get familiar with connExecutor for UDFs, so maybe could take a look at this too? |
@yuzefovich, is there a way we can test this scenario you describe? It sounds like an interesting edge case, yet clearly it's not tested at all right now @RichardJCai, aren't you working on internal executor soon? Could you take a look at this (and maybe talk more with Yahor about the change)? |
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.
Alright, I added a WIP commit with the test that follows exactly the scenario I described in the commit message. Everything behaves exactly as I described. However, without introducing several knobs I don't know how to make such a test non-flaky, and adding the knobs seems not worth it just for this edge case, so I'm inclined to not merge the test.
Reviewable status: complete! 0 of 0 LGTMs obtained (waiting on @cucaroach and @jordanlewis)
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.
nit: fix "the new goroutine is span..." in the PR description
It's unfortunate that a test requires these complex knobs or significantly restructuring the code. i'm find with leaving out the test.
Reviewed 1 of 1 files at r1, 3 of 3 files at r3, 1 of 1 files at r4, all commit messages.
Reviewable status: complete! 1 of 0 LGTMs obtained (waiting on @jordanlewis and @yuzefovich)
-- commits
line 17 at r2:
nit: formatting typo here?
Previously, we would close the stmt buffer of the internal executor in `errCallback`, "just to be safe" since it was assumed that the buffer is already closed when the callback is executed. The callback runs whenever `run()` loop of connExecutor exits with an error. However, it is possible for the following sequence of events to happen: - The new goroutine is spun up for the internal executor before any commands are pushed into the stmt buffer. - The context is canceled before the new goroutine blocks waiting for the command to execute, i.e. `run()` loop is exited before any commands are executed. - The `errCallback` with the context cancellation error is evaluated. This closes the stmt buffer. The goroutine exits. - The main goroutine tries to push some commands into the buffer only to find that it was already closed. An assertion error is returned, and a sentry event is created. I think we should just not close the stmt buffer in the `errCallback` since this was never necessary and can lead to the scenario described above where no sentry event should be emitted. Release note: None
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.
TFTRs!
bors r+
Reviewable status: complete! 0 of 0 LGTMs obtained (and 1 stale) (waiting on @jordanlewis and @mgartner)
Build succeeded: |
Previously, we would close the stmt buffer of the internal executor in
errCallback
, "just to be safe" since it was assumed that the buffer isalready closed when the callback is executed. The callback runs whenever
run()
loop of connExecutor exits with an error.However, it is possible for the following sequence of events to happen:
commands are pushed into the stmt buffer.
the command to execute, i.e.
run()
loop is exited before any commandsare executed.
errCallback
with the context cancellation error is evaluated.This closes the stmt buffer. The goroutine exits.
find that it was already closed. An assertion error is returned, and
a sentry event is created.
I think we should just not close the stmt buffer in the
errCallback
since this was never necessary and can lead to the scenario described
above where no sentry event should be emitted.
Fixes: #79746.
Release note: None