private PinningOffHeapChainMap<Long> getPinningOffHeapChainMap() { return new PinningOffHeapChainMap<>(new UnlimitedPageSource(new OffHeapBufferSource()), LongPortability.INSTANCE, 4096, 4096, false); }
@Override public ServerStore newStore() { return new OffHeapServerStore(new UnlimitedPageSource(new OffHeapBufferSource()), DEFAULT_MAPPER, false); }
private OffHeapChainMap<String> getChainMapWithExtendedStorageEngine() { PageSource chainSource = new UnlimitedPageSource(new OffHeapBufferSource()); PageSource extendedSource = new UnlimitedPageSource(new OffHeapBufferSource()); Factory<? extends ChainStorageEngine<String>> factory = ExtendedOffHeapChainStorageEngine.createFactory(chainSource, StringPortability.INSTANCE, 4096, 4096, false, false, extendedSource); return new OffHeapChainMap<>(chainSource, factory); }
@Test public void testRemoveMissingKey() { OffHeapChainMap<String> map = new OffHeapChainMap<>(new UnlimitedPageSource(new OffHeapBufferSource()), StringPortability.INSTANCE, minPageSize, maxPageSize, steal); map.remove("foo"); assertThat(map.get("foo").isEmpty(), is(true)); }
@Test public void testInitiallyEmptyChain() { OffHeapChainMap<String> map = new OffHeapChainMap<>(new UnlimitedPageSource(new OffHeapBufferSource()), StringPortability.INSTANCE, minPageSize, maxPageSize, steal); assertThat(map.get("foo"), emptyIterable()); }
@Test public void testActiveChainsThreadSafety() throws ExecutionException, InterruptedException { UnlimitedPageSource source = new UnlimitedPageSource(new OffHeapBufferSource()); OffHeapChainStorageEngine<String> chainStorage = new OffHeapChainStorageEngine<>(source, StringPortability.INSTANCE, minPageSize, maxPageSize, steal, steal); ReadWriteLockedOffHeapClockCache<String, InternalChain> heads = new EvictionListeningReadWriteLockedOffHeapClockCache<>(callable -> {}, source, chainStorage); OffHeapChainMap<String> map = new OffHeapChainMap<>(heads, chainStorage); map.put("key", chain(buffer(1), buffer(2))); int nThreads = 10; ExecutorService executorService = Executors.newFixedThreadPool(nThreads); List<Future<Chain>> futures = new ArrayList<>(); for (int i = 0; i < nThreads ; i++) { futures.add(executorService.submit(() -> map.get("key"))); } for (Future<Chain> f : futures) { f.get(); } assertThat(chainStorage.getActiveChains().size(), is(0)); }
@Test public void testReplaceEmptyChainAtHeadOnEmptyChainFails() { OffHeapChainMap<String> map = new OffHeapChainMap<>(new UnlimitedPageSource(new OffHeapBufferSource()), StringPortability.INSTANCE, minPageSize, maxPageSize, steal); try { map.replaceAtHead("foo", chain(), chain(buffer(1))); fail("Expected IllegalArgumentException"); } catch (IllegalArgumentException e) { //expected } }
@Test public void testAppendToEmptyChain() { OffHeapChainMap<String> map = new OffHeapChainMap<>(new UnlimitedPageSource(new OffHeapBufferSource()), StringPortability.INSTANCE, minPageSize, maxPageSize, steal); map.append("foo", buffer(1)); assertThat(map.get("foo"), contains(element(1))); }
@Test public void testReplaceEmptyChainAtHeadOnNonEmptyChain() { OffHeapChainMap<String> map = new OffHeapChainMap<>(new UnlimitedPageSource(new OffHeapBufferSource()), StringPortability.INSTANCE, minPageSize, maxPageSize, steal); map.append("foo", buffer(1)); try { map.replaceAtHead("foo", chain(), chain(buffer(2))); fail("Expected IllegalArgumentException"); } catch (IllegalArgumentException e) { //expected } }
@Test public void testGetAndAppendToEmptyChain() { OffHeapChainMap<String> map = new OffHeapChainMap<>(new UnlimitedPageSource(new OffHeapBufferSource()), StringPortability.INSTANCE, minPageSize, maxPageSize, steal); assertThat(map.getAndAppend("foo", buffer(1)), emptyIterable()); assertThat(map.get("foo"), contains(element(1))); }
@Test public void testPutWhenKeyIsNull() { OffHeapChainMap<String> map = new OffHeapChainMap<>(new UnlimitedPageSource(new OffHeapBufferSource()), StringPortability.INSTANCE, minPageSize, maxPageSize, steal); map.put("key", chain(buffer(1), buffer(2))); assertThat(map.get("key"), contains(element(1), element(2))); }
@Test public void testAppendToSingletonChain() { OffHeapChainMap<String> map = new OffHeapChainMap<>(new UnlimitedPageSource(new OffHeapBufferSource()), StringPortability.INSTANCE, minPageSize, maxPageSize, steal); map.append("foo", buffer(1)); map.append("foo", buffer(2)); assertThat(map.get("foo"), contains(element(1), element(2))); }
private OffHeapChainMap<String> getNewMap(ExtendedOffHeapChainStorageEngine<String> ese) { PageSource chainSource = new UnlimitedPageSource(new OffHeapBufferSource()); Factory<? extends ChainStorageEngine<String>> factory = OffHeapChainStorageEngine.createFactory(chainSource, StringPortability.INSTANCE, 4096, 4096, false, false); OffHeapChainStorageEngine<String> storageEngine = (OffHeapChainStorageEngine<String>) factory.newInstance(); ReadWriteLockedOffHeapClockCache<String, InternalChain> newMap = new ReadWriteLockedOffHeapClockCache<>(chainSource, storageEngine); ese.replayIntoMap(newMap); return new OffHeapChainMap<>(newMap, storageEngine); }
@Test public void testRemoveDoubleChain() { OffHeapChainMap<String> map = new OffHeapChainMap<>(new UnlimitedPageSource(new OffHeapBufferSource()), StringPortability.INSTANCE, minPageSize, maxPageSize, steal); map.append("foo", buffer(1)); map.append("foo", buffer(2)); assertThat(map.get("foo"), contains(element(1), element(2))); map.remove("foo"); assertThat(map.get("foo").isEmpty(), is(true)); }
@Test public void testPutDoesNotLeakWhenMappingIsNotNull() { UnlimitedPageSource source = new UnlimitedPageSource(new OffHeapBufferSource()); OffHeapChainStorageEngine<String> chainStorage = new OffHeapChainStorageEngine<>(source, StringPortability.INSTANCE, minPageSize, maxPageSize, steal, steal); ReadWriteLockedOffHeapClockCache<String, InternalChain> heads = new EvictionListeningReadWriteLockedOffHeapClockCache<>(callable -> {}, source, chainStorage); OffHeapChainMap<String> map = new OffHeapChainMap<>(heads, chainStorage); map.put("key", chain(buffer(1))); map.put("key", chain(buffer(2))); assertThat(chainStorage.getActiveChains().size(), is(0)); }
@Test public void testMismatchingReplaceSingletonChainAtHeadOnSingletonChain() { OffHeapChainMap<String> map = new OffHeapChainMap<>(new UnlimitedPageSource(new OffHeapBufferSource()), StringPortability.INSTANCE, minPageSize, maxPageSize, steal); map.append("foo", buffer(1)); map.replaceAtHead("foo", chain(buffer(2)), chain(buffer(42))); assertThat(map.get("foo"), contains(element(1))); }
@Test public void testPutWhenKeyIsNotNull() { OffHeapChainMap<String> map = new OffHeapChainMap<>(new UnlimitedPageSource(new OffHeapBufferSource()), StringPortability.INSTANCE, minPageSize, maxPageSize, steal); map.append("key", buffer(3)); map.put("key", chain(buffer(1), buffer(2))); assertThat(map.get("key"), contains(element(1), element(2))); }
@Test public void testReplaceSingletonChainAtHeadOnSingletonChain() { OffHeapChainMap<String> map = new OffHeapChainMap<>(new UnlimitedPageSource(new OffHeapBufferSource()), StringPortability.INSTANCE, minPageSize, maxPageSize, steal); map.append("foo", buffer(1)); map.replaceAtHead("foo", chain(buffer(1)), chain(buffer(42))); assertThat(map.get("foo"), contains(element(42))); }
@Test public void testReplaceFullPluralChainAtHeadWithEmpty() { OffHeapChainMap<String> map = new OffHeapChainMap<>(new UnlimitedPageSource(new OffHeapBufferSource()), StringPortability.INSTANCE, minPageSize, maxPageSize, steal); map.append("foo", buffer(1)); map.append("foo", buffer(2)); map.append("foo", buffer(3)); assertThat(map.getDataOccupiedMemory(), greaterThan(0L)); map.replaceAtHead("foo", chain(buffer(1), buffer(2), buffer(3)), chain()); assertThat(map.getDataOccupiedMemory(), is(0L)); assertThat(map.get("foo"), emptyIterable()); }
@Test public void testSequenceBasedChainComparison() { OffHeapChainMap<String> map = new OffHeapChainMap<>(new UnlimitedPageSource(new OffHeapBufferSource()), StringPortability.INSTANCE, minPageSize, maxPageSize, steal); map.append("foo", buffer(1)); map.append("foo", buffer(2)); map.append("foo", buffer(3)); map.replaceAtHead("foo", map.get("foo"), chain()); assertThat(map.get("foo"), emptyIterable()); }