Skip to content

Commit dd336fd

Browse files
authored
3.x: fix switchMaps inconsistency swallowing errors when cancelled (#6572)
1 parent aa8e03f commit dd336fd

20 files changed

+329
-12
lines changed

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

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -585,10 +585,7 @@ void disposeAll() {
585585
for (InnerSubscriber<?, ?> inner : a) {
586586
inner.dispose();
587587
}
588-
Throwable ex = errs.terminate();
589-
if (ex != null && ex != ExceptionHelper.TERMINATED) {
590-
RxJavaPlugins.onError(ex);
591-
}
588+
errs.tryTerminateAndReport();
592589
}
593590
}
594591
}

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -173,6 +173,8 @@ public void cancel() {
173173
upstream.cancel();
174174

175175
disposeInner();
176+
177+
error.tryTerminateAndReport();
176178
}
177179
}
178180

src/main/java/io/reactivex/internal/operators/mixed/FlowableSwitchMapCompletable.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -162,6 +162,7 @@ void disposeInner() {
162162
public void dispose() {
163163
upstream.cancel();
164164
disposeInner();
165+
errors.tryTerminateAndReport();
165166
}
166167

167168
@Override
@@ -178,7 +179,8 @@ void innerError(SwitchMapInnerObserver sender, Throwable error) {
178179
downstream.onError(ex);
179180
}
180181
} else {
181-
dispose();
182+
upstream.cancel();
183+
disposeInner();
182184
Throwable ex = errors.terminate();
183185
if (ex != ExceptionHelper.TERMINATED) {
184186
downstream.onError(ex);

src/main/java/io/reactivex/internal/operators/mixed/FlowableSwitchMapMaybe.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -177,6 +177,7 @@ public void cancel() {
177177
cancelled = true;
178178
upstream.cancel();
179179
disposeInner();
180+
errors.tryTerminateAndReport();
180181
}
181182

182183
void innerError(SwitchMapMaybeObserver<R> sender, Throwable ex) {

src/main/java/io/reactivex/internal/operators/mixed/FlowableSwitchMapSingle.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -177,6 +177,7 @@ public void cancel() {
177177
cancelled = true;
178178
upstream.cancel();
179179
disposeInner();
180+
errors.tryTerminateAndReport();
180181
}
181182

182183
void innerError(SwitchMapSingleObserver<R> sender, Throwable ex) {

src/main/java/io/reactivex/internal/operators/mixed/ObservableSwitchMapCompletable.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,7 @@ void disposeInner() {
160160
public void dispose() {
161161
upstream.dispose();
162162
disposeInner();
163+
errors.tryTerminateAndReport();
163164
}
164165

165166
@Override
@@ -176,7 +177,8 @@ void innerError(SwitchMapInnerObserver sender, Throwable error) {
176177
downstream.onError(ex);
177178
}
178179
} else {
179-
dispose();
180+
upstream.dispose();
181+
disposeInner();
180182
Throwable ex = errors.terminate();
181183
if (ex != ExceptionHelper.TERMINATED) {
182184
downstream.onError(ex);

src/main/java/io/reactivex/internal/operators/mixed/ObservableSwitchMapMaybe.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,7 @@ public void dispose() {
164164
cancelled = true;
165165
upstream.dispose();
166166
disposeInner();
167+
errors.tryTerminateAndReport();
167168
}
168169

169170
@Override

src/main/java/io/reactivex/internal/operators/mixed/ObservableSwitchMapSingle.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,7 @@ public void dispose() {
164164
cancelled = true;
165165
upstream.dispose();
166166
disposeInner();
167+
errors.tryTerminateAndReport();
167168
}
168169

169170
@Override

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

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -307,10 +307,7 @@ public void dispose() {
307307
if (!cancelled) {
308308
cancelled = true;
309309
if (disposeAll()) {
310-
Throwable ex = errors.terminate();
311-
if (ex != null && ex != ExceptionHelper.TERMINATED) {
312-
RxJavaPlugins.onError(ex);
313-
}
310+
errors.tryTerminateAndReport();
314311
}
315312
}
316313
}

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,8 @@ public void dispose() {
157157
cancelled = true;
158158
upstream.dispose();
159159
disposeInner();
160+
161+
errors.tryTerminateAndReport();
160162
}
161163
}
162164

0 commit comments

Comments
 (0)