[ 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)