Repository: ignite Updated Branches: refs/heads/master 76ad0a4d1 -> 525680c74
IGNITE-10448: MVCC: Fixed NPE on data page eviction. This closes #5704. Project: http://git-wip-us.apache.org/repos/asf/ignite/repo Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/525680c7 Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/525680c7 Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/525680c7 Branch: refs/heads/master Commit: 525680c748e9479b02cecbdca1e2ac5d582105ad Parents: 76ad0a4 Author: rkondakov <kondako...@mail.ru> Authored: Mon Dec 24 18:42:18 2018 +0300 Committer: Igor Seliverstov <gvvinbl...@gmail.com> Committed: Mon Dec 24 18:42:18 2018 +0300 ---------------------------------------------------------------------- .../processors/cache/GridCacheProcessor.java | 14 +++++++ .../PageEvictionMultinodeAbstractTest.java | 4 +- .../CacheMvccConfigurationValidationTest.java | 39 ++++++++++++++++++++ 3 files changed, 55 insertions(+), 2 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ignite/blob/525680c7/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheProcessor.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheProcessor.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheProcessor.java index 6ab5cfe..b919024 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheProcessor.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheProcessor.java @@ -55,6 +55,7 @@ import org.apache.ignite.cache.store.CacheStore; import org.apache.ignite.cache.store.CacheStoreSessionListener; import org.apache.ignite.cluster.ClusterNode; import org.apache.ignite.configuration.CacheConfiguration; +import org.apache.ignite.configuration.DataPageEvictionMode; import org.apache.ignite.configuration.DataStorageConfiguration; import org.apache.ignite.configuration.DeploymentMode; import org.apache.ignite.configuration.FileSystemConfiguration; @@ -539,6 +540,19 @@ public class GridCacheProcessor extends GridProcessorAdapter { assertParameter(cc.getInterceptor() == null, "interceptor cannot be used with TRANSACTIONAL_SNAPSHOT atomicity mode"); + + // Disable in-memory evictions for mvcc cache. TODO IGNITE-10738 + String memPlcName = cc.getDataRegionName(); + DataRegion dataRegion = sharedCtx.database().dataRegion(memPlcName); + + if (dataRegion != null && !dataRegion.config().isPersistenceEnabled() && + dataRegion.config().getPageEvictionMode() != DataPageEvictionMode.DISABLED) { + throw new IgniteCheckedException("Data pages evictions cannot be used with TRANSACTIONAL_SNAPSHOT " + + "cache atomicity mode for in-memory regions. Please, either disable evictions or enable " + + "persistence for data regions with TRANSACTIONAL_SNAPSHOT caches. [cacheName=" + cc.getName() + + ", dataRegionName=" + memPlcName + ", pageEvictionMode=" + + dataRegion.config().getPageEvictionMode() + ']'); + } } if (cc.isWriteBehindEnabled()) { http://git-wip-us.apache.org/repos/asf/ignite/blob/525680c7/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/eviction/paged/PageEvictionMultinodeAbstractTest.java ---------------------------------------------------------------------- diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/eviction/paged/PageEvictionMultinodeAbstractTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/eviction/paged/PageEvictionMultinodeAbstractTest.java index 49b54dd..52bb29d 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/eviction/paged/PageEvictionMultinodeAbstractTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/eviction/paged/PageEvictionMultinodeAbstractTest.java @@ -25,6 +25,7 @@ import org.apache.ignite.cache.CachePeekMode; import org.apache.ignite.cache.CacheWriteSynchronizationMode; import org.apache.ignite.configuration.CacheConfiguration; import org.apache.ignite.configuration.IgniteConfiguration; +import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.JUnit4; @@ -96,10 +97,9 @@ public abstract class PageEvictionMultinodeAbstractTest extends PageEvictionAbst /** * @throws Exception If failed. */ + @Ignore("https://issues.apache.org/jira/browse/IGNITE-10738") @Test public void testPageEvictionMvcc() throws Exception { - fail("https://issues.apache.org/jira/browse/IGNITE-10448"); - for (int i = 0; i < CACHE_MODES.length; i++) { CacheConfiguration<Object, Object> cfg = cacheConfig( "evict" + i, null, CACHE_MODES[i], CacheAtomicityMode.TRANSACTIONAL_SNAPSHOT, http://git-wip-us.apache.org/repos/asf/ignite/blob/525680c7/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/mvcc/CacheMvccConfigurationValidationTest.java ---------------------------------------------------------------------- diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/mvcc/CacheMvccConfigurationValidationTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/mvcc/CacheMvccConfigurationValidationTest.java index b809b25..92ec812 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/mvcc/CacheMvccConfigurationValidationTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/mvcc/CacheMvccConfigurationValidationTest.java @@ -36,6 +36,7 @@ import org.apache.ignite.configuration.DataRegionConfiguration; import org.apache.ignite.configuration.DataStorageConfiguration; import org.apache.ignite.configuration.IgniteConfiguration; import org.apache.ignite.configuration.NearCacheConfiguration; +import org.apache.ignite.internal.util.typedef.X; import org.apache.ignite.lang.IgniteBiTuple; import org.apache.ignite.testframework.GridTestUtils; import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest; @@ -48,6 +49,8 @@ import static org.apache.ignite.cache.CacheAtomicityMode.ATOMIC; import static org.apache.ignite.cache.CacheAtomicityMode.TRANSACTIONAL; import static org.apache.ignite.cache.CacheAtomicityMode.TRANSACTIONAL_SNAPSHOT; import static org.apache.ignite.cache.CacheMode.LOCAL; +import static org.apache.ignite.configuration.DataPageEvictionMode.RANDOM_2_LRU; +import static org.apache.ignite.configuration.DataPageEvictionMode.RANDOM_LRU; /** * @@ -200,6 +203,7 @@ public class CacheMvccConfigurationValidationTest extends GridCommonAbstractTest DataStorageConfiguration storageCfg = new DataStorageConfiguration(); DataRegionConfiguration regionCfg = new DataRegionConfiguration(); regionCfg.setPersistenceEnabled(true); + regionCfg.setPageEvictionMode(RANDOM_LRU); storageCfg.setDefaultDataRegionConfiguration(regionCfg); IgniteConfiguration cfg = getConfiguration("testGrid"); cfg.setDataStorageConfiguration(storageCfg); @@ -237,6 +241,41 @@ public class CacheMvccConfigurationValidationTest extends GridCommonAbstractTest } /** + * @throws Exception If failed. + */ + @Test + public void testMvccInMemoryEvictionDisabled() throws Exception { + final String memRegName = "in-memory-evictions"; + + // Enable in-memory eviction. + DataRegionConfiguration regionCfg = new DataRegionConfiguration(); + regionCfg.setPersistenceEnabled(false); + regionCfg.setPageEvictionMode(RANDOM_2_LRU); + regionCfg.setName(memRegName); + + DataStorageConfiguration storageCfg = new DataStorageConfiguration(); + storageCfg.setDefaultDataRegionConfiguration(regionCfg); + + IgniteConfiguration cfg = getConfiguration("testGrid"); + cfg.setDataStorageConfiguration(storageCfg); + + Ignite node = startGrid(cfg); + + CacheConfiguration ccfg1 = new CacheConfiguration("test1") + .setAtomicityMode(TRANSACTIONAL_SNAPSHOT) + .setDataRegionName(memRegName); + + try { + node.createCache(ccfg1); + + fail("In memory evictions should be disabled for MVCC caches."); + } + catch (Exception e) { + assertTrue(X.getFullStackTrace(e).contains("Data pages evictions cannot be used with TRANSACTIONAL_SNAPSHOT")); + } + } + + /** * Test TRANSACTIONAL_SNAPSHOT and near cache. * * @throws Exception If failed.