You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user@ignite.apache.org by ght230 <gh...@163.com> on 2017/02/21 02:36:13 UTC

Ignite client doing asynchronously operation will be jammed

I start an Ignite server first, 
then start an Ignite client which do some asynchronously operations on
cache.
But only after several seconds, the operation jammed.

Is there anything wrong about my code?

public class ContinuousQuery {

	public static void main(String[] args) {
		Ignition.setClientMode(true);
		String cacheName = "Test";
		Ignite ignite = Ignition.start();
		System.out.println();
		System.out.println(">>>TestMain started.");
		CacheConfiguration<Integer, UUID> cacheCfg = new
CacheConfiguration<>(cacheName);
		cacheCfg.setBackups(0);
		cacheCfg.setCacheMode(CacheMode.PARTITIONED);
		cacheCfg.setAtomicityMode(CacheAtomicityMode.ATOMIC);
		cacheCfg.setMemoryMode(CacheMemoryMode.OFFHEAP_TIERED);
		cacheCfg.setOffHeapMaxMemory(200L * 1024L * 1024L);
		cacheCfg.setSwapEnabled(false);
		boolean isAsync = true;
		for (int i = 1;; i++) {
			IgniteCache<Integer, UUID> cache = ignite.getOrCreateCache(cacheCfg);

			for (int j = 0; j < 1000000; j++) {
				UUID val = UUID.randomUUID();
				doit(isAsync, i, cache, j, val);
			}
		}
	}

	private static void doit(boolean isAsync, final int i, IgniteCache<Integer,
UUID> cache, final Integer key,
			final UUID value) {
		if (isAsync) {
			final IgniteCache<Integer, UUID> asyncCache = cache.withAsync();
			// setp 1
			asyncCache.put(key, value);
			// setp 1 asynchronously wait for result.
			asyncCache.future().listen(new IgniteInClosure<IgniteFuture&lt;?>>() {
				@Override
				public void apply(IgniteFuture<?> fut) {
					System.out.println(i + ", timeNow=" + timeNow() + ":setp 1 put
operation completed '" + fut.isDone()
							+ "' [key=" + key + ", value=" + fut.get() + "]");
					// setp 2
					asyncCache.remove(key);
					// setp 2 asynchronously wait for result.
					asyncCache.future().listen(new IgniteInClosure<IgniteFuture&lt;?>>() {
						@Override
						public void apply(IgniteFuture<?> fut) {
							System.out.println(i + ", timeNow=" + timeNow() + ":setp 2 remove
operation completed '"
									+ fut.isDone() + "' [key=" + key + ", value=" + fut.get() + "]");
						}
					});
				}
			});
		} else {
			// setp 1
			cache.put(key, value);
			System.out.println(i + ", timeNow=" + timeNow() + ":setp 1 put operation
completed [key=" + key + "]");
			// setp 2
			boolean result = cache.remove(key);
			System.out.println(i + ", timeNow=" + timeNow() + ":setp 2 remove
operation completed [key=" + key
					+ ", result=" + result + "]");
		}
	}

	private static String timeNow() {
		Date date = new Date();
		DateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
		String time = format.format(date);
		return time;
	}
}

Following is the test result:
[10:19:55] Topology snapshot [ver=2, servers=1, clients=1, CPUs=32,
heap=12.0GB]

>>>TestMain started.
1, timeNow=2017-02-21 10:19:55.652:setp 1 put operation completed 'true'
[key=0, value=null]
1, timeNow=2017-02-21 10:19:55.658:setp 2 remove operation completed 'true'
[key=0, value=true]
1, timeNow=2017-02-21 10:19:55.659:setp 1 put operation completed 'true'
[key=1, value=null]
1, timeNow=2017-02-21 10:19:55.663:setp 2 remove operation completed 'true'
[key=1, value=true]
1, timeNow=2017-02-21 10:19:55.664:setp 1 put operation completed 'true'
[key=2, value=null]
1, timeNow=2017-02-21 10:19:55.667:setp 2 remove operation completed 'true'
[key=2, value=true]
1, timeNow=2017-02-21 10:19:55.668:setp 1 put operation completed 'true'
[key=3, value=null]
1, timeNow=2017-02-21 10:19:55.672:setp 2 remove operation completed 'true'
[key=3, value=true]
1, timeNow=2017-02-21 10:19:55.673:setp 1 put operation completed 'true'
[key=4, value=null]
1, timeNow=2017-02-21 10:19:55.677:setp 2 remove operation completed 'true'
[key=4, value=true]
1, timeNow=2017-02-21 10:19:55.678:setp 1 put operation completed 'true'
[key=5, value=null]
1, timeNow=2017-02-21 10:19:55.681:setp 2 remove operation completed 'true'
[key=5, value=true]
1, timeNow=2017-02-21 10:19:55.682:setp 1 put operation completed 'true'
[key=6, value=null]
1, timeNow=2017-02-21 10:19:55.686:setp 1 put operation completed 'true'
[key=7, value=null]
1, timeNow=2017-02-21 10:19:55.687:setp 2 remove operation completed 'true'
[key=6, value=true]
1, timeNow=2017-02-21 10:19:55.716:setp 2 remove operation completed 'true'
[key=7, value=true]

Then it jammed.




--
View this message in context: http://apache-ignite-users.70518.x6.nabble.com/Ignite-client-doing-asynchronously-operation-will-be-jammed-tp10746.html
Sent from the Apache Ignite Users mailing list archive at Nabble.com.

Re: Ignite client doing asynchronously operation will be jammed

Posted by Nikolai Tikhonov <nt...@apache.org>.
Hi!

In current implementation .chain() and .listen() callbacks will be executed
in completion thread (for your case in system pool) that leads to
starvation. https://issues.apache.org/jira/browse/IGNITE-4477 You need to
execute callback to other thread. For example:

Executor exec = ...


fut.listen(fut0 -> {
     exec.submit(() -> cache.put(key2, val2)); });


Thanks,
Nikolay

On Tue, Feb 21, 2017 at 5:36 AM, ght230 <gh...@163.com> wrote:

> I start an Ignite server first,
> then start an Ignite client which do some asynchronously operations on
> cache.
> But only after several seconds, the operation jammed.
>
> Is there anything wrong about my code?
>
> public class ContinuousQuery {
>
>         public static void main(String[] args) {
>                 Ignition.setClientMode(true);
>                 String cacheName = "Test";
>                 Ignite ignite = Ignition.start();
>                 System.out.println();
>                 System.out.println(">>>TestMain started.");
>                 CacheConfiguration<Integer, UUID> cacheCfg = new
> CacheConfiguration<>(cacheName);
>                 cacheCfg.setBackups(0);
>                 cacheCfg.setCacheMode(CacheMode.PARTITIONED);
>                 cacheCfg.setAtomicityMode(CacheAtomicityMode.ATOMIC);
>                 cacheCfg.setMemoryMode(CacheMemoryMode.OFFHEAP_TIERED);
>                 cacheCfg.setOffHeapMaxMemory(200L * 1024L * 1024L);
>                 cacheCfg.setSwapEnabled(false);
>                 boolean isAsync = true;
>                 for (int i = 1;; i++) {
>                         IgniteCache<Integer, UUID> cache =
> ignite.getOrCreateCache(cacheCfg);
>
>                         for (int j = 0; j < 1000000; j++) {
>                                 UUID val = UUID.randomUUID();
>                                 doit(isAsync, i, cache, j, val);
>                         }
>                 }
>         }
>
>         private static void doit(boolean isAsync, final int i,
> IgniteCache<Integer,
> UUID> cache, final Integer key,
>                         final UUID value) {
>                 if (isAsync) {
>                         final IgniteCache<Integer, UUID> asyncCache =
> cache.withAsync();
>                         // setp 1
>                         asyncCache.put(key, value);
>                         // setp 1 asynchronously wait for result.
>                         asyncCache.future().listen(new
> IgniteInClosure<IgniteFuture&lt;?>>() {
>                                 @Override
>                                 public void apply(IgniteFuture<?> fut) {
>                                         System.out.println(i + ",
> timeNow=" + timeNow() + ":setp 1 put
> operation completed '" + fut.isDone()
>                                                         + "' [key=" + key
> + ", value=" + fut.get() + "]");
>                                         // setp 2
>                                         asyncCache.remove(key);
>                                         // setp 2 asynchronously wait for
> result.
>                                         asyncCache.future().listen(new
> IgniteInClosure<IgniteFuture&lt;?>>() {
>                                                 @Override
>                                                 public void
> apply(IgniteFuture<?> fut) {
>
> System.out.println(i + ", timeNow=" + timeNow() + ":setp 2 remove
> operation completed '"
>                                                                         +
> fut.isDone() + "' [key=" + key + ", value=" + fut.get() + "]");
>                                                 }
>                                         });
>                                 }
>                         });
>                 } else {
>                         // setp 1
>                         cache.put(key, value);
>                         System.out.println(i + ", timeNow=" + timeNow() +
> ":setp 1 put operation
> completed [key=" + key + "]");
>                         // setp 2
>                         boolean result = cache.remove(key);
>                         System.out.println(i + ", timeNow=" + timeNow() +
> ":setp 2 remove
> operation completed [key=" + key
>                                         + ", result=" + result + "]");
>                 }
>         }
>
>         private static String timeNow() {
>                 Date date = new Date();
>                 DateFormat format = new SimpleDateFormat("yyyy-MM-dd
> HH:mm:ss.SSS");
>                 String time = format.format(date);
>                 return time;
>         }
> }
>
> Following is the test result:
> [10:19:55] Topology snapshot [ver=2, servers=1, clients=1, CPUs=32,
> heap=12.0GB]
>
> >>>TestMain started.
> 1, timeNow=2017-02-21 10:19:55.652:setp 1 put operation completed 'true'
> [key=0, value=null]
> 1, timeNow=2017-02-21 10:19:55.658:setp 2 remove operation completed 'true'
> [key=0, value=true]
> 1, timeNow=2017-02-21 10:19:55.659:setp 1 put operation completed 'true'
> [key=1, value=null]
> 1, timeNow=2017-02-21 10:19:55.663:setp 2 remove operation completed 'true'
> [key=1, value=true]
> 1, timeNow=2017-02-21 10:19:55.664:setp 1 put operation completed 'true'
> [key=2, value=null]
> 1, timeNow=2017-02-21 10:19:55.667:setp 2 remove operation completed 'true'
> [key=2, value=true]
> 1, timeNow=2017-02-21 10:19:55.668:setp 1 put operation completed 'true'
> [key=3, value=null]
> 1, timeNow=2017-02-21 10:19:55.672:setp 2 remove operation completed 'true'
> [key=3, value=true]
> 1, timeNow=2017-02-21 10:19:55.673:setp 1 put operation completed 'true'
> [key=4, value=null]
> 1, timeNow=2017-02-21 10:19:55.677:setp 2 remove operation completed 'true'
> [key=4, value=true]
> 1, timeNow=2017-02-21 10:19:55.678:setp 1 put operation completed 'true'
> [key=5, value=null]
> 1, timeNow=2017-02-21 10:19:55.681:setp 2 remove operation completed 'true'
> [key=5, value=true]
> 1, timeNow=2017-02-21 10:19:55.682:setp 1 put operation completed 'true'
> [key=6, value=null]
> 1, timeNow=2017-02-21 10:19:55.686:setp 1 put operation completed 'true'
> [key=7, value=null]
> 1, timeNow=2017-02-21 10:19:55.687:setp 2 remove operation completed 'true'
> [key=6, value=true]
> 1, timeNow=2017-02-21 10:19:55.716:setp 2 remove operation completed 'true'
> [key=7, value=true]
>
> Then it jammed.
>
>
>
>
> --
> View this message in context: http://apache-ignite-users.
> 70518.x6.nabble.com/Ignite-client-doing-asynchronously-
> operation-will-be-jammed-tp10746.html
> Sent from the Apache Ignite Users mailing list archive at Nabble.com.
>