You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@avro.apache.org by "Doug Cutting (Commented) (JIRA)" <ji...@apache.org> on 2012/03/14 22:16:37 UTC

[jira] [Commented] (AVRO-1045) deepCopy of BYTES underflow exception

    [ https://issues.apache.org/jira/browse/AVRO-1045?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13229630#comment-13229630 ] 

Doug Cutting commented on AVRO-1045:
------------------------------------

It's a little odd to require that deepCopy() preserve more than is checked by equals().  Some folks may might reasonably expect deepCopy() to compact large ByteBuffers.  We could perhaps add a 'protected ByteBuffer GenericData#copyBytes(ByteBuffer)' method that could be overridden in a subclass?  Would that work in your case?  Am I being overly cautious?
                
> deepCopy of BYTES underflow exception
> -------------------------------------
>
>                 Key: AVRO-1045
>                 URL: https://issues.apache.org/jira/browse/AVRO-1045
>             Project: Avro
>          Issue Type: Bug
>          Components: java
>    Affects Versions: 1.6.2
>            Reporter: Jeremy Lewi
>            Priority: Minor
>             Fix For: 1.6.3
>
>         Attachments: AVRO-1045.patch
>
>
> In org.apache.avro.generic.GenericData.deepCopy - the code for copying a ByteBuffer is
>         ByteBuffer byteBufferValue = (ByteBuffer) value;
>         byte[] bytesCopy = new byte[byteBufferValue.capacity()];
>         byteBufferValue.rewind();
>         byteBufferValue.get(bytesCopy);
>         byteBufferValue.rewind();
>         return ByteBuffer.wrap(bytesCopy);
> I think this is problematic because it will cause an UnderFlow exception to be thrown if the ByteBuffer limit is less than the capacity of the byte buffer.
> My use case is as follows. I have ByteBuffer's backed by large arrays so I can avoid resizing the array every time I write data. So limit < capacity. When the data is written, or copied
> I think avro should respect this. When data is serialized, avro should automatically use the minimum number of bytes.
> When an object is copied, I think it makes sense to preserve the capacity of the underlying buffer as opposed to compacting it.
> So I think the code could be fixed by replacing get with 
> byteBufferValue.get(bytesCopy, 0 , byteBufferValue.limit());

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators: https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira