Skip to content

Commit 30d3cf2

Browse files
Ryland Degnanrobertroeser
Ryland Degnan
authored andcommitted
Update dependencies, cleanup RSocketClient/Server implementation (#466)
* Delegate dispose/isDisposed to underlying channel in NettyDuplexConnection * Update dependencies * Update NonBlockingHashMap * Avoid unhandled exception in ClientServerInputMultiplexer
1 parent 353115f commit 30d3cf2

File tree

12 files changed

+201
-300
lines changed

12 files changed

+201
-300
lines changed

build.gradle

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -80,8 +80,8 @@ subprojects {
8080
}
8181

8282
dependencies {
83-
compile "io.projectreactor:reactor-core:3.1.2.RELEASE"
84-
compile "io.netty:netty-buffer:4.1.17.Final"
83+
compile "io.projectreactor:reactor-core:3.1.3.RELEASE"
84+
compile "io.netty:netty-buffer:4.1.20.Final"
8585
compile "org.reactivestreams:reactive-streams:1.0.1"
8686
compile "org.slf4j:slf4j-api:1.7.25"
8787
compile "com.google.code.findbugs:jsr305:3.0.2"
@@ -90,7 +90,7 @@ subprojects {
9090
testCompile "org.mockito:mockito-core:2.10.0"
9191
testCompile "org.hamcrest:hamcrest-library:1.3"
9292
testCompile "org.slf4j:slf4j-log4j12:1.7.25"
93-
testCompile "io.projectreactor:reactor-test:3.1.2.RELEASE"
93+
testCompile "io.projectreactor:reactor-test:3.1.3.RELEASE"
9494
}
9595

9696
publishing {

gradle.properties

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,6 @@
1414
# limitations under the License.
1515
#
1616

17-
mavenversion=0.9-SNAPSHOT
17+
mavenversion=0.10-SNAPSHOT
1818
release.scope=patch
19-
release.version=0.9-SNAPSHOT
19+
release.version=0.10-SNAPSHOT

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

Lines changed: 26 additions & 74 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@
2929

3030
import javax.annotation.Nullable;
3131
import java.time.Duration;
32-
import java.util.Collection;
3332
import java.util.concurrent.atomic.AtomicBoolean;
3433
import java.util.concurrent.atomic.AtomicInteger;
3534
import java.util.function.Consumer;
@@ -122,22 +121,15 @@ class RSocketClient implements RSocket {
122121
}
123122

124123
private void handleSendProcessorError(Throwable t) {
125-
Collection<UnicastProcessor<Payload>> values;
126-
Collection<LimitableRequestPublisher> values1;
127-
synchronized (RSocketClient.this) {
128-
values = receivers.values();
129-
values1 = senders.values();
130-
}
131-
132-
for (Subscriber subscriber : values) {
124+
for (Subscriber subscriber : receivers.values()) {
133125
try {
134126
subscriber.onError(t);
135127
} catch (Throwable e) {
136128
errorConsumer.accept(e);
137129
}
138130
}
139131

140-
for (LimitableRequestPublisher p : values1) {
132+
for (LimitableRequestPublisher p : senders.values()) {
141133
p.cancel();
142134
}
143135
}
@@ -146,22 +138,16 @@ private void handleSendProcessorCancel(SignalType t) {
146138
if (SignalType.ON_ERROR == t) {
147139
return;
148140
}
149-
Collection<UnicastProcessor<Payload>> values;
150-
Collection<LimitableRequestPublisher> values1;
151-
synchronized (RSocketClient.this) {
152-
values = receivers.values();
153-
values1 = senders.values();
154-
}
155141

156-
for (Subscriber subscriber : values) {
142+
for (Subscriber subscriber : receivers.values()) {
157143
try {
158144
subscriber.onError(new Throwable("closed connection"));
159145
} catch (Throwable e) {
160146
errorConsumer.accept(e);
161147
}
162148
}
163149

164-
for (LimitableRequestPublisher p : values1) {
150+
for (LimitableRequestPublisher p : senders.values()) {
165151
p.cancel();
166152
}
167153
}
@@ -255,10 +241,7 @@ public Flux<Payload> handleRequestStream(final Payload payload) {
255241
int streamId = streamIdSupplier.nextStreamId();
256242

257243
UnicastProcessor<Payload> receiver = UnicastProcessor.create();
258-
259-
synchronized (this) {
260-
receivers.put(streamId, receiver);
261-
}
244+
receivers.put(streamId, receiver);
262245

263246
AtomicBoolean first = new AtomicBoolean(false);
264247

@@ -289,7 +272,7 @@ public Flux<Payload> handleRequestStream(final Payload payload) {
289272
})
290273
.doFinally(
291274
s -> {
292-
removeReceiver(streamId);
275+
receivers.remove(streamId);
293276
});
294277
}));
295278
}
@@ -304,10 +287,7 @@ private Mono<Payload> handleRequestResponse(final Payload payload) {
304287
payload.release();
305288

306289
UnicastProcessor<Payload> receiver = UnicastProcessor.create();
307-
308-
synchronized (this) {
309-
receivers.put(streamId, receiver);
310-
}
290+
receivers.put(streamId, receiver);
311291

312292
sendProcessor.onNext(requestFrame);
313293

@@ -317,7 +297,7 @@ private Mono<Payload> handleRequestResponse(final Payload payload) {
317297
.doOnCancel(() -> sendProcessor.onNext(Frame.Cancel.from(streamId)))
318298
.doFinally(
319299
s -> {
320-
removeReceiver(streamId);
300+
receivers.remove(streamId);
321301
});
322302
}));
323303
}
@@ -364,10 +344,8 @@ public Flux<Payload> get() {
364344
LimitableRequestPublisher.wrap(f);
365345
// Need to set this to one for first the frame
366346
wrapped.increaseRequestLimit(1);
367-
synchronized (RSocketClient.this) {
368-
senders.put(streamId, wrapped);
369-
receivers.put(streamId, receiver);
370-
}
347+
senders.put(streamId, wrapped);
348+
receivers.put(streamId, receiver);
371349

372350
return wrapped;
373351
})
@@ -424,39 +402,32 @@ public Frame apply(Payload payload) {
424402
})
425403
.doFinally(
426404
s -> {
427-
removeReceiver(streamId);
428-
removeSender(streamId);
405+
receivers.remove(streamId);
406+
senders.remove(streamId);
429407
});
430408
}
431409
}));
432410
}
433411

434412
private boolean contains(int streamId) {
435-
synchronized (RSocketClient.this) {
436-
return receivers.containsKey(streamId);
437-
}
413+
return receivers.containsKey(streamId);
438414
}
439415

440416
protected void cleanup() {
441417
try {
442-
Collection<UnicastProcessor<Payload>> subscribers;
443-
Collection<LimitableRequestPublisher> publishers;
444-
synchronized (RSocketClient.this) {
445-
subscribers = receivers.values();
446-
publishers = senders.values();
418+
for (UnicastProcessor<Payload> subscriber: receivers.values()) {
419+
cleanUpSubscriber(subscriber);
420+
}
421+
for (LimitableRequestPublisher p: senders.values()) {
422+
cleanUpLimitableRequestPublisher(p);
447423
}
448-
449-
subscribers.forEach(this::cleanUpSubscriber);
450-
publishers.forEach(this::cleanUpLimitableRequestPublisher);
451424

452425
if (null != keepAliveSendSub) {
453426
keepAliveSendSub.dispose();
454427
}
455428
} finally {
456-
synchronized (this) {
457-
senders.clear();
458-
receivers.clear();
459-
}
429+
senders.clear();
430+
receivers.clear();
460431
}
461432
}
462433

@@ -513,29 +484,23 @@ private void handleStreamZero(FrameType type, Frame frame) {
513484
}
514485

515486
private void handleFrame(int streamId, FrameType type, Frame frame) {
516-
Subscriber<Payload> receiver;
517-
synchronized (this) {
518-
receiver = receivers.get(streamId);
519-
}
487+
Subscriber<Payload> receiver = receivers.get(streamId);
520488
if (receiver == null) {
521489
handleMissingResponseProcessor(streamId, type, frame);
522490
} else {
523491
switch (type) {
524492
case ERROR:
525493
receiver.onError(Exceptions.from(frame));
526-
removeReceiver(streamId);
494+
receivers.remove(streamId);
527495
break;
528496
case NEXT_COMPLETE:
529497
receiver.onNext(frameDecoder.apply(frame));
530498
receiver.onComplete();
531499
break;
532500
case CANCEL:
533501
{
534-
LimitableRequestPublisher sender;
535-
synchronized (this) {
536-
sender = senders.remove(streamId);
537-
removeReceiver(streamId);
538-
}
502+
LimitableRequestPublisher sender = senders.remove(streamId);
503+
receivers.remove(streamId);
539504
if (sender != null) {
540505
sender.cancel();
541506
}
@@ -546,10 +511,7 @@ private void handleFrame(int streamId, FrameType type, Frame frame) {
546511
break;
547512
case REQUEST_N:
548513
{
549-
LimitableRequestPublisher sender;
550-
synchronized (this) {
551-
sender = senders.get(streamId);
552-
}
514+
LimitableRequestPublisher sender = senders.get(streamId);
553515
if (sender != null) {
554516
int n = Frame.RequestN.requestN(frame);
555517
sender.increaseRequestLimit(n);
@@ -559,9 +521,7 @@ private void handleFrame(int streamId, FrameType type, Frame frame) {
559521
}
560522
case COMPLETE:
561523
receiver.onComplete();
562-
synchronized (this) {
563-
receivers.remove(streamId);
564-
}
524+
receivers.remove(streamId);
565525
break;
566526
default:
567527
throw new IllegalStateException(
@@ -593,12 +553,4 @@ private void handleMissingResponseProcessor(int streamId, FrameType type, Frame
593553
// receiving a frame after a given stream has been cancelled/completed,
594554
// so ignore (cancellation is async so there is a race condition)
595555
}
596-
597-
private synchronized void removeReceiver(int streamId) {
598-
receivers.remove(streamId);
599-
}
600-
601-
private synchronized void removeSender(int streamId) {
602-
senders.remove(streamId);
603-
}
604556
}

0 commit comments

Comments
 (0)