Skip to content

Commit e784201

Browse files
authored
2.x: Fix mergeWith not canceling other when the main fails (#6599)
* 2.x: Fix mergeWith not canceling other when the main fails * Switch to OpenJDK compilation as OracleJDK is not available * Add more time to refCount testing * More time again * Looks like 250ms is still not enough, let's loop
1 parent 5550b63 commit e784201

15 files changed

+249
-25
lines changed

.travis.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
language: java
22
jdk:
3-
- oraclejdk8
3+
- openjdk8
44

55
# force upgrade Java8 as per https://github.com/travis-ci/travis-ci/issues/4042 (fixes compilation issue)
66
#addons:

src/main/java/io/reactivex/internal/operators/flowable/FlowableMergeWithCompletable.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ public void onNext(T t) {
8686

8787
@Override
8888
public void onError(Throwable ex) {
89-
SubscriptionHelper.cancel(mainSubscription);
89+
DisposableHelper.dispose(otherObserver);
9090
HalfSerializer.onError(downstream, ex, this, error);
9191
}
9292

src/main/java/io/reactivex/internal/operators/flowable/FlowableMergeWithMaybe.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,7 @@ public void onNext(T t) {
143143
@Override
144144
public void onError(Throwable ex) {
145145
if (error.addThrowable(ex)) {
146-
SubscriptionHelper.cancel(mainSubscription);
146+
DisposableHelper.dispose(otherObserver);
147147
drain();
148148
} else {
149149
RxJavaPlugins.onError(ex);

src/main/java/io/reactivex/internal/operators/flowable/FlowableMergeWithSingle.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,7 @@ public void onNext(T t) {
143143
@Override
144144
public void onError(Throwable ex) {
145145
if (error.addThrowable(ex)) {
146-
SubscriptionHelper.cancel(mainSubscription);
146+
DisposableHelper.dispose(otherObserver);
147147
drain();
148148
} else {
149149
RxJavaPlugins.onError(ex);

src/main/java/io/reactivex/internal/operators/observable/ObservableMergeWithCompletable.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ public void onNext(T t) {
8080

8181
@Override
8282
public void onError(Throwable ex) {
83-
DisposableHelper.dispose(mainDisposable);
83+
DisposableHelper.dispose(otherObserver);
8484
HalfSerializer.onError(downstream, ex, this, error);
8585
}
8686

src/main/java/io/reactivex/internal/operators/observable/ObservableMergeWithMaybe.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ public void onNext(T t) {
106106
@Override
107107
public void onError(Throwable ex) {
108108
if (error.addThrowable(ex)) {
109-
DisposableHelper.dispose(mainDisposable);
109+
DisposableHelper.dispose(otherObserver);
110110
drain();
111111
} else {
112112
RxJavaPlugins.onError(ex);

src/main/java/io/reactivex/internal/operators/observable/ObservableMergeWithSingle.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ public void onNext(T t) {
106106
@Override
107107
public void onError(Throwable ex) {
108108
if (error.addThrowable(ex)) {
109-
DisposableHelper.dispose(mainDisposable);
109+
DisposableHelper.dispose(otherObserver);
110110
drain();
111111
} else {
112112
RxJavaPlugins.onError(ex);

src/test/java/io/reactivex/internal/operators/flowable/FlowableMergeWithCompletableTest.java

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -136,4 +136,40 @@ public void run() {
136136
ts.assertResult(1);
137137
}
138138
}
139+
140+
@Test
141+
public void cancelOtherOnMainError() {
142+
PublishProcessor<Integer> pp = PublishProcessor.create();
143+
CompletableSubject cs = CompletableSubject.create();
144+
145+
TestSubscriber<Integer> ts = pp.mergeWith(cs).test();
146+
147+
assertTrue(pp.hasSubscribers());
148+
assertTrue(cs.hasObservers());
149+
150+
pp.onError(new TestException());
151+
152+
ts.assertFailure(TestException.class);
153+
154+
assertFalse("main has observers!", pp.hasSubscribers());
155+
assertFalse("other has observers", cs.hasObservers());
156+
}
157+
158+
@Test
159+
public void cancelMainOnOtherError() {
160+
PublishProcessor<Integer> pp = PublishProcessor.create();
161+
CompletableSubject cs = CompletableSubject.create();
162+
163+
TestSubscriber<Integer> ts = pp.mergeWith(cs).test();
164+
165+
assertTrue(pp.hasSubscribers());
166+
assertTrue(cs.hasObservers());
167+
168+
cs.onError(new TestException());
169+
170+
ts.assertFailure(TestException.class);
171+
172+
assertFalse("main has observers!", pp.hasSubscribers());
173+
assertFalse("other has observers", cs.hasObservers());
174+
}
139175
}

src/test/java/io/reactivex/internal/operators/flowable/FlowableMergeWithMaybeTest.java

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -401,4 +401,40 @@ public void onNext(Integer t) {
401401
ts.assertValueCount(Flowable.bufferSize());
402402
ts.assertComplete();
403403
}
404+
405+
@Test
406+
public void cancelOtherOnMainError() {
407+
PublishProcessor<Integer> pp = PublishProcessor.create();
408+
MaybeSubject<Integer> ms = MaybeSubject.create();
409+
410+
TestSubscriber<Integer> ts = pp.mergeWith(ms).test();
411+
412+
assertTrue(pp.hasSubscribers());
413+
assertTrue(ms.hasObservers());
414+
415+
pp.onError(new TestException());
416+
417+
ts.assertFailure(TestException.class);
418+
419+
assertFalse("main has observers!", pp.hasSubscribers());
420+
assertFalse("other has observers", ms.hasObservers());
421+
}
422+
423+
@Test
424+
public void cancelMainOnOtherError() {
425+
PublishProcessor<Integer> pp = PublishProcessor.create();
426+
MaybeSubject<Integer> ms = MaybeSubject.create();
427+
428+
TestSubscriber<Integer> ts = pp.mergeWith(ms).test();
429+
430+
assertTrue(pp.hasSubscribers());
431+
assertTrue(ms.hasObservers());
432+
433+
ms.onError(new TestException());
434+
435+
ts.assertFailure(TestException.class);
436+
437+
assertFalse("main has observers!", pp.hasSubscribers());
438+
assertFalse("other has observers", ms.hasObservers());
439+
}
404440
}

src/test/java/io/reactivex/internal/operators/flowable/FlowableMergeWithSingleTest.java

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -397,4 +397,40 @@ public void onNext(Integer t) {
397397
ts.assertValueCount(Flowable.bufferSize());
398398
ts.assertComplete();
399399
}
400+
401+
@Test
402+
public void cancelOtherOnMainError() {
403+
PublishProcessor<Integer> pp = PublishProcessor.create();
404+
SingleSubject<Integer> ss = SingleSubject.create();
405+
406+
TestSubscriber<Integer> ts = pp.mergeWith(ss).test();
407+
408+
assertTrue(pp.hasSubscribers());
409+
assertTrue(ss.hasObservers());
410+
411+
pp.onError(new TestException());
412+
413+
ts.assertFailure(TestException.class);
414+
415+
assertFalse("main has observers!", pp.hasSubscribers());
416+
assertFalse("other has observers", ss.hasObservers());
417+
}
418+
419+
@Test
420+
public void cancelMainOnOtherError() {
421+
PublishProcessor<Integer> pp = PublishProcessor.create();
422+
SingleSubject<Integer> ss = SingleSubject.create();
423+
424+
TestSubscriber<Integer> ts = pp.mergeWith(ss).test();
425+
426+
assertTrue(pp.hasSubscribers());
427+
assertTrue(ss.hasObservers());
428+
429+
ss.onError(new TestException());
430+
431+
ts.assertFailure(TestException.class);
432+
433+
assertFalse("main has observers!", pp.hasSubscribers());
434+
assertFalse("other has observers", ss.hasObservers());
435+
}
400436
}

0 commit comments

Comments
 (0)