I'm not a Java developer, but based on my best knowledge, ByteBuffer.array() method returns the whole byte array, not just the part of the byte array that's meaningful (i.e. has ever been written to). You may want to check the difference between the bb.capacity() and bb.limit(), and also check the bb.arrayOffset() because the first element is not always at beginning of the byte array.

On 27/01/2022 22:11, Neophytos Demetriou wrote:
Hi,

I'm new to the list but not new to Cassandra. I'm writing an app on top of C* and I have come across an issue (huge cell buffer size after applying a mutation) that I haven't been able to resolve yet. I would appreciate any suggestions/help to resolve this. Here are the details:

1. I have a column family defined as follows:
TableMetadata.Builder metadata =
TableMetadata
     .builder(KEYSPACE1, CF_STANDARD1)
     .addPartitionKeyColumn("key", Int32Type.instance)
     .addRegularColumn(
     "a", MapType.getInstance(AsciiType.instance, 
SetType.getInstance(UTF8Type.instance,false),false))
     .addRegularColumn("b", UTF8Type.instance);
2. And here's a test that I wrote and works on cassandra-4.0 branch:
Row.Builder builder = BTreeRow.unsortedBuilder(); builder.newRow(Clustering.EMPTY); ColumnMetadata def 
=metadata.getColumn(new ColumnIdentifier("b", true)); Cell<?> cell = BufferCell.live(def, 
System.currentTimeMillis(), UTF8Type.instance.decompose("/b1")); builder.addCell(cell); 
PartitionUpdate update = PartitionUpdate.singleRowUpdate(metadata, dk, builder.build()); new 
Mutation(update).apply(); Row row = Util.getOnlyRow(Util.cmd(cfs, dk).withLimit(1).build()); 
assertEquals(3, row.getCell(def).buffer().array().length);
3. However, in my app when I do the getOnlyRow after applying the mutation the string value of b is 3 but the buffer().array().length is 1048576.

4. Restarting the app (which starts the cassandra daemon), fixes the issue i.e. getOnlyRow returns the correct buffer size.

5. I'm importing cassandra-all 4.0.1 and the app uses jdk-11.

If you need further info, please do not hesitate to ask.

- Neophytos

PS. I'm experimenting with C* internals for the first time so it's very likely I'm doing something wrong.

Reply via email to