@Test public void testByteArrayAllocation() { GemFireCacheImpl gfc = createCache(); try { MemoryAllocator ma = gfc.getOffHeapStore(); assertNotNull(ma); final long offHeapSize = ma.getFreeMemory(); assertEquals(0, ma.getUsedMemory()); byte[] data = new byte[] {1, 2, 3, 4, 5, 6, 7, 8}; MemoryChunk mc1 = (MemoryChunk) ma.allocateAndInitialize(data, false, false, null); assertEquals(data.length + perObjectOverhead(), ma.getUsedMemory()); assertEquals(offHeapSize - (data.length + perObjectOverhead()), ma.getFreeMemory()); byte[] data2 = new byte[data.length]; mc1.readBytes(0, data2); assertTrue(Arrays.equals(data, data2)); mc1.release(); assertEquals(offHeapSize, ma.getFreeMemory()); assertEquals(0, ma.getUsedMemory()); // try some small byte[] that don't need to be stored off heap. data = new byte[] {1, 2, 3, 4, 5, 6, 7}; StoredObject so1 = ma.allocateAndInitialize(data, false, false, null); assertEquals(0, ma.getUsedMemory()); assertEquals(offHeapSize, ma.getFreeMemory()); data2 = new byte[data.length]; data2 = (byte[]) so1.getDeserializedForReading(); assertTrue(Arrays.equals(data, data2)); } finally { closeCache(gfc, false); } }
@Test public void testSizeAllocation() { // prevent cache from closing in reaction to ooom System.setProperty(OffHeapStorage.STAY_CONNECTED_ON_OUTOFOFFHEAPMEMORY_PROPERTY, "true"); GemFireCacheImpl gfc = createCache(); try { MemoryAllocator ma = gfc.getOffHeapStore(); assertNotNull(ma); final long offHeapSize = ma.getFreeMemory(); assertEquals(0, ma.getUsedMemory()); MemoryChunk mc1 = ma.allocate(64, null); assertEquals(64 + perObjectOverhead(), ma.getUsedMemory()); assertEquals(offHeapSize - (64 + perObjectOverhead()), ma.getFreeMemory()); mc1.release(); assertEquals(offHeapSize, ma.getFreeMemory()); assertEquals(0, ma.getUsedMemory()); // do an allocation larger than the slab size // TODO: currently the compact will product slabs bigger than the max slab size // (see the todo comment on compact() in SimpleMemoryAllocator). // So we request 20m here since that it the total size. try { ma.allocate(1024 * 1024 * 20, null); fail("Expected an out of heap exception"); } catch (OutOfOffHeapMemoryException expected) { } assertEquals(0, ma.getUsedMemory()); assertFalse(gfc.isClosed()); } finally { System.clearProperty(OffHeapStorage.STAY_CONNECTED_ON_OUTOFOFFHEAPMEMORY_PROPERTY); closeCache(gfc, false); } }
public void keep_testOutOfOffHeapMemoryErrorClosesCache() { // this test is redundant but may be useful final GemFireCacheImpl gfc = createCache(); try { MemoryAllocator ma = gfc.getOffHeapStore(); assertNotNull(ma); final long offHeapSize = ma.getFreeMemory(); assertEquals(0, ma.getUsedMemory()); MemoryChunk mc1 = ma.allocate(64, null); assertEquals(64 + perObjectOverhead(), ma.getUsedMemory()); assertEquals(offHeapSize - (64 + perObjectOverhead()), ma.getFreeMemory()); mc1.release(); assertEquals(offHeapSize, ma.getFreeMemory()); assertEquals(0, ma.getUsedMemory()); // do an allocation larger than the slab size try { ma.allocate(1024 * 1024 * 10, null); fail("Expected an out of heap exception"); } catch (OutOfOffHeapMemoryException expected) { // passed } assertEquals(0, ma.getUsedMemory()); final WaitCriterion waitForDisconnect = new WaitCriterion() { public boolean done() { return gfc.isClosed(); } public String description() { return "Waiting for disconnect to complete"; } }; dunit.DistributedTestCase.waitForCriterion(waitForDisconnect, 10 * 1000, 100, true); assertTrue(gfc.isClosed()); } finally { closeCache(gfc, false); } }