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 2015/12/17 12:38:46 UTC

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

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

Semen Boikov closed IGNITE-2146.
--------------------------------
    Assignee:     (was: Semen Boikov)

> 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
>             Fix For: 1.5
>
>         Attachments: stacktrace.txt
>
>
> 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)