ignite-issues mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Vladimir Ozerov (JIRA)" <j...@apache.org>
Subject [jira] [Updated] (IGNITE-6507) Commit can be lost in network split scenario
Date Thu, 28 Sep 2017 08:48:00 GMT

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

Vladimir Ozerov updated IGNITE-6507:
------------------------------------
    Fix Version/s:     (was: 2.3)
                   2.4

> Commit can be lost in network split scenario
> --------------------------------------------
>
>                 Key: IGNITE-6507
>                 URL: https://issues.apache.org/jira/browse/IGNITE-6507
>             Project: Ignite
>          Issue Type: Bug
>          Components: general
>    Affects Versions: 2.1
>            Reporter: Alexei Scherbakov
>            Priority: Critical
>              Labels: important
>             Fix For: 2.4
>
>
> Commit can be lost in network split scenario
> {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.distributed.dht;
> import org.apache.ignite.IgniteCache;
> import org.apache.ignite.cache.affinity.Affinity;
> import org.apache.ignite.cache.affinity.rendezvous.RendezvousAffinityFunction;
> import org.apache.ignite.configuration.BinaryConfiguration;
> import org.apache.ignite.configuration.CacheConfiguration;
> import org.apache.ignite.configuration.IgniteConfiguration;
> import org.apache.ignite.configuration.MemoryConfiguration;
> import org.apache.ignite.internal.IgniteEx;
> import org.apache.ignite.internal.IgniteInternalFuture;
> import org.apache.ignite.internal.TestRecordingCommunicationSpi;
> 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.CacheWriteSynchronizationMode.FULL_SYNC;
> /**
>  * Tests commit consitency in split-brain scenario.
>  */
> public class GridCacheGridSplitTxConsistencyTest extends GridCommonAbstractTest {
>     /** */
>     private static final TcpDiscoveryIpFinder IP_FINDER = new TcpDiscoveryVmIpFinder(true);
>     /**
>      * {@inheritDoc}
>      */
>     @Override protected void afterTest() throws Exception {
>         super.afterTest();
>         stopAllGrids();
>         GridTestUtils.deleteDbFiles();
>     }
>     /**
>      * {@inheritDoc}
>      */
>     @Override protected IgniteConfiguration getConfiguration(String gridName) throws
Exception {
>         IgniteConfiguration cfg = super.getConfiguration(gridName);
>         cfg.setCommunicationSpi(new TestRecordingCommunicationSpi());
>         cfg.setConsistentId(gridName);
>         MemoryConfiguration memCfg = new MemoryConfiguration();
>         memCfg.setPageSize(1024);
>         memCfg.setDefaultMemoryPolicySize(100 * 1024 * 1024);
>         cfg.setMemoryConfiguration(memCfg);
>         ((TcpDiscoverySpi) cfg.getDiscoverySpi()).setIpFinder(IP_FINDER);
>         CacheConfiguration ccfg = new CacheConfiguration();
>         ccfg.setName(DEFAULT_CACHE_NAME);
>         ccfg.setAtomicityMode(TRANSACTIONAL);
>         ccfg.setWriteSynchronizationMode(FULL_SYNC);
>         ccfg.setAffinity(new RendezvousAffinityFunction(false, 3));
>         ccfg.setBackups(2);
>         cfg.setCacheConfiguration(ccfg);
>         return cfg;
>     }
>     /**
>      * Tests if commits are working as expected.
>      * @throws Exception
>      */
>     public void testSplitTxConsistency() throws Exception {
>         IgniteEx grid0 = startGrid(0);
>         grid0.active(true);
>         IgniteEx grid1 = startGrid(1);
>         IgniteEx grid2 = startGrid(2);
>         int key = 0;
>         Affinity<Object> aff = grid0.affinity(DEFAULT_CACHE_NAME);
>         assertTrue(aff.isPrimary(grid0.localNode(), key));
>         assertTrue(aff.isBackup(grid1.localNode(), key));
>         assertTrue(aff.isBackup(grid2.localNode(), key));
>         final TestRecordingCommunicationSpi spi0 = (TestRecordingCommunicationSpi) grid0.configuration().getCommunicationSpi();
>         spi0.blockMessages(GridDhtTxFinishRequest.class, grid1.name());
>         spi0.blockMessages(GridDhtTxFinishRequest.class, grid2.name());
>         IgniteInternalFuture<?> fut = multithreadedAsync(new Runnable() {
>             @Override public void run() {
>                 try {
>                     spi0.waitForBlocked();
>                 } catch (InterruptedException e) {
>                     fail();
>                 }
>                 stopGrid(1);
>                 stopGrid(2);
>                 spi0.stopBlock(true);
>             }
>         }, 1, "stop-thread");
>         IgniteCache cache = grid0.cache(DEFAULT_CACHE_NAME);
>         int val0 = 1;
>         cache.put(key, val0);
>         fut.get();
>         assertTrue("Expecting committed key", cache.containsKey(0));
>         // Some actions can be done after successful commit at this point.
>         // Now split-brain happens.
>         // In real life grid0 and grid1 are separated and do not see each other.
>         // Pretend second DC is active.
>         stopGrid(0);
>         grid1 = startGrid(1);
>         grid1.active(true);
>         grid2 = startGrid(2);
>         // Test if previous commit is not lost.
>         assertTrue("Expecting committed key", grid1.cache(DEFAULT_CACHE_NAME).containsKey(0));
>         assertTrue("Expecting committed key", grid2.cache(DEFAULT_CACHE_NAME).containsKey(0));
>     }
> }
> {noformat}
> If routing will be switched to second data center, new transactions will no see commited
state.



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

Mime
View raw message