Hao Zhong created CASSANDRA-13680:
-------------------------------------
Summary: readBytes needs to clone its data
Key: CASSANDRA-13680
URL: https://issues.apache.org/jira/browse/CASSANDRA-13680
Project: Cassandra
Issue Type: Bug
Reporter: Hao Zhong
The code of the ByteBufferUtil_readBytes method is as follow:
{code}
public static ByteBuffer readBytes(ByteBuffer bb, int length)
{
ByteBuffer copy = bb.duplicate();
copy.limit(copy.position() + length);
bb.position(bb.position() + length);
return copy;
}
{code}
I found that CASSANDRA-3179 fixed a related bug. The buggy code is as follow:
{code}
public synchronized ByteBuffer readBytes(int length) throws IOException
{
int remaining = buffer.remaining() - position;
if (length > remaining)
throw new IOException(String.format("mmap segment underflow;
remaining is %d but %d requested",
remaining, length));
ByteBuffer bytes = buffer.duplicate();
bytes.position(buffer.position() + position).limit(buffer.position() +
position + length);
position += length;
return bytes;
}
{code}
The fixed code is:
{code}
public synchronized ByteBuffer readBytes(int length) throws IOException
{
int remaining = buffer.remaining() - position;
if (length > remaining)
throw new IOException(String.format("mmap segment underflow;
remaining is %d but %d requested",
remaining, length));
if (length == 0)
return ByteBufferUtil.EMPTY_BYTE_BUFFER;
ByteBuffer bytes = buffer.duplicate();
bytes.position(buffer.position() + position).limit(buffer.position() +
position + length);
position += length;
// we have to copy the data in case we unreference the underlying
sstable. See CASSANDRA-3179
ByteBuffer clone = ByteBuffer.allocate(bytes.remaining());
clone.put(bytes);
clone.flip();
return clone;
}
{code}
The ByteBufferUtil_readBytes method may be modified in the same way to handle
the similar problem.
--
This message was sent by Atlassian JIRA
(v6.4.14#64029)
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]