-
Notifications
You must be signed in to change notification settings - Fork 911
GODRIVER-3399: PoolClearedError should have TransientTransactionError label appended to it #2114
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
base: master
Are you sure you want to change the base?
Conversation
API Change ReportNo changes found! |
b8b5aa9
to
f4fc9f4
Compare
x/mongo/driver/topology/pool.go
Outdated
wrappedErr := fmt.Errorf( | ||
"%v: connection pool for %v was cleared because another operation failed with: %v %w", | ||
driver.TransientTransactionError, pce.address, pce.err, pce) | ||
return wrappedErr.Error() |
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.
Error "labels" in this context means that the error type must satisfy the LabeledError interface and have a particular label string. See example code that checks if an error has the "TransientTransactionError" label here.
There are a few ways to accomplish that:
- Wrap the
poolClearedError
with adriver.Error
and add the "TransientTransactionError" label to the labels list. - Add a
HasErrorLabel(string) bool
method to thepoolClearedError
type and return true if the arg is "TransientTransactionError".
Option 2 is more complex, and it's not clear how we'd determine if a transaction is running when the poolClearedError
is created. Option 1 is already used when handling server selection errors while running a transaction (see here), so I recommend that approach.
In the above example, the "TransientTransactionError" label is always added if selectServer
returns an error while a transaction is running. However, some errors that server.Connection returns should not have the "TransientTransactionError" label applied. You'll need to check if the returned error is a poolClearedError
before adding the "TransientTransactionError" label.
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.
@matthewdale I fixed it to wrap the driver.Error and updated the test accordingly! however, I noticed that PoolClearedError
is created here as well and passed through a wantConn trydeliver
. I'm not super familiar with what exactly wantConn does, but it is a poolClearedError that is being passed through so I was wondering if it also needs to be labelled there?
GODRIVER-3399
Summary
Add
TransientTransactionError
label to `PoolClearedError and created unit test accordingly.Background & Motivation
(From DRIVERS-1815) In order for withTransaction to retry PoolClearedErrors, they need to have the TransientTransactionError label appended to them by the driver, similar to server selection errors.