Repository: ignite Updated Branches: refs/heads/ignite-3477-master baa3835ee -> ff5b3e168
http://git-wip-us.apache.org/repos/asf/ignite/blob/ff5b3e16/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/tree/io/DataPageIO.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/tree/io/DataPageIO.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/tree/io/DataPageIO.java index 190349a..9546890 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/tree/io/DataPageIO.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/tree/io/DataPageIO.java @@ -18,9 +18,11 @@ package org.apache.ignite.internal.processors.cache.database.tree.io; import java.nio.ByteBuffer; +import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.HashSet; +import java.util.List; import org.apache.ignite.IgniteCheckedException; import org.apache.ignite.internal.pagemem.PageIdUtils; import org.apache.ignite.internal.pagemem.PageMemory; @@ -254,6 +256,29 @@ public class DataPageIO extends PageIO { /** * @param pageAddr Page address. + * @param c Closure. + * @param <T> Closure return type. + * @return Collection of closure results for all items in page. + * @throws IgniteCheckedException In case of error in closure body. + */ + public <T> List<T> forAllItems(long pageAddr, CC<T> c) throws IgniteCheckedException { + long pageId = getPageId(pageAddr); + + int cnt = getDirectCount(pageAddr); + + List<T> res = new ArrayList<>(cnt); + + for (int i = 0; i < cnt; i++) { + long link = PageIdUtils.link(pageId, i); + + res.add(c.apply(link)); + } + + return res; + } + + /** + * @param pageAddr Page address. * @param cnt Indirect count. */ private void setIndirectCount(long pageAddr, int cnt) { @@ -1007,7 +1032,8 @@ public class DataPageIO extends PageIO { final int keySize = row.key().valueBytesLength(null); final int valSize = row.value().valueBytesLength(null); - int written = writeFragment(row, buf, rowOff, payloadSize, EntryPart.KEY, keySize, valSize); + int written = writeFragment(row, buf, rowOff, payloadSize, EntryPart.CACHE_ID, keySize, valSize); + written += writeFragment(row, buf, rowOff + written, payloadSize - written, EntryPart.KEY, keySize, valSize); written += writeFragment(row, buf, rowOff + written, payloadSize - written, EntryPart.EXPIRE_TIME, keySize, valSize); written += writeFragment(row, buf, rowOff + written, payloadSize - written, EntryPart.VALUE, keySize, valSize); written += writeFragment(row, buf, rowOff + written, payloadSize - written, EntryPart.VERSION, keySize, valSize); @@ -1039,28 +1065,36 @@ public class DataPageIO extends PageIO { final int prevLen; final int curLen; + int cacheIdSize = row.cacheId() == 0 ? 0 : 4; + switch (type) { - case KEY: + case CACHE_ID: prevLen = 0; - curLen = keySize; + curLen = cacheIdSize; + + break; + + case KEY: + prevLen = cacheIdSize; + curLen = cacheIdSize + keySize; break; case EXPIRE_TIME: - prevLen = keySize; - curLen = keySize + 8; + prevLen = cacheIdSize + keySize; + curLen = cacheIdSize + keySize + 8; break; case VALUE: - prevLen = keySize + 8; - curLen = keySize + valSize + 8; + prevLen = cacheIdSize + keySize + 8; + curLen = cacheIdSize + keySize + valSize + 8; break; case VERSION: - prevLen = keySize + valSize + 8; - curLen = keySize + valSize + CacheVersionIO.size(row.version(), false) + 8; + prevLen = cacheIdSize + keySize + valSize + 8; + curLen = cacheIdSize + keySize + valSize + CacheVersionIO.size(row.version(), false) + 8; break; @@ -1075,6 +1109,8 @@ public class DataPageIO extends PageIO { if (type == EntryPart.EXPIRE_TIME) writeExpireTimeFragment(buf, row.expireTime(), rowOff, len, prevLen); + else if (type == EntryPart.CACHE_ID) + writeCacheIdFragment(buf, row.cacheId(), rowOff, len, prevLen); else if (type != EntryPart.VERSION) { // Write key or value. final CacheObject co = type == EntryPart.KEY ? row.key() : row.value(); @@ -1139,6 +1175,32 @@ public class DataPageIO extends PageIO { } /** + * @param buf Buffer. + * @param cacheId Cache ID. + * @param rowOff Row offset. + * @param len Length. + * @param prevLen Prev length. + */ + private void writeCacheIdFragment(ByteBuffer buf, int cacheId, int rowOff, int len, int prevLen) { + if (cacheId == 0) + return; + + int size = 4; + + if (size <= len) + buf.putInt(cacheId); + else { + ByteBuffer cacheIdBuf = ByteBuffer.allocate(size); + + cacheIdBuf.order(buf.order()); + + cacheIdBuf.putInt(cacheId); + + buf.put(cacheIdBuf.array(), rowOff - prevLen, len); + } + } + + /** * */ private enum EntryPart { @@ -1152,7 +1214,10 @@ public class DataPageIO extends PageIO { VERSION, /** */ - EXPIRE_TIME + EXPIRE_TIME, + + /** */ + CACHE_ID } /** @@ -1326,14 +1391,21 @@ public class DataPageIO extends PageIO { ) throws IgniteCheckedException { long addr = pageAddr + dataOff; + int cacheIdSize = row.cacheId() != 0 ? 4 : 0; + if (newRow) { PageUtils.putShort(addr, 0, (short)payloadSize); addr += 2; + if (cacheIdSize != 0) + PageUtils.putInt(addr, 0, row.cacheId()); + + addr += cacheIdSize; + addr += row.key().putValue(addr); } else - addr += (2 + row.key().valueBytesLength(null)); + addr += (2 + cacheIdSize + row.key().valueBytesLength(null)); addr += row.value().putValue(addr); @@ -1358,4 +1430,20 @@ public class DataPageIO extends PageIO { PageUtils.putBytes(pageAddr, dataOff, payload); } + + /** + * Defines closure interface for applying computations to data page items. + * + * @param <T> Closure return type. + */ + public interface CC<T> { + /** + * Closure body. + * + * @param link Link to item. + * @return Closure return value. + * @throws IgniteCheckedException In case of error in closure body. + */ + public T apply(long link) throws IgniteCheckedException; + } } http://git-wip-us.apache.org/repos/asf/ignite/blob/ff5b3e16/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridDhtAtomicCache.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridDhtAtomicCache.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridDhtAtomicCache.java index d652767..5a8dfa0 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridDhtAtomicCache.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridDhtAtomicCache.java @@ -1795,6 +1795,8 @@ public class GridDhtAtomicCache<K, V> extends GridDhtCacheAdapter<K, V> { // Do not check topology version if topology was locked on near node by // external transaction or explicit lock. if (req.topologyLocked() || !needRemap(req.topologyVersion(), top.topologyVersion())) { + ctx.shared().database().ensureFreeSpace(ctx.memoryPolicy()); + locked = lockEntries(req, req.topologyVersion()); boolean hasNear = ctx.discovery().cacheNearNode(node, name()); http://git-wip-us.apache.org/repos/asf/ignite/blob/ff5b3e16/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearTxLocal.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearTxLocal.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearTxLocal.java index c257154..64f6187 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearTxLocal.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearTxLocal.java @@ -2673,6 +2673,8 @@ public class GridNearTxLocal extends GridDhtTxLocalAdapter implements AutoClosea GridCacheEntryEx entry = cacheCtx.cache().entryEx(key, topVer); try { + cacheCtx.shared().database().ensureFreeSpace(cacheCtx.memoryPolicy()); + EntryGetResult verVal = entry.versionedValue(cacheVal, ver, null, http://git-wip-us.apache.org/repos/asf/ignite/blob/ff5b3e16/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearTxRemote.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearTxRemote.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearTxRemote.java index 767ce84..e5cd469 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearTxRemote.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearTxRemote.java @@ -334,7 +334,7 @@ public class GridNearTxRemote extends GridDistributedTxRemoteAdapter { CacheObject val = cached.peek(null); - if (val == null && cached.evictInternal(xidVer, null)) { + if (val == null && cached.evictInternal(xidVer, null, false)) { evicted.add(entry.txKey()); return false; @@ -395,7 +395,7 @@ public class GridNearTxRemote extends GridDistributedTxRemoteAdapter { CacheObject peek = cached.peek(null); - if (peek == null && cached.evictInternal(xidVer, null)) { + if (peek == null && cached.evictInternal(xidVer, null, false)) { cached.context().cache().removeIfObsolete(key.key()); evicted.add(key); http://git-wip-us.apache.org/repos/asf/ignite/blob/ff5b3e16/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/local/atomic/GridLocalAtomicCache.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/local/atomic/GridLocalAtomicCache.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/local/atomic/GridLocalAtomicCache.java index da92692..b8c0e36 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/local/atomic/GridLocalAtomicCache.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/local/atomic/GridLocalAtomicCache.java @@ -791,6 +791,8 @@ public class GridLocalAtomicCache<K, V> extends GridLocalCache<K, V> { CacheEntryPredicate[] filters = CU.filterArray(filter); + ctx.shared().database().ensureFreeSpace(ctx.memoryPolicy()); + if (writeThrough && keys.size() > 1) { return updateWithBatch(op, keys, @@ -995,8 +997,8 @@ public class GridLocalAtomicCache<K, V> extends GridLocalCache<K, V> { null, null, /*read-through*/true, - /**update-metrics*/true, - /**event*/true, + /*update-metrics*/true, + /*event*/true, subjId, entryProcessor, taskName, http://git-wip-us.apache.org/repos/asf/ignite/blob/ff5b3e16/modules/core/src/main/java/org/apache/ignite/internal/processors/cacheobject/IgniteCacheObjectProcessor.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cacheobject/IgniteCacheObjectProcessor.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cacheobject/IgniteCacheObjectProcessor.java index 4ec89e1..9beb296 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cacheobject/IgniteCacheObjectProcessor.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cacheobject/IgniteCacheObjectProcessor.java @@ -180,13 +180,6 @@ public interface IgniteCacheObjectProcessor extends GridProcessor { public CacheObject toCacheObject(CacheObjectContext ctx, ByteBuffer buf); /** - * @param ctx Cache context. - * @param buf Buffer to read from. - * @return Cache object. - */ - public KeyCacheObject toKeyCacheObject(CacheObjectContext ctx, ByteBuffer buf) throws IgniteCheckedException; - - /** * @param ctx Cache object context. * @param buf Buffer. * @param incompleteObj Incomplete cache object or {@code null} if it's a first read. http://git-wip-us.apache.org/repos/asf/ignite/blob/ff5b3e16/modules/core/src/main/java/org/apache/ignite/internal/processors/cacheobject/IgniteCacheObjectProcessorImpl.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cacheobject/IgniteCacheObjectProcessorImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cacheobject/IgniteCacheObjectProcessorImpl.java index 4726d86..a8595fb 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cacheobject/IgniteCacheObjectProcessorImpl.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cacheobject/IgniteCacheObjectProcessorImpl.java @@ -188,22 +188,6 @@ public class IgniteCacheObjectProcessorImpl extends GridProcessorAdapter impleme } /** {@inheritDoc} */ - @Override public KeyCacheObject toKeyCacheObject(CacheObjectContext ctx, ByteBuffer buf) throws IgniteCheckedException { - int len = buf.getInt(); - - if (len == 0) - return null; - - byte type = buf.get(); - - byte[] data = new byte[len]; - - buf.get(data); - - return toKeyCacheObject(ctx, type, data); - } - - /** {@inheritDoc} */ @Override public IncompleteCacheObject toCacheObject( final CacheObjectContext ctx, final ByteBuffer buf, http://git-wip-us.apache.org/repos/asf/ignite/blob/ff5b3e16/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheTestEntryEx.java ---------------------------------------------------------------------- diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheTestEntryEx.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheTestEntryEx.java index 46dec44..adbd6f1 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheTestEntryEx.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheTestEntryEx.java @@ -369,7 +369,7 @@ public class GridCacheTestEntryEx extends GridMetadataAwareAdapter implements Gr /** @inheritDoc */ @Override public boolean evictInternal(GridCacheVersion obsoleteVer, - @Nullable CacheEntryPredicate[] filter) { + @Nullable CacheEntryPredicate[] filter, boolean evictOffheap) { assert false; return false; http://git-wip-us.apache.org/repos/asf/ignite/blob/ff5b3e16/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridCacheDhtEntrySelfTest.java ---------------------------------------------------------------------- diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridCacheDhtEntrySelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridCacheDhtEntrySelfTest.java index bc7fffe..58c3841 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridCacheDhtEntrySelfTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridCacheDhtEntrySelfTest.java @@ -280,7 +280,7 @@ public class GridCacheDhtEntrySelfTest extends GridCommonAbstractTest { assert e0.readers().contains(other.id()); assert e1 == null || e1.readers().isEmpty(); - assert !e0.evictInternal(dht0.context().versions().next(), null); + assert !e0.evictInternal(dht0.context().versions().next(), null, false); assertEquals(1, near0.localSize(CachePeekMode.ALL)); assertEquals(1, dht0.localSize(null)); @@ -288,7 +288,7 @@ public class GridCacheDhtEntrySelfTest extends GridCommonAbstractTest { assertEquals(1, near1.localSize(CachePeekMode.ALL)); assertEquals(0, dht1.localSize(null)); - assert !e0.evictInternal(dht0.context().versions().next(), null); + assert !e0.evictInternal(dht0.context().versions().next(), null, false); assertEquals(1, near0.localSize(CachePeekMode.ALL)); assertEquals(1, dht0.localSize(null)); http://git-wip-us.apache.org/repos/asf/ignite/blob/ff5b3e16/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/eviction/paged/PageEvictionAbstractTest.java ---------------------------------------------------------------------- diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/eviction/paged/PageEvictionAbstractTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/eviction/paged/PageEvictionAbstractTest.java new file mode 100644 index 0000000..bf05146 --- /dev/null +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/eviction/paged/PageEvictionAbstractTest.java @@ -0,0 +1,124 @@ +/* +* Licensed to the Apache Software Foundation (ASF) under one or more +* contributor license agreements. See the NOTICE file distributed with +* this work for additional information regarding copyright ownership. +* The ASF licenses this file to You under the Apache License, Version 2.0 +* (the "License"); you may not use this file except in compliance with +* the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ +package org.apache.ignite.internal.processors.cache.eviction.paged; + +import org.apache.ignite.cache.CacheAtomicityMode; +import org.apache.ignite.cache.CacheMode; +import org.apache.ignite.cache.CacheWriteSynchronizationMode; +import org.apache.ignite.cache.affinity.rendezvous.RendezvousAffinityFunction; +import org.apache.ignite.configuration.CacheConfiguration; +import org.apache.ignite.configuration.DataPageEvictionMode; +import org.apache.ignite.configuration.IgniteConfiguration; +import org.apache.ignite.configuration.MemoryConfiguration; +import org.apache.ignite.configuration.MemoryPolicyConfiguration; +import org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi; +import org.apache.ignite.spi.discovery.tcp.ipfinder.TcpDiscoveryIpFinder; +import org.apache.ignite.spi.discovery.tcp.ipfinder.vm.TcpDiscoveryVmIpFinder; +import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest; + +/** + * + */ +public class PageEvictionAbstractTest extends GridCommonAbstractTest { + /** */ + protected static final TcpDiscoveryIpFinder IP_FINDER = new TcpDiscoveryVmIpFinder(true); + + /** Offheap size for memory policy. */ + private static final int SIZE = 256 * 1024 * 1024; + + /** Page size. */ + static final int PAGE_SIZE = 2048; + + /** Number of entries. */ + static final int ENTRIES = 400_000; + + /** Empty pages pool size. */ + private static final int EMPTY_PAGES_POOL_SIZE = 100; + + /** Eviction threshold. */ + private static final double EVICTION_THRESHOLD = 0.9; + + /** Default policy name. */ + private static final String DEFAULT_POLICY_NAME = "dfltPlc"; + + /** + * @param mode Eviction mode. + * @param configuration Configuration. + * @return Configuration with given eviction mode set. + */ + static IgniteConfiguration setEvictionMode(DataPageEvictionMode mode, IgniteConfiguration configuration) { + MemoryPolicyConfiguration[] policies = configuration.getMemoryConfiguration().getMemoryPolicies(); + + for (MemoryPolicyConfiguration plcCfg : policies) + plcCfg.setPageEvictionMode(mode); + + return configuration; + } + + /** {@inheritDoc} */ + @Override protected IgniteConfiguration getConfiguration(String gridName) throws Exception { + IgniteConfiguration cfg = super.getConfiguration(gridName); + + ((TcpDiscoverySpi)cfg.getDiscoverySpi()).setIpFinder(IP_FINDER); + + MemoryConfiguration dbCfg = new MemoryConfiguration(); + + MemoryPolicyConfiguration plc = new MemoryPolicyConfiguration(); + + plc.setSize(SIZE); + plc.setEmptyPagesPoolSize(EMPTY_PAGES_POOL_SIZE); + plc.setEvictionThreshold(EVICTION_THRESHOLD); + plc.setName(DEFAULT_POLICY_NAME); + + dbCfg.setMemoryPolicies(plc); + dbCfg.setPageSize(PAGE_SIZE); + dbCfg.setDefaultMemoryPolicyName(DEFAULT_POLICY_NAME); + + cfg.setMemoryConfiguration(dbCfg); + + return cfg; + } + + /** + * @param name Name. + * @param cacheMode Cache mode. + * @param atomicityMode Atomicity mode. + * @param writeSynchronizationMode Write synchronization mode. + * @param memoryPlcName Memory policy name. + * @return Cache configuration. + */ + protected static CacheConfiguration<Object, Object> cacheConfig( + String name, + String memoryPlcName, + CacheMode cacheMode, + CacheAtomicityMode atomicityMode, + CacheWriteSynchronizationMode writeSynchronizationMode + ) { + CacheConfiguration<Object, Object> cacheConfiguration = new CacheConfiguration<>() + .setName(name) + .setAffinity(new RendezvousAffinityFunction(false, 32)) + .setCacheMode(cacheMode) + .setAtomicityMode(atomicityMode) + .setMemoryPolicyName(memoryPlcName) + .setWriteSynchronizationMode(writeSynchronizationMode); + + if (cacheMode == CacheMode.PARTITIONED) + cacheConfiguration.setBackups(1); + + return cacheConfiguration; + } +} http://git-wip-us.apache.org/repos/asf/ignite/blob/ff5b3e16/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/eviction/paged/PageEvictionMultinodeTest.java ---------------------------------------------------------------------- diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/eviction/paged/PageEvictionMultinodeTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/eviction/paged/PageEvictionMultinodeTest.java new file mode 100644 index 0000000..2302de1 --- /dev/null +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/eviction/paged/PageEvictionMultinodeTest.java @@ -0,0 +1,110 @@ +/* +* Licensed to the Apache Software Foundation (ASF) under one or more +* contributor license agreements. See the NOTICE file distributed with +* this work for additional information regarding copyright ownership. +* The ASF licenses this file to You under the Apache License, Version 2.0 +* (the "License"); you may not use this file except in compliance with +* the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ +package org.apache.ignite.internal.processors.cache.eviction.paged; + +import java.util.concurrent.ThreadLocalRandom; +import org.apache.ignite.IgniteCache; +import org.apache.ignite.cache.CacheAtomicityMode; +import org.apache.ignite.cache.CacheMode; +import org.apache.ignite.cache.CachePeekMode; +import org.apache.ignite.cache.CacheWriteSynchronizationMode; +import org.apache.ignite.configuration.CacheConfiguration; + +/** + * + */ +public abstract class PageEvictionMultinodeTest extends PageEvictionAbstractTest { + /** Cache modes. */ + private static final CacheMode[] CACHE_MODES = {CacheMode.PARTITIONED, CacheMode.REPLICATED}; + + /** Atomicity modes. */ + private static final CacheAtomicityMode[] ATOMICITY_MODES = { + CacheAtomicityMode.ATOMIC, CacheAtomicityMode.TRANSACTIONAL}; + + /** Write modes. */ + private static final CacheWriteSynchronizationMode[] WRITE_MODES = {CacheWriteSynchronizationMode.PRIMARY_SYNC, + CacheWriteSynchronizationMode.FULL_SYNC, CacheWriteSynchronizationMode.FULL_ASYNC}; + + /** {@inheritDoc} */ + @Override protected void beforeTestsStarted() throws Exception { + startGridsMultiThreaded(4, false); + } + + /** {@inheritDoc} */ + @Override protected void afterTestsStopped() throws Exception { + stopAllGrids(); + } + + /** {@inheritDoc} */ + @Override protected long getTestTimeout() { + return 10 * 60 * 1000; + } + + /** + * @throws Exception If failed. + */ + public void testPageEviction() throws Exception { + for (int i = 0; i < CACHE_MODES.length; i++) { + for (int j = 0; j < ATOMICITY_MODES.length; j++) { + for (int k = 0; k < WRITE_MODES.length; k++) { + if (i + j + Math.min(k, 1) <= 1) { + CacheConfiguration<Object, Object> cfg = cacheConfig( + "evict" + i + j + k, null, CACHE_MODES[i], ATOMICITY_MODES[j], WRITE_MODES[k]); + + createCacheAndTestEvcition(cfg); + } + } + } + } + } + + /** + * @param cfg Config. + * @throws Exception If failed. + */ + private void createCacheAndTestEvcition(CacheConfiguration<Object, Object> cfg) throws Exception { + IgniteCache<Object, Object> cache = ignite(0).getOrCreateCache(cfg); + + for (int i = 1; i <= ENTRIES; i++) { + ThreadLocalRandom r = ThreadLocalRandom.current(); + + if (r.nextInt() % 5 == 0) + cache.put(i, new TestObject(PAGE_SIZE / 4 - 50 + r.nextInt(5000))); // Fragmented object. + else + cache.put(i, new TestObject(r.nextInt(PAGE_SIZE / 4 - 50))); // Fits in one page. + + if (r.nextInt() % 7 == 0) + cache.get(r.nextInt(i)); // Touch. + else if (r.nextInt() % 11 == 0) + cache.remove(r.nextInt(i)); // Remove. + else if (r.nextInt() % 13 == 0) + cache.put(r.nextInt(i), new TestObject(r.nextInt(PAGE_SIZE / 2))); // Update. + + if (i % (ENTRIES / 10) == 0) + System.out.println(">>> Entries put: " + i); + } + + int resultingSize = cache.size(CachePeekMode.PRIMARY); + + System.out.println(">>> Resulting size: " + resultingSize); + + // More than half of entries evicted, no OutOfMemory occurred, success. + assertTrue(resultingSize < ENTRIES / 2); + + ignite(0).destroyCache(cfg.getName()); + } +} http://git-wip-us.apache.org/repos/asf/ignite/blob/ff5b3e16/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/eviction/paged/PageEvictionReadThroughTest.java ---------------------------------------------------------------------- diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/eviction/paged/PageEvictionReadThroughTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/eviction/paged/PageEvictionReadThroughTest.java new file mode 100644 index 0000000..c8cd7c9 --- /dev/null +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/eviction/paged/PageEvictionReadThroughTest.java @@ -0,0 +1,140 @@ +/* +* Licensed to the Apache Software Foundation (ASF) under one or more +* contributor license agreements. See the NOTICE file distributed with +* this work for additional information regarding copyright ownership. +* The ASF licenses this file to You under the Apache License, Version 2.0 +* (the "License"); you may not use this file except in compliance with +* the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ +package org.apache.ignite.internal.processors.cache.eviction.paged; + +import java.util.concurrent.ThreadLocalRandom; +import javax.cache.Cache; +import javax.cache.configuration.Factory; +import javax.cache.integration.CacheLoaderException; +import org.apache.ignite.IgniteCache; +import org.apache.ignite.cache.CacheAtomicityMode; +import org.apache.ignite.cache.CacheMode; +import org.apache.ignite.cache.CachePeekMode; +import org.apache.ignite.cache.CacheWriteSynchronizationMode; +import org.apache.ignite.cache.store.CacheStoreAdapter; +import org.apache.ignite.configuration.CacheConfiguration; +import org.apache.ignite.configuration.DataPageEvictionMode; +import org.apache.ignite.configuration.IgniteConfiguration; + +/** + * + */ +public class PageEvictionReadThroughTest extends PageEvictionAbstractTest { + /** {@inheritDoc} */ + @Override protected IgniteConfiguration getConfiguration(String gridName) throws Exception { + return setEvictionMode(DataPageEvictionMode.RANDOM_LRU, super.getConfiguration(gridName)); + } + + /** + * @throws Exception If failed. + */ + public void testEvictionWithReadThroughAtomicReplicated() throws Exception { + testEvictionWithReadThrough(CacheAtomicityMode.ATOMIC, CacheMode.REPLICATED); + } + + /** + * @throws Exception If failed. + */ + public void testEvictionWithReadThroughAtomicLocal() throws Exception { + testEvictionWithReadThrough(CacheAtomicityMode.ATOMIC, CacheMode.LOCAL); + } + + /** + * @throws Exception If failed. + */ + public void testEvictionWithReadThroughTxReplicated() throws Exception { + testEvictionWithReadThrough(CacheAtomicityMode.TRANSACTIONAL, CacheMode.REPLICATED); + } + + /** + * @throws Exception If failed. + */ + public void testEvictionWithReadThroughTxLocal() throws Exception { + testEvictionWithReadThrough(CacheAtomicityMode.TRANSACTIONAL, CacheMode.LOCAL); + } + + /** + * @param atomicityMode Atomicity mode. + * @param cacheMode Cache mode. + * @throws Exception If failed. + */ + private void testEvictionWithReadThrough(CacheAtomicityMode atomicityMode, CacheMode cacheMode) throws Exception { + startGridsMultiThreaded(4); + + CacheConfiguration<Object, Object> cfg = cacheConfig("evict-rebalance", null, cacheMode, atomicityMode, + CacheWriteSynchronizationMode.PRIMARY_SYNC); + cfg.setReadThrough(true); + cfg.setCacheStoreFactory(new TestStoreFactory()); + + IgniteCache<Object, Object> cache = ignite(0).getOrCreateCache(cfg); + + for (int i = 1; i <= ENTRIES; i++) { + cache.get(i); + + if (i % (ENTRIES / 10) == 0) + System.out.println(">>> Entries: " + i); + } + + int size = cache.size(CachePeekMode.PRIMARY); + + System.out.println(">>> Resulting size: " + size); + + assertTrue(size > 0); + + assertTrue(size < ENTRIES); + } + + /** {@inheritDoc} */ + @Override protected void afterTest() throws Exception { + stopAllGrids(); + } + + /** + * + */ + private static class TestStoreFactory implements Factory<TestCacheStore> { + /** {@inheritDoc} */ + @Override public TestCacheStore create() { + return new TestCacheStore(); + } + } + + /** + * + */ + private static class TestCacheStore extends CacheStoreAdapter<Object, Object> { + /** {@inheritDoc} */ + @Override public Object load(Object key) throws CacheLoaderException { + ThreadLocalRandom r = ThreadLocalRandom.current(); + + if (r.nextInt() % 5 == 0) + return new TestObject(PAGE_SIZE / 4 - 50 + r.nextInt(5000)); // Fragmented object. + else + return new TestObject(r.nextInt(PAGE_SIZE / 4 - 50)); // Fits in one page. + } + + /** {@inheritDoc} */ + @Override public void write(Cache.Entry<?, ?> entry) { + throw new UnsupportedOperationException(); + } + + /** {@inheritDoc} */ + @Override public void delete(Object key) { + // No-op. + } + } +} http://git-wip-us.apache.org/repos/asf/ignite/blob/ff5b3e16/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/eviction/paged/PageEvictionTouchOrderTest.java ---------------------------------------------------------------------- diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/eviction/paged/PageEvictionTouchOrderTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/eviction/paged/PageEvictionTouchOrderTest.java new file mode 100644 index 0000000..4335649 --- /dev/null +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/eviction/paged/PageEvictionTouchOrderTest.java @@ -0,0 +1,109 @@ +/* +* Licensed to the Apache Software Foundation (ASF) under one or more +* contributor license agreements. See the NOTICE file distributed with +* this work for additional information regarding copyright ownership. +* The ASF licenses this file to You under the Apache License, Version 2.0 +* (the "License"); you may not use this file except in compliance with +* the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ +package org.apache.ignite.internal.processors.cache.eviction.paged; + +import org.apache.ignite.IgniteCache; +import org.apache.ignite.cache.CacheAtomicityMode; +import org.apache.ignite.cache.CacheMode; +import org.apache.ignite.cache.CacheWriteSynchronizationMode; +import org.apache.ignite.configuration.CacheConfiguration; +import org.apache.ignite.configuration.DataPageEvictionMode; +import org.apache.ignite.configuration.IgniteConfiguration; + +/** + * + */ +public class PageEvictionTouchOrderTest extends PageEvictionAbstractTest { + /** Test entries number. */ + private static final int SAFE_ENTRIES = 1000; + + /** {@inheritDoc} */ + @Override protected IgniteConfiguration getConfiguration(String gridName) throws Exception { + return setEvictionMode(/* Overriden by FairFifoPageEvictionTracker */DataPageEvictionMode.RANDOM_LRU, + super.getConfiguration(gridName)); + } + + /** {@inheritDoc} */ + @Override protected void beforeTest() throws Exception { + System.setProperty("override.fair.fifo.page.eviction.tracker", "true"); + } + + /** + * @throws Exception If failed. + */ + public void testTouchOrderWithFairFifoEvictionAtomicReplicated() throws Exception { + testTouchOrderWithFairFifoEviction(CacheAtomicityMode.ATOMIC, CacheMode.REPLICATED); + } + + /** + * @throws Exception If failed. + */ + public void testTouchOrderWithFairFifoEvictionAtomicLocal() throws Exception { + testTouchOrderWithFairFifoEviction(CacheAtomicityMode.ATOMIC, CacheMode.LOCAL); + } + + /** + * @throws Exception If failed. + */ + public void testTouchOrderWithFairFifoEvictionTxReplicated() throws Exception { + testTouchOrderWithFairFifoEviction(CacheAtomicityMode.TRANSACTIONAL, CacheMode.REPLICATED); + } + + /** + * @throws Exception If failed. + */ + public void testTouchOrderWithFairFifoEvictionTxLocal() throws Exception { + testTouchOrderWithFairFifoEviction(CacheAtomicityMode.TRANSACTIONAL, CacheMode.LOCAL); + } + + /** + * @param atomicityMode Atomicity mode. + * @param cacheMode Cache mode. + * @throws Exception If failed. + */ + private void testTouchOrderWithFairFifoEviction(CacheAtomicityMode atomicityMode, CacheMode cacheMode) + throws Exception { + startGrid(0); + + CacheConfiguration<Object, Object> cfg = cacheConfig("evict-fair", null, cacheMode, atomicityMode, + CacheWriteSynchronizationMode.PRIMARY_SYNC); + + IgniteCache<Object, Object> cache = ignite(0).getOrCreateCache(cfg); + + for (int i = 1; i <= ENTRIES; i++) { + cache.put(i, new TestObject(PAGE_SIZE / 6)); + // Row size is between PAGE_SIZE / 2 and PAGE_SIZE. Enforces "one row - one page". + + if (i % (ENTRIES / 10) == 0) + System.out.println(">>> Entries put: " + i); + } + + for (int i = ENTRIES - SAFE_ENTRIES + 1; i <= ENTRIES; i++) + assertNotNull(cache.get(i)); + + for (int i = 1; i <= SAFE_ENTRIES; i++) + assertNull(cache.get(i)); + } + + /** {@inheritDoc} */ + @Override protected void afterTest() throws Exception { + stopAllGrids(); + + System.setProperty("override.fair.fifo.page.eviction.tracker", "false"); + } + +} http://git-wip-us.apache.org/repos/asf/ignite/blob/ff5b3e16/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/eviction/paged/PageEvictionWithRebalanceTest.java ---------------------------------------------------------------------- diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/eviction/paged/PageEvictionWithRebalanceTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/eviction/paged/PageEvictionWithRebalanceTest.java new file mode 100644 index 0000000..fd80201 --- /dev/null +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/eviction/paged/PageEvictionWithRebalanceTest.java @@ -0,0 +1,81 @@ +/* +* Licensed to the Apache Software Foundation (ASF) under one or more +* contributor license agreements. See the NOTICE file distributed with +* this work for additional information regarding copyright ownership. +* The ASF licenses this file to You under the Apache License, Version 2.0 +* (the "License"); you may not use this file except in compliance with +* the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ +package org.apache.ignite.internal.processors.cache.eviction.paged; + +import java.util.concurrent.ThreadLocalRandom; +import org.apache.ignite.IgniteCache; +import org.apache.ignite.cache.CacheAtomicityMode; +import org.apache.ignite.cache.CacheMode; +import org.apache.ignite.cache.CachePeekMode; +import org.apache.ignite.cache.CacheWriteSynchronizationMode; +import org.apache.ignite.configuration.CacheConfiguration; + +/** + * + */ +public abstract class PageEvictionWithRebalanceTest extends PageEvictionAbstractTest { + /** + * @throws Exception If failed. + */ + public void testEvictionWithRebalance() throws Exception { + startGridsMultiThreaded(4); + + CacheConfiguration<Object, Object> cfg = cacheConfig("evict-rebalance", null, CacheMode.PARTITIONED, + CacheAtomicityMode.ATOMIC, CacheWriteSynchronizationMode.PRIMARY_SYNC); + + IgniteCache<Object, Object> cache = ignite(0).getOrCreateCache(cfg); + + for (int i = 1; i <= ENTRIES; i++) { + ThreadLocalRandom r = ThreadLocalRandom.current(); + + if (r.nextInt() % 5 == 0) + cache.put(i, new TestObject(PAGE_SIZE / 4 - 50 + r.nextInt(5000))); // Fragmented object. + else + cache.put(i, new TestObject(r.nextInt(PAGE_SIZE / 4 - 50))); // Fits in one page. + + if (i % (ENTRIES / 10) == 0) + System.out.println(">>> Entries put: " + i); + } + + int size = cache.size(CachePeekMode.PRIMARY); + + System.out.println(">>> Resulting size: " + size); + + assertTrue(size < ENTRIES); + + for (int i = 3; i >= 1; i--) { + stopGrid(i); + + cache.rebalance().get(); + + awaitPartitionMapExchange(); + + int rebalanceSize = cache.size(CachePeekMode.PRIMARY); + + System.out.println(">>> Size after rebalance: " + rebalanceSize); + + assertTrue(rebalanceSize < size); + + size = rebalanceSize; + } + } + + /** {@inheritDoc} */ + @Override protected void afterTest() throws Exception { + stopAllGrids(); + } +} http://git-wip-us.apache.org/repos/asf/ignite/blob/ff5b3e16/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/eviction/paged/Random2LruPageEvictionMultinodeTest.java ---------------------------------------------------------------------- diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/eviction/paged/Random2LruPageEvictionMultinodeTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/eviction/paged/Random2LruPageEvictionMultinodeTest.java new file mode 100644 index 0000000..b05ec43 --- /dev/null +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/eviction/paged/Random2LruPageEvictionMultinodeTest.java @@ -0,0 +1,30 @@ +/* +* Licensed to the Apache Software Foundation (ASF) under one or more +* contributor license agreements. See the NOTICE file distributed with +* this work for additional information regarding copyright ownership. +* The ASF licenses this file to You under the Apache License, Version 2.0 +* (the "License"); you may not use this file except in compliance with +* the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ +package org.apache.ignite.internal.processors.cache.eviction.paged; + +import org.apache.ignite.configuration.DataPageEvictionMode; +import org.apache.ignite.configuration.IgniteConfiguration; + +/** + * + */ +public class Random2LruPageEvictionMultinodeTest extends PageEvictionMultinodeTest { + /** {@inheritDoc} */ + @Override protected IgniteConfiguration getConfiguration(String gridName) throws Exception { + return setEvictionMode(DataPageEvictionMode.RANDOM_2_LRU, super.getConfiguration(gridName)); + } +} http://git-wip-us.apache.org/repos/asf/ignite/blob/ff5b3e16/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/eviction/paged/Random2LruPageEvictionWithRebalanceTest.java ---------------------------------------------------------------------- diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/eviction/paged/Random2LruPageEvictionWithRebalanceTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/eviction/paged/Random2LruPageEvictionWithRebalanceTest.java new file mode 100644 index 0000000..56698fb --- /dev/null +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/eviction/paged/Random2LruPageEvictionWithRebalanceTest.java @@ -0,0 +1,30 @@ +/* +* Licensed to the Apache Software Foundation (ASF) under one or more +* contributor license agreements. See the NOTICE file distributed with +* this work for additional information regarding copyright ownership. +* The ASF licenses this file to You under the Apache License, Version 2.0 +* (the "License"); you may not use this file except in compliance with +* the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ +package org.apache.ignite.internal.processors.cache.eviction.paged; + +import org.apache.ignite.configuration.DataPageEvictionMode; +import org.apache.ignite.configuration.IgniteConfiguration; + +/** + * + */ +public class Random2LruPageEvictionWithRebalanceTest extends PageEvictionWithRebalanceTest { + /** {@inheritDoc} */ + @Override protected IgniteConfiguration getConfiguration(String gridName) throws Exception { + return setEvictionMode(DataPageEvictionMode.RANDOM_2_LRU, super.getConfiguration(gridName)); + } +} http://git-wip-us.apache.org/repos/asf/ignite/blob/ff5b3e16/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/eviction/paged/RandomLruPageEvictionMultinodeTest.java ---------------------------------------------------------------------- diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/eviction/paged/RandomLruPageEvictionMultinodeTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/eviction/paged/RandomLruPageEvictionMultinodeTest.java new file mode 100644 index 0000000..38ca2af --- /dev/null +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/eviction/paged/RandomLruPageEvictionMultinodeTest.java @@ -0,0 +1,30 @@ +/* +* Licensed to the Apache Software Foundation (ASF) under one or more +* contributor license agreements. See the NOTICE file distributed with +* this work for additional information regarding copyright ownership. +* The ASF licenses this file to You under the Apache License, Version 2.0 +* (the "License"); you may not use this file except in compliance with +* the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ +package org.apache.ignite.internal.processors.cache.eviction.paged; + +import org.apache.ignite.configuration.DataPageEvictionMode; +import org.apache.ignite.configuration.IgniteConfiguration; + +/** + * + */ +public class RandomLruPageEvictionMultinodeTest extends PageEvictionMultinodeTest { + /** {@inheritDoc} */ + @Override protected IgniteConfiguration getConfiguration(String gridName) throws Exception { + return setEvictionMode(DataPageEvictionMode.RANDOM_LRU, super.getConfiguration(gridName)); + } +} http://git-wip-us.apache.org/repos/asf/ignite/blob/ff5b3e16/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/eviction/paged/RandomLruPageEvictionWithRebalanceTest.java ---------------------------------------------------------------------- diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/eviction/paged/RandomLruPageEvictionWithRebalanceTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/eviction/paged/RandomLruPageEvictionWithRebalanceTest.java new file mode 100644 index 0000000..d961360 --- /dev/null +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/eviction/paged/RandomLruPageEvictionWithRebalanceTest.java @@ -0,0 +1,30 @@ +/* +* Licensed to the Apache Software Foundation (ASF) under one or more +* contributor license agreements. See the NOTICE file distributed with +* this work for additional information regarding copyright ownership. +* The ASF licenses this file to You under the Apache License, Version 2.0 +* (the "License"); you may not use this file except in compliance with +* the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ +package org.apache.ignite.internal.processors.cache.eviction.paged; + +import org.apache.ignite.configuration.DataPageEvictionMode; +import org.apache.ignite.configuration.IgniteConfiguration; + +/** + * + */ +public class RandomLruPageEvictionWithRebalanceTest extends PageEvictionWithRebalanceTest { + /** {@inheritDoc} */ + @Override protected IgniteConfiguration getConfiguration(String gridName) throws Exception { + return setEvictionMode(DataPageEvictionMode.RANDOM_LRU, super.getConfiguration(gridName)); + } +} http://git-wip-us.apache.org/repos/asf/ignite/blob/ff5b3e16/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/eviction/paged/TestObject.java ---------------------------------------------------------------------- diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/eviction/paged/TestObject.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/eviction/paged/TestObject.java new file mode 100644 index 0000000..baf2414 --- /dev/null +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/eviction/paged/TestObject.java @@ -0,0 +1,78 @@ +/* +* Licensed to the Apache Software Foundation (ASF) under one or more +* contributor license agreements. See the NOTICE file distributed with +* this work for additional information regarding copyright ownership. +* The ASF licenses this file to You under the Apache License, Version 2.0 +* (the "License"); you may not use this file except in compliance with +* the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ +package org.apache.ignite.internal.processors.cache.eviction.paged; + +import java.util.Arrays; +import java.util.concurrent.ThreadLocalRandom; + +/** + * + */ +class TestObject { + /** */ + private int b; + + /** */ + private String c; + + /** */ + private int[] arr; + + /** + * @param intArrSize Int array size. + */ + public TestObject(int intArrSize) { + this.b = intArrSize; + + this.c = String.valueOf(2 * intArrSize); + + arr = new int[intArrSize]; + + for (int i = 0; i < intArrSize; i++) + arr[i] = ThreadLocalRandom.current().nextInt(); + } + + /** {@inheritDoc} */ + @Override public boolean equals(Object o) { + if (this == o) + return true; + + if (o == null || getClass() != o.getClass()) + return false; + + TestObject testObj = (TestObject)o; + + if (b != testObj.b) + return false; + + if (c != null ? !c.equals(testObj.c) : testObj.c != null) + return false; + + return Arrays.equals(arr, testObj.arr); + } + + /** {@inheritDoc} */ + @Override public int hashCode() { + int res = b; + + res = 31 * res + (c != null ? c.hashCode() : 0); + + res = 31 * res + Arrays.hashCode(arr); + + return res; + } +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/ignite/blob/ff5b3e16/modules/core/src/test/java/org/apache/ignite/internal/processors/database/FreeListImplSelfTest.java ---------------------------------------------------------------------- diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/database/FreeListImplSelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/database/FreeListImplSelfTest.java index 7fccef1..d5011a8 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/processors/database/FreeListImplSelfTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/database/FreeListImplSelfTest.java @@ -39,6 +39,8 @@ import org.apache.ignite.internal.processors.cache.CacheObjectContext; import org.apache.ignite.internal.processors.cache.KeyCacheObject; import org.apache.ignite.internal.processors.cache.database.CacheDataRow; import org.apache.ignite.internal.processors.cache.database.MemoryMetricsImpl; +import org.apache.ignite.internal.processors.cache.database.MemoryPolicy; +import org.apache.ignite.internal.processors.cache.database.evict.NoOpPageEvictionTracker; import org.apache.ignite.internal.processors.cache.database.freelist.FreeList; import org.apache.ignite.internal.processors.cache.database.freelist.FreeListImpl; import org.apache.ignite.internal.processors.cache.version.GridCacheVersion; @@ -334,7 +336,11 @@ public class FreeListImplSelfTest extends GridCommonAbstractTest { long metaPageId = pageMem.allocatePage(1, 1, PageIdAllocator.FLAG_DATA); - return new FreeListImpl(1, "freelist", pageMem, new MemoryMetricsImpl(null), null, null, metaPageId, true); + MemoryMetricsImpl metrics = new MemoryMetricsImpl(null); + + MemoryPolicy memPlc = new MemoryPolicy(pageMem, null, metrics, new NoOpPageEvictionTracker()); + + return new FreeListImpl(1, "freelist", metrics, memPlc, null, null, metaPageId, true); } /** @@ -407,6 +413,11 @@ public class FreeListImplSelfTest extends GridCommonAbstractTest { @Override public int hash() { throw new UnsupportedOperationException(); } + + /** {@inheritDoc} */ + @Override public int cacheId() { + return 0; + } } /** http://git-wip-us.apache.org/repos/asf/ignite/blob/ff5b3e16/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheEvictionSelfTestSuite.java ---------------------------------------------------------------------- diff --git a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheEvictionSelfTestSuite.java b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheEvictionSelfTestSuite.java index 94e1447..1bdfdd1 100644 --- a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheEvictionSelfTestSuite.java +++ b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheEvictionSelfTestSuite.java @@ -33,6 +33,12 @@ import org.apache.ignite.internal.processors.cache.eviction.fifo.FifoEvictionPol import org.apache.ignite.internal.processors.cache.eviction.lru.LruEvictionPolicySelfTest; import org.apache.ignite.internal.processors.cache.eviction.lru.LruNearEvictionPolicySelfTest; import org.apache.ignite.internal.processors.cache.eviction.lru.LruNearOnlyNearEvictionPolicySelfTest; +import org.apache.ignite.internal.processors.cache.eviction.paged.PageEvictionReadThroughTest; +import org.apache.ignite.internal.processors.cache.eviction.paged.PageEvictionTouchOrderTest; +import org.apache.ignite.internal.processors.cache.eviction.paged.Random2LruPageEvictionMultinodeTest; +import org.apache.ignite.internal.processors.cache.eviction.paged.Random2LruPageEvictionWithRebalanceTest; +import org.apache.ignite.internal.processors.cache.eviction.paged.RandomLruPageEvictionMultinodeTest; +import org.apache.ignite.internal.processors.cache.eviction.paged.RandomLruPageEvictionWithRebalanceTest; import org.apache.ignite.internal.processors.cache.eviction.sorted.SortedEvictionPolicySelfTest; /** @@ -63,6 +69,13 @@ public class IgniteCacheEvictionSelfTestSuite extends TestSuite { suite.addTest(new TestSuite(GridCacheEmptyEntriesLocalSelfTest.class)); suite.addTest(new TestSuite(GridCacheEvictableEntryEqualsSelfTest.class)); + suite.addTest(new TestSuite(RandomLruPageEvictionMultinodeTest.class)); + suite.addTest(new TestSuite(Random2LruPageEvictionMultinodeTest.class)); + suite.addTest(new TestSuite(RandomLruPageEvictionWithRebalanceTest.class)); + suite.addTest(new TestSuite(Random2LruPageEvictionWithRebalanceTest.class)); + suite.addTest(new TestSuite(PageEvictionTouchOrderTest.class)); + suite.addTest(new TestSuite(PageEvictionReadThroughTest.class)); + return suite; } } http://git-wip-us.apache.org/repos/asf/ignite/blob/ff5b3e16/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2Row.java ---------------------------------------------------------------------- diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2Row.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2Row.java index ce10cdb..042e163 100644 --- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2Row.java +++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2Row.java @@ -174,4 +174,9 @@ public abstract class GridH2Row extends Row implements GridSearchRowPointer, Cac @Override public int hash() { throw new UnsupportedOperationException(); } + + /** {@inheritDoc} */ + @Override public int cacheId() { + return 0; + } } \ No newline at end of file
