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

3.x: Fix Single.timeout race condition #7515

Merged
merged 1 commit into from
Jan 17, 2023

Conversation

akarnokd
Copy link
Member

The PR fixes a race condition in Single.timeout where when the time was really small, the timeout logic in run would race with the onSubscribe logic and not handle the the timeout case.

The race happened between Disposable d = get() and the later compareAndSet(d, DisposableHelper.DISPOSED). When the get executes, it sees null. Then comes onSubscribe and atomically sets some Disposable in this. Now compareAndSet fails because the null -> Disposed transition can't be made.

The fix is to use DisposableHelper.dispose which returns true iff the current thread managed to transition from a non-disposed state into a disposed state.

Fixes #7514

@akarnokd akarnokd added this to the 3.1-support milestone Jan 16, 2023
@codecov
Copy link

codecov bot commented Jan 16, 2023

Codecov Report

Merging #7515 (12f20fb) into 3.x (e1b6cb4) will increase coverage by 0.02%.
The diff coverage is 100.00%.

@@             Coverage Diff              @@
##                3.x    #7515      +/-   ##
============================================
+ Coverage     99.53%   99.55%   +0.02%     
  Complexity     6798     6798              
============================================
  Files           752      752              
  Lines         47673    47670       -3     
  Branches       6400     6399       -1     
============================================
+ Hits          47452    47460       +8     
+ Misses          101       96       -5     
+ Partials        120      114       -6     
Impacted Files Coverage Δ
...java3/internal/operators/single/SingleTimeout.java 100.00% <100.00%> (ø)
...tivex/rxjava3/internal/jdk8/ParallelCollector.java 89.90% <0.00%> (-6.43%) ⬇️
...nternal/operators/observable/ObservableCreate.java 95.72% <0.00%> (-1.71%) ⬇️
...ternal/operators/completable/CompletableMerge.java 98.64% <0.00%> (ø)
.../operators/observable/ObservableCombineLatest.java 100.00% <0.00%> (+0.61%) ⬆️
...3/internal/operators/flowable/FlowablePublish.java 100.00% <0.00%> (+0.99%) ⬆️
...rnal/operators/flowable/FlowableFlatMapSingle.java 95.34% <0.00%> (+1.16%) ⬆️
...ernal/operators/flowable/FlowableFlatMapMaybe.java 97.92% <0.00%> (+2.07%) ⬆️
.../operators/observable/ObservableFlatMapSingle.java 97.61% <0.00%> (+3.17%) ⬆️
...l/operators/observable/ObservableFlatMapMaybe.java 97.88% <0.00%> (+4.92%) ⬆️

📣 We’re building smart automated test selection to slash your CI/CD build times. Learn more

@akarnokd akarnokd merged commit baad331 into ReactiveX:3.x Jan 17, 2023
Goooler referenced this pull request in Goooler/DemoApp Jan 18, 2023
[![Mend
Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com)

This PR contains the following updates:

| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|
| [io.reactivex.rxjava3:rxjava](https://togithub.com/ReactiveX/RxJava) |
`3.1.5` -> `3.1.6` |
[![age](https://badges.renovateapi.com/packages/maven/io.reactivex.rxjava3:rxjava/3.1.6/age-slim)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://badges.renovateapi.com/packages/maven/io.reactivex.rxjava3:rxjava/3.1.6/adoption-slim)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://badges.renovateapi.com/packages/maven/io.reactivex.rxjava3:rxjava/3.1.6/compatibility-slim/3.1.5)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://badges.renovateapi.com/packages/maven/io.reactivex.rxjava3:rxjava/3.1.6/confidence-slim/3.1.5)](https://docs.renovatebot.com/merge-confidence/)
|

---

### ⚠ Dependency Lookup Warnings ⚠

Warnings were logged while processing this repo. Please check the
Dependency Dashboard for more information.

---

### Release Notes

<details>
<summary>ReactiveX/RxJava</summary>

###
[`v3.1.6`](https://togithub.com/ReactiveX/RxJava/releases/tag/v3.1.6)


[Maven](http://search.maven.org/#artifactdetails%7Cio.reactivex.rxjava3%7Crxjava%7C3.1.6%7C)
[JavaDocs](http://reactivex.io/RxJava/3.x/javadoc/3.1.6)

##### API changes

- Add an overload to `throttleLatest` operator with an `onDropped`
callback. (<a
href='https://github.com/ReactiveX/RxJava/issues/7457'>[#&#8203;7457](https://togithub.com/ReactiveX/RxJava/issues/7457)</a>)
- Add an overload to `throttleFirst` operator with an `onDropped`
callback. (<a
href='https://github.com/ReactiveX/RxJava/issues/7482'>[#&#8203;7482](https://togithub.com/ReactiveX/RxJava/issues/7482)</a>)
- Add an overload to `throttleLast` operator with an `onDropped`
callback. (<a
href='https://github.com/ReactiveX/RxJava/issues/7488'>[#&#8203;7488](https://togithub.com/ReactiveX/RxJava/issues/7488)</a>)
- Add an overload to `throttleWithTimeout` operator with an `onDropped`
callback. (<a
href='https://github.com/ReactiveX/RxJava/issues/7510'>[#&#8203;7510](https://togithub.com/ReactiveX/RxJava/issues/7510)</a>)

##### Bugfixes

- Fix a race condition in `Single.timeout` that prevented the timeout
signal from happening. (<a
href='https://github.com/ReactiveX/RxJava/issues/7515'>[#&#8203;7515](https://togithub.com/ReactiveX/RxJava/issues/7515)</a>)

##### Documentation

- Fix formatting in `TestObserver/Consumer/Subscriber` javadoc html. (<a
href='https://github.com/ReactiveX/RxJava/issues/7442'>[#&#8203;7442](https://togithub.com/ReactiveX/RxJava/issues/7442)</a>)
- Fix typo in `BehaviorSubject.java`. (<a
href='https://github.com/ReactiveX/RxJava/issues/7452'>[#&#8203;7452](https://togithub.com/ReactiveX/RxJava/issues/7452)</a>)
- Fix grammar about cancellation in `Schedulers` javadoc. (<a
href='https://github.com/ReactiveX/RxJava/issues/7453'>[#&#8203;7453](https://togithub.com/ReactiveX/RxJava/issues/7453)</a>)
- Change `@coded` tag to `@code` tag. (<a
href='https://github.com/ReactiveX/RxJava/issues/7463'>[#&#8203;7463](https://togithub.com/ReactiveX/RxJava/issues/7463)</a>)
- Fix `fromCompletionStage` javadoc. (<a
href='https://github.com/ReactiveX/RxJava/issues/7508'>[#&#8203;7508](https://togithub.com/ReactiveX/RxJava/issues/7508)</a>)

##### Other

- Add missing `@NonNull` annotation to `Maybe` type argument. (<a
href='https://github.com/ReactiveX/RxJava/issues/7436'>[#&#8203;7436](https://togithub.com/ReactiveX/RxJava/issues/7436)</a>)
- Remove redundant interface declarations. (<a
href='https://github.com/ReactiveX/RxJava/issues/7438'>[#&#8203;7438](https://togithub.com/ReactiveX/RxJava/issues/7438)</a>)
- Standardize `MissingBackpressureException` message, introduce
`QueueOverflowException`. (<a
href='https://github.com/ReactiveX/RxJava/issues/7459'>[#&#8203;7459](https://togithub.com/ReactiveX/RxJava/issues/7459)</a>)
- Update `Flowable.throttleLatest` `MissingBackpressureException`
message. (<a
href='https://github.com/ReactiveX/RxJava/issues/7460'>[#&#8203;7460](https://togithub.com/ReactiveX/RxJava/issues/7460)</a>)
- Fix cancellation order in `throttleFirst`. (<a
href='https://github.com/ReactiveX/RxJava/issues/7484'>[#&#8203;7484](https://togithub.com/ReactiveX/RxJava/issues/7484)</a>)

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR has been generated by [Mend
Renovate](https://www.mend.io/free-developer-tools/renovate/). View
repository job log
[here](https://app.renovatebot.com/dashboard#github/Goooler/DemoApp).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzNC4xMDUuMyIsInVwZGF0ZWRJblZlciI6IjM0LjEwNS4zIn0=-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
ZacSweers referenced this pull request in slackhq/circuit Jan 19, 2023
This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
| [io.reactivex.rxjava3:rxjava](https://togithub.com/ReactiveX/RxJava) |
dependencies | patch | `3.1.5` -> `3.1.6` |

---

### Release Notes

<details>
<summary>ReactiveX/RxJava</summary>

###
[`v3.1.6`](https://togithub.com/ReactiveX/RxJava/releases/tag/v3.1.6)


[Maven](http://search.maven.org/#artifactdetails%7Cio.reactivex.rxjava3%7Crxjava%7C3.1.6%7C)
[JavaDocs](http://reactivex.io/RxJava/3.x/javadoc/3.1.6)

##### API changes

- Add an overload to `throttleLatest` operator with an `onDropped`
callback. (<a
href='https://github.com/ReactiveX/RxJava/issues/7457'>[#&#8203;7457](https://togithub.com/ReactiveX/RxJava/issues/7457)</a>)
- Add an overload to `throttleFirst` operator with an `onDropped`
callback. (<a
href='https://github.com/ReactiveX/RxJava/issues/7482'>[#&#8203;7482](https://togithub.com/ReactiveX/RxJava/issues/7482)</a>)
- Add an overload to `throttleLast` operator with an `onDropped`
callback. (<a
href='https://github.com/ReactiveX/RxJava/issues/7488'>[#&#8203;7488](https://togithub.com/ReactiveX/RxJava/issues/7488)</a>)
- Add an overload to `throttleWithTimeout` operator with an `onDropped`
callback. (<a
href='https://github.com/ReactiveX/RxJava/issues/7510'>[#&#8203;7510](https://togithub.com/ReactiveX/RxJava/issues/7510)</a>)

##### Bugfixes

- Fix a race condition in `Single.timeout` that prevented the timeout
signal from happening. (<a
href='https://github.com/ReactiveX/RxJava/issues/7515'>[#&#8203;7515](https://togithub.com/ReactiveX/RxJava/issues/7515)</a>)

##### Documentation

- Fix formatting in `TestObserver/Consumer/Subscriber` javadoc html. (<a
href='https://github.com/ReactiveX/RxJava/issues/7442'>[#&#8203;7442](https://togithub.com/ReactiveX/RxJava/issues/7442)</a>)
- Fix typo in `BehaviorSubject.java`. (<a
href='https://github.com/ReactiveX/RxJava/issues/7452'>[#&#8203;7452](https://togithub.com/ReactiveX/RxJava/issues/7452)</a>)
- Fix grammar about cancellation in `Schedulers` javadoc. (<a
href='https://github.com/ReactiveX/RxJava/issues/7453'>[#&#8203;7453](https://togithub.com/ReactiveX/RxJava/issues/7453)</a>)
- Change `@coded` tag to `@code` tag. (<a
href='https://github.com/ReactiveX/RxJava/issues/7463'>[#&#8203;7463](https://togithub.com/ReactiveX/RxJava/issues/7463)</a>)
- Fix `fromCompletionStage` javadoc. (<a
href='https://github.com/ReactiveX/RxJava/issues/7508'>[#&#8203;7508](https://togithub.com/ReactiveX/RxJava/issues/7508)</a>)

##### Other

- Add missing `@NonNull` annotation to `Maybe` type argument. (<a
href='https://github.com/ReactiveX/RxJava/issues/7436'>[#&#8203;7436](https://togithub.com/ReactiveX/RxJava/issues/7436)</a>)
- Remove redundant interface declarations. (<a
href='https://github.com/ReactiveX/RxJava/issues/7438'>[#&#8203;7438](https://togithub.com/ReactiveX/RxJava/issues/7438)</a>)
- Standardize `MissingBackpressureException` message, introduce
`QueueOverflowException`. (<a
href='https://github.com/ReactiveX/RxJava/issues/7459'>[#&#8203;7459](https://togithub.com/ReactiveX/RxJava/issues/7459)</a>)
- Update `Flowable.throttleLatest` `MissingBackpressureException`
message. (<a
href='https://github.com/ReactiveX/RxJava/issues/7460'>[#&#8203;7460](https://togithub.com/ReactiveX/RxJava/issues/7460)</a>)
- Fix cancellation order in `throttleFirst`. (<a
href='https://github.com/ReactiveX/RxJava/issues/7484'>[#&#8203;7484](https://togithub.com/ReactiveX/RxJava/issues/7484)</a>)

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, click
this checkbox.

---

This PR has been generated by [Renovate
Bot](https://togithub.com/renovatebot/renovate).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzMi4xOTAuNiIsInVwZGF0ZWRJblZlciI6IjMyLjE5MC42In0=-->
ZacSweers referenced this pull request in slackhq/foundry Jan 19, 2023
This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
| [io.reactivex.rxjava3:rxjava](https://togithub.com/ReactiveX/RxJava) |
dependencies | patch | `3.1.5` -> `3.1.6` |

---

### Release Notes

<details>
<summary>ReactiveX/RxJava</summary>

###
[`v3.1.6`](https://togithub.com/ReactiveX/RxJava/releases/tag/v3.1.6)


[Maven](http://search.maven.org/#artifactdetails%7Cio.reactivex.rxjava3%7Crxjava%7C3.1.6%7C)
[JavaDocs](http://reactivex.io/RxJava/3.x/javadoc/3.1.6)

##### API changes

- Add an overload to `throttleLatest` operator with an `onDropped`
callback. (<a
href='https://github.com/ReactiveX/RxJava/issues/7457'>[#&#8203;7457](https://togithub.com/ReactiveX/RxJava/issues/7457)</a>)
- Add an overload to `throttleFirst` operator with an `onDropped`
callback. (<a
href='https://github.com/ReactiveX/RxJava/issues/7482'>[#&#8203;7482](https://togithub.com/ReactiveX/RxJava/issues/7482)</a>)
- Add an overload to `throttleLast` operator with an `onDropped`
callback. (<a
href='https://github.com/ReactiveX/RxJava/issues/7488'>[#&#8203;7488](https://togithub.com/ReactiveX/RxJava/issues/7488)</a>)
- Add an overload to `throttleWithTimeout` operator with an `onDropped`
callback. (<a
href='https://github.com/ReactiveX/RxJava/issues/7510'>[#&#8203;7510](https://togithub.com/ReactiveX/RxJava/issues/7510)</a>)

##### Bugfixes

- Fix a race condition in `Single.timeout` that prevented the timeout
signal from happening. (<a
href='https://github.com/ReactiveX/RxJava/issues/7515'>[#&#8203;7515](https://togithub.com/ReactiveX/RxJava/issues/7515)</a>)

##### Documentation

- Fix formatting in `TestObserver/Consumer/Subscriber` javadoc html. (<a
href='https://github.com/ReactiveX/RxJava/issues/7442'>[#&#8203;7442](https://togithub.com/ReactiveX/RxJava/issues/7442)</a>)
- Fix typo in `BehaviorSubject.java`. (<a
href='https://github.com/ReactiveX/RxJava/issues/7452'>[#&#8203;7452](https://togithub.com/ReactiveX/RxJava/issues/7452)</a>)
- Fix grammar about cancellation in `Schedulers` javadoc. (<a
href='https://github.com/ReactiveX/RxJava/issues/7453'>[#&#8203;7453](https://togithub.com/ReactiveX/RxJava/issues/7453)</a>)
- Change `@coded` tag to `@code` tag. (<a
href='https://github.com/ReactiveX/RxJava/issues/7463'>[#&#8203;7463](https://togithub.com/ReactiveX/RxJava/issues/7463)</a>)
- Fix `fromCompletionStage` javadoc. (<a
href='https://github.com/ReactiveX/RxJava/issues/7508'>[#&#8203;7508](https://togithub.com/ReactiveX/RxJava/issues/7508)</a>)

##### Other

- Add missing `@NonNull` annotation to `Maybe` type argument. (<a
href='https://github.com/ReactiveX/RxJava/issues/7436'>[#&#8203;7436](https://togithub.com/ReactiveX/RxJava/issues/7436)</a>)
- Remove redundant interface declarations. (<a
href='https://github.com/ReactiveX/RxJava/issues/7438'>[#&#8203;7438](https://togithub.com/ReactiveX/RxJava/issues/7438)</a>)
- Standardize `MissingBackpressureException` message, introduce
`QueueOverflowException`. (<a
href='https://github.com/ReactiveX/RxJava/issues/7459'>[#&#8203;7459](https://togithub.com/ReactiveX/RxJava/issues/7459)</a>)
- Update `Flowable.throttleLatest` `MissingBackpressureException`
message. (<a
href='https://github.com/ReactiveX/RxJava/issues/7460'>[#&#8203;7460](https://togithub.com/ReactiveX/RxJava/issues/7460)</a>)
- Fix cancellation order in `throttleFirst`. (<a
href='https://github.com/ReactiveX/RxJava/issues/7484'>[#&#8203;7484](https://togithub.com/ReactiveX/RxJava/issues/7484)</a>)

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, click
this checkbox.

---

This PR has been generated by [Renovate
Bot](https://togithub.com/renovatebot/renovate).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzMi4xOTAuNiIsInVwZGF0ZWRJblZlciI6IjMyLjE5MC42In0=-->
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

.timeout with small value on Single does not emit error. RxJava 2.2.21
2 participants