Search in sources :

Example 1 with PageReplacementPolicy

use of herddb.core.PageReplacementPolicy in project herddb by diennea.

the class BlockRangeIndexStorageTest method testUnload.

@Test
public void testUnload() throws Exception {
    IndexDataStorage<Sized<Integer>, Sized<String>> storage = new IndexDataStorage<Sized<Integer>, Sized<String>>() {

        AtomicLong newPageId = new AtomicLong();

        private ConcurrentHashMap<Long, List<Map.Entry<Sized<Integer>, Sized<String>>>> pages = new ConcurrentHashMap<>();

        @Override
        public List<Map.Entry<Sized<Integer>, Sized<String>>> loadDataPage(long pageId) throws IOException {
            return pages.get(pageId);
        }

        @Override
        public long createDataPage(List<Map.Entry<Sized<Integer>, Sized<String>>> values) throws IOException {
            long newid = newPageId.incrementAndGet();
            pages.put(newid, values);
            return newid;
        }
    };
    PageReplacementPolicy policy = new RandomPageReplacementPolicy(10);
    BlockRangeIndex<Sized<Integer>, Sized<String>> index = new BlockRangeIndex<>(1024, policy, storage);
    for (int i = 0; i < 100; i++) {
        index.put(Sized.valueOf(i), Sized.valueOf("a"));
    }
    BlockRangeIndexMetadata<Sized<Integer>> metadata = index.checkpoint();
    assertEquals(index.getNumBlocks(), metadata.getBlocksMetadata().size());
    for (int i = 0; i < 100; i++) {
        assertEquals(Sized.valueOf("a"), index.search(Sized.valueOf(i)).get(0));
    }
    assertEquals(10, policy.size());
    index.clear();
    /* No pages should remain in memory after unload!! */
    assertEquals(0, policy.size());
}
Also used : Sized(herddb.utils.Sized) RandomPageReplacementPolicy(herddb.core.RandomPageReplacementPolicy) PageReplacementPolicy(herddb.core.PageReplacementPolicy) RandomPageReplacementPolicy(herddb.core.RandomPageReplacementPolicy) AtomicLong(java.util.concurrent.atomic.AtomicLong) List(java.util.List) ConcurrentHashMap(java.util.concurrent.ConcurrentHashMap) Map(java.util.Map) ConcurrentHashMap(java.util.concurrent.ConcurrentHashMap) Test(org.junit.Test)

Example 2 with PageReplacementPolicy

use of herddb.core.PageReplacementPolicy in project herddb by diennea.

the class BlockRangeIndexTest method testDeleteAndUnload.

/**
 * Verify that deleted entries stay deleted ever after a page unload
 *
 * @author diego.salvi
 */
@Test
public void testDeleteAndUnload() throws IOException {
    /* Must be 1 to keep just one page in memory keeping to unload on every page load */
    final PageReplacementPolicy policy = new RandomPageReplacementPolicy(1);
    final IndexDataStorage<Sized<Integer>, Sized<String>> storage = new MemoryIndexDataStorage<>();
    final BlockRangeIndex<Sized<Integer>, Sized<String>> index = new BlockRangeIndex<>(400, policy, storage);
    /* Add values until block split */
    int elements;
    for (elements = 0; index.getNumBlocks() < 2; elements++) {
        index.put(Sized.valueOf(elements), Sized.valueOf("test_" + elements));
    }
    /* NumBlocks must be greater than 1 to permit unloading */
    Assert.assertTrue(index.getNumBlocks() > 1);
    /* Check every value existance */
    for (int i = 0; i < elements; i++) {
        List<Sized<String>> result = index.search(Sized.valueOf(i));
        Assert.assertEquals(1, result.size());
    }
    /* Remove every value */
    for (int i = 0; i < elements; i++) {
        index.delete(Sized.valueOf(i), Sized.valueOf("test_" + i));
    }
    /* Check every value non existance */
    for (int i = 0; i < elements; i++) {
        List<Sized<String>> result = index.search(Sized.valueOf(i));
        Assert.assertEquals(0, result.size());
    }
    index.clear();
}
Also used : Sized(herddb.utils.Sized) RandomPageReplacementPolicy(herddb.core.RandomPageReplacementPolicy) PageReplacementPolicy(herddb.core.PageReplacementPolicy) RandomPageReplacementPolicy(herddb.core.RandomPageReplacementPolicy) Test(org.junit.Test)

Example 3 with PageReplacementPolicy

use of herddb.core.PageReplacementPolicy in project herddb by diennea.

the class BlockRangeIndexTest method testSplitAndDelete.

/**
 * Verify that BRIN blocks next field is managed when pointed block get deleted
 *
 * @author diego.salvi
 */
@Test
public void testSplitAndDelete() throws IOException {
    /* Must be 1 to keep just one page in memory keeping to unload on every page load */
    final PageReplacementPolicy policy = new RandomPageReplacementPolicy(1);
    final MemoryIndexDataStorage<Sized<Integer>, Sized<String>> storage = new MemoryIndexDataStorage<>();
    final BlockRangeIndex<Sized<Integer>, Sized<String>> index = new BlockRangeIndex<>(400, policy, storage);
    /* Add values until block split */
    int elements;
    for (elements = 0; index.getNumBlocks() < 2; elements++) {
        /* All entries have the same key to create contiguous blocks with same keys */
        index.put(Sized.valueOf(1), Sized.valueOf("test_" + elements));
    }
    /* NumBlocks must be greater than 1 (split done) */
    Assert.assertTrue(index.getNumBlocks() > 1);
    /* Check every value existance */
    {
        List<Sized<String>> result = index.search(Sized.valueOf(1));
        Assert.assertEquals(elements, result.size());
    }
    /* Remove every last value until last block is empty */
    for (int i = elements - 1; i > -1; i--) {
        index.delete(Sized.valueOf(1), Sized.valueOf("test_" + i));
        /* Check if last block got emptied */
        if (index.getBlocks().lastEntry().getValue().getSize() == 0) {
            elements = i;
            break;
        }
    }
    /* Now checkpoint to remove empty block */
    BlockRangeIndexMetadata<Sized<Integer>> metadata = index.checkpoint();
    /* Deletes unreferenced pages from memory store */
    storage.getPages().retainAll(metadata.getBlocksMetadata().stream().map(m -> m.pageId).collect(Collectors.toList()));
    /* Delete remaining values (next should have been handled to avoid errors) */
    for (int i = 0; i < elements; i++) {
        index.delete(Sized.valueOf(1), Sized.valueOf("test_" + i));
    }
    /* Check every value non existance */
    {
        List<Sized<String>> result = index.search(Sized.valueOf(1));
        Assert.assertEquals(0, result.size());
    }
    index.clear();
}
Also used : Sized(herddb.utils.Sized) List(java.util.List) RandomPageReplacementPolicy(herddb.core.RandomPageReplacementPolicy) PageReplacementPolicy(herddb.core.PageReplacementPolicy) RandomPageReplacementPolicy(herddb.core.RandomPageReplacementPolicy) Test(org.junit.Test)

Example 4 with PageReplacementPolicy

use of herddb.core.PageReplacementPolicy in project herddb by diennea.

the class BLinkTest method testUnload.

@Test
public void testUnload() throws Exception {
    final int pages = 5;
    final int inserts = 100;
    BLinkIndexDataStorage<Sized<Long>, Long> storage = new DummyBLinkIndexDataStorage<>();
    PageReplacementPolicy policy = new RandomPageReplacementPolicy(pages);
    try (BLink<Sized<Long>, Long> blink = new BLink<>(2048L, new LongSizeEvaluator(), policy, storage)) {
        for (long l = 0; l < inserts; l++) {
            blink.insert(Sized.valueOf(l), l);
        }
        /* Must fill the polocy */
        assertEquals(pages, policy.size());
        assertEquals(inserts, blink.size());
        blink.close();
        /* No pages should remain in memory after unload!! */
        assertEquals(0, policy.size());
        assertEquals(0, blink.size());
    }
}
Also used : Sized(herddb.utils.Sized) AtomicLong(java.util.concurrent.atomic.AtomicLong) RandomPageReplacementPolicy(herddb.core.RandomPageReplacementPolicy) PageReplacementPolicy(herddb.core.PageReplacementPolicy) RandomPageReplacementPolicy(herddb.core.RandomPageReplacementPolicy) Test(org.junit.Test)

Aggregations

PageReplacementPolicy (herddb.core.PageReplacementPolicy)4 RandomPageReplacementPolicy (herddb.core.RandomPageReplacementPolicy)4 Sized (herddb.utils.Sized)4 Test (org.junit.Test)4 List (java.util.List)2 AtomicLong (java.util.concurrent.atomic.AtomicLong)2 Map (java.util.Map)1 ConcurrentHashMap (java.util.concurrent.ConcurrentHashMap)1