Skip to content

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

Open
wants to merge 9 commits into
base: master
Choose a base branch
from

Conversation

zhouselena
Copy link
Contributor

@zhouselena zhouselena commented Jun 24, 2025

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.

@zhouselena zhouselena requested a review from a team as a code owner June 24, 2025 17:17
@mongodb-drivers-pr-bot mongodb-drivers-pr-bot bot added the priority-3-low Low Priority PR for Review label Jun 24, 2025
Copy link
Contributor

API Change Report

No changes found!

@zhouselena zhouselena requested a review from qingyang-hu June 24, 2025 18:55
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()
Copy link
Collaborator

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:

  1. Wrap the poolClearedError with a driver.Error and add the "TransientTransactionError" label to the labels list.
  2. Add a HasErrorLabel(string) bool method to the poolClearedError 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.

Copy link
Contributor Author

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?

@prestonvasquez prestonvasquez removed their request for review June 25, 2025 15:14
@zhouselena zhouselena requested a review from matthewdale June 25, 2025 20:30
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
priority-3-low Low Priority PR for Review
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants