Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Single#concat(Publisher) potential demand deadlock fix #1646

Merged
merged 1 commit into from
Jun 28, 2021

Conversation

Scottmitch
Copy link
Member

Motivation:
Single#concat(Publisher) may result in deadlock if demand comes after
the Single completes, and the next Publisher blocks in its subscribe
method. This may happen if blocking APIs are used (e.g.
ConnectablePayloadWriter) and the control flow involves
Single#concat(Publisher). ServiceTalk currently only uses this operator
for use in the Publisher#buffer(..) operator.

Modifications:

  • SingleConcatWithPublisher#request(long) should deliver demand to super
    class before delivering downstream demand and subscribing. Ordering of
    downstream signals will be preserved because
    DelayedCancellableThenSubscription won't propagate demand upstream
    until onSubscribe is called.

Result:
If downstream requests sufficient demand it will be available to the
concat Publisher as soon as it is subscribed to, and therefore less
potential for deadlock when using blocking APIs and
Single#concat(Publisher).

Motivation:
Single#concat(Publisher) may result in deadlock if demand comes after
the Single completes, and the next Publisher blocks in its subscribe
method. This may happen if blocking APIs are used (e.g.
ConnectablePayloadWriter) and the control flow involves
Single#concat(Publisher). ServiceTalk currently only uses this operator
for use in the Publisher#buffer(..) operator.

Modifications:
- SingleConcatWithPublisher#request(long) should deliver demand to super
  class before delivering downstream demand and subscribing. Ordering of
  downstream signals will be preserved because
  DelayedCancellableThenSubscription won't propagate demand upstream
  until onSubscribe is called.

Result:
If downstream requests sufficient demand it will be available to the
concat Publisher as soon as it is subscribed to, and therefore less
potential for deadlock when using blocking APIs and
Single#concat(Publisher).
Copy link
Member

@idelpivnitskiy idelpivnitskiy left a comment

Choose a reason for hiding this comment

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

🚀

@idelpivnitskiy idelpivnitskiy changed the title Single#concat(Publisher) potential demand deadlock fix Single#concat(Publisher) potential demand deadlock fix Jun 28, 2021
@idelpivnitskiy
Copy link
Member

I will take this in and adjust #1643. Thank you for the test!

@idelpivnitskiy idelpivnitskiy merged commit 96b1443 into apple:main Jun 28, 2021
@Scottmitch Scottmitch deleted the single_concatwith_demand branch June 28, 2021 19:53
bondolo pushed a commit to bondolo/servicetalk that referenced this pull request Jul 2, 2021
Motivation:
`Single#concat(Publisher)` may result in deadlock if demand comes after
the `Single` completes, and the next `Publisher` blocks in its subscribe
method. This may happen if blocking APIs are used (e.g.
`ConnectablePayloadWriter`) and the control flow involves
`Single#concat(Publisher)`. ServiceTalk currently only uses this operator
for use in the `Publisher#buffer(..)` operator.

Modifications:
- `SingleConcatWithPublisher#request(long)` should deliver demand to super
  class before delivering downstream demand and subscribing. Ordering of
  downstream signals will be preserved because
  `DelayedCancellableThenSubscription` won't propagate demand upstream
  until `onSubscribe` is called.

Result:
If downstream requests sufficient demand it will be available to the
concat `Publisher` as soon as it is subscribed to, and therefore less
potential for deadlock when using blocking APIs and
`Single#concat(Publisher)`.
bondolo pushed a commit to bondolo/servicetalk that referenced this pull request Jul 2, 2021
Motivation:
`Single#concat(Publisher)` may result in deadlock if demand comes after
the `Single` completes, and the next `Publisher` blocks in its subscribe
method. This may happen if blocking APIs are used (e.g.
`ConnectablePayloadWriter`) and the control flow involves
`Single#concat(Publisher)`. ServiceTalk currently only uses this operator
for use in the `Publisher#buffer(..)` operator.

Modifications:
- `SingleConcatWithPublisher#request(long)` should deliver demand to super
  class before delivering downstream demand and subscribing. Ordering of
  downstream signals will be preserved because
  `DelayedCancellableThenSubscription` won't propagate demand upstream
  until `onSubscribe` is called.

Result:
If downstream requests sufficient demand it will be available to the
concat `Publisher` as soon as it is subscribed to, and therefore less
potential for deadlock when using blocking APIs and
`Single#concat(Publisher)`.
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.

2 participants