[ 
https://issues.apache.org/jira/browse/DIRECTMEMORY-49?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Benoit Perroud updated DIRECTMEMORY-49:
---------------------------------------

    Description: 
MemoryManagerService.update actually free and store again the payload, which 
leads to another pointer allocation. This is fine in lots of case, but when the 
buffer is full, we still want the update to succeed.

Moreover, update should throw an exception (BufferOverFlowException for 
example) when the new payload data is bigger than the previous.

Considering the following test, where I allocate just enough space for 1 
object, I store it, and then want to update it content. I could hope this use 
case succeed, but it's actually not the case

{code}
@Test
public void testOffHeapMemoryBufferUpdate() {
                
        final int NUMBER_OF_OBJECTS = 1;
        final int BUFFER_SIZE = NUMBER_OF_OBJECTS * 4; // allocate 4 bytes
        
        final OffHeapMemoryBuffer offHeapMemoryBuffer = 
OffHeapMemoryBufferImpl.createNew(BUFFER_SIZE);

        // generate 4 random bytes, store, read back and assert
        final byte[] payload = generateRandomPayload(4);
        final Pointer pointer = offHeapMemoryBuffer.store(payload);
        Assert.assertNotNull(pointer);
        Assert.assertEquals(new String(payload), new 
String(offHeapMemoryBuffer.retrieve(pointer)));
        
        // generate another payload, update it, read it and assert.
        byte[] otherPayload = generateRandomPayload(4);
        final Pointer otherPointer = offHeapMemoryBuffer.update(pointer, 
otherPayload);
        Assert.assertNotNull(otherPointer);
        Assert.assertEquals(new String(otherPayload), new 
String(offHeapMemoryBuffer.retrieve(otherPointer)));
}
{code}

  was:
OffHeapMemoryBuffer.update actually free and store again the payload, which 
leads to another pointer allocation. This is fine in lots of case, but when the 
buffer is full, we still want the update to succeed.

Moreover, update should throw an exception (BufferOverFlowException for 
example) when the new payload data is bigger than the previous.

Considering the following test, where I allocate just enough space for 1 
object, I store it, and then want to update it content. I could hope this use 
case succeed, but it's actually not the case

{code}
@Test
public void testOffHeapMemoryBufferUpdate() {
                
        final int NUMBER_OF_OBJECTS = 1;
        final int BUFFER_SIZE = NUMBER_OF_OBJECTS * 4; // allocate 4 bytes
        
        final OffHeapMemoryBuffer offHeapMemoryBuffer = 
OffHeapMemoryBufferImpl.createNew(BUFFER_SIZE);

        // generate 4 random bytes, store, read back and assert
        final byte[] payload = generateRandomPayload(4);
        final Pointer pointer = offHeapMemoryBuffer.store(payload);
        Assert.assertNotNull(pointer);
        Assert.assertEquals(new String(payload), new 
String(offHeapMemoryBuffer.retrieve(pointer)));
        
        // generate another payload, update it, read it and assert.
        byte[] otherPayload = generateRandomPayload(4);
        final Pointer otherPointer = offHeapMemoryBuffer.update(pointer, 
otherPayload);
        Assert.assertNotNull(otherPointer);
        Assert.assertEquals(new String(otherPayload), new 
String(offHeapMemoryBuffer.retrieve(otherPointer)));
}
{code}

        Summary: MemoryManagerService.update does not reuse the same pointer  
(was: OffHeapMemoryBuffer.update does not reuse the same pointer)
    
> MemoryManagerService.update does not reuse the same pointer
> -----------------------------------------------------------
>
>                 Key: DIRECTMEMORY-49
>                 URL: https://issues.apache.org/jira/browse/DIRECTMEMORY-49
>             Project: Apache DirectMemory
>          Issue Type: Bug
>            Reporter: Benoit Perroud
>            Priority: Minor
>
> MemoryManagerService.update actually free and store again the payload, which 
> leads to another pointer allocation. This is fine in lots of case, but when 
> the buffer is full, we still want the update to succeed.
> Moreover, update should throw an exception (BufferOverFlowException for 
> example) when the new payload data is bigger than the previous.
> Considering the following test, where I allocate just enough space for 1 
> object, I store it, and then want to update it content. I could hope this use 
> case succeed, but it's actually not the case
> {code}
> @Test
> public void testOffHeapMemoryBufferUpdate() {
>               
>       final int NUMBER_OF_OBJECTS = 1;
>       final int BUFFER_SIZE = NUMBER_OF_OBJECTS * 4; // allocate 4 bytes
>       
>       final OffHeapMemoryBuffer offHeapMemoryBuffer = 
> OffHeapMemoryBufferImpl.createNew(BUFFER_SIZE);
>         // generate 4 random bytes, store, read back and assert
>       final byte[] payload = generateRandomPayload(4);
>       final Pointer pointer = offHeapMemoryBuffer.store(payload);
>       Assert.assertNotNull(pointer);
>       Assert.assertEquals(new String(payload), new 
> String(offHeapMemoryBuffer.retrieve(pointer)));
>       
>         // generate another payload, update it, read it and assert.
>       byte[] otherPayload = generateRandomPayload(4);
>       final Pointer otherPointer = offHeapMemoryBuffer.update(pointer, 
> otherPayload);
>       Assert.assertNotNull(otherPointer);
>       Assert.assertEquals(new String(otherPayload), new 
> String(offHeapMemoryBuffer.retrieve(otherPointer)));
> }
> {code}

--
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