You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@ignite.apache.org by "Semen Boikov (JIRA)" <ji...@apache.org> on 2017/11/22 10:20:00 UTC

[jira] [Resolved] (IGNITE-6973) Node restarts with enabled persistence lead to affinity assignment mismatch on different nodes.

     [ https://issues.apache.org/jira/browse/IGNITE-6973?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Semen Boikov resolved IGNITE-6973.
----------------------------------
    Resolution: Fixed

There was a bug with deploymentId assigned to caches started during activation, fixed in master.

> Node restarts with enabled persistence lead to affinity assignment mismatch on different nodes.
> -----------------------------------------------------------------------------------------------
>
>                 Key: IGNITE-6973
>                 URL: https://issues.apache.org/jira/browse/IGNITE-6973
>             Project: Ignite
>          Issue Type: Bug
>    Affects Versions: 2.3
>            Reporter: Alexei Scherbakov
>            Assignee: Semen Boikov
>             Fix For: 2.4
>
>
> Most probably this is caused by deploymentId reassign after grid restart.
> All nodes must have same deploymentId in such case.
> Reproducer:
> {noformat}
> /*
>  * 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.persistence;
> import java.util.Arrays;
> import java.util.Collection;
> import java.util.HashMap;
> import java.util.List;
> import java.util.Map;
> import java.util.concurrent.Callable;
> import java.util.concurrent.atomic.AtomicInteger;
> import org.apache.ignite.Ignite;
> import org.apache.ignite.IgniteCache;
> import org.apache.ignite.cache.CacheAtomicityMode;
> import org.apache.ignite.cache.CacheMode;
> import org.apache.ignite.cache.affinity.rendezvous.RendezvousAffinityFunction;
> import org.apache.ignite.cluster.ClusterNode;
> import org.apache.ignite.configuration.CacheConfiguration;
> import org.apache.ignite.configuration.IgniteConfiguration;
> import org.apache.ignite.configuration.MemoryConfiguration;
> import org.apache.ignite.configuration.MemoryPolicyConfiguration;
> import org.apache.ignite.configuration.PersistentStoreConfiguration;
> import org.apache.ignite.configuration.WALMode;
> import org.apache.ignite.internal.IgniteEx;
> import org.apache.ignite.internal.IgniteInternalFuture;
> import org.apache.ignite.internal.IgniteKernal;
> import org.apache.ignite.internal.processors.affinity.AffinityTopologyVersion;
> import org.apache.ignite.internal.processors.cache.CacheGroupDescriptor;
> import org.apache.ignite.internal.processors.cache.IgniteInternalCache;
> import org.apache.ignite.internal.util.typedef.G;
> import org.apache.ignite.internal.util.typedef.internal.U;
> import org.apache.ignite.lang.IgniteUuid;
> 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.GridTestUtils;
> import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
> import static org.apache.ignite.cache.CacheAtomicityMode.TRANSACTIONAL;
> import static org.apache.ignite.cache.CacheMode.PARTITIONED;
> import static org.apache.ignite.cache.CacheWriteSynchronizationMode.FULL_SYNC;
> import static org.apache.ignite.internal.processors.cache.persistence.GridCacheDatabaseSharedManager.IGNITE_PDS_CHECKPOINT_TEST_SKIP_SYNC;
> /**
>  * The test validates assignment after nodes restart with enabled persistence.
>  */
> public class IgnitePdsCacheAssignmentNodeRestartsTest extends GridCommonAbstractTest {
>     /** */
>     private static TcpDiscoveryIpFinder ipFinder = new TcpDiscoveryVmIpFinder(true);
>     /** {@inheritDoc} */
>     @Override protected IgniteConfiguration getConfiguration(String igniteInstanceName) throws Exception {
>         IgniteConfiguration cfg = super.getConfiguration(igniteInstanceName);
>             cfg.setMemoryConfiguration(new MemoryConfiguration().setDefaultMemoryPolicyName("d").
>                 setPageSize(1024).setMemoryPolicies(new MemoryPolicyConfiguration().setName("d").
>                 setInitialSize(50 * 1024 * 1024L).setMaxSize(50 * 1024 * 1024)));
>             cfg.setPersistentStoreConfiguration(new PersistentStoreConfiguration().setWalMode(WALMode.LOG_ONLY));
>         ((TcpDiscoverySpi)cfg.getDiscoverySpi()).setIpFinder(ipFinder);
>         return cfg;
>     }
>     /** {@inheritDoc} */
>     @Override protected void beforeTest() throws Exception {
>         super.beforeTest();
>         deleteRecursively(U.resolveWorkDirectory(U.defaultWorkDirectory(), "db", false));
>     }
>     /** {@inheritDoc} */
>     @Override protected void afterTest() throws Exception {
>         stopAllGrids();
>         deleteRecursively(U.resolveWorkDirectory(U.defaultWorkDirectory(), "db", false));
>         super.afterTest();
>     }
>     /**
>      * @param name Name.
>      * @param atomicityMode Atomicity mode.
>      * @param cacheMode Cache mode.
>      * @param backups Backups.
>      * @param grp Group.
>      */
>     private CacheConfiguration cacheConfiguration(String name,
>         CacheAtomicityMode atomicityMode,
>         CacheMode cacheMode,
>         int backups,
>         String grp)
>     {
>         CacheConfiguration ccfg = new CacheConfiguration(name);
>         ccfg.setAtomicityMode(atomicityMode);
>         ccfg.setWriteSynchronizationMode(FULL_SYNC);
>         ccfg.setCacheMode(cacheMode);
>         ccfg.setGroupName(grp);
>         ccfg.setAffinity(new RendezvousAffinityFunction(false, 128));
>         if (cacheMode == PARTITIONED)
>             ccfg.setBackups(backups);
>         return ccfg;
>     }
>     /**
>      *
>      */
>     public void testAssignmentAfterRestarts() throws Exception {
>         try {
>             System.setProperty(IGNITE_PDS_CHECKPOINT_TEST_SKIP_SYNC, "true");
>             final int gridsCnt = 5;
>             final int groupsCnt = 2;
>             final IgniteEx node = (IgniteEx)startGridsMultiThreaded(gridsCnt);
>             final List<CacheConfiguration> cfgs = Arrays.asList(
>                 cacheConfiguration("g1c1", TRANSACTIONAL, PARTITIONED, gridsCnt, "testGrp1"),
>                 cacheConfiguration("g1c2", TRANSACTIONAL, PARTITIONED, gridsCnt, "testGrp1"),
>                 cacheConfiguration("g2c1", TRANSACTIONAL, PARTITIONED, gridsCnt, "testGrp2"),
>                 cacheConfiguration("g2c2", TRANSACTIONAL, PARTITIONED, gridsCnt, "testGrp2"));
>             final Collection<IgniteCache> caches = node.getOrCreateCaches(cfgs);
>             validateDepIds(groupsCnt);
>             stopAllGrids();
>             IgniteEx node2 = (IgniteEx)startGridsMultiThreaded(gridsCnt);
>             validateDepIds(groupsCnt); // Deployment ids must be the same on all nodes.
>             final int restartIdxFrom = 2;
>             final AtomicInteger idx = new AtomicInteger(restartIdxFrom);
>             IgniteInternalFuture fut = GridTestUtils.runMultiThreadedAsync(new Callable<Void>() {
>                 @Override public Void call() throws Exception {
>                     int nodeIdx = idx.getAndIncrement();
>                     stopGrid(nodeIdx);
>                     return null;
>                 }
>             }, gridsCnt - restartIdxFrom, "stop-node");
>             fut.get();
>             awaitPartitionMapExchange();
>             checkAffinity();
>             idx.set(restartIdxFrom);
>             fut = GridTestUtils.runMultiThreadedAsync(new Callable<Void>() {
>                 @Override public Void call() throws Exception {
>                     int nodeIdx = idx.getAndIncrement();
>                     startGrid(nodeIdx);
>                     return null;
>                 }
>             }, gridsCnt - restartIdxFrom, "start-node");
>             fut.get();
>             awaitPartitionMapExchange();
>             AffinityTopologyVersion topVer = node2.context().cache().context().exchange().readyAffinityVersion();
>             log.info("Using version: " + topVer);
>             checkAffinity();
>         }
>         finally {
>             System.clearProperty(IGNITE_PDS_CHECKPOINT_TEST_SKIP_SYNC);
>         }
>     }
>     /**
>      * @param grpCnt Group count.
>      */
>     private void validateDepIds(int grpCnt) {
>         Map<Integer, IgniteUuid> depIds = new HashMap<>();
>         for (Ignite ignite : G.allGrids()) {
>             final Map<Integer, CacheGroupDescriptor> descMap = ((IgniteEx)ignite).context().cache().cacheGroupDescriptors();
>             for (Map.Entry<Integer, CacheGroupDescriptor> entry : descMap.entrySet()) {
>                 final IgniteUuid u = entry.getValue().deploymentId();
>                 final IgniteUuid u0 = depIds.get(entry.getKey());
>                 if (u0 == null)
>                     depIds.put(entry.getKey(), u);
>                 else
>                     assertEquals("Descriptors do not match", u0, u);
>             }
>         }
>         assertEquals(grpCnt + 1, depIds.size());
>     }
>     /**
>      * @throws Exception If failed.
>      */
>     private void checkAffinity() throws Exception {
>         List<Ignite> nodes = G.allGrids();
>         ClusterNode crdNode = null;
>         for (Ignite node : nodes) {
>             ClusterNode locNode = node.cluster().localNode();
>             if (crdNode == null || locNode.order() < crdNode.order())
>                 crdNode = locNode;
>         }
>         AffinityTopologyVersion topVer = ((IgniteKernal)grid(crdNode)).
>             context().cache().context().exchange().readyAffinityVersion();
>         Map<String, List<List<ClusterNode>>> affMap = new HashMap<>();
>         for (Ignite node : nodes) {
>             IgniteKernal node0 = (IgniteKernal)node;
>             for (IgniteInternalCache cache : node0.context().cache().caches()) {
>                 List<List<ClusterNode>> aff = affMap.get(cache.name());
>                 List<List<ClusterNode>> aff0 = cache.context().affinity().assignments(topVer);
>                 if (aff != null)
>                     assertEquals(aff, aff0);
>                 else
>                     affMap.put(cache.name(), aff0);
>             }
>         }
>     }
> }
> {noformat}



--
This message was sent by Atlassian JIRA
(v6.4.14#64029)