/** * Test a bunch of random allocations */ @Test public void testLABRandomAllocation() { Random rand = new Random(); MemStoreLAB mslab = new MemStoreLAB(); int expectedOff = 0; byte[] lastBuffer = null; // 100K iterations by 0-1K alloc -> 50MB expected // should be reasonable for unit test and also cover wraparound // behavior for (int i = 0; i < 100000; i++) { int size = rand.nextInt(1000); Allocation alloc = mslab.allocateBytes(size); if (alloc.getData() != lastBuffer) { expectedOff = 0; lastBuffer = alloc.getData(); } assertEquals(expectedOff, alloc.getOffset()); assertTrue("Allocation " + alloc + " overruns buffer", alloc.getOffset() + size <= alloc.getData().length); expectedOff += size; } }
@Test public void testLABLargeAllocation() { MemStoreLAB mslab = new MemStoreLAB(); Allocation alloc = mslab.allocateBytes(2*1024*1024); assertNull("2MB allocation shouldn't be satisfied by LAB.", alloc); }
@Test public void testReusingChunks() { Random rand = new Random(); MemStoreLAB mslab = new MemStoreLAB(conf, chunkPool); int expectedOff = 0; byte[] lastBuffer = null; // Randomly allocate some bytes for (int i = 0; i < 100; i++) { int size = rand.nextInt(1000); Allocation alloc = mslab.allocateBytes(size); if (alloc.getData() != lastBuffer) { expectedOff = 0; lastBuffer = alloc.getData(); } assertEquals(expectedOff, alloc.getOffset()); assertTrue("Allocation " + alloc + " overruns buffer", alloc.getOffset() + size <= alloc.getData().length); expectedOff += size; } // chunks will be put back to pool after close mslab.close(); int chunkCount = chunkPool.getPoolSize(); assertTrue(chunkCount > 0); // reconstruct mslab mslab = new MemStoreLAB(conf, chunkPool); // chunk should be got from the pool, so we can reuse it. mslab.allocateBytes(1000); assertEquals(chunkCount - 1, chunkPool.getPoolSize()); }
public AllocRecord(Allocation alloc, int size) { super(); this.alloc = alloc; this.size = size; }