Skip to content

JAVA-6194 Add MongoSocksProxyException for CMAP backpressure labeling#1968

Draft
nhachicha wants to merge 10 commits intomongodb:backpressurefrom
nhachicha:nh/backpressure/socks5_exception
Draft

JAVA-6194 Add MongoSocksProxyException for CMAP backpressure labeling#1968
nhachicha wants to merge 10 commits intomongodb:backpressurefrom
nhachicha:nh/backpressure/socks5_exception

Conversation

@nhachicha
Copy link
Copy Markdown
Collaborator

nhachicha and others added 10 commits March 5, 2026 13:34
…ABEL` (mongodb#1926)

This commit only adds the labels, and does not fully implement the tickets specified below.

The reason there are four JAVA tickets specified is that the is a single specification commit that resolved the four corresponding DRIVERS tickets. All of these JAVA tickets have to be done together.

The relevant spec changes:
- https://github.com/mongodb/specifications/blame/ba14b6bdc1dc695aa9cc20ccf9378592da1b2329/source/client-backpressure/client-backpressure.md#L52-L80 - it's a subset of [DRIVERS-3239, DRIVERS-3411, DRIVERS-3370, DRIVERS-3412: Client backpressure (mongodb#1907)](mongodb/specifications@1125200)

JAVA-5956, JAVA-6117, JAVA-6113, JAVA-6119
- Deprioritize sharded clusters on any error, all other topologies only on SystemOverloadedError.
- Pass ClusterType to updateCandidate so onAttemptFailure can distinguish topology types.
- Add retryable reads prose tests 3.1 and 3.2.
- Change ServerSelectionSelectionTest to use BaseCluster server selection chain.

JAVA-6105
JAVA-6021
JAVA-6074
---------
Co-authored-by: Valentin Kovalenko <valentin.male.kovalenko@gmail.com>
Co-authored-by: Ross Lawley <ross.lawley@gmail.com>
- Add enableOverloadRetargeting boolean option to MongoClientSettings and ConnectionString to allow
  the driver to route requests to a different replica set member on retries when the previously
  used server is overloaded
- Add prose test 3.3 to verify that overload errors are retried on the same server when retargeting
  is disabled

JAVA-6167
---------

Co-authored-by: Ross Lawley <ross.lawley@gmail.com>
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR introduces a dedicated MongoSocksProxyException to represent SOCKS5 proxy connection/handshake failures (with phase + optional RFC 1928 reply code), and updates the SOCKS implementation/tests to throw and assert this new exception type. This supports more precise classification/handling of SOCKS-related connection failures (per JAVA-6194).

Changes:

  • Added MongoSocksProxyException (with HandshakePhase and optional proxy reply code).
  • Updated SocksSocket and SocketStream to throw/propagate MongoSocksProxyException for SOCKS negotiation/auth/connect failures and proxy TCP connect failures.
  • Updated/added tests to validate the new exception type and its phase/reply-code tagging.

Reviewed changes

Copilot reviewed 5 out of 5 changed files in this pull request and generated 4 comments.

Show a summary per file
File Description
driver-sync/src/test/functional/com/mongodb/client/Socks5ProseTest.java Updates prose test assertions to expect MongoSocksProxyException during SOCKS auth failures.
driver-core/src/test/unit/com/mongodb/internal/connection/SocksSocketTest.java Adds unit tests validating handshake phase tagging and CONNECT reply-code tagging.
driver-core/src/main/com/mongodb/MongoSocksProxyException.java Adds new public exception type carrying SOCKS handshake phase and optional RFC 1928 reply code.
driver-core/src/main/com/mongodb/internal/connection/SocksSocket.java Replaces some SOCKS protocol failures with MongoSocksProxyException and adds helper to build a ServerAddress.
driver-core/src/main/com/mongodb/internal/connection/SocketStream.java Wraps proxy-enabled IO failures as MongoSocksProxyException and rethrows SOCKS exceptions directly.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment on lines 226 to 230
}
return;
}
throw new ConnectException(reply.getMessage());
throw new MongoSocksProxyException(reply.message, targetServerAddress(), HandshakePhase.CONNECT_RELAY, reply.replyNumber);
}
Comment on lines 78 to +93
public void open(final OperationContext operationContext) {
try {
socket = initializeSocket(operationContext);
outputStream = socket.getOutputStream();
inputStream = socket.getInputStream();
} catch (MongoSocksProxyException e) {
close();
throw e;
} catch (IOException e) {
close();
if (settings.getProxySettings().isProxyEnabled()) {
throw translateInterruptedException(e, "Interrupted while connecting")
.orElseThrow(() -> new MongoSocksProxyException(
"Exception connecting to SOCKS5 proxy", getAddress(), e,
MongoSocksProxyException.HandshakePhase.PROXY_TCP_CONNECT));
}
OutputStream out = client.getOutputStream();
out.write(serverBytes);
out.flush();
Thread.sleep(300);
Comment on lines +176 to +177
// Nothing listening on port 1; SocksSocket throws plain ConnectException
try (SocksSocket s = new SocksSocket(buildProxySettings("127.0.0.1", 1, false))) {
@stIncMale stIncMale force-pushed the backpressure branch 2 times, most recently from 2d1b2e1 to 11a7b73 Compare May 8, 2026 20:58
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants