Details
-
Bug
-
Status: Resolved
-
Normal
-
Resolution: Fixed
-
3.0.27, 3.11.13, 4.0.4, 4.1-alpha1, 4.1
-
None
Description
https://github.com/apache/cassandra/blob/trunk/src/java/org/apache/cassandra/serializers/BooleanSerializer.java#L26 It has two static Bytebuffer variables:-
private static final ByteBuffer TRUE = ByteBuffer.wrap(new byte[]{1}); private static final ByteBuffer FALSE = ByteBuffer.wrap(new byte[]{0});
What will happen if the position of these Bytebuffers is being changed by some other operations? It'll affect other subsequent operations. IMO Using static is not a good idea here.
A potential place where it can become problematic: https://github.com/apache/cassandra/blob/cassandra-2.1.13/src/java/org/apache/cassandra/db/marshal/AbstractCompositeType.java#L243 Since we are calling `.remaining()` It may give wrong results i.e 0 if these Bytebuffers have been used previously.
Solution:
https://github.com/apache/cassandra/blob/trunk/src/java/org/apache/cassandra/serializers/BooleanSerializer.java#L42 Every time we return new bytebuffer object. Please do let me know If there is a better way. I'd like to contribute. Thanks!!
public ByteBuffer serialize(Boolean value) { return (value == null) ? ByteBufferUtil.EMPTY_BYTE_BUFFER : value ? ByteBuffer.wrap(new byte[] {1}) : ByteBuffer.wrap(new byte[] {0}); // false }
Attachments
Attachments
Issue Links
- blocks
-
CASSANDRA-16310 Track top partitions (by size and tombstone count) and display in nodetool tablestats
- Resolved