Skip to content

Commit 1fe2d64

Browse files
OlegDokukaOlegDokuka
authored and
OlegDokuka
committed
moves error propagation out of the synchronise to avoid deadlock (#1060)
(cherry picked from commit 6426e45)
1 parent ef826de commit 1fe2d64

File tree

2 files changed

+16
-11
lines changed

2 files changed

+16
-11
lines changed

rsocket-core/src/main/java/io/rsocket/core/RSocketRequester.java

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -345,15 +345,17 @@ private void terminate(Throwable e) {
345345
requesterLeaseTracker.dispose(e);
346346
}
347347

348+
final Collection<FrameHandler> activeStreamsCopy;
348349
synchronized (this) {
349350
final IntObjectMap<FrameHandler> activeStreams = this.activeStreams;
350-
final Collection<FrameHandler> activeStreamsCopy = new ArrayList<>(activeStreams.values());
351-
for (FrameHandler handler : activeStreamsCopy) {
352-
if (handler != null) {
353-
try {
354-
handler.handleError(e);
355-
} catch (Throwable ignored) {
356-
}
351+
activeStreamsCopy = new ArrayList<>(activeStreams.values());
352+
}
353+
354+
for (FrameHandler handler : activeStreamsCopy) {
355+
if (handler != null) {
356+
try {
357+
handler.handleError(e);
358+
} catch (Throwable ignored) {
357359
}
358360
}
359361
}

rsocket-core/src/main/java/io/rsocket/core/RSocketResponder.java

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -185,15 +185,18 @@ final void doOnDispose() {
185185
requestHandler.dispose();
186186
}
187187

188-
private synchronized void cleanUpSendingSubscriptions() {
189-
final IntObjectMap<FrameHandler> activeStreams = this.activeStreams;
190-
final Collection<FrameHandler> activeStreamsCopy = new ArrayList<>(activeStreams.values());
188+
private void cleanUpSendingSubscriptions() {
189+
final Collection<FrameHandler> activeStreamsCopy;
190+
synchronized (this) {
191+
final IntObjectMap<FrameHandler> activeStreams = this.activeStreams;
192+
activeStreamsCopy = new ArrayList<>(activeStreams.values());
193+
}
194+
191195
for (FrameHandler handler : activeStreamsCopy) {
192196
if (handler != null) {
193197
handler.handleCancel();
194198
}
195199
}
196-
activeStreams.clear();
197200
}
198201

199202
final void handleFrame(ByteBuf frame) {

0 commit comments

Comments
 (0)