You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@pekko.apache.org by "He-Pin (via GitHub)" <gi...@apache.org> on 2026/05/29 16:23:50 UTC

[PR] fix: await in-flight completion on partner termination in SinkRef [pekko]

He-Pin opened a new pull request, #3016:
URL: https://github.com/apache/pekko/pull/3016

   ## Motivation
   
   `StreamRefsSpec` *"pass cancellation upstream across remoting before elements has been emitted"* is flaky (#610, upstream akka#30844).
   
   When the consuming `SourceRef` cancels gracefully **before any element**, it sends a `RemoteStreamCompleted` to the origin `SinkRef` and then terminates. On transports such as Artery, system messages (the consumer's `Terminated` / deathwatch) travel on a **dedicated lane** and can overtake the ordinary-lane `RemoteStreamCompleted`. The `SinkRef` then observed `Terminated` first and, with no completion recorded yet, immediately failed with `RemoteStreamRefActorTerminatedException` ("message loss may have happened") — so the origin's `watchTermination` yielded `Failure` instead of `Done`.
   
   The `SinkRef` already guards its *own* termination against this lane race (`finishedWithAwaitingPartnerTermination` + `setKeepGoing`), and the `SourceRef` already waits a `finalTerminationSignalDeadline` grace period when *its* partner terminates (`SourceRefImpl` `TerminationDeadlineTimerKey`). The **symmetric** case on the `SinkRef` side was missing.
   
   ## Modification
   
   When the `SinkRef` observes its partner `Terminated` with no recorded completion/failure, schedule a `finalTerminationSignalDeadline` grace timer instead of failing immediately. If the in-flight `RemoteStreamCompleted` / `RemoteStreamFailure` arrives within the deadline, it completes/fails cleanly via the existing handlers; otherwise the timer fires and message loss is declared as before. The change is confined to the `case _ =>` branch (partner terminated before any completion) — the `Some(Success)` / `Some(Failure)` branches are unchanged.
   
   Removed the corresponding `// FIXME akka#30844` from the test.
   
   ## Result
   
   ```
   [info] Tests: succeeded 24, failed 0   (full StreamRefsSpec)
   cancellation cases: 5/5 on repeat
   stream/mimaReportBinaryIssues: [success] no binary issues
   ```
   
   ## Tests
   
   `stream-tests/testOnly org.apache.pekko.stream.scaladsl.StreamRefsSpec` — 24 pass; cancellation subset 5/5 on repeat. `scalafmt` run; `stream/mimaReportBinaryIssues` clean. Change is internal to `SinkRefStageImpl`.
   
   ## References
   
   Fixes #610


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: notifications-unsubscribe@pekko.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


---------------------------------------------------------------------
To unsubscribe, e-mail: notifications-unsubscribe@pekko.apache.org
For additional commands, e-mail: notifications-help@pekko.apache.org


Re: [PR] fix: await in-flight completion on partner termination in SinkRef [pekko]

Posted by "He-Pin (via GitHub)" <gi...@apache.org>.
He-Pin merged PR #3016:
URL: https://github.com/apache/pekko/pull/3016


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: notifications-unsubscribe@pekko.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


---------------------------------------------------------------------
To unsubscribe, e-mail: notifications-unsubscribe@pekko.apache.org
For additional commands, e-mail: notifications-help@pekko.apache.org