hazelcast-code-samples
hazelcast-code-samples copied to clipboard
RingbufferStore does not support byte[] as type parameter.
https://github.com/hazelcast/hazelcast-code-samples/blob/e640f3ea1c3659e954e4dcfc91f55079675314a5/distributed-collections/ringbufferstore/src/main/java/TheRingbufferBinaryStore.java#L11
Version:
3.4.11
( Although I just checked the 4.x
code and it has the same problem )
Description:
When implementing a RingbufferStore<byte[]>
as in the example, when storeAll
is invoked it will fail with a ClassCastException
. This is because the RingbufferStoreWrapper
converts the data into an Object
array before trying to call the main RingBufferStore
. An Object[]
cannot be cast into an byte[][]
so it fails to properly cast the data.
Example:
public class SimpleRingBufferStore implements RingbufferStore<byte[]>
{
public void store(final long sequence, final byte[] data) {}
public void storeAll(long firstItemSequence, byte[] [] items) {}
public byte[] load(long sequence) { return new byte[0]; }
public long getLargestSequence() { return 0L; }
}
var hazelcastInstance = ... // configure with ring buffer store and binary mode
var ringbuffer = hazelcastInstance .getRingbuffer("test_ringbuffer");
// This will fail internally
ringbuffer.addAllAsync(asList("A", "B", "C"), OverflowPolicy.FAIL)
.get();
// This will work
ringbuffer.add("A");
ringbuffer.add("B");
ringbuffer.add("C");
Solution:
The solution seems to be change it to RingBufferStore<Object>
and then casting it internally.
Thank you for the report @andrewfinnell ! Do you mind sending a PR to fix this?