IGNITE-5843 Persist cache configuration received on node join - Fixes #2347.
Project: http://git-wip-us.apache.org/repos/asf/ignite/repo Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/cdac5a87 Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/cdac5a87 Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/cdac5a87 Branch: refs/heads/ignite-5947 Commit: cdac5a87cb1432ffd0ec32a2888505805e7348da Parents: 2f38065 Author: EdShangGG <[email protected]> Authored: Mon Aug 14 16:56:11 2017 +0300 Committer: Alexey Goncharuk <[email protected]> Committed: Mon Aug 14 17:32:01 2017 +0300 ---------------------------------------------------------------------- .../cache/CacheAffinitySharedManager.java | 56 +++++++++++++++----- .../GridCacheDatabaseSharedManager.java | 15 +++--- .../persistence/file/FilePageStoreManager.java | 1 - .../processors/query/GridQueryProcessor.java | 15 ------ .../persistence/IgnitePdsDynamicCacheTest.java | 43 +++++++++++++++ 5 files changed, 92 insertions(+), 38 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ignite/blob/cdac5a87/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheAffinitySharedManager.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheAffinitySharedManager.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheAffinitySharedManager.java index d251d52..9fc791e 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheAffinitySharedManager.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheAffinitySharedManager.java @@ -720,13 +720,6 @@ public class CacheAffinitySharedManager<K, V> extends GridCacheSharedManagerAdap } try { - // Save configuration before cache started. - if (cctx.pageStore() != null && !cctx.kernalContext().clientNode()) { - cctx.pageStore().storeCacheData( - new StoredCacheData(req.startCacheConfiguration()) - ); - } - if (startCache) { cctx.cache().prepareCacheStart(req.startCacheConfiguration(), cacheDesc, @@ -2157,7 +2150,7 @@ public class CacheAffinitySharedManager<K, V> extends GridCacheSharedManagerAdap /** * */ - static class CachesInfo { + class CachesInfo { /** Registered cache groups (updated from exchange thread). */ private final ConcurrentHashMap<Integer, CacheGroupDescriptor> registeredGrps = new ConcurrentHashMap<>(); @@ -2170,10 +2163,29 @@ public class CacheAffinitySharedManager<K, V> extends GridCacheSharedManagerAdap */ void init(Map<Integer, CacheGroupDescriptor> grps, Map<String, DynamicCacheDescriptor> caches) { for (CacheGroupDescriptor grpDesc : grps.values()) - registeredGrps.put(grpDesc.groupId(), grpDesc); + registerGroup(grpDesc); for (DynamicCacheDescriptor cacheDesc : caches.values()) - registeredCaches.put(cacheDesc.cacheId(), cacheDesc); + registerCache(cacheDesc); + } + + + /** + * @param desc Description. + */ + private DynamicCacheDescriptor registerCache(DynamicCacheDescriptor desc) { + saveCacheConfiguration(desc.cacheConfiguration()); + + return registeredCaches.put(desc.cacheId(), desc); + } + + /** + * @param grpDesc Group description. + */ + private CacheGroupDescriptor registerGroup(CacheGroupDescriptor grpDesc) { + saveCacheConfiguration(grpDesc.config()); + + return registeredGrps.put(grpDesc.groupId(), grpDesc); } /** @@ -2203,10 +2215,10 @@ public class CacheAffinitySharedManager<K, V> extends GridCacheSharedManagerAdap CacheGroupDescriptor grpDesc = desc.groupDescriptor(); if (!registeredGrps.containsKey(grpDesc.groupId())) - registeredGrps.put(grpDesc.groupId(), grpDesc); + registerGroup(grpDesc); if (!registeredCaches.containsKey(desc.cacheId())) - registeredCaches.put(desc.cacheId(), desc); + registerCache(desc); } } @@ -2221,7 +2233,7 @@ public class CacheAffinitySharedManager<K, V> extends GridCacheSharedManagerAdap } for (ExchangeActions.CacheGroupActionData startAction : exchActions.cacheGroupsToStart()) { - CacheGroupDescriptor old = registeredGrps.put(startAction.descriptor().groupId(), startAction.descriptor()); + CacheGroupDescriptor old = registerGroup(startAction.descriptor()); assert old == null : old; } @@ -2230,7 +2242,7 @@ public class CacheAffinitySharedManager<K, V> extends GridCacheSharedManagerAdap registeredCaches.remove(req.descriptor().cacheId()); for (ExchangeActions.CacheActionData req : exchActions.cacheStartRequests()) - registeredCaches.put(req.descriptor().cacheId(), req.descriptor()); + registerCache(req.descriptor()); } /** @@ -2250,4 +2262,20 @@ public class CacheAffinitySharedManager<K, V> extends GridCacheSharedManagerAdap registeredCaches.clear(); } } + + /** + * @param cfg cache configuration + */ + private void saveCacheConfiguration(CacheConfiguration<?, ?> cfg) { + if (cctx.pageStore() != null && cctx.database().persistenceEnabled() && !cctx.kernalContext().clientNode()) { + try { + cctx.pageStore().storeCacheData( + new StoredCacheData(cfg) + ); + } + catch (IgniteCheckedException e) { + U.error(log(), "Error while saving cache configuration on disk, cfg = " + cfg, e); + } + } + } } http://git-wip-us.apache.org/repos/asf/ignite/blob/cdac5a87/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/GridCacheDatabaseSharedManager.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/GridCacheDatabaseSharedManager.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/GridCacheDatabaseSharedManager.java index a1eb4af..56dcac0 100755 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/GridCacheDatabaseSharedManager.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/GridCacheDatabaseSharedManager.java @@ -56,9 +56,6 @@ import java.util.concurrent.atomic.AtomicIntegerFieldUpdater; import java.util.concurrent.locks.ReentrantReadWriteLock; import java.util.regex.Matcher; import java.util.regex.Pattern; -import javax.management.InstanceNotFoundException; -import javax.management.JMException; -import javax.management.MBeanRegistrationException; import javax.management.ObjectName; import org.apache.ignite.IgniteCheckedException; import org.apache.ignite.IgniteException; @@ -98,6 +95,7 @@ import org.apache.ignite.internal.pagemem.wal.record.delta.PartitionDestroyRecor import org.apache.ignite.internal.pagemem.wal.record.delta.PartitionMetaStateRecord; import org.apache.ignite.internal.processors.affinity.AffinityTopologyVersion; import org.apache.ignite.internal.processors.cache.CacheGroupContext; +import org.apache.ignite.internal.processors.cache.CacheGroupDescriptor; import org.apache.ignite.internal.processors.cache.DynamicCacheDescriptor; import org.apache.ignite.internal.processors.cache.GridCacheContext; import org.apache.ignite.internal.processors.cache.GridCacheSharedContext; @@ -1453,11 +1451,12 @@ public class GridCacheDatabaseSharedManager extends IgniteCacheDatabaseSharedMan // TODO IGNITE-5075: cache descriptor can be removed. GridCacheSharedContext sharedCtx = context(); - String memPlcName = sharedCtx - .cache() - .cacheGroupDescriptors().get(grpId) - .config() - .getMemoryPolicyName(); + CacheGroupDescriptor desc = sharedCtx.cache().cacheGroupDescriptors().get(grpId); + + if (desc == null) + throw new IgniteCheckedException("Failed to find cache group descriptor [grpId=" + grpId + ']'); + + String memPlcName = desc.config().getMemoryPolicyName(); return (PageMemoryEx)sharedCtx.database().memoryPolicy(memPlcName).pageMemory(); } http://git-wip-us.apache.org/repos/asf/ignite/blob/cdac5a87/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/file/FilePageStoreManager.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/file/FilePageStoreManager.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/file/FilePageStoreManager.java index 0041ea6..13bcd2a 100755 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/file/FilePageStoreManager.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/file/FilePageStoreManager.java @@ -210,7 +210,6 @@ public class FilePageStoreManager extends GridCacheSharedManagerAdapter implemen @Override public void storeCacheData( StoredCacheData cacheData ) throws IgniteCheckedException { - File cacheWorkDir = cacheWorkDirectory(cacheData.config()); File file; http://git-wip-us.apache.org/repos/asf/ignite/blob/cdac5a87/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryProcessor.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryProcessor.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryProcessor.java index d44be2c..baafb1e 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryProcessor.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryProcessor.java @@ -504,21 +504,6 @@ public class GridQueryProcessor extends GridProcessorAdapter { if (cacheDesc != null && F.eq(cacheDesc.deploymentId(), proposeMsg.deploymentId())) cacheDesc.schemaChangeFinish(msg); - - if (ctx.cache().context().pageStore() != null && - ctx.cache().context().database().persistenceEnabled()) { - - StoredCacheData cacheData = new StoredCacheData(cacheDesc.cacheConfiguration()); - - cacheData.queryEntities(cacheDesc.schema().entities()); - - try { - ctx.cache().context().pageStore().storeCacheData(cacheData); - } - catch (IgniteCheckedException e) { - throw new IllegalStateException("Failed to persist cache data: " + cacheData.config().getName(), e); - } - } } // Propose message will be used from exchange thread to http://git-wip-us.apache.org/repos/asf/ignite/blob/cdac5a87/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/IgnitePdsDynamicCacheTest.java ---------------------------------------------------------------------- diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/IgnitePdsDynamicCacheTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/IgnitePdsDynamicCacheTest.java index 189b866..5873a35 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/IgnitePdsDynamicCacheTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/IgnitePdsDynamicCacheTest.java @@ -19,6 +19,7 @@ package org.apache.ignite.internal.processors.cache.persistence; import java.io.Serializable; import org.apache.ignite.Ignite; +import org.apache.ignite.IgniteCache; import org.apache.ignite.IgniteCheckedException; import org.apache.ignite.cache.CacheAtomicityMode; import org.apache.ignite.cache.CacheMode; @@ -160,6 +161,48 @@ public class IgnitePdsDynamicCacheTest extends IgniteDbDynamicCacheSelfTest { } /** + * @throws Exception If failed. + */ + public void testDynamicCacheSavingOnNewNode() throws Exception { + Ignite ignite = startGrid(0); + + ignite.active(true); + + CacheConfiguration ccfg = new CacheConfiguration(DEFAULT_CACHE_NAME); + + ccfg.setAtomicityMode(CacheAtomicityMode.TRANSACTIONAL); + ccfg.setWriteSynchronizationMode(CacheWriteSynchronizationMode.FULL_SYNC); + ccfg.setRebalanceMode(CacheRebalanceMode.SYNC); + ccfg.setAffinity(new RendezvousAffinityFunction(false, 32)); + + IgniteCache cache = ignite.getOrCreateCache(ccfg); + + for (int i = 0; i < 160; i++) + cache.put(i, i); + + ignite = startGrid(1); + + awaitPartitionMapExchange(); + + cache = ignite.cache(DEFAULT_CACHE_NAME); + + for (int i = 0; i < 160; i++) + assertEquals(i, cache.get(i)); + + stopAllGrids(true); + + startGrid(0); + ignite = startGrid(1); + + ignite.active(true); + + cache = ignite.cache(DEFAULT_CACHE_NAME); + + for (int i = 0; i < 160; i++) + assertEquals(i, cache.get(i)); + } + + /** * @throws IgniteCheckedException If failed. */ private void deleteWorkFiles() throws IgniteCheckedException {
