GH-863: [JDBC] Suppress benign exceptions from gRPC layer on ArrowFlightSqlClientHandler#close - #910

Merged
lidavidm merged 6 commits into
apache:mainfrom
ennuite:pr-864-remove-jmeter-exceptions
Dec 4, 2025
Merged

GH-863: [JDBC] Suppress benign exceptions from gRPC layer on ArrowFlightSqlClientHandler#close#910
lidavidm merged 6 commits into
apache:mainfrom
ennuite:pr-864-remove-jmeter-exceptions

Conversation

@ennuite

@ennuiteennuite commented Nov 18, 2025

Copy link
Copy Markdown
Contributor

What's Changed

When using the Flight SQL JDBC driver with connection pooling and a catalog parameter, ArrowFlightSqlClientHandler.close() performs a CloseSession RPC that can fail during gRPC channel shutdown.

These transient failures (UNAVAILABLE or INTERNAL with "Connection closed after GOAWAY") cause noisy errors in pooling frameworks like Apache Commons DBCP.

With this PR these exceptions will instead be suppressed and logged, following the procedure that was used for ARROW-17785

Are these changes tested?

Yes

Closes#863

vandopand others added 5 commits November 14, 2025 19:48
…hen catalog is set
This change addresses race conditions during gRPC channel shutdown that occur
when using connection pooling with catalog parameters. The CloseSession RPC
can fail with UNAVAILABLE or 'Connection closed after GOAWAY' errors during
normal connection cleanup.
Key improvements:
- Refactored duplicate exception handling code into reusable helper methods
- Added comprehensive error suppression for both AutoCloseable cleanup and CloseSession
- Follows the established ARROW-17785 pattern from PreparedStatement.close()
- Improved logging with context-aware debug/info messages
- Fixed typo in existing error suppression logging
The refactoring eliminates code duplication while maintaining identical
functionality and improving maintainability.
…on error suppression
Add unit and integration tests for the error suppression functionality
in ArrowFlightSqlClientHandler:
- ArrowFlightSqlClientHandlerTest: 18 unit tests covering error detection,
logging, and exception handling logic using Mockito and reflection
- ArrowFlightSqlClientHandlerIntegrationTest: 4 integration tests with
real FlightServer to validate error suppression in realistic scenarios
Tests verify that benign gRPC shutdown errors (UNAVAILABLE and INTERNAL
with GOAWAY) are properly suppressed while genuine failures are correctly
propagated as exceptions.
…reliability
This commit addresses bugs introduced in the error suppression implementation:
1. Fixed NullPointerException in isBenignCloseException() when
FlightRuntimeException.getMessage() returns null. Added null check
before calling contains() on the message string.
2. Fixed unit test setup to avoid attempting real server connections
during test initialization. Tests now use reflection to test private
methods without requiring actual network connections.
3. Fixed Mockito unnecessary stubbing warnings by making all mock
objects lenient, allowing tests to create comprehensive mocks
without triggering warnings when not all stubbings are used.
4. Simplified integration tests to focus on testable scenarios.
Removed tests that required mocking gRPC service methods (closeSession)
which are not routed through FlightProducer, making them difficult
to test in isolation.
Test Results:
- 21 tests total (15 unit + 1 integration + 5 builder tests)
- All tests passing with 0 failures and 0 errors
- Comprehensive coverage of error suppression logic via reflection-based
unit tests
@github-actions

This comment has been minimized.

@ennuite
ennuite marked this pull request as ready for review November 18, 2025 13:55
@ennuiteennuite changed the title GH-863: [JDBC] Suppress benign exceptions from gRPC layerGH-863: [JDBC] Suppress benign exceptions from gRPC layer on ArrowFlightSqlClientHandler#closeNov 18, 2025
@ennuite
ennuite marked this pull request as draft November 18, 2025 14:14
@ennuite

Copy link
Copy Markdown
ContributorAuthor

This PR is based on https://github.com/apache/arrow-java/pull/864/files, @vandop asked me to take it over from him.

I simplified the tests. I don't think this merits a full integration test with shutting down a server because all the logic is inside a single method.

About the logging level: for the original issue at https://github.com/apache/arrow/pull/14210/files the log level was set to warn, and in Vando's PR @lidavidm asked for the log level to be debug. It's not clear to me the reason for the discrepancy, and I put it as info.

@vandopvandop left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Thanks for taking over.
Note internally in Dremio we already tested this with jmeter, which wouldn't run without this change.

@jbonofre

Copy link
Copy Markdown
Member

The format is not fully correct. I will fix that.

@lidavidmlidavidm added the enhancement PRs that add or improve features. label Nov 25, 2025
@github-actionsgithub-actionsBot added this to the 18.4.0 milestone Nov 25, 2025
private void logSuppressedCloseException(
FlightRuntimeException fre, String operationDescription) {
// ARROW-17785 and GH-863: suppress exceptions caused by flaky gRPC layer during shutdown
LOGGER.info("Suppressed error {}", operationDescription, fre);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

I would still prefer debug level

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Agreed. Debug makes more sense to me here.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Ok, done!

@lidavidm
lidavidm merged commit 2329174 into apache:mainDec 4, 2025
22 of 25 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancementPRs that add or improve features.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

ArrowFlightSqlClientHandler.close() performs a CloseSession RPC that can fail during gRPC channel shutdown - similar to ARROW-17785

4 participants

@ennuite@jbonofre@lidavidm@vandop
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

GH-863: [JDBC] Suppress benign exceptions from gRPC layer on ArrowFlightSqlClientHandler#close - #910

Merged
lidavidm merged 6 commits into
apache:mainfrom
ennuite:pr-864-remove-jmeter-exceptions
Dec 4, 2025
Merged

GH-863: [JDBC] Suppress benign exceptions from gRPC layer on ArrowFlightSqlClientHandler#close#910
lidavidm merged 6 commits into
apache:mainfrom
ennuite:pr-864-remove-jmeter-exceptions

Conversation

@ennuite

@ennuiteennuite commented Nov 18, 2025

Copy link
Copy Markdown
Contributor

What's Changed

When using the Flight SQL JDBC driver with connection pooling and a catalog parameter, ArrowFlightSqlClientHandler.close() performs a CloseSession RPC that can fail during gRPC channel shutdown.

These transient failures (UNAVAILABLE or INTERNAL with "Connection closed after GOAWAY") cause noisy errors in pooling frameworks like Apache Commons DBCP.

With this PR these exceptions will instead be suppressed and logged, following the procedure that was used for ARROW-17785

Are these changes tested?

Yes

Closes#863

vandopand others added 5 commits November 14, 2025 19:48
…hen catalog is set
This change addresses race conditions during gRPC channel shutdown that occur
when using connection pooling with catalog parameters. The CloseSession RPC
can fail with UNAVAILABLE or 'Connection closed after GOAWAY' errors during
normal connection cleanup.
Key improvements:
- Refactored duplicate exception handling code into reusable helper methods
- Added comprehensive error suppression for both AutoCloseable cleanup and CloseSession
- Follows the established ARROW-17785 pattern from PreparedStatement.close()
- Improved logging with context-aware debug/info messages
- Fixed typo in existing error suppression logging
The refactoring eliminates code duplication while maintaining identical
functionality and improving maintainability.
…on error suppression
Add unit and integration tests for the error suppression functionality
in ArrowFlightSqlClientHandler:
- ArrowFlightSqlClientHandlerTest: 18 unit tests covering error detection,
logging, and exception handling logic using Mockito and reflection
- ArrowFlightSqlClientHandlerIntegrationTest: 4 integration tests with
real FlightServer to validate error suppression in realistic scenarios
Tests verify that benign gRPC shutdown errors (UNAVAILABLE and INTERNAL
with GOAWAY) are properly suppressed while genuine failures are correctly
propagated as exceptions.
…reliability
This commit addresses bugs introduced in the error suppression implementation:
1. Fixed NullPointerException in isBenignCloseException() when
FlightRuntimeException.getMessage() returns null. Added null check
before calling contains() on the message string.
2. Fixed unit test setup to avoid attempting real server connections
during test initialization. Tests now use reflection to test private
methods without requiring actual network connections.
3. Fixed Mockito unnecessary stubbing warnings by making all mock
objects lenient, allowing tests to create comprehensive mocks
without triggering warnings when not all stubbings are used.
4. Simplified integration tests to focus on testable scenarios.
Removed tests that required mocking gRPC service methods (closeSession)
which are not routed through FlightProducer, making them difficult
to test in isolation.
Test Results:
- 21 tests total (15 unit + 1 integration + 5 builder tests)
- All tests passing with 0 failures and 0 errors
- Comprehensive coverage of error suppression logic via reflection-based
unit tests
@github-actions

This comment has been minimized.

@ennuite
ennuite marked this pull request as ready for review November 18, 2025 13:55
@ennuiteennuite changed the title GH-863: [JDBC] Suppress benign exceptions from gRPC layerGH-863: [JDBC] Suppress benign exceptions from gRPC layer on ArrowFlightSqlClientHandler#closeNov 18, 2025
@ennuite
ennuite marked this pull request as draft November 18, 2025 14:14
@ennuite

Copy link
Copy Markdown
ContributorAuthor

This PR is based on https://github.com/apache/arrow-java/pull/864/files, @vandop asked me to take it over from him.

I simplified the tests. I don't think this merits a full integration test with shutting down a server because all the logic is inside a single method.

About the logging level: for the original issue at https://github.com/apache/arrow/pull/14210/files the log level was set to warn, and in Vando's PR @lidavidm asked for the log level to be debug. It's not clear to me the reason for the discrepancy, and I put it as info.

@vandopvandop left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Thanks for taking over.
Note internally in Dremio we already tested this with jmeter, which wouldn't run without this change.

@jbonofre

Copy link
Copy Markdown
Member

The format is not fully correct. I will fix that.

@lidavidmlidavidm added the enhancement PRs that add or improve features. label Nov 25, 2025
@github-actionsgithub-actionsBot added this to the 18.4.0 milestone Nov 25, 2025
private void logSuppressedCloseException(
FlightRuntimeException fre, String operationDescription) {
// ARROW-17785 and GH-863: suppress exceptions caused by flaky gRPC layer during shutdown
LOGGER.info("Suppressed error {}", operationDescription, fre);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

I would still prefer debug level

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Agreed. Debug makes more sense to me here.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Ok, done!

@lidavidm
lidavidm merged commit 2329174 into apache:mainDec 4, 2025
22 of 25 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancementPRs that add or improve features.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

ArrowFlightSqlClientHandler.close() performs a CloseSession RPC that can fail during gRPC channel shutdown - similar to ARROW-17785

4 participants

@ennuite@jbonofre@lidavidm@vandop
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

GH-863: [JDBC] Suppress benign exceptions from gRPC layer on ArrowFlightSqlClientHandler#close - #910

Merged
lidavidm merged 6 commits into
apache:mainfrom
ennuite:pr-864-remove-jmeter-exceptions
Dec 4, 2025
Merged

GH-863: [JDBC] Suppress benign exceptions from gRPC layer on ArrowFlightSqlClientHandler#close#910
lidavidm merged 6 commits into
apache:mainfrom
ennuite:pr-864-remove-jmeter-exceptions

Conversation

@ennuite

@ennuiteennuite commented Nov 18, 2025

Copy link
Copy Markdown
Contributor

What's Changed

When using the Flight SQL JDBC driver with connection pooling and a catalog parameter, ArrowFlightSqlClientHandler.close() performs a CloseSession RPC that can fail during gRPC channel shutdown.

These transient failures (UNAVAILABLE or INTERNAL with "Connection closed after GOAWAY") cause noisy errors in pooling frameworks like Apache Commons DBCP.

With this PR these exceptions will instead be suppressed and logged, following the procedure that was used for ARROW-17785

Are these changes tested?

Yes

Closes#863

vandopand others added 5 commits November 14, 2025 19:48
…hen catalog is set
This change addresses race conditions during gRPC channel shutdown that occur
when using connection pooling with catalog parameters. The CloseSession RPC
can fail with UNAVAILABLE or 'Connection closed after GOAWAY' errors during
normal connection cleanup.
Key improvements:
- Refactored duplicate exception handling code into reusable helper methods
- Added comprehensive error suppression for both AutoCloseable cleanup and CloseSession
- Follows the established ARROW-17785 pattern from PreparedStatement.close()
- Improved logging with context-aware debug/info messages
- Fixed typo in existing error suppression logging
The refactoring eliminates code duplication while maintaining identical
functionality and improving maintainability.
…on error suppression
Add unit and integration tests for the error suppression functionality
in ArrowFlightSqlClientHandler:
- ArrowFlightSqlClientHandlerTest: 18 unit tests covering error detection,
logging, and exception handling logic using Mockito and reflection
- ArrowFlightSqlClientHandlerIntegrationTest: 4 integration tests with
real FlightServer to validate error suppression in realistic scenarios
Tests verify that benign gRPC shutdown errors (UNAVAILABLE and INTERNAL
with GOAWAY) are properly suppressed while genuine failures are correctly
propagated as exceptions.
…reliability
This commit addresses bugs introduced in the error suppression implementation:
1. Fixed NullPointerException in isBenignCloseException() when
FlightRuntimeException.getMessage() returns null. Added null check
before calling contains() on the message string.
2. Fixed unit test setup to avoid attempting real server connections
during test initialization. Tests now use reflection to test private
methods without requiring actual network connections.
3. Fixed Mockito unnecessary stubbing warnings by making all mock
objects lenient, allowing tests to create comprehensive mocks
without triggering warnings when not all stubbings are used.
4. Simplified integration tests to focus on testable scenarios.
Removed tests that required mocking gRPC service methods (closeSession)
which are not routed through FlightProducer, making them difficult
to test in isolation.
Test Results:
- 21 tests total (15 unit + 1 integration + 5 builder tests)
- All tests passing with 0 failures and 0 errors
- Comprehensive coverage of error suppression logic via reflection-based
unit tests
@github-actions

This comment has been minimized.

@ennuite
ennuite marked this pull request as ready for review November 18, 2025 13:55
@ennuiteennuite changed the title GH-863: [JDBC] Suppress benign exceptions from gRPC layerGH-863: [JDBC] Suppress benign exceptions from gRPC layer on ArrowFlightSqlClientHandler#closeNov 18, 2025
@ennuite
ennuite marked this pull request as draft November 18, 2025 14:14
@ennuite

Copy link
Copy Markdown
ContributorAuthor

This PR is based on https://github.com/apache/arrow-java/pull/864/files, @vandop asked me to take it over from him.

I simplified the tests. I don't think this merits a full integration test with shutting down a server because all the logic is inside a single method.

About the logging level: for the original issue at https://github.com/apache/arrow/pull/14210/files the log level was set to warn, and in Vando's PR @lidavidm asked for the log level to be debug. It's not clear to me the reason for the discrepancy, and I put it as info.

@vandopvandop left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Thanks for taking over.
Note internally in Dremio we already tested this with jmeter, which wouldn't run without this change.

@jbonofre

Copy link
Copy Markdown
Member

The format is not fully correct. I will fix that.

@lidavidmlidavidm added the enhancement PRs that add or improve features. label Nov 25, 2025
@github-actionsgithub-actionsBot added this to the 18.4.0 milestone Nov 25, 2025
private void logSuppressedCloseException(
FlightRuntimeException fre, String operationDescription) {
// ARROW-17785 and GH-863: suppress exceptions caused by flaky gRPC layer during shutdown
LOGGER.info("Suppressed error {}", operationDescription, fre);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

I would still prefer debug level

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Agreed. Debug makes more sense to me here.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Ok, done!

@lidavidm
lidavidm merged commit 2329174 into apache:mainDec 4, 2025
22 of 25 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancementPRs that add or improve features.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

ArrowFlightSqlClientHandler.close() performs a CloseSession RPC that can fail during gRPC channel shutdown - similar to ARROW-17785

4 participants

@ennuite@jbonofre@lidavidm@vandop
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

GH-863: [JDBC] Suppress benign exceptions from gRPC layer on ArrowFlightSqlClientHandler#close - #910

Merged
lidavidm merged 6 commits into
apache:mainfrom
ennuite:pr-864-remove-jmeter-exceptions
Dec 4, 2025
Merged

GH-863: [JDBC] Suppress benign exceptions from gRPC layer on ArrowFlightSqlClientHandler#close#910
lidavidm merged 6 commits into
apache:mainfrom
ennuite:pr-864-remove-jmeter-exceptions

Conversation

@ennuite

@ennuiteennuite commented Nov 18, 2025

Copy link
Copy Markdown
Contributor

What's Changed

When using the Flight SQL JDBC driver with connection pooling and a catalog parameter, ArrowFlightSqlClientHandler.close() performs a CloseSession RPC that can fail during gRPC channel shutdown.

These transient failures (UNAVAILABLE or INTERNAL with "Connection closed after GOAWAY") cause noisy errors in pooling frameworks like Apache Commons DBCP.

With this PR these exceptions will instead be suppressed and logged, following the procedure that was used for ARROW-17785

Are these changes tested?

Yes

Closes#863

vandopand others added 5 commits November 14, 2025 19:48
…hen catalog is set
This change addresses race conditions during gRPC channel shutdown that occur
when using connection pooling with catalog parameters. The CloseSession RPC
can fail with UNAVAILABLE or 'Connection closed after GOAWAY' errors during
normal connection cleanup.
Key improvements:
- Refactored duplicate exception handling code into reusable helper methods
- Added comprehensive error suppression for both AutoCloseable cleanup and CloseSession
- Follows the established ARROW-17785 pattern from PreparedStatement.close()
- Improved logging with context-aware debug/info messages
- Fixed typo in existing error suppression logging
The refactoring eliminates code duplication while maintaining identical
functionality and improving maintainability.
…on error suppression
Add unit and integration tests for the error suppression functionality
in ArrowFlightSqlClientHandler:
- ArrowFlightSqlClientHandlerTest: 18 unit tests covering error detection,
logging, and exception handling logic using Mockito and reflection
- ArrowFlightSqlClientHandlerIntegrationTest: 4 integration tests with
real FlightServer to validate error suppression in realistic scenarios
Tests verify that benign gRPC shutdown errors (UNAVAILABLE and INTERNAL
with GOAWAY) are properly suppressed while genuine failures are correctly
propagated as exceptions.
…reliability
This commit addresses bugs introduced in the error suppression implementation:
1. Fixed NullPointerException in isBenignCloseException() when
FlightRuntimeException.getMessage() returns null. Added null check
before calling contains() on the message string.
2. Fixed unit test setup to avoid attempting real server connections
during test initialization. Tests now use reflection to test private
methods without requiring actual network connections.
3. Fixed Mockito unnecessary stubbing warnings by making all mock
objects lenient, allowing tests to create comprehensive mocks
without triggering warnings when not all stubbings are used.
4. Simplified integration tests to focus on testable scenarios.
Removed tests that required mocking gRPC service methods (closeSession)
which are not routed through FlightProducer, making them difficult
to test in isolation.
Test Results:
- 21 tests total (15 unit + 1 integration + 5 builder tests)
- All tests passing with 0 failures and 0 errors
- Comprehensive coverage of error suppression logic via reflection-based
unit tests
@github-actions

This comment has been minimized.

@ennuite
ennuite marked this pull request as ready for review November 18, 2025 13:55
@ennuiteennuite changed the title GH-863: [JDBC] Suppress benign exceptions from gRPC layerGH-863: [JDBC] Suppress benign exceptions from gRPC layer on ArrowFlightSqlClientHandler#closeNov 18, 2025
@ennuite
ennuite marked this pull request as draft November 18, 2025 14:14
@ennuite

Copy link
Copy Markdown
ContributorAuthor

This PR is based on https://github.com/apache/arrow-java/pull/864/files, @vandop asked me to take it over from him.

I simplified the tests. I don't think this merits a full integration test with shutting down a server because all the logic is inside a single method.

About the logging level: for the original issue at https://github.com/apache/arrow/pull/14210/files the log level was set to warn, and in Vando's PR @lidavidm asked for the log level to be debug. It's not clear to me the reason for the discrepancy, and I put it as info.

@vandopvandop left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Thanks for taking over.
Note internally in Dremio we already tested this with jmeter, which wouldn't run without this change.

@jbonofre

Copy link
Copy Markdown
Member

The format is not fully correct. I will fix that.

@lidavidmlidavidm added the enhancement PRs that add or improve features. label Nov 25, 2025
@github-actionsgithub-actionsBot added this to the 18.4.0 milestone Nov 25, 2025
private void logSuppressedCloseException(
FlightRuntimeException fre, String operationDescription) {
// ARROW-17785 and GH-863: suppress exceptions caused by flaky gRPC layer during shutdown
LOGGER.info("Suppressed error {}", operationDescription, fre);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

I would still prefer debug level

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Agreed. Debug makes more sense to me here.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Ok, done!

@lidavidm
lidavidm merged commit 2329174 into apache:mainDec 4, 2025
22 of 25 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancementPRs that add or improve features.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

ArrowFlightSqlClientHandler.close() performs a CloseSession RPC that can fail during gRPC channel shutdown - similar to ARROW-17785

4 participants

@ennuite@jbonofre@lidavidm@vandop
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

GH-863: [JDBC] Suppress benign exceptions from gRPC layer on ArrowFlightSqlClientHandler#close - #910

Merged
lidavidm merged 6 commits into
apache:mainfrom
ennuite:pr-864-remove-jmeter-exceptions
Dec 4, 2025
Merged

GH-863: [JDBC] Suppress benign exceptions from gRPC layer on ArrowFlightSqlClientHandler#close#910
lidavidm merged 6 commits into
apache:mainfrom
ennuite:pr-864-remove-jmeter-exceptions

Conversation

@ennuite

@ennuiteennuite commented Nov 18, 2025

Copy link
Copy Markdown
Contributor

What's Changed

When using the Flight SQL JDBC driver with connection pooling and a catalog parameter, ArrowFlightSqlClientHandler.close() performs a CloseSession RPC that can fail during gRPC channel shutdown.

These transient failures (UNAVAILABLE or INTERNAL with "Connection closed after GOAWAY") cause noisy errors in pooling frameworks like Apache Commons DBCP.

With this PR these exceptions will instead be suppressed and logged, following the procedure that was used for ARROW-17785

Are these changes tested?

Yes

Closes#863

vandopand others added 5 commits November 14, 2025 19:48
…hen catalog is set
This change addresses race conditions during gRPC channel shutdown that occur
when using connection pooling with catalog parameters. The CloseSession RPC
can fail with UNAVAILABLE or 'Connection closed after GOAWAY' errors during
normal connection cleanup.
Key improvements:
- Refactored duplicate exception handling code into reusable helper methods
- Added comprehensive error suppression for both AutoCloseable cleanup and CloseSession
- Follows the established ARROW-17785 pattern from PreparedStatement.close()
- Improved logging with context-aware debug/info messages
- Fixed typo in existing error suppression logging
The refactoring eliminates code duplication while maintaining identical
functionality and improving maintainability.
…on error suppression
Add unit and integration tests for the error suppression functionality
in ArrowFlightSqlClientHandler:
- ArrowFlightSqlClientHandlerTest: 18 unit tests covering error detection,
logging, and exception handling logic using Mockito and reflection
- ArrowFlightSqlClientHandlerIntegrationTest: 4 integration tests with
real FlightServer to validate error suppression in realistic scenarios
Tests verify that benign gRPC shutdown errors (UNAVAILABLE and INTERNAL
with GOAWAY) are properly suppressed while genuine failures are correctly
propagated as exceptions.
…reliability
This commit addresses bugs introduced in the error suppression implementation:
1. Fixed NullPointerException in isBenignCloseException() when
FlightRuntimeException.getMessage() returns null. Added null check
before calling contains() on the message string.
2. Fixed unit test setup to avoid attempting real server connections
during test initialization. Tests now use reflection to test private
methods without requiring actual network connections.
3. Fixed Mockito unnecessary stubbing warnings by making all mock
objects lenient, allowing tests to create comprehensive mocks
without triggering warnings when not all stubbings are used.
4. Simplified integration tests to focus on testable scenarios.
Removed tests that required mocking gRPC service methods (closeSession)
which are not routed through FlightProducer, making them difficult
to test in isolation.
Test Results:
- 21 tests total (15 unit + 1 integration + 5 builder tests)
- All tests passing with 0 failures and 0 errors
- Comprehensive coverage of error suppression logic via reflection-based
unit tests
@github-actions

This comment has been minimized.

@ennuite
ennuite marked this pull request as ready for review November 18, 2025 13:55
@ennuiteennuite changed the title GH-863: [JDBC] Suppress benign exceptions from gRPC layerGH-863: [JDBC] Suppress benign exceptions from gRPC layer on ArrowFlightSqlClientHandler#closeNov 18, 2025
@ennuite
ennuite marked this pull request as draft November 18, 2025 14:14
@ennuite

Copy link
Copy Markdown
ContributorAuthor

This PR is based on https://github.com/apache/arrow-java/pull/864/files, @vandop asked me to take it over from him.

I simplified the tests. I don't think this merits a full integration test with shutting down a server because all the logic is inside a single method.

About the logging level: for the original issue at https://github.com/apache/arrow/pull/14210/files the log level was set to warn, and in Vando's PR @lidavidm asked for the log level to be debug. It's not clear to me the reason for the discrepancy, and I put it as info.

@vandopvandop left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Thanks for taking over.
Note internally in Dremio we already tested this with jmeter, which wouldn't run without this change.

@jbonofre

Copy link
Copy Markdown
Member

The format is not fully correct. I will fix that.

@lidavidmlidavidm added the enhancement PRs that add or improve features. label Nov 25, 2025
@github-actionsgithub-actionsBot added this to the 18.4.0 milestone Nov 25, 2025
private void logSuppressedCloseException(
FlightRuntimeException fre, String operationDescription) {
// ARROW-17785 and GH-863: suppress exceptions caused by flaky gRPC layer during shutdown
LOGGER.info("Suppressed error {}", operationDescription, fre);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

I would still prefer debug level

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Agreed. Debug makes more sense to me here.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Ok, done!

@lidavidm
lidavidm merged commit 2329174 into apache:mainDec 4, 2025
22 of 25 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancementPRs that add or improve features.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

ArrowFlightSqlClientHandler.close() performs a CloseSession RPC that can fail during gRPC channel shutdown - similar to ARROW-17785

4 participants

@ennuite@jbonofre@lidavidm@vandop
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

GH-863: [JDBC] Suppress benign exceptions from gRPC layer on ArrowFlightSqlClientHandler#close - #910

Merged
lidavidm merged 6 commits into
apache:mainfrom
ennuite:pr-864-remove-jmeter-exceptions
Dec 4, 2025
Merged

GH-863: [JDBC] Suppress benign exceptions from gRPC layer on ArrowFlightSqlClientHandler#close#910
lidavidm merged 6 commits into
apache:mainfrom
ennuite:pr-864-remove-jmeter-exceptions

Conversation

@ennuite

@ennuiteennuite commented Nov 18, 2025

Copy link
Copy Markdown
Contributor

What's Changed

When using the Flight SQL JDBC driver with connection pooling and a catalog parameter, ArrowFlightSqlClientHandler.close() performs a CloseSession RPC that can fail during gRPC channel shutdown.

These transient failures (UNAVAILABLE or INTERNAL with "Connection closed after GOAWAY") cause noisy errors in pooling frameworks like Apache Commons DBCP.

With this PR these exceptions will instead be suppressed and logged, following the procedure that was used for ARROW-17785

Are these changes tested?

Yes

Closes#863

vandopand others added 5 commits November 14, 2025 19:48
…hen catalog is set
This change addresses race conditions during gRPC channel shutdown that occur
when using connection pooling with catalog parameters. The CloseSession RPC
can fail with UNAVAILABLE or 'Connection closed after GOAWAY' errors during
normal connection cleanup.
Key improvements:
- Refactored duplicate exception handling code into reusable helper methods
- Added comprehensive error suppression for both AutoCloseable cleanup and CloseSession
- Follows the established ARROW-17785 pattern from PreparedStatement.close()
- Improved logging with context-aware debug/info messages
- Fixed typo in existing error suppression logging
The refactoring eliminates code duplication while maintaining identical
functionality and improving maintainability.
…on error suppression
Add unit and integration tests for the error suppression functionality
in ArrowFlightSqlClientHandler:
- ArrowFlightSqlClientHandlerTest: 18 unit tests covering error detection,
logging, and exception handling logic using Mockito and reflection
- ArrowFlightSqlClientHandlerIntegrationTest: 4 integration tests with
real FlightServer to validate error suppression in realistic scenarios
Tests verify that benign gRPC shutdown errors (UNAVAILABLE and INTERNAL
with GOAWAY) are properly suppressed while genuine failures are correctly
propagated as exceptions.
…reliability
This commit addresses bugs introduced in the error suppression implementation:
1. Fixed NullPointerException in isBenignCloseException() when
FlightRuntimeException.getMessage() returns null. Added null check
before calling contains() on the message string.
2. Fixed unit test setup to avoid attempting real server connections
during test initialization. Tests now use reflection to test private
methods without requiring actual network connections.
3. Fixed Mockito unnecessary stubbing warnings by making all mock
objects lenient, allowing tests to create comprehensive mocks
without triggering warnings when not all stubbings are used.
4. Simplified integration tests to focus on testable scenarios.
Removed tests that required mocking gRPC service methods (closeSession)
which are not routed through FlightProducer, making them difficult
to test in isolation.
Test Results:
- 21 tests total (15 unit + 1 integration + 5 builder tests)
- All tests passing with 0 failures and 0 errors
- Comprehensive coverage of error suppression logic via reflection-based
unit tests
@github-actions

This comment has been minimized.

@ennuite
ennuite marked this pull request as ready for review November 18, 2025 13:55
@ennuiteennuite changed the title GH-863: [JDBC] Suppress benign exceptions from gRPC layerGH-863: [JDBC] Suppress benign exceptions from gRPC layer on ArrowFlightSqlClientHandler#closeNov 18, 2025
@ennuite
ennuite marked this pull request as draft November 18, 2025 14:14
@ennuite

Copy link
Copy Markdown
ContributorAuthor

This PR is based on https://github.com/apache/arrow-java/pull/864/files, @vandop asked me to take it over from him.

I simplified the tests. I don't think this merits a full integration test with shutting down a server because all the logic is inside a single method.

About the logging level: for the original issue at https://github.com/apache/arrow/pull/14210/files the log level was set to warn, and in Vando's PR @lidavidm asked for the log level to be debug. It's not clear to me the reason for the discrepancy, and I put it as info.

@vandopvandop left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Thanks for taking over.
Note internally in Dremio we already tested this with jmeter, which wouldn't run without this change.

@jbonofre

Copy link
Copy Markdown
Member

The format is not fully correct. I will fix that.

@lidavidmlidavidm added the enhancement PRs that add or improve features. label Nov 25, 2025
@github-actionsgithub-actionsBot added this to the 18.4.0 milestone Nov 25, 2025
private void logSuppressedCloseException(
FlightRuntimeException fre, String operationDescription) {
// ARROW-17785 and GH-863: suppress exceptions caused by flaky gRPC layer during shutdown
LOGGER.info("Suppressed error {}", operationDescription, fre);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

I would still prefer debug level

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Agreed. Debug makes more sense to me here.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Ok, done!

@lidavidm
lidavidm merged commit 2329174 into apache:mainDec 4, 2025
22 of 25 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancementPRs that add or improve features.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

ArrowFlightSqlClientHandler.close() performs a CloseSession RPC that can fail during gRPC channel shutdown - similar to ARROW-17785

4 participants

@ennuite@jbonofre@lidavidm@vandop
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

GH-863: [JDBC] Suppress benign exceptions from gRPC layer on ArrowFlightSqlClientHandler#close - #910

Merged
lidavidm merged 6 commits into
apache:mainfrom
ennuite:pr-864-remove-jmeter-exceptions
Dec 4, 2025
Merged

GH-863: [JDBC] Suppress benign exceptions from gRPC layer on ArrowFlightSqlClientHandler#close#910
lidavidm merged 6 commits into
apache:mainfrom
ennuite:pr-864-remove-jmeter-exceptions

Conversation

@ennuite

@ennuiteennuite commented Nov 18, 2025

Copy link
Copy Markdown
Contributor

What's Changed

When using the Flight SQL JDBC driver with connection pooling and a catalog parameter, ArrowFlightSqlClientHandler.close() performs a CloseSession RPC that can fail during gRPC channel shutdown.

These transient failures (UNAVAILABLE or INTERNAL with "Connection closed after GOAWAY") cause noisy errors in pooling frameworks like Apache Commons DBCP.

With this PR these exceptions will instead be suppressed and logged, following the procedure that was used for ARROW-17785

Are these changes tested?

Yes

Closes#863

vandopand others added 5 commits November 14, 2025 19:48
…hen catalog is set
This change addresses race conditions during gRPC channel shutdown that occur
when using connection pooling with catalog parameters. The CloseSession RPC
can fail with UNAVAILABLE or 'Connection closed after GOAWAY' errors during
normal connection cleanup.
Key improvements:
- Refactored duplicate exception handling code into reusable helper methods
- Added comprehensive error suppression for both AutoCloseable cleanup and CloseSession
- Follows the established ARROW-17785 pattern from PreparedStatement.close()
- Improved logging with context-aware debug/info messages
- Fixed typo in existing error suppression logging
The refactoring eliminates code duplication while maintaining identical
functionality and improving maintainability.
…on error suppression
Add unit and integration tests for the error suppression functionality
in ArrowFlightSqlClientHandler:
- ArrowFlightSqlClientHandlerTest: 18 unit tests covering error detection,
logging, and exception handling logic using Mockito and reflection
- ArrowFlightSqlClientHandlerIntegrationTest: 4 integration tests with
real FlightServer to validate error suppression in realistic scenarios
Tests verify that benign gRPC shutdown errors (UNAVAILABLE and INTERNAL
with GOAWAY) are properly suppressed while genuine failures are correctly
propagated as exceptions.
…reliability
This commit addresses bugs introduced in the error suppression implementation:
1. Fixed NullPointerException in isBenignCloseException() when
FlightRuntimeException.getMessage() returns null. Added null check
before calling contains() on the message string.
2. Fixed unit test setup to avoid attempting real server connections
during test initialization. Tests now use reflection to test private
methods without requiring actual network connections.
3. Fixed Mockito unnecessary stubbing warnings by making all mock
objects lenient, allowing tests to create comprehensive mocks
without triggering warnings when not all stubbings are used.
4. Simplified integration tests to focus on testable scenarios.
Removed tests that required mocking gRPC service methods (closeSession)
which are not routed through FlightProducer, making them difficult
to test in isolation.
Test Results:
- 21 tests total (15 unit + 1 integration + 5 builder tests)
- All tests passing with 0 failures and 0 errors
- Comprehensive coverage of error suppression logic via reflection-based
unit tests
@github-actions

This comment has been minimized.

@ennuite
ennuite marked this pull request as ready for review November 18, 2025 13:55
@ennuiteennuite changed the title GH-863: [JDBC] Suppress benign exceptions from gRPC layerGH-863: [JDBC] Suppress benign exceptions from gRPC layer on ArrowFlightSqlClientHandler#closeNov 18, 2025
@ennuite
ennuite marked this pull request as draft November 18, 2025 14:14
@ennuite

Copy link
Copy Markdown
ContributorAuthor

This PR is based on https://github.com/apache/arrow-java/pull/864/files, @vandop asked me to take it over from him.

I simplified the tests. I don't think this merits a full integration test with shutting down a server because all the logic is inside a single method.

About the logging level: for the original issue at https://github.com/apache/arrow/pull/14210/files the log level was set to warn, and in Vando's PR @lidavidm asked for the log level to be debug. It's not clear to me the reason for the discrepancy, and I put it as info.

@vandopvandop left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Thanks for taking over.
Note internally in Dremio we already tested this with jmeter, which wouldn't run without this change.

@jbonofre

Copy link
Copy Markdown
Member

The format is not fully correct. I will fix that.

@lidavidmlidavidm added the enhancement PRs that add or improve features. label Nov 25, 2025
@github-actionsgithub-actionsBot added this to the 18.4.0 milestone Nov 25, 2025
private void logSuppressedCloseException(
FlightRuntimeException fre, String operationDescription) {
// ARROW-17785 and GH-863: suppress exceptions caused by flaky gRPC layer during shutdown
LOGGER.info("Suppressed error {}", operationDescription, fre);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

I would still prefer debug level

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Agreed. Debug makes more sense to me here.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Ok, done!

@lidavidm
lidavidm merged commit 2329174 into apache:mainDec 4, 2025
22 of 25 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancementPRs that add or improve features.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

ArrowFlightSqlClientHandler.close() performs a CloseSession RPC that can fail during gRPC channel shutdown - similar to ARROW-17785

4 participants

@ennuite@jbonofre@lidavidm@vandop
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

GH-863: [JDBC] Suppress benign exceptions from gRPC layer on ArrowFlightSqlClientHandler#close - #910

Merged
lidavidm merged 6 commits into
apache:mainfrom
ennuite:pr-864-remove-jmeter-exceptions
Dec 4, 2025
Merged

GH-863: [JDBC] Suppress benign exceptions from gRPC layer on ArrowFlightSqlClientHandler#close#910
lidavidm merged 6 commits into
apache:mainfrom
ennuite:pr-864-remove-jmeter-exceptions

Conversation

@ennuite

@ennuiteennuite commented Nov 18, 2025

Copy link
Copy Markdown
Contributor

What's Changed

When using the Flight SQL JDBC driver with connection pooling and a catalog parameter, ArrowFlightSqlClientHandler.close() performs a CloseSession RPC that can fail during gRPC channel shutdown.

These transient failures (UNAVAILABLE or INTERNAL with "Connection closed after GOAWAY") cause noisy errors in pooling frameworks like Apache Commons DBCP.

With this PR these exceptions will instead be suppressed and logged, following the procedure that was used for ARROW-17785

Are these changes tested?

Yes

Closes#863

vandopand others added 5 commits November 14, 2025 19:48
…hen catalog is set
This change addresses race conditions during gRPC channel shutdown that occur
when using connection pooling with catalog parameters. The CloseSession RPC
can fail with UNAVAILABLE or 'Connection closed after GOAWAY' errors during
normal connection cleanup.
Key improvements:
- Refactored duplicate exception handling code into reusable helper methods
- Added comprehensive error suppression for both AutoCloseable cleanup and CloseSession
- Follows the established ARROW-17785 pattern from PreparedStatement.close()
- Improved logging with context-aware debug/info messages
- Fixed typo in existing error suppression logging
The refactoring eliminates code duplication while maintaining identical
functionality and improving maintainability.
…on error suppression
Add unit and integration tests for the error suppression functionality
in ArrowFlightSqlClientHandler:
- ArrowFlightSqlClientHandlerTest: 18 unit tests covering error detection,
logging, and exception handling logic using Mockito and reflection
- ArrowFlightSqlClientHandlerIntegrationTest: 4 integration tests with
real FlightServer to validate error suppression in realistic scenarios
Tests verify that benign gRPC shutdown errors (UNAVAILABLE and INTERNAL
with GOAWAY) are properly suppressed while genuine failures are correctly
propagated as exceptions.
…reliability
This commit addresses bugs introduced in the error suppression implementation:
1. Fixed NullPointerException in isBenignCloseException() when
FlightRuntimeException.getMessage() returns null. Added null check
before calling contains() on the message string.
2. Fixed unit test setup to avoid attempting real server connections
during test initialization. Tests now use reflection to test private
methods without requiring actual network connections.
3. Fixed Mockito unnecessary stubbing warnings by making all mock
objects lenient, allowing tests to create comprehensive mocks
without triggering warnings when not all stubbings are used.
4. Simplified integration tests to focus on testable scenarios.
Removed tests that required mocking gRPC service methods (closeSession)
which are not routed through FlightProducer, making them difficult
to test in isolation.
Test Results:
- 21 tests total (15 unit + 1 integration + 5 builder tests)
- All tests passing with 0 failures and 0 errors
- Comprehensive coverage of error suppression logic via reflection-based
unit tests
@github-actions

This comment has been minimized.

@ennuite
ennuite marked this pull request as ready for review November 18, 2025 13:55
@ennuiteennuite changed the title GH-863: [JDBC] Suppress benign exceptions from gRPC layerGH-863: [JDBC] Suppress benign exceptions from gRPC layer on ArrowFlightSqlClientHandler#closeNov 18, 2025
@ennuite
ennuite marked this pull request as draft November 18, 2025 14:14
@ennuite

Copy link
Copy Markdown
ContributorAuthor

This PR is based on https://github.com/apache/arrow-java/pull/864/files, @vandop asked me to take it over from him.

I simplified the tests. I don't think this merits a full integration test with shutting down a server because all the logic is inside a single method.

About the logging level: for the original issue at https://github.com/apache/arrow/pull/14210/files the log level was set to warn, and in Vando's PR @lidavidm asked for the log level to be debug. It's not clear to me the reason for the discrepancy, and I put it as info.

@vandopvandop left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Thanks for taking over.
Note internally in Dremio we already tested this with jmeter, which wouldn't run without this change.

@jbonofre

Copy link
Copy Markdown
Member

The format is not fully correct. I will fix that.

@lidavidmlidavidm added the enhancement PRs that add or improve features. label Nov 25, 2025
@github-actionsgithub-actionsBot added this to the 18.4.0 milestone Nov 25, 2025
private void logSuppressedCloseException(
FlightRuntimeException fre, String operationDescription) {
// ARROW-17785 and GH-863: suppress exceptions caused by flaky gRPC layer during shutdown
LOGGER.info("Suppressed error {}", operationDescription, fre);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

I would still prefer debug level

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Agreed. Debug makes more sense to me here.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Ok, done!

@lidavidm
lidavidm merged commit 2329174 into apache:mainDec 4, 2025
22 of 25 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancementPRs that add or improve features.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

ArrowFlightSqlClientHandler.close() performs a CloseSession RPC that can fail during gRPC channel shutdown - similar to ARROW-17785

4 participants

@ennuite@jbonofre@lidavidm@vandop