Repository navigation
fix: Restarted the watch after stream reset #19055 - #19056
Conversation
There was a problem hiding this comment.
Pull request overview
Fixes issue #19055 by improving resiliency of the Kubernetes service-discovery watch so broker node inventory can recover after watch stream disruptions.
Changes:
- Updated
WatchResultto be usable with try-with-resources by extendingAutoCloseable. - Refactored
NodeRoleWatcher.keepWatchingto use try-with-resources and added explicit handling for HTTP/2 stream reset conditions.
Reviewed changes
Copilot reviewed 2 out of 2 changed files in this pull request and generated 3 comments.
| File | Description |
|---|---|
extensions-core/kubernetes-extensions/src/main/java/org/apache/druid/k8s/discovery/WatchResult.java |
Adjusts the watch iterator contract to support automatic resource management. |
extensions-core/kubernetes-extensions/src/main/java/org/apache/druid/k8s/discovery/K8sDruidNodeDiscoveryProvider.java |
Updates watch loop to auto-close resources and attempts to restart after stream resets/timeouts. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
|
@vivek807 Thanks for reporting the issue and submitting this PR for fix. can you address above comments? |
updated, please recheck. |
dc86628 to
268b1ff
Compare
capistrant
left a comment
There was a problem hiding this comment.
Still think we need to push further in removing the okhttp internals from this PR. My initial thought is that we just need to handle all IOExceptions with a full re-list. We can keep the one off handling of the known ok IOException that a simple retry of the watch from same resource version will work for. But for all others force a re-list? My biggest fear is that this is an overreaction.
FrankChen021
left a comment
There was a problem hiding this comment.
Follow-up handled: the OkHttp internal StreamResetException dependency was removed, and the watch handling now treats non-interrupt IOExceptions as restartable channel resets while preserving timeout handling. No further inline reply needed from me.
This is an automated review by Codex GPT-5
This is an automated review by Codex GPT-5
|
@FrankChen021 @gianm @capistrant Please let me know if there’s anything I can do to help move this PR forward. |
FrankChen021
left a comment
There was a problem hiding this comment.
I reviewed the update and full PR for correctness, lifecycle, retry, cancellation, cleanup, and concurrency risks; no new issues were found.
Reviewed 5 of 5 changed files.
This is an automated review by Codex GPT-5.6-Sol
|
@capistrant - Can you please check this. |
92fce24 to
9806c18
Compare
2355d10 to
7298c01
Compare
FrankChen021
left a comment
There was a problem hiding this comment.
| Severity | Findings |
|---|---|
| P0 | 0 |
| P1 | 0 |
| P2 | 1 |
| P3 | 0 |
| Total | 1 |
I reviewed the full current diff because the prior reviewed baseline SHA was unavailable.
Reviewed 5 of 5 changed files.
This is an automated review by Codex GPT-5.6-Luna(max)
| } | ||
| catch (ChannelResetException ex) { | ||
| LOGGER.debug("Watch stream terminated normally for role[%s], restarting", this.nodeRole); | ||
| return; |
There was a problem hiding this comment.
[P2] Persistent resets can cause a tight relist loop
Returning from this handler immediately re-enters the outer watch() loop, which performs listPods() and opens another watch without using watcherErrorRetryWaitMS. If the API server or an intermediary persistently resets every watch stream, this becomes an unbounded list/watch loop that can hammer the Kubernetes API and consume the watcher thread. Apply the configured retry backoff (or otherwise rate-limit full resyncs) before retrying this failure path.
a44ac5d to
8559960
Compare
| obj = new Watch.Response<>( | ||
| WatchResult.BOOKMARK, | ||
| new DiscoveryDruidNodeAndResourceVersion( | ||
| item.object.getMetadata().getResourceVersion(), null)); |
There was a problem hiding this comment.
BOOKMARK events always has resource version
FrankChen021
left a comment
There was a problem hiding this comment.
I reviewed the incremental update and the full current diff for correctness, edge cases, concurrency, lifecycle, retry, cleanup, compatibility, and data-loss risks; no issues found.
Reviewed 7 of 7 changed files.
This is an automated review by Codex GPT-5.6-Luna(max)
|
I have manually tested this PR on k8s version 1.35. |
|
Thanks @FrankChen021 and @AdheipSingh for taking the time to review the changes. @capistrant I’ve received the required approval. Could you also review the changes and let me know if there’s anything else I can do to help move this PR forward? |
|
@vivek807 can you merge the master to your branch again to see if the CI will be green? recently there're several CI problems when some old PRs were merged into master |
Remove hard dependency of okhttp3 internals
Rebasing onto apache/druid master silently duplicated three childRemoved(skipIfUnknown) tests: the JUnit5 versions already in this branch's history merged alongside stale JUnit4 copies from before the junit5-migration commit, instead of conflicting.
Address review comments Signed-off-by: Vivek Dhiman <approach2vivek@gmail.com>
8559960 to
c66ddf8
Compare
FrankChen021
left a comment
There was a problem hiding this comment.
🟢 Approval recommended
No actionable issues found in this review. Connection resets close the active watch and trigger a full relist after backoff, socket timeouts retain the last processed resource version, and bookmark events carry their own resource version without replaying the previous node event. The current regression tests cover bookmark handling, connection resets, and repeated-reset backoff.
Reviewed 7 of 7 changed files, including the dependency declaration, exception and iterator contracts, both watcher implementations, and both test files. The incremental comparison contains upstream rebase changes; all seven PR files are unchanged from the previous reviewed head. I rechecked the full current diff and surrounding discovery cache and lifecycle code against the latest base.
Validation: git diff --check cde7404de1e6257fce19c9990dd7d94332fca10c HEAD passed. Static review only; no tests or builds were run.
This is an automated review by Codex GPT-5.6-Luna(max)
Fixes #19055.
Description
Restarted the watch after stream reset
Fixed the bug #19055
This PR has: