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