diff --git a/CHANGES.txt b/CHANGES.txt index 6e628546d8..90fd207e9f 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -8,6 +8,7 @@ dev * cli defaults to bytestype for subcomparator when creating column families (CASSANDRA-1835) * unregister index MBeans when index is dropped (CASSANDRA-1843) + * make ByteBufferUtil.clone thread-safe (CASSANDRA-1847) 0.7.0-rc2 diff --git a/src/java/org/apache/cassandra/utils/ByteBufferUtil.java b/src/java/org/apache/cassandra/utils/ByteBufferUtil.java index 80fdd229ef..5152432f03 100644 --- a/src/java/org/apache/cassandra/utils/ByteBufferUtil.java +++ b/src/java/org/apache/cassandra/utils/ByteBufferUtil.java @@ -101,11 +101,26 @@ public class ByteBufferUtil public static ByteBuffer clone(ByteBuffer o) { + assert o != null; + + if (o.remaining() == 0) + return FBUtilities.EMPTY_BYTE_BUFFER; + ByteBuffer clone = ByteBuffer.allocate(o.remaining()); - o.mark(); - clone.put(o); - o.reset(); - clone.flip(); + + if (o.isDirect()) + { + for (int i = o.position(); i < o.limit(); i++) + { + clone.put(o.get(i)); + } + clone.flip(); + } + else + { + System.arraycopy(o.array(), o.arrayOffset() + o.position(), clone.array(), 0, o.remaining()); + } + return clone; } }