Skip to content

Commit 6f74ae9

Browse files
committed
provides refactoring related to ensuring that hasMetadata is propagated correctly
Right now there was observed a few issues related to that Payload with no metadata was incorrectly incoded so it results to hasMetadata true on the received side Also, optimized the API of Flyweights to ensure that we have common things in one place Signed-off-by: Oleh Dokuka <[email protected]>
1 parent c93c456 commit 6f74ae9

31 files changed

+572
-447
lines changed

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
package io.rsocket.core;
1818

1919
import io.netty.buffer.ByteBuf;
20+
import io.netty.buffer.Unpooled;
2021
import io.rsocket.ConnectionSetupPayload;
2122
import io.rsocket.frame.FrameHeaderFlyweight;
2223
import io.rsocket.frame.SetupFrameFlyweight;
@@ -40,7 +41,8 @@ public boolean hasMetadata() {
4041

4142
@Override
4243
public ByteBuf sliceMetadata() {
43-
return SetupFrameFlyweight.metadata(setupFrame);
44+
final ByteBuf metadata = SetupFrameFlyweight.metadata(setupFrame);
45+
return metadata == null ? Unpooled.EMPTY_BUFFER : metadata;
4446
}
4547

4648
@Override

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

Lines changed: 8 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -212,12 +212,7 @@ private Mono<Void> handleFireAndForget(Payload payload) {
212212
return UnicastMonoEmpty.newInstance(
213213
() -> {
214214
ByteBuf requestFrame =
215-
RequestFireAndForgetFrameFlyweight.encode(
216-
allocator,
217-
streamId,
218-
false,
219-
payload.hasMetadata() ? payload.sliceMetadata().retain() : null,
220-
payload.sliceData().retain());
215+
RequestFireAndForgetFrameFlyweight.encode(allocator, streamId, payload);
221216
payload.release();
222217

223218
sendProcessor.onNext(requestFrame);
@@ -245,12 +240,7 @@ private Mono<Payload> handleRequestResponse(final Payload payload) {
245240
@Override
246241
public void doOnSubscribe() {
247242
final ByteBuf requestFrame =
248-
RequestResponseFrameFlyweight.encode(
249-
allocator,
250-
streamId,
251-
false,
252-
payload.sliceMetadata().retain(),
253-
payload.sliceData().retain());
243+
RequestResponseFrameFlyweight.encode(allocator, streamId, payload);
254244
payload.release();
255245

256246
sendProcessor.onNext(requestFrame);
@@ -302,15 +292,9 @@ private Flux<Payload> handleRequestStream(final Payload payload) {
302292
public void accept(long n) {
303293
if (firstRequest && !receiver.isDisposed()) {
304294
firstRequest = false;
305-
sendProcessor.onNext(
306-
RequestStreamFrameFlyweight.encode(
307-
allocator,
308-
streamId,
309-
false,
310-
n,
311-
payload.sliceMetadata().retain(),
312-
payload.sliceData().retain()));
313295
if (!payloadReleasedFlag.getAndSet(true)) {
296+
sendProcessor.onNext(
297+
RequestStreamFrameFlyweight.encode(allocator, streamId, n, payload));
314298
payload.release();
315299
}
316300
} else if (contains(streamId) && !receiver.isDisposed()) {
@@ -399,8 +383,7 @@ protected void hookOnNext(Payload payload) {
399383
receiver.onError(t);
400384
return;
401385
}
402-
final ByteBuf frame =
403-
PayloadFrameFlyweight.encode(allocator, streamId, false, false, true, payload);
386+
final ByteBuf frame = PayloadFrameFlyweight.encodeNext(allocator, streamId, payload);
404387

405388
sendProcessor.onNext(frame);
406389
payload.release();
@@ -445,13 +428,7 @@ public void accept(long n) {
445428
if (!payloadReleasedFlag.getAndSet(true)) {
446429
ByteBuf frame =
447430
RequestChannelFrameFlyweight.encode(
448-
allocator,
449-
streamId,
450-
false,
451-
false,
452-
n,
453-
initialPayload.sliceMetadata().retain(),
454-
initialPayload.sliceData().retain());
431+
allocator, streamId, false, n, initialPayload);
455432

456433
sendProcessor.onNext(frame);
457434

@@ -604,8 +581,8 @@ private void handleFrame(int streamId, FrameType type, ByteBuf frame) {
604581
{
605582
Subscription sender = senders.get(streamId);
606583
if (sender != null) {
607-
int n = RequestNFrameFlyweight.requestN(frame);
608-
sender.request(n >= Integer.MAX_VALUE ? Long.MAX_VALUE : n);
584+
long n = RequestNFrameFlyweight.requestN(frame);
585+
sender.request(n);
609586
}
610587
break;
611588
}

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

Lines changed: 25 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
import io.rsocket.internal.UnboundedProcessor;
3636
import io.rsocket.lease.ResponderLeaseHandler;
3737
import java.util.function.Consumer;
38+
import java.util.function.LongConsumer;
3839
import javax.annotation.Nullable;
3940
import org.reactivestreams.Processor;
4041
import org.reactivestreams.Publisher;
@@ -300,12 +301,12 @@ private void handleFrame(ByteBuf frame) {
300301
handleRequestN(streamId, frame);
301302
break;
302303
case REQUEST_STREAM:
303-
int streamInitialRequestN = RequestStreamFrameFlyweight.initialRequestN(frame);
304+
long streamInitialRequestN = RequestStreamFrameFlyweight.initialRequestN(frame);
304305
Payload streamPayload = payloadDecoder.apply(frame);
305306
handleStream(streamId, requestStream(streamPayload), streamInitialRequestN, null);
306307
break;
307308
case REQUEST_CHANNEL:
308-
int channelInitialRequestN = RequestChannelFrameFlyweight.initialRequestN(frame);
309+
long channelInitialRequestN = RequestChannelFrameFlyweight.initialRequestN(frame);
309310
Payload channelPayload = payloadDecoder.apply(frame);
310311
handleChannel(streamId, channelPayload, channelInitialRequestN);
311312
break;
@@ -436,14 +437,14 @@ protected void hookFinally(SignalType type) {
436437
private void handleStream(
437438
int streamId,
438439
Flux<Payload> response,
439-
int initialRequestN,
440+
long initialRequestN,
440441
@Nullable UnicastProcessor<Payload> requestChannel) {
441442
final BaseSubscriber<Payload> subscriber =
442443
new BaseSubscriber<Payload>() {
443444

444445
@Override
445446
protected void hookOnSubscribe(Subscription s) {
446-
s.request(initialRequestN >= Integer.MAX_VALUE ? Long.MAX_VALUE : initialRequestN);
447+
s.request(initialRequestN);
447448
}
448449

449450
@Override
@@ -522,14 +523,30 @@ protected void hookFinally(SignalType type) {
522523
.subscribe(subscriber);
523524
}
524525

525-
private void handleChannel(int streamId, Payload payload, int initialRequestN) {
526+
private void handleChannel(int streamId, Payload payload, long initialRequestN) {
526527
UnicastProcessor<Payload> frames = UnicastProcessor.create();
527528
channelProcessors.put(streamId, frames);
528529

529530
Flux<Payload> payloads =
530531
frames
531532
.doOnRequest(
532-
l -> sendProcessor.onNext(RequestNFrameFlyweight.encode(allocator, streamId, l)))
533+
new LongConsumer() {
534+
boolean first = true;
535+
536+
@Override
537+
public void accept(long l) {
538+
long n;
539+
if (first) {
540+
first = false;
541+
n = l - 1L;
542+
} else {
543+
n = l;
544+
}
545+
if (n > 0) {
546+
sendProcessor.onNext(RequestNFrameFlyweight.encode(allocator, streamId, n));
547+
}
548+
}
549+
})
533550
.doFinally(
534551
signalType -> {
535552
if (channelProcessors.remove(streamId, frames)) {
@@ -585,8 +602,8 @@ private void handleRequestN(int streamId, ByteBuf frame) {
585602
Subscription subscription = sendingSubscriptions.get(streamId);
586603

587604
if (subscription != null) {
588-
int n = RequestNFrameFlyweight.requestN(frame);
589-
subscription.request(n >= Integer.MAX_VALUE ? Long.MAX_VALUE : n);
605+
long n = RequestNFrameFlyweight.requestN(frame);
606+
subscription.request(n);
590607
}
591608
}
592609
}

rsocket-core/src/main/java/io/rsocket/fragmentation/FrameReassembler.java

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -166,8 +166,8 @@ void handleFollowsFlag(ByteBuf frame, int streamId, FrameType frameType) {
166166
header = frame.copy(frame.readerIndex(), FrameHeaderFlyweight.size());
167167

168168
if (frameType == FrameType.REQUEST_CHANNEL || frameType == FrameType.REQUEST_STREAM) {
169-
int i = RequestChannelFrameFlyweight.initialRequestN(frame);
170-
header.writeInt(i);
169+
long i = RequestChannelFrameFlyweight.initialRequestN(frame);
170+
header.writeInt(i > Integer.MAX_VALUE ? Integer.MAX_VALUE : (int) i);
171171
}
172172
putHeader(streamId, header);
173173
}
@@ -261,10 +261,16 @@ void reassembleFrame(ByteBuf frame, SynchronousSink<ByteBuf> sink) {
261261
private ByteBuf assembleFrameWithMetadata(ByteBuf frame, int streamId, ByteBuf header) {
262262
ByteBuf metadata;
263263
CompositeByteBuf cm = removeMetadata(streamId);
264-
if (cm != null) {
265-
metadata = cm.addComponents(true, PayloadFrameFlyweight.metadata(frame).retain());
264+
265+
ByteBuf decodedMetadata = PayloadFrameFlyweight.metadata(frame);
266+
if (decodedMetadata != null) {
267+
if (cm != null) {
268+
metadata = cm.addComponents(true, decodedMetadata.retain());
269+
} else {
270+
metadata = PayloadFrameFlyweight.metadata(frame).retain();
271+
}
266272
} else {
267-
metadata = PayloadFrameFlyweight.metadata(frame).retain();
273+
metadata = cm != null ? cm : null;
268274
}
269275

270276
ByteBuf data = assembleData(frame, streamId);

rsocket-core/src/main/java/io/rsocket/frame/DataAndMetadataFlyweight.java

Lines changed: 21 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -30,40 +30,35 @@ private static int decodeLength(final ByteBuf byteBuf) {
3030
return length;
3131
}
3232

33-
static ByteBuf encodeOnlyData(ByteBufAllocator allocator, final ByteBuf header, ByteBuf data) {
34-
return allocator.compositeBuffer(2).addComponents(true, header, data);
35-
}
36-
3733
static ByteBuf encode(
38-
ByteBufAllocator allocator, final ByteBuf header, ByteBuf metadata, ByteBuf data) {
39-
40-
int length = metadata.readableBytes();
41-
encodeLength(header, length);
42-
return allocator.compositeBuffer(3).addComponents(true, header, metadata, data);
43-
}
44-
45-
static ByteBuf encode(ByteBufAllocator allocator, final ByteBuf header, ByteBuf metadata) {
34+
ByteBufAllocator allocator,
35+
final ByteBuf header,
36+
ByteBuf metadata,
37+
boolean hasMetadata,
38+
ByteBuf data) {
4639

47-
int length = metadata.readableBytes();
48-
encodeLength(header, length);
49-
return allocator.compositeBuffer(2).addComponents(true, header, metadata);
50-
}
40+
final boolean addData = data != null && data.isReadable();
41+
final boolean addMetadata = hasMetadata && metadata.isReadable();
5142

52-
static ByteBuf metadataWithoutMarking(ByteBuf byteBuf, boolean hasMetadata) {
5343
if (hasMetadata) {
54-
int length = decodeLength(byteBuf);
55-
return byteBuf.readSlice(length);
44+
int length = metadata.readableBytes();
45+
encodeLength(header, length);
46+
}
47+
48+
if (addMetadata && addData) {
49+
return allocator.compositeBuffer(3).addComponents(true, header, metadata, data);
50+
} else if (addMetadata) {
51+
return allocator.compositeBuffer(2).addComponents(true, header, metadata);
52+
} else if (addData) {
53+
return allocator.compositeBuffer(2).addComponents(true, header, data);
5654
} else {
57-
return Unpooled.EMPTY_BUFFER;
55+
return header;
5856
}
5957
}
6058

61-
static ByteBuf metadata(ByteBuf byteBuf, boolean hasMetadata) {
62-
byteBuf.markReaderIndex();
63-
byteBuf.skipBytes(6);
64-
ByteBuf metadata = metadataWithoutMarking(byteBuf, hasMetadata);
65-
byteBuf.resetReaderIndex();
66-
return metadata;
59+
static ByteBuf metadataWithoutMarking(ByteBuf byteBuf) {
60+
int length = decodeLength(byteBuf);
61+
return byteBuf.readSlice(length);
6762
}
6863

6964
static ByteBuf dataWithoutMarking(ByteBuf byteBuf, boolean hasMetadata) {
@@ -78,12 +73,4 @@ static ByteBuf dataWithoutMarking(ByteBuf byteBuf, boolean hasMetadata) {
7873
return Unpooled.EMPTY_BUFFER;
7974
}
8075
}
81-
82-
static ByteBuf data(ByteBuf byteBuf, boolean hasMetadata) {
83-
byteBuf.markReaderIndex();
84-
byteBuf.skipBytes(6);
85-
ByteBuf data = dataWithoutMarking(byteBuf, hasMetadata);
86-
byteBuf.resetReaderIndex();
87-
return data;
88-
}
8976
}

rsocket-core/src/main/java/io/rsocket/frame/ExtensionFrameFlyweight.java

Lines changed: 7 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,7 @@ public static ByteBuf encode(
1414
@Nullable ByteBuf metadata,
1515
ByteBuf data) {
1616

17-
final boolean hasData = data != null && data.isReadable();
18-
final boolean hasMetadata = metadata != null && metadata.isReadable();
17+
final boolean hasMetadata = metadata != null;
1918

2019
int flags = FrameHeaderFlyweight.FLAGS_I;
2120

@@ -25,15 +24,8 @@ public static ByteBuf encode(
2524

2625
final ByteBuf header = FrameHeaderFlyweight.encode(allocator, streamId, FrameType.EXT, flags);
2726
header.writeInt(extendedType);
28-
if (hasData && hasMetadata) {
29-
return DataAndMetadataFlyweight.encode(allocator, header, metadata, data);
30-
} else if (hasMetadata) {
31-
return DataAndMetadataFlyweight.encode(allocator, header, metadata);
32-
} else if (hasData) {
33-
return DataAndMetadataFlyweight.encodeOnlyData(allocator, header, data);
34-
} else {
35-
return header;
36-
}
27+
28+
return DataAndMetadataFlyweight.encode(allocator, header, metadata, hasMetadata, data);
3729
}
3830

3931
public static int extendedType(ByteBuf byteBuf) {
@@ -61,10 +53,13 @@ public static ByteBuf metadata(ByteBuf byteBuf) {
6153
FrameHeaderFlyweight.ensureFrameType(FrameType.EXT, byteBuf);
6254

6355
boolean hasMetadata = FrameHeaderFlyweight.hasMetadata(byteBuf);
56+
if (!hasMetadata) {
57+
return null;
58+
}
6459
byteBuf.markReaderIndex();
6560
// Extended type
6661
byteBuf.skipBytes(FrameHeaderFlyweight.size() + Integer.BYTES);
67-
ByteBuf metadata = DataAndMetadataFlyweight.metadataWithoutMarking(byteBuf, hasMetadata);
62+
ByteBuf metadata = DataAndMetadataFlyweight.metadataWithoutMarking(byteBuf);
6863
byteBuf.resetReaderIndex();
6964
return metadata;
7065
}

rsocket-core/src/main/java/io/rsocket/frame/FragmentationFlyweight.java

Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -13,17 +13,7 @@ public static ByteBuf encode(final ByteBufAllocator allocator, ByteBuf header, B
1313
public static ByteBuf encode(
1414
final ByteBufAllocator allocator, ByteBuf header, @Nullable ByteBuf metadata, ByteBuf data) {
1515

16-
final boolean hasData = data != null && data.isReadable();
17-
final boolean hasMetadata = metadata != null && metadata.isReadable();
18-
19-
if (hasData && hasMetadata) {
20-
return DataAndMetadataFlyweight.encode(allocator, header, metadata, data);
21-
} else if (hasMetadata) {
22-
return DataAndMetadataFlyweight.encode(allocator, header, metadata);
23-
} else if (hasData) {
24-
return DataAndMetadataFlyweight.encodeOnlyData(allocator, header, data);
25-
} else {
26-
return header;
27-
}
16+
final boolean hasMetadata = metadata != null;
17+
return DataAndMetadataFlyweight.encode(allocator, header, metadata, hasMetadata, data);
2818
}
2919
}

rsocket-core/src/main/java/io/rsocket/frame/KeepAliveFrameFlyweight.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ public static ByteBuf encode(
2929

3030
header.writeLong(lp);
3131

32-
return DataAndMetadataFlyweight.encodeOnlyData(allocator, header, data);
32+
return DataAndMetadataFlyweight.encode(allocator, header, null, false, data);
3333
}
3434

3535
public static boolean respondFlag(ByteBuf byteBuf) {

rsocket-core/src/main/java/io/rsocket/frame/LeaseFrameFlyweight.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ public static ByteBuf encode(
1414
@Nullable final ByteBuf metadata) {
1515

1616
final boolean hasMetadata = metadata != null;
17-
final boolean writesMetadata = hasMetadata && metadata.isReadable();
17+
final boolean addMetadata = hasMetadata && metadata.isReadable();
1818

1919
int flags = 0;
2020

@@ -27,7 +27,7 @@ public static ByteBuf encode(
2727
.writeInt(ttl)
2828
.writeInt(numRequests);
2929

30-
if (writesMetadata) {
30+
if (addMetadata) {
3131
return allocator.compositeBuffer(2).addComponents(true, header, metadata);
3232
} else {
3333
return header;

0 commit comments

Comments
 (0)