Skip to content

Commit f5b4020

Browse files
authored
Remove netty BytesReference implementations (#54355)
Elasticsearch has a number of different BytesReference implementations. These implementations can all implement the interface in different ways with subtly different behavior and performance characteristics. On the other-hand, the JVM only represents bytes as an array or a direct byte buffer. This commit deletes the specialized Netty implementations and moves to using a generic ByteBuffer reference type. This will allow us to focus on standardizing performance and behave around a smaller number of implementations that can be used by all components in Elasticsearch.
1 parent f2cc2b1 commit f5b4020

File tree

7 files changed

+90
-470
lines changed

7 files changed

+90
-470
lines changed

modules/transport-netty4/src/main/java/org/elasticsearch/transport/netty4/ByteBufBytesReference.java

Lines changed: 0 additions & 104 deletions
This file was deleted.

modules/transport-netty4/src/main/java/org/elasticsearch/transport/netty4/Netty4Utils.java

Lines changed: 20 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
import org.elasticsearch.common.bytes.BytesReference;
3131

3232
import java.io.IOException;
33+
import java.nio.ByteBuffer;
3334
import java.util.ArrayList;
3435
import java.util.List;
3536
import java.util.Locale;
@@ -80,28 +81,24 @@ public static ByteBuf toByteBuf(final BytesReference reference) {
8081
if (reference.length() == 0) {
8182
return Unpooled.EMPTY_BUFFER;
8283
}
83-
if (reference instanceof ByteBufBytesReference) {
84-
return ((ByteBufBytesReference) reference).toByteBuf();
85-
} else {
86-
final BytesRefIterator iterator = reference.iterator();
87-
// usually we have one, two, or three components from the header, the message, and a buffer
88-
final List<ByteBuf> buffers = new ArrayList<>(3);
89-
try {
90-
BytesRef slice;
91-
while ((slice = iterator.next()) != null) {
92-
buffers.add(Unpooled.wrappedBuffer(slice.bytes, slice.offset, slice.length));
93-
}
84+
final BytesRefIterator iterator = reference.iterator();
85+
// usually we have one, two, or three components from the header, the message, and a buffer
86+
final List<ByteBuf> buffers = new ArrayList<>(3);
87+
try {
88+
BytesRef slice;
89+
while ((slice = iterator.next()) != null) {
90+
buffers.add(Unpooled.wrappedBuffer(slice.bytes, slice.offset, slice.length));
91+
}
9492

95-
if (buffers.size() == 1) {
96-
return buffers.get(0);
97-
} else {
98-
CompositeByteBuf composite = Unpooled.compositeBuffer(buffers.size());
99-
composite.addComponents(true, buffers);
100-
return composite;
101-
}
102-
} catch (IOException ex) {
103-
throw new AssertionError("no IO happens here", ex);
93+
if (buffers.size() == 1) {
94+
return buffers.get(0);
95+
} else {
96+
CompositeByteBuf composite = Unpooled.compositeBuffer(buffers.size());
97+
composite.addComponents(true, buffers);
98+
return composite;
10499
}
100+
} catch (IOException ex) {
101+
throw new AssertionError("no IO happens here", ex);
105102
}
106103
}
107104

@@ -112,7 +109,9 @@ public static BytesReference toBytesReference(final ByteBuf buffer) {
112109
final int readableBytes = buffer.readableBytes();
113110
if (readableBytes == 0) {
114111
return BytesArray.EMPTY;
112+
} else {
113+
final ByteBuffer[] byteBuffers = buffer.nioBuffers();
114+
return BytesReference.fromByteBuffers(byteBuffers);
115115
}
116-
return new ByteBufBytesReference(buffer, buffer.readableBytes());
117116
}
118117
}

modules/transport-netty4/src/test/java/org/elasticsearch/transport/netty4/ByteBufBytesReferenceTests.java

Lines changed: 0 additions & 84 deletions
This file was deleted.

modules/transport-netty4/src/test/java/org/elasticsearch/transport/netty4/Netty4UtilsTests.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -69,9 +69,7 @@ public void testToChannelBuffer() throws IOException {
6969
BytesReference ref = getRandomizedBytesReference(randomIntBetween(1, 3 * PAGE_SIZE));
7070
ByteBuf buffer = Netty4Utils.toByteBuf(ref);
7171
BytesReference bytesReference = Netty4Utils.toBytesReference(buffer);
72-
if (ref instanceof ByteBufBytesReference) {
73-
assertEquals(buffer, ((ByteBufBytesReference) ref).toByteBuf());
74-
} else if (AbstractBytesReferenceTestCase.getNumPages(ref) > 1) { // we gather the buffers into a channel buffer
72+
if (AbstractBytesReferenceTestCase.getNumPages(ref) > 1) { // we gather the buffers into a channel buffer
7573
assertTrue(buffer instanceof CompositeByteBuf);
7674
}
7775
assertArrayEquals(BytesReference.toBytes(ref), BytesReference.toBytes(bytesReference));

0 commit comments

Comments
 (0)