Skip to content

Deliver upstream feedback to remote tasks and stop spurious "No remote destination available" warnings - #9175

Open
ErnestasVaiciukeviciusAdform wants to merge 11 commits into
apache:masterfrom
ErnestasVaiciukeviciusAdform:fix/upstream-feedback-remote-destination
Open

ErnestasVaiciukeviciusAdform wants to merge 11 commits into
apache:masterfrom
ErnestasVaiciukeviciusAdform:fix/upstream-feedback-remote-destination

Conversation

@ErnestasVaiciukeviciusAdform

Copy link
Copy Markdown

What is the purpose of the change

To fix #9174.

When topology.upstream.feedback.enable=true, workers flood their logs with
WARN o.a.s.utils.TransferDrainer - No remote destination available for task <id>,
and — more importantly — the upstream-feedback tuples that trigger those warnings are
dropped. Upstream feedback is therefore only delivered to tasks on the same
worker; feedback destined for upstream tasks on other workers never arrives.

Root cause. Upstream feedback is routed directly to upstream (source) component task ids
via Task.sendUnanchoredFeedback, bypassing stream grouping
(Executor.sendUpstreamFeedback / Executor.computeUpstreamTaskIds). But a worker's routable
remote destinations (WorkerState.cachedTaskToNodePort) and its connections are built only
from outboundTasks, which WorkerState.workerOutboundTasks() derives purely from the
downstream-target components of local tasks. addUpstreamFeedback declares
FEEDBACK_STREAM_ID only as an output stream (no grouping/input edge), so feedback recipients
are never added to outboundTasks. For a remote recipient, TransferDrainer.send finds no
node, logs the warning, and drops the tuple.

Why it looks intermittent / misleading. outboundTasks membership is decided per
component: if a component is a downstream target of any local task, all of its tasks become
routable. So a worker emits no warning for feedback to upstream component X whenever X
also happens to be a downstream target of some co-located task — the feedback rides the
existing connection and looks healthy. The same feedback edge warns and drops on a worker that
hosts upstream tasks of X but none of X's downstream consumers. Consequently "no
warnings" does not mean feedback is delivered
; it only reflects task placement (e.g. the
warnings vanish entirely if every worker happens to host a task of every component), which can
mislead operators into thinking the feature works.

Fix. When upstream feedback is enabled, also include the non-system source (upstream)
components of the locally-hosted components when computing outboundTasks, mirroring
Executor.computeUpstreamTaskIds() at worker granularity. This makes every feedback recipient
(bolt or spout) a routable remote destination with a connection, so feedback is delivered
correctly and the spurious warning disappears — independent of task placement. The change is
confined to WorkerState.workerOutboundTasks() and only takes effect when
topology.upstream.feedback.enable=true (off by default).

How was the change tested

  • Added WorkerOutboundTasksTest (storm-client) covering a spout -> bolt1 -> bolt2 topology:
    • feedback disabled → only downstream-target tasks are routable (upstream spout tasks excluded);
    • feedback enabled → upstream source (spout) tasks are additionally routable, downstream tasks preserved;
    • the misleading placement-dependent case → when a worker co-locates a spout and a bolt2
      task, bolt1 is already routable as the spout's downstream target even with feedback off,
      documenting that absence of warnings does not imply correct delivery.
  • Commands run (Maven 3.10, Java 25):
    • mvn -pl storm-client -am install -DskipTests — BUILD SUCCESS
    • mvn -pl storm-client test -Dtest=WorkerOutboundTasksTest — Tests run: 3, Failures: 0, Errors: 0
    • mvn -pl storm-client test -Dtest=WorkerStateTest (existing tests, no regression) — Tests run: 3, Failures: 0, Errors: 0
    • mvn -pl storm-client checkstyle:check@validate — 0 Checkstyle violations

@reiabreu reiabreu left a comment •

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

This review was generated with the help of an LLM (Claude).

Inline notes below.

Comment thread storm-client/src/jvm/org/apache/storm/daemon/worker/WorkerState.java Outdated
Comment thread storm-client/src/jvm/org/apache/storm/daemon/worker/WorkerState.java Outdated
Comment thread storm-client/test/jvm/org/apache/storm/daemon/worker/WorkerOutboundTasksTest.java Outdated
Comment thread storm-client/test/jvm/org/apache/storm/daemon/worker/WorkerOutboundTasksTest.java Outdated
@reiabreu reiabreu added the bug label Oct 17, 2026
@reiabreu reiabreu added this to the 3.2.0 milestone Oct 17, 2026
@GGraziadei

GGraziadei commented Oct 17, 2026 •

Copy link
Copy Markdown
Member

Hi @ErnestasVaiciukeviciusAdform thanks a lot for reporting and addressing this bug!

If you have bandwidth, can you execute with your changes this topology in a two supervisors cluster with flag on/off?

https://github.com/apache/storm/blob/master/examples%2Fstorm-perf%2Fsrc%2Fmain%2Fjava%2Forg%2Fapache%2Fstorm%2Fperf%2FJitterAwareGroupingTopology.java

@ErnestasVaiciukeviciusAdform

Copy link
Copy Markdown
Author

Hi @ErnestasVaiciukeviciusAdform thanks a lot for reporting and addressing this bug!

If you have bandwidth, can you execute with your changes this topology in a two supervisors cluster with flag on/off?

https://github.com/apache/storm/blob/master/examples%2Fstorm-perf%2Fsrc%2Fmain%2Fjava%2Forg%2Fapache%2Fstorm%2Fperf%2FJitterAwareGroupingTopology.java

Sure.
Below what i've got running JitterAwareGroupingTopology on codebase with PR changes (2 runs for each case):

4 workers, 2 supervisors - feedback disabled (-c topology.upstream.feedback.enable=false)
120,4,12,12,38640,644,1,2680,2300,44,11400.035,11400.035
second run
120,4,12,12,33380,556,1,2040,2020,34,13016.901,13016.901

4 workers, 2 supervisors - feedback enabled (-c topology.upstream.feedback.enable=true)
120,4,12,12,49680,828,1,3580,3060,59,8996.098,8996.098
second run
120,4,12,12,46240,770,1,3340,2760,55,9766.036,9766.036

Also for comparison on unmodified 3.1.0:

4 workers - feedback disabled
120,4,12,12,39620,660,1,3000,2300,50,11436.565,11436.565

4 workers - feedback enabled
120,4,12,12,38220,637,1,2660,2300,44,11365.287,11365.287

@GGraziadei

GGraziadei commented Oct 19, 2026 •

Copy link
Copy Markdown
Member

Hi @ErnestasVaiciukeviciusAdform thanks!
What about repeating the benchmark with this configuration and running for 240s?

topology.executor.receive.control.queue.enable: true/false
topology.max.spout.pending: 500
topology.upstream.feedback.enable: true/false

Reducing p99 latency of 4s(~30%) is a lot, it requires additional validation.

@GGraziadei GGraziadei left a comment

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.

A few requests before merging:

  • Please rebase on master
  • Document the connection fan-in in docs/Performance.md (the only place describing the flag) and/or the TOPOLOGY_UPSTREAM_FEEDBACK_ENABLE javadoc: with the flag on, every worker hosting a user bolt now opens a Netty client connection to every worker hosting a task of its upstream components
  • A few small things on the tests, inline.

Comment thread storm-client/test/jvm/org/apache/storm/daemon/worker/WorkerOutboundTasksTest.java Outdated
…e destination available" warnings

When topology.upstream.feedback.enable is true, feedback tuples are routed
directly to upstream (source) component tasks, but a worker's routable remote
destinations (cachedTaskToNodePort) and connections are built only from
outboundTasks, which contained just the downstream-target components of local
tasks. Feedback recipients were therefore missing, so TransferDrainer logged
"No remote destination available for task" and silently dropped the tuple;
cross-worker feedback was never delivered. Whether the warning appeared depended
on task placement, which was misleading.

Include the non-system source (upstream) components of local tasks in
outboundTasks when feedback is enabled, mirroring Executor.computeUpstreamTaskIds
at worker granularity, so feedback recipients are routable and connected.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@ErnestasVaiciukeviciusAdform
ErnestasVaiciukeviciusAdform force-pushed the fix/upstream-feedback-remote-destination branch from c18e109 to 0f60ebe Compare October 20, 2026 07:22
@ErnestasVaiciukeviciusAdform

Copy link
Copy Markdown
Author

Hi @ErnestasVaiciukeviciusAdform thanks! What about repeating the benchmark with this configuration and running for 240s?

topology.executor.receive.control.queue.enable: true/false
topology.max.spout.pending: 500
topology.upstream.feedback.enable: true/false

Reducing p99 latency of 4s(~30%) is a lot, it requires additional validation.

Checked all 4 variations (on code rebased on master).

-c topology.executor.receive.control.queue.enable=false -c topology.upstream.feedback.enable=false

240,4,12,12,28300,471,1,2060,1880,34,14326.030,14326.030

-c topology.executor.receive.control.queue.enable=false -c topology.upstream.feedback.enable=true

240,4,12,12,45760,762,1,3020,3040,50,9497.082,9497.082

-c topology.executor.receive.control.queue.enable=true -c topology.upstream.feedback.enable=false

240,4,12,12,30100,501,1,1880,2020,31,14314.659,14314.659

-c topology.executor.receive.control.queue.enable=true -c topology.upstream.feedback.enable=true

240,4,12,12,47820,797,1,3080,3120,51,8984.315,8984.315

@ErnestasVaiciukeviciusAdform

ErnestasVaiciukeviciusAdform commented Oct 20, 2026 •

Copy link
Copy Markdown
Author

A few requests before merging:

  • Please rebase on master
  • Document the connection fan-in in docs/Performance.md (the only place describing the flag) and/or the TOPOLOGY_UPSTREAM_FEEDBACK_ENABLE javadoc: with the flag on, every worker hosting a user bolt now opens a Netty client connection to every worker hosting a task of its upstream components
  • A few small things on the tests, inline.

Addressed all the points.
Documentation extended in both Performance.md and javadoc.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

topology.upstream.feedback.enable floods logs with "No remote destination available for task" and drops cross-worker feedback

3 participants