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

Jeremy Lewi commented on AVRO-1045:
-----------------------------------

I think the issue is less my use case then maintaining compatibility with 
existing code. In my patch, I decided to preserve the capacity on copy rather 
than compact because this seemed slightly less likely to break existing code.
The current implementation creates a new buffer of equal capacity, so in theory 
its not compacting the buffer. However, if the buffer isn't full, i.e. limit < 
capacity, then the current code causes an exception. So based on the current 
implementation, its unclear whether compacting or not compacting is the 
expected behavior.

With regards to my use case, compacting on copy is fine, so long as deep copy 
doesn't expect limit = capacity like it currently does. 
                
> 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

        

Reply via email to