diff --git a/processing/src/main/java/org/apache/druid/segment/data/CompressionFactory.java b/processing/src/main/java/org/apache/druid/segment/data/CompressionFactory.java index 0b45cdb8d5cf..10943316b707 100644 --- a/processing/src/main/java/org/apache/druid/segment/data/CompressionFactory.java +++ b/processing/src/main/java/org/apache/druid/segment/data/CompressionFactory.java @@ -287,6 +287,11 @@ public interface LongEncodingReader int read(long[] out, int outPosition, int[] indexes, int length, int indexOffset, int limit); + /** + * Duplicates this reader, creating a new reader that does not share any state. Important to achieve thread-safety, + * because a common pattern is to duplicate a reader multiple times and then call {@link #setBuffer} on the + * various duplicates. + */ LongEncodingReader duplicate(); } diff --git a/processing/src/main/java/org/apache/druid/segment/data/LongsLongEncodingReader.java b/processing/src/main/java/org/apache/druid/segment/data/LongsLongEncodingReader.java index 7fd1aef58b42..2ed0459121af 100644 --- a/processing/src/main/java/org/apache/druid/segment/data/LongsLongEncodingReader.java +++ b/processing/src/main/java/org/apache/druid/segment/data/LongsLongEncodingReader.java @@ -69,6 +69,6 @@ public int read(long[] out, int outPosition, int[] indexes, int length, int inde @Override public CompressionFactory.LongEncodingReader duplicate() { - return this; + return new LongsLongEncodingReader(buffer.getByteBuffer(), buffer.getTypeByteOrder()); } }