Skip to content

Commit 24691af

Browse files
Ryland Degnanrobertroeser
authored andcommitted
Added recycler for ByteBufPayload (#445)
1 parent 6a0cc5c commit 24691af

File tree

5 files changed

+45
-50
lines changed

5 files changed

+45
-50
lines changed

build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ subprojects {
8181

8282
dependencies {
8383
compile "io.projectreactor:reactor-core:3.1.1.RELEASE"
84-
compile "io.netty:netty-buffer:4.1.15.Final"
84+
compile "io.netty:netty-buffer:4.1.16.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"

rsocket-core/src/main/java/io/rsocket/util/ByteBufPayload.java

Lines changed: 31 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import io.netty.buffer.ByteBufUtil;
2222
import io.netty.buffer.Unpooled;
2323
import io.netty.util.AbstractReferenceCounted;
24+
import io.netty.util.Recycler;
2425
import io.rsocket.Payload;
2526

2627
import javax.annotation.Nullable;
@@ -29,17 +30,19 @@
2930
import java.nio.charset.Charset;
3031

3132
public final class ByteBufPayload extends AbstractReferenceCounted implements Payload {
32-
private final ByteBuf data;
33-
private final ByteBuf metadata;
33+
private static final Recycler<ByteBufPayload> RECYCLER =
34+
new Recycler<ByteBufPayload>() {
35+
protected ByteBufPayload newObject(Handle<ByteBufPayload> handle) {
36+
return new ByteBufPayload(handle);
37+
}
38+
};
3439

35-
private ByteBufPayload(ByteBuf data) {
36-
this.data = data.asReadOnly();
37-
this.metadata = null;
38-
}
40+
private final Recycler.Handle<ByteBufPayload> handle;
41+
private ByteBuf data;
42+
private ByteBuf metadata;
3943

40-
private ByteBufPayload(ByteBuf data, @Nullable ByteBuf metadata) {
41-
this.data = data.asReadOnly();
42-
this.metadata = metadata == null ? null : metadata.asReadOnly();
44+
private ByteBufPayload(final Recycler.Handle<ByteBufPayload> handle) {
45+
this.handle = handle;
4346
}
4447

4548
@Override
@@ -49,12 +52,12 @@ public boolean hasMetadata() {
4952

5053
@Override
5154
public ByteBuf sliceMetadata() {
52-
return metadata == null ? Unpooled.EMPTY_BUFFER : metadata.duplicate();
55+
return metadata == null ? Unpooled.EMPTY_BUFFER : metadata;
5356
}
5457

5558
@Override
5659
public ByteBuf sliceData() {
57-
return data.duplicate();
60+
return data;
5861
}
5962

6063
@Override
@@ -90,9 +93,12 @@ public ByteBufPayload touch(Object hint) {
9093
@Override
9194
protected void deallocate() {
9295
data.release();
96+
data = null;
9397
if (metadata != null) {
9498
metadata.release();
99+
metadata = null;
95100
}
101+
handle.recycle(this);
96102
}
97103

98104
/**
@@ -102,7 +108,7 @@ protected void deallocate() {
102108
* @return a payload.
103109
*/
104110
public static Payload create(String data) {
105-
return new ByteBufPayload(ByteBufUtil.writeUtf8(ByteBufAllocator.DEFAULT, data));
111+
return create(ByteBufUtil.writeUtf8(ByteBufAllocator.DEFAULT, data), null);
106112
}
107113

108114
/**
@@ -114,48 +120,51 @@ public static Payload create(String data) {
114120
* @return a payload.
115121
*/
116122
public static Payload create(String data, @Nullable String metadata) {
117-
return new ByteBufPayload(
123+
return create(
118124
ByteBufUtil.writeUtf8(ByteBufAllocator.DEFAULT, data),
119125
metadata == null ? null : ByteBufUtil.writeUtf8(ByteBufAllocator.DEFAULT, metadata)
120126
);
121127
}
122128

123129
public static Payload create(CharSequence data, Charset dataCharset) {
124-
return new ByteBufPayload(ByteBufUtil.encodeString(ByteBufAllocator.DEFAULT, CharBuffer.wrap(data), dataCharset));
130+
return create(ByteBufUtil.encodeString(ByteBufAllocator.DEFAULT, CharBuffer.wrap(data), dataCharset), null);
125131
}
126132

127133
public static Payload create(CharSequence data, Charset dataCharset, @Nullable CharSequence metadata, Charset metadataCharset) {
128-
return new ByteBufPayload(
134+
return create(
129135
ByteBufUtil.encodeString(ByteBufAllocator.DEFAULT, CharBuffer.wrap(data), dataCharset),
130136
metadata == null ? null : ByteBufUtil.encodeString(ByteBufAllocator.DEFAULT, CharBuffer.wrap(metadata), metadataCharset)
131137
);
132138
}
133139

134140
public static Payload create(byte[] data) {
135-
return new ByteBufPayload(Unpooled.wrappedBuffer(data));
141+
return create(Unpooled.wrappedBuffer(data), null);
136142
}
137143

138144
public static Payload create(byte[] data, @Nullable byte[] metadata) {
139-
return new ByteBufPayload(Unpooled.wrappedBuffer(data), metadata == null ? null : Unpooled.wrappedBuffer(metadata));
145+
return create(Unpooled.wrappedBuffer(data), metadata == null ? null : Unpooled.wrappedBuffer(metadata));
140146
}
141147

142148
public static Payload create(ByteBuffer data) {
143-
return new ByteBufPayload(Unpooled.wrappedBuffer(data));
149+
return create(Unpooled.wrappedBuffer(data), null);
144150
}
145151

146152
public static Payload create(ByteBuffer data, @Nullable ByteBuffer metadata) {
147-
return new ByteBufPayload(Unpooled.wrappedBuffer(data), metadata == null ? null : Unpooled.wrappedBuffer(metadata));
153+
return create(Unpooled.wrappedBuffer(data), metadata == null ? null : Unpooled.wrappedBuffer(metadata));
148154
}
149155

150156
public static Payload create(ByteBuf data) {
151-
return new ByteBufPayload(data);
157+
return create(data, null);
152158
}
153159

154160
public static Payload create(ByteBuf data, @Nullable ByteBuf metadata) {
155-
return new ByteBufPayload(data, metadata);
161+
ByteBufPayload payload = RECYCLER.get();
162+
payload.data = data;
163+
payload.metadata = metadata;
164+
return payload;
156165
}
157166

158167
public static Payload create(Payload payload) {
159-
return new ByteBufPayload(payload.sliceData(), payload.hasMetadata() ? payload.sliceMetadata() : null);
168+
return create(payload.sliceData(), payload.hasMetadata() ? payload.sliceMetadata() : null);
160169
}
161170
}

rsocket-core/src/main/java/io/rsocket/util/DefaultPayload.java

Lines changed: 12 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -35,14 +35,9 @@ public final class DefaultPayload implements Payload {
3535
private final ByteBuffer data;
3636
private final ByteBuffer metadata;
3737

38-
private DefaultPayload(ByteBuffer data) {
39-
this.data = data.asReadOnlyBuffer();
40-
this.metadata = null;
41-
}
42-
4338
private DefaultPayload(ByteBuffer data, @Nullable ByteBuffer metadata) {
44-
this.data = data.asReadOnlyBuffer();
45-
this.metadata = metadata == null ? null : metadata.asReadOnlyBuffer();
39+
this.data = data;
40+
this.metadata = metadata;
4641
}
4742

4843
@Override
@@ -62,12 +57,12 @@ public ByteBuf sliceData() {
6257

6358
@Override
6459
public ByteBuffer getMetadata() {
65-
return metadata == null ? DefaultPayload.EMPTY_BUFFER : metadata.duplicate();
60+
return metadata == null ? DefaultPayload.EMPTY_BUFFER : metadata;
6661
}
6762

6863
@Override
6964
public ByteBuffer getData() {
70-
return data.duplicate();
65+
return data;
7166
}
7267

7368
@Override
@@ -112,7 +107,7 @@ public boolean release(int decrement) {
112107
* @return a payload.
113108
*/
114109
public static Payload create(CharSequence data) {
115-
return new DefaultPayload(StandardCharsets.UTF_8.encode(CharBuffer.wrap(data)));
110+
return create(StandardCharsets.UTF_8.encode(CharBuffer.wrap(data)), null);
116111
}
117112

118113
/**
@@ -124,40 +119,40 @@ public static Payload create(CharSequence data) {
124119
* @return a payload.
125120
*/
126121
public static Payload create(CharSequence data, @Nullable CharSequence metadata) {
127-
return new DefaultPayload(
122+
return create(
128123
StandardCharsets.UTF_8.encode(CharBuffer.wrap(data)),
129124
metadata == null ? null : StandardCharsets.UTF_8.encode(CharBuffer.wrap(metadata))
130125
);
131126
}
132127

133128
public static Payload create(CharSequence data, Charset dataCharset) {
134-
return new DefaultPayload(dataCharset.encode(CharBuffer.wrap(data)));
129+
return create(dataCharset.encode(CharBuffer.wrap(data)), null);
135130
}
136131

137132
public static Payload create(CharSequence data, Charset dataCharset, @Nullable CharSequence metadata, Charset metadataCharset) {
138-
return new DefaultPayload(
133+
return create(
139134
dataCharset.encode(CharBuffer.wrap(data)),
140135
metadata == null ? null : metadataCharset.encode(CharBuffer.wrap(metadata))
141136
);
142137
}
143138

144139
public static Payload create(byte[] data) {
145-
return new DefaultPayload(ByteBuffer.wrap(data));
140+
return create(ByteBuffer.wrap(data), null);
146141
}
147142

148143
public static Payload create(byte[] data, @Nullable byte[] metadata) {
149-
return new DefaultPayload(ByteBuffer.wrap(data), metadata == null ? null : ByteBuffer.wrap(metadata));
144+
return create(ByteBuffer.wrap(data), metadata == null ? null : ByteBuffer.wrap(metadata));
150145
}
151146

152147
public static Payload create(ByteBuffer data) {
153-
return new DefaultPayload(data);
148+
return create(data, null);
154149
}
155150

156151
public static Payload create(ByteBuffer data, @Nullable ByteBuffer metadata) {
157152
return new DefaultPayload(data, metadata);
158153
}
159154

160155
public static Payload create(Payload payload) {
161-
return new DefaultPayload(payload.getData(), payload.hasMetadata() ? payload.getMetadata() : null);
156+
return create(payload.getData(), payload.hasMetadata() ? payload.getMetadata() : null);
162157
}
163158
}

rsocket-core/src/test/java/io/rsocket/util/DefaultPayloadTest.java

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@
1313

1414
package io.rsocket.util;
1515

16-
import static io.rsocket.util.DefaultPayload.create;
1716
import static org.hamcrest.MatcherAssert.*;
1817
import static org.hamcrest.Matchers.*;
1918

@@ -32,14 +31,6 @@ public void testReuse() {
3231
assertDataAndMetadata(p, DATA_VAL, METADATA_VAL);
3332
}
3433

35-
@Test
36-
public void testReuseWithExternalMark() {
37-
Payload p = DefaultPayload.create(DATA_VAL, METADATA_VAL);
38-
assertDataAndMetadata(p, DATA_VAL, METADATA_VAL);
39-
p.getData().position(2).mark();
40-
assertDataAndMetadata(p, DATA_VAL, METADATA_VAL);
41-
}
42-
4334
public void assertDataAndMetadata(Payload p, String dataVal, @Nullable String metadataVal) {
4435
assertThat("Unexpected data.", p.getDataUtf8(), equalTo(dataVal));
4536
if (metadataVal == null) {

rsocket-test/build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,5 +20,5 @@ dependencies {
2020
compile "org.mockito:mockito-core:2.10.0"
2121
compile "org.hamcrest:hamcrest-library:1.3"
2222
compile "org.hdrhistogram:HdrHistogram:2.1.9"
23-
compile "io.projectreactor:reactor-test:3.1.0.RELEASE"
23+
compile "io.projectreactor:reactor-test:3.1.1.RELEASE"
2424
}

0 commit comments

Comments
 (0)