You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@ignite.apache.org by "Noam Liran (JIRA)" <ji...@apache.org> on 2015/12/13 15:32:46 UTC

[jira] [Created] (IGNITE-2146) Service deployment using a cache-accessing-predicate in node filter sometimes causes a deadlock

Noam Liran created IGNITE-2146:
----------------------------------

             Summary: Service deployment using a cache-accessing-predicate in node filter sometimes causes a deadlock
                 Key: IGNITE-2146
                 URL: https://issues.apache.org/jira/browse/IGNITE-2146
             Project: Ignite
          Issue Type: Bug
    Affects Versions: ignite-1.4, 1.5
         Environment: Mac OS X 10.11
java version "1.8.0_66"
Java(TM) SE Runtime Environment (build 1.8.0_66-b17)
Java HotSpot(TM) 64-Bit Server VM (build 25.66-b17, mixed mode)
Ignite 1.4.0 + Ignite-1.5.0-b1
            Reporter: Noam Liran


We're deploying a service on a cluster group. The cluster group is filtered using a predicate. The predicate accesses a cache key to determine if it should return true for a node or not.

If a new node joins the cluster while the predicate is running a deadlock is encountered: cache functions do not return and the node does not finish joining the cluster.

I've created a sample program to reproduce this on 1.4.0 and also tried to reproduce it on 1.5.0-b1;
On 1.4.0 the deadlock is usually reproduced, on 1.5.0-b1 it might take a few tries (I'm guessing it's a timing issue.. I tried to improve the odds of reproduction by using a countdown latch).

Code:
{code:title=Main.java}
import org.apache.ignite.Ignite;
import org.apache.ignite.IgniteCache;
import org.apache.ignite.Ignition;
import org.apache.ignite.cache.CacheAtomicWriteOrderMode;
import org.apache.ignite.cache.CacheAtomicityMode;
import org.apache.ignite.cache.CacheMode;
import org.apache.ignite.cache.CacheWriteSynchronizationMode;
import org.apache.ignite.cluster.ClusterGroup;
import org.apache.ignite.configuration.CacheConfiguration;
import org.apache.ignite.configuration.IgniteConfiguration;
import org.apache.ignite.services.Service;
import org.apache.ignite.services.ServiceContext;

import java.util.concurrent.CountDownLatch;

/**
 * Created by noliran on 08/12/2015.
 */
public class Main {
    public static IgniteCache<String, Object> cache1;
    public static CountDownLatch latch = new CountDownLatch(1);

    public static CacheConfiguration<String, Object> CACHE_CONFIG = new CacheConfiguration<String, Object>()
            .setName("testCache")
            .setAtomicityMode(CacheAtomicityMode.ATOMIC)
            .setCacheMode(CacheMode.REPLICATED)
            .setWriteSynchronizationMode(CacheWriteSynchronizationMode.FULL_SYNC)
            .setAtomicWriteOrderMode(CacheAtomicWriteOrderMode.PRIMARY);

    public static void main(String[] args) throws InterruptedException {
        IgniteConfiguration igniteConfiguration = new IgniteConfiguration();
        Ignite ignite1 = Ignition.start(igniteConfiguration.setGridName("grid1"));

        System.out.println("Creating cache");
        cache1 = ignite1.getOrCreateCache(CACHE_CONFIG);

        ClusterGroup group = ignite1.cluster().forPredicate(node -> {
            System.out.println("predicate: starting");
            latch.countDown();

            try {
                System.out.println("predicate: before sleep");
                Thread.sleep(10_000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

            System.out.println("predicate: before containsKey");
            boolean b1 = cache1.containsKey(node.id().toString());

            System.out.println("predicate: returning");
            return b1;
        });

        System.out.println("Deploying service with cache-based predicate");
        new Thread(() -> {
            ignite1.services(group).deployNodeSingleton("testService", new TestService());
        }).start();
        System.out.println("Service in deployment.");

        latch.await();

        System.out.println("Starting second Ignite instance..");
        Ignite ignite2 = Ignition.start(igniteConfiguration.setGridName("grid2"));
        System.out.println("Second Ignite instance started successfully!"); // This isn't going to be printed.
    }

    public static class TestService implements Service
    {
        public void execute(ServiceContext ctx) throws Exception { System.out.println("execute()"); }
        public void init(ServiceContext ctx) throws Exception { System.out.println("init()"); }
        public void cancel(ServiceContext ctx) { System.out.println("cancel()"); }
    }
}

{code}

Output:
{noformat}
[16:27:01]    __________  ________________ 
[16:27:01]   /  _/ ___/ |/ /  _/_  __/ __/ 
[16:27:01]  _/ // (7 7    // /  / / / _/   
[16:27:01] /___/\___/_/|_/___/ /_/ /___/  
[16:27:01] 
[16:27:01] ver. 1.5.0-b1#20151201-sha1:062d440c
[16:27:01] 2015 Copyright(C) Apache Software Foundation
[16:27:01] 
[16:27:01] Ignite documentation: http://ignite.apache.org
[16:27:01] 
[16:27:01] Quiet mode.
[16:27:01]   ^-- To see **FULL** console log here add -DIGNITE_QUIET=false or "-v" to ignite.{sh|bat}
[16:27:01] 
[16:27:01] OS: Mac OS X 10.11 x86_64
[16:27:01] VM information: Java(TM) SE Runtime Environment 1.8.0_66-b17 Oracle Corporation Java HotSpot(TM) 64-Bit Server VM 25.66-b17
[16:27:01] Initial heap size is 256MB (should be no less than 512MB, use -Xms512m -Xmx512m).
[16:27:01] Configured plugins:
[16:27:01]   ^-- None
[16:27:01] 
[16:27:01] Security status [authentication=off, tls/ssl=off]
[16:27:03] To start Console Management & Monitoring run ignitevisorcmd.{sh|bat}
[16:27:03] 
[16:27:03] Ignite node started OK (id=4821080c, grid=grid1)
[16:27:03] Topology snapshot [ver=1, servers=1, clients=0, CPUs=4, heap=3.6GB]
Creating cache
Deploying service with cache-based predicate
Service in deployment.
predicate: starting
predicate: before sleep
Starting second Ignite instance..
[16:27:03]    __________  ________________ 
[16:27:03]   /  _/ ___/ |/ /  _/_  __/ __/ 
[16:27:03]  _/ // (7 7    // /  / / / _/   
[16:27:03] /___/\___/_/|_/___/ /_/ /___/  
[16:27:03] 
[16:27:03] ver. 1.5.0-b1#20151201-sha1:062d440c
[16:27:03] 2015 Copyright(C) Apache Software Foundation
[16:27:03] 
[16:27:03] Ignite documentation: http://ignite.apache.org
[16:27:03] 
[16:27:03] Quiet mode.
[16:27:03]   ^-- To see **FULL** console log here add -DIGNITE_QUIET=false or "-v" to ignite.{sh|bat}
[16:27:03] 
[16:27:03] OS: Mac OS X 10.11 x86_64
[16:27:03] VM information: Java(TM) SE Runtime Environment 1.8.0_66-b17 Oracle Corporation Java HotSpot(TM) 64-Bit Server VM 25.66-b17
[16:27:03] Initial heap size is 256MB (should be no less than 512MB, use -Xms512m -Xmx512m).
[16:27:03] Configured plugins:
[16:27:03]   ^-- None
[16:27:03] 
[16:27:03] Security status [authentication=off, tls/ssl=off]
[16:27:04] Topology snapshot [ver=2, servers=2, clients=0, CPUs=4, heap=3.6GB]
predicate: before containsKey
{noformat}



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)