[ 
https://issues.apache.org/jira/browse/IGNITE-6005?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16204556#comment-16204556
 ] 

Nikolay Izhikov edited comment on IGNITE-6005 at 10/16/17 10:00 AM:
--------------------------------------------------------------------

[~avinogradov]

Below wider explanation why I have stucked:

> I think better way is using special code flow for operations with 
> non-interruptible semantic.

1. As far as I can see - *all* {{get*}} operations within tx requires 
synchronization on internal {{Semaphore}} therefore can't be executed on 
interrupted thread.

2. I suggest usage explicit lock on data structure key. It helps a bit, but I 
don't get any logic in call results:

Interrupted thread:

GridDhtColocatedCache:

cache.get(key) - fails.
cache.getAsync(key).getUninterruptibly() - succeed
cache.remove(key) - succeed.
cache.removeAsync(key).getUninterruptibly() - fails.

GridDhtAtomicCache: 

All calls of get* or getAsync* fails.

Any suggestion why this happening?

This code runs OK on interrupted thread. Cache is GridDhtColocatedCache.
{code:java}
    boolean lock = cache.lock(key, 0);
    AtomicDataStructureValue val = cache.getAsync(key).getUninterruptibly();
    cache.remove(key);
{code}

This code fails on interrupted thread. Cache is GridDhtAtomicCache
{code:java}
                hdr = (GridCacheSetHeader) cctx.cache().getAsync(new 
GridCacheSetHeaderKey(name)).getUninterruptibly();
{code}


was (Author: nizhikov):
[~avinogradov]

Below wider explanation why I have stucked:

> I think better way is using special code flow for operations with 
> non-interruptible semantic.

1. As far as I can see - *all* {{get*}} operations requires synchronization on 
internal {{Semaphore}} therefore can't be executed on interrupted thread.

2. I suggest usage explicit lock on data structure key. It helps a bit, but I 
don't get any logic in call results:

Interrupted thread:

GridDhtColocatedCache:

cache.get(key) - fails.
cache.getAsync(key).getUninterruptibly() - succeed
cache.remove(key) - succeed.
cache.removeAsync(key).getUninterruptibly() - fails.

GridDhtAtomicCache: 

All calls of get* or getAsync* fails.

Any suggestion why this happening?

This code runs OK on interrupted thread. Cache is GridDhtColocatedCache.
{code:java}
    boolean lock = cache.lock(key, 0);
    AtomicDataStructureValue val = cache.getAsync(key).getUninterruptibly();
    cache.remove(key);
{code}

This code fails on interrupted thread. Cache is GridDhtAtomicCache
{code:java}
                hdr = (GridCacheSetHeader) cctx.cache().getAsync(new 
GridCacheSetHeaderKey(name)).getUninterruptibly();
{code}

> [Test failed] 
> GridCachePartitionedDataStructuresFailoverSelfTest.testSemaphoreNonFailoverSafe
> ---------------------------------------------------------------------------------------------
>
>                 Key: IGNITE-6005
>                 URL: https://issues.apache.org/jira/browse/IGNITE-6005
>             Project: Ignite
>          Issue Type: Bug
>    Affects Versions: 2.1
>            Reporter: Eduard Shangareev
>            Assignee: Nikolay Izhikov
>              Labels: MakeTeamcityGreenAgain
>             Fix For: 2.3
>
>
> Example of fail
> https://ci.ignite.apache.org/viewLog.html?buildId=762788&tab=buildResultsDiv&buildTypeId=Ignite20Tests_IgniteDataStrucutures
> Typical problem is 
> {code}
> org.apache.ignite.IgniteInterruptedException: Failed to wait for asynchronous 
> operation permit (thread got interrupted).
>     at 
> org.apache.ignite.internal.util.IgniteUtils$3.apply(IgniteUtils.java:805)
>     at 
> org.apache.ignite.internal.util.IgniteUtils$3.apply(IgniteUtils.java:803)
>     at 
> org.apache.ignite.internal.util.IgniteUtils.convertException(IgniteUtils.java:961)
>     at 
> org.apache.ignite.internal.processors.datastructures.GridCacheSemaphoreImpl.close(GridCacheSemaphoreImpl.java:1026)
>     at 
> org.apache.ignite.internal.processors.cache.datastructures.GridCacheAbstractDataStructuresFailoverSelfTest.testSemaphoreNonFailoverSafe(GridCacheAbstractDataStructuresFailoverSelfTest.java:458)
>     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>     at 
> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
>     at 
> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
>     at java.lang.reflect.Method.invoke(Method.java:606)
>     at junit.framework.TestCase.runTest(TestCase.java:176)
>     at 
> org.apache.ignite.testframework.junits.GridAbstractTest.runTestInternal(GridAbstractTest.java:2000)
>     at 
> org.apache.ignite.testframework.junits.GridAbstractTest.access$000(GridAbstractTest.java:132)
>     at 
> org.apache.ignite.testframework.junits.GridAbstractTest$5.run(GridAbstractTest.java:1915)
>     at java.lang.Thread.run(Thread.java:745)
> Caused by: java.lang.InterruptedException: null
>     at 
> java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireSharedInterruptibly(AbstractQueuedSynchronizer.java:1301)
>     at java.util.concurrent.Semaphore.acquire(Semaphore.java:317)
>     at 
> org.apache.ignite.internal.processors.cache.GridCacheAdapter.asyncOpAcquire(GridCacheAdapter.java:4314)
>     at 
> org.apache.ignite.internal.processors.cache.GridCacheAdapter.asyncOp(GridCacheAdapter.java:4177)
>     at 
> org.apache.ignite.internal.processors.cache.distributed.dht.colocated.GridDhtColocatedCache.getAsync(GridDhtColocatedCache.java:196)
>     at 
> org.apache.ignite.internal.processors.cache.GridCacheAdapter.get0(GridCacheAdapter.java:4509)
>     at 
> org.apache.ignite.internal.processors.cache.GridCacheAdapter.get(GridCacheAdapter.java:4490)
>     at 
> org.apache.ignite.internal.processors.cache.GridCacheAdapter.get(GridCacheAdapter.java:1324)
>     at 
> org.apache.ignite.internal.processors.cache.GridCacheProxyImpl.get(GridCacheProxyImpl.java:329)
>     at 
> org.apache.ignite.internal.processors.datastructures.DataStructuresProcessor$5.applyx(DataStructuresProcessor.java:635)
>     at 
> org.apache.ignite.internal.processors.datastructures.DataStructuresProcessor.retryTopologySafe(DataStructuresProcessor.java:1519)
>     at 
> org.apache.ignite.internal.processors.datastructures.DataStructuresProcessor.removeDataStructure(DataStructuresProcessor.java:629)
>     at 
> org.apache.ignite.internal.processors.datastructures.DataStructuresProcessor.removeSemaphore(DataStructuresProcessor.java:1188)
>     at 
> org.apache.ignite.internal.processors.datastructures.GridCacheSemaphoreImpl.close(GridCacheSemaphoreImpl.java:1023)
>     at 
> org.apache.ignite.internal.processors.cache.datastructures.GridCacheAbstractDataStructuresFailoverSelfTest.testSemaphoreNonFailoverSafe(GridCacheAbstractDataStructuresFailoverSelfTest.java:458)
>     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>     at 
> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
>     at 
> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
>     at java.lang.reflect.Method.invoke(Method.java:606)
>     at junit.framework.TestCase.runTest(TestCase.java:176)
>     at 
> org.apache.ignite.testframework.junits.GridAbstractTest.runTestInternal(GridAbstractTest.java:2000)
>     at 
> org.apache.ignite.testframework.junits.GridAbstractTest.access$000(GridAbstractTest.java:132)
>     at 
> org.apache.ignite.testframework.junits.GridAbstractTest$5.run(GridAbstractTest.java:1915)
>     at java.lang.Thread.run(Thread.java:745)
> {code}



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

Reply via email to