Skip to content

Commit 6afd2b8

Browse files
authored
2.x: Fix refCount eager disconnect not resetting the connection (#6297)
* 2.x: Fix refCount eager disconnect not resetting the connection * Remove unnecessary comment.
1 parent 390b7b0 commit 6afd2b8

File tree

4 files changed

+55
-2
lines changed

4 files changed

+55
-2
lines changed

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

+12-1
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,11 @@ void timeout(RefConnection rc) {
141141
if (source instanceof Disposable) {
142142
((Disposable)source).dispose();
143143
} else if (source instanceof ResettableConnectable) {
144-
((ResettableConnectable)source).resetIf(connectionObject);
144+
if (connectionObject == null) {
145+
rc.disconnectedEarly = true;
146+
} else {
147+
((ResettableConnectable)source).resetIf(connectionObject);
148+
}
145149
}
146150
}
147151
}
@@ -160,6 +164,8 @@ static final class RefConnection extends AtomicReference<Disposable>
160164

161165
boolean connected;
162166

167+
boolean disconnectedEarly;
168+
163169
RefConnection(FlowableRefCount<?> parent) {
164170
this.parent = parent;
165171
}
@@ -172,6 +178,11 @@ public void run() {
172178
@Override
173179
public void accept(Disposable t) throws Exception {
174180
DisposableHelper.replace(this, t);
181+
synchronized (parent) {
182+
if (disconnectedEarly) {
183+
((ResettableConnectable)parent.source).resetIf(t);
184+
}
185+
}
175186
}
176187
}
177188

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

+13-1
Original file line numberDiff line numberDiff line change
@@ -135,10 +135,15 @@ void timeout(RefConnection rc) {
135135
connection = null;
136136
Disposable connectionObject = rc.get();
137137
DisposableHelper.dispose(rc);
138+
138139
if (source instanceof Disposable) {
139140
((Disposable)source).dispose();
140141
} else if (source instanceof ResettableConnectable) {
141-
((ResettableConnectable)source).resetIf(connectionObject);
142+
if (connectionObject == null) {
143+
rc.disconnectedEarly = true;
144+
} else {
145+
((ResettableConnectable)source).resetIf(connectionObject);
146+
}
142147
}
143148
}
144149
}
@@ -157,6 +162,8 @@ static final class RefConnection extends AtomicReference<Disposable>
157162

158163
boolean connected;
159164

165+
boolean disconnectedEarly;
166+
160167
RefConnection(ObservableRefCount<?> parent) {
161168
this.parent = parent;
162169
}
@@ -169,6 +176,11 @@ public void run() {
169176
@Override
170177
public void accept(Disposable t) throws Exception {
171178
DisposableHelper.replace(this, t);
179+
synchronized (parent) {
180+
if (disconnectedEarly) {
181+
((ResettableConnectable)parent.source).resetIf(t);
182+
}
183+
}
172184
}
173185
}
174186

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

+15
Original file line numberDiff line numberDiff line change
@@ -1394,4 +1394,19 @@ public void timeoutDisposesSource() {
13941394

13951395
assertTrue(((Disposable)o.source).isDisposed());
13961396
}
1397+
1398+
@Test
1399+
public void disconnectBeforeConnect() {
1400+
BehaviorProcessor<Integer> processor = BehaviorProcessor.create();
1401+
1402+
Flowable<Integer> flowable = processor
1403+
.replay(1)
1404+
.refCount();
1405+
1406+
flowable.takeUntil(Flowable.just(1)).test();
1407+
1408+
processor.onNext(2);
1409+
1410+
flowable.take(1).test().assertResult(2);
1411+
}
13971412
}

src/test/java/io/reactivex/internal/operators/observable/ObservableRefCountTest.java

+15
Original file line numberDiff line numberDiff line change
@@ -1345,4 +1345,19 @@ public void timeoutDisposesSource() {
13451345

13461346
assertTrue(((Disposable)o.source).isDisposed());
13471347
}
1348+
1349+
@Test
1350+
public void disconnectBeforeConnect() {
1351+
BehaviorSubject<Integer> subject = BehaviorSubject.create();
1352+
1353+
Observable<Integer> observable = subject
1354+
.replay(1)
1355+
.refCount();
1356+
1357+
observable.takeUntil(Observable.just(1)).test();
1358+
1359+
subject.onNext(2);
1360+
1361+
observable.take(1).test().assertResult(2);
1362+
}
13481363
}

0 commit comments

Comments
 (0)