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

Dmitry Werner updated IGNITE-29052:
-----------------------------------
    Description: 
Success Rate: 21.5% (Last 107 Runs) 84 failed, 23 successful

https://ci2.ignite.apache.org/test/7147504629922790672?currentProjectId=IgniteTests24Java8&branch=%3Cdefault%3E

Current failure (from CI log _Apache_Ignite_2.x_Tests_Cache_3_43882.log)

The test starts at 15:19:30 and is interrupted after the hardened 600s timeout 
(getTestTimeout() = 10 * 60_000 overridden by suite/CI watchdog). 
Reported failure:
     [ERROR] 
org.apache.ignite.internal.processors.cache.IgniteCacheGroupsTest.testRestartsAndCacheCreateDestroy
             -- Time elapsed: 601.1 s <<< ERROR!
     java.util.concurrent.TimeoutException: Test has been timed out 
[test=testRestartsAndCacheCreateDestroy, timeout=600000]

    Main thread stack (at dump time, blocked in `.get()`):

     
o.a.i.IgniteCacheGroupsTest.testRestartsAndCacheCreateDestroy(IgniteCacheGroupsTest.java:3865)
         at 
o.a.i.i.util.future.GridFutureAdapter.get(GridFutureAdapter.java:147)
         at 
o.a.i.i.util.future.GridFutureAdapter.get0(GridFutureAdapter.java:184)
         at jdk.internal.misc.Unsafe.park(Native Method)

    Cache destroy thread (`async-runnable-runner-1`) blocked in `destroyCache`:

     o.a.i.IgniteCacheGroupsTest$41.run(IgniteCacheGroupsTest.java:3791)
         at o.a.i.i.IgniteKernal.destroyCache(IgniteKernal.java:2374)
         at o.a.i.i.IgniteKernal.destroyCache0(IgniteKernal.java:2384)
         at 
o.a.i.i.util.future.GridFutureAdapter.get(GridFutureAdapter.java:147)
         at 
o.a.i.i.util.future.GridFutureAdapter.get0(GridFutureAdapter.java:184)
         at java.util.concurrent.locks.LockSupport.park(Native Method)

    All op threads (`op-thread-3..10`) parked on operation futures, e.g.:

     
o.a.i.IgniteCacheGroupsTest.cacheOperation(IgniteCacheGroupsTest.java:4120)  // 
put
     
o.a.i.IgniteCacheGroupsTest.cacheOperation(IgniteCacheGroupsTest.java:4155)  // 
putAll
     
o.a.i.IgniteCacheGroupsTest.cacheOperation(IgniteCacheGroupsTest.java:4145)  // 
getAll
         at 
o.a.i.i.processors.cache.GridCacheAdapter.syncOp(GridCacheAdapter.java:3906)
         at 
o.a.i.i.util.future.GridFutureAdapter.get(GridFutureAdapter.java:147)
         at 
o.a.i.i.util.future.GridFutureAdapter.get0(GridFutureAdapter.java:184)
         at java.util.concurrent.locks.LockSupport.park(Native Method)

*Root cause of the test failure*

IgniteCacheGroupsTest#testRestartsAndCacheCreateDestroy fails not due to test 
timeouts or hung transactions, but due to a client-initiated exchange deadlock 
(dynamic cache change) racing against a server node restart that rejoins with 
the same consistentId/port.

*Mechanism:*
     1. The client initiates a dynamic cache change (destroy/create c0) — a 
separate distributed exchange (topVer=6.3) started from the client node.
     2. At the same time the restart thread stops a server node (node 2, 
consistentId=127.0.0.1:47502) and restarts it with the same consistentId/port. 
The rejoin spawns its own chain of exchanges (NODE_LEFT, NODE_JOINED, …) which 
merge with the client's exchange.
     3. The client waits for the coordinator to confirm exchange 6.3 ("waiting 
for coordinator response"), but its partition single-messages are never 
acknowledged (msgsAckedByRmt=0, recovery descriptor connected=false).
     4. Because the client's exchange is never completed, the cluster-wide 
merge is blocked; startGrid(2) in the restart thread hangs on await exchange, 
and restartFut.get(...) fails with IgniteFutureTimeoutCheckedException at 
IgniteCacheGroupsTest.java:3904.

Key detail: the restarted node keeps its identity (consistentId/discPort), 
which breaks the client→coordinator recovery session during the rejoin. It's a 
race of "client-initiated dynamic-cache-change ⇄ restart of a node with the 
same consistentId".

*Proposed fix*
Synchronize client create/destroy and node restarts with a shared ReentrantLock 
restartLock in the test:
- restart thread: lock → stopGrid/startGrid → unlock;
- cache thread: lock → destroyCache/createCache → unlock.

A node restart therefore executes sequentially and never overlaps an in-flight 
client create/destroy (which is what triggers the deadlock), while ordinary 
cache operations continue running concurrently with restarts. The client stays 
the initiator of create/destroy, so test coverage is preserved.

A side refinement was made to the group assertion loop to iterate over both 
GROUP1/GROUP2 and tolerate a group being absent on a node (all its caches 
re-created under another group during the iteration).

  was:
Success Rate: 21.5% (Last 107 Runs) 84 failed, 23 successful

https://ci2.ignite.apache.org/test/7147504629922790672?currentProjectId=IgniteTests24Java8&branch=%3Cdefault%3E

Current failure (from CI log _Apache_Ignite_2.x_Tests_Cache_3_43882.log)

The test starts at 15:19:30 and is interrupted after the hardened 600s timeout 
(getTestTimeout() = 10 * 60_000 overridden by suite/CI watchdog). 
Reported failure:
     [ERROR] 
org.apache.ignite.internal.processors.cache.IgniteCacheGroupsTest.testRestartsAndCacheCreateDestroy
             -- Time elapsed: 601.1 s <<< ERROR!
     java.util.concurrent.TimeoutException: Test has been timed out 
[test=testRestartsAndCacheCreateDestroy, timeout=600000]

    Main thread stack (at dump time, blocked in `.get()`):

     
o.a.i.IgniteCacheGroupsTest.testRestartsAndCacheCreateDestroy(IgniteCacheGroupsTest.java:3865)
         at 
o.a.i.i.util.future.GridFutureAdapter.get(GridFutureAdapter.java:147)
         at 
o.a.i.i.util.future.GridFutureAdapter.get0(GridFutureAdapter.java:184)
         at jdk.internal.misc.Unsafe.park(Native Method)

    Cache destroy thread (`async-runnable-runner-1`) blocked in `destroyCache`:

     o.a.i.IgniteCacheGroupsTest$41.run(IgniteCacheGroupsTest.java:3791)
         at o.a.i.i.IgniteKernal.destroyCache(IgniteKernal.java:2374)
         at o.a.i.i.IgniteKernal.destroyCache0(IgniteKernal.java:2384)
         at 
o.a.i.i.util.future.GridFutureAdapter.get(GridFutureAdapter.java:147)
         at 
o.a.i.i.util.future.GridFutureAdapter.get0(GridFutureAdapter.java:184)
         at java.util.concurrent.locks.LockSupport.park(Native Method)

    All op threads (`op-thread-3..10`) parked on operation futures, e.g.:

     
o.a.i.IgniteCacheGroupsTest.cacheOperation(IgniteCacheGroupsTest.java:4120)  // 
put
     
o.a.i.IgniteCacheGroupsTest.cacheOperation(IgniteCacheGroupsTest.java:4155)  // 
putAll
     
o.a.i.IgniteCacheGroupsTest.cacheOperation(IgniteCacheGroupsTest.java:4145)  // 
getAll
         at 
o.a.i.i.processors.cache.GridCacheAdapter.syncOp(GridCacheAdapter.java:3906)
         at 
o.a.i.i.util.future.GridFutureAdapter.get(GridFutureAdapter.java:147)
         at 
o.a.i.i.util.future.GridFutureAdapter.get0(GridFutureAdapter.java:184)
         at java.util.concurrent.locks.LockSupport.park(Native Method)

*Root cause of the test failure*

IgniteCacheGroupsTest#testRestartsAndCacheCreateDestroy fails not due to test 
timeouts or hung transactions, but due to a client-initiated exchange deadlock 
(dynamic cache change) racing against a server node restart that rejoins with 
the same consistentId/port.

*Mechanism:*
     1. The client initiates a dynamic cache change (destroy/create c0) — a 
separate distributed exchange (topVer=6.3) started from the client node.
     2. At the same time the restart thread stops a server node (node 2, 
consistentId=127.0.0.1:47502) and restarts it with the same consistentId/port. 
The rejoin spawns its own chain of exchanges
        (NODE_LEFT, NODE_JOINED, …) which merge with the client's exchange.
     3. The client waits for the coordinator to confirm exchange 6.3 ("waiting 
for coordinator response"), but its partition single-messages are never 
acknowledged (msgsAckedByRmt=0, recovery
        descriptor connected=false).
     4. Because the client's exchange is never completed, the cluster-wide 
merge is blocked; startGrid(2) in the restart thread hangs on await exchange, 
and restartFut.get(...) fails with
        IgniteFutureTimeoutCheckedException at IgniteCacheGroupsTest.java:3904.

Key detail: the restarted node keeps its identity (consistentId/discPort), 
which breaks the client→coordinator recovery session during the rejoin. It's a 
race of "client-initiated dynamic-cache-change ⇄ restart of a node with the 
same consistentId".

*Proposed fix*
Synchronize client create/destroy and node restarts with a shared ReentrantLock 
restartLock in the test:
- restart thread: lock → stopGrid/startGrid → unlock;
- cache thread: lock → destroyCache/createCache → unlock.

A node restart therefore executes sequentially and never overlaps an in-flight 
client create/destroy (which is what triggers the deadlock), while ordinary 
cache operations continue running concurrently with restarts. The client stays 
the initiator of create/destroy, so test coverage is preserved.

A side refinement was made to the group assertion loop to iterate over both 
GROUP1/GROUP2 and tolerate a group being absent on a node (all its caches 
re-created under another group during the iteration).


> Fix flaky IgniteCacheGroupsTest.testRestartsAndCacheCreateDestroy
> -----------------------------------------------------------------
>
>                 Key: IGNITE-29052
>                 URL: https://issues.apache.org/jira/browse/IGNITE-29052
>             Project: Ignite
>          Issue Type: Bug
>            Reporter: Dmitry Werner
>            Assignee: Dmitry Werner
>            Priority: Major
>          Time Spent: 10m
>  Remaining Estimate: 0h
>
> Success Rate: 21.5% (Last 107 Runs) 84 failed, 23 successful
> https://ci2.ignite.apache.org/test/7147504629922790672?currentProjectId=IgniteTests24Java8&branch=%3Cdefault%3E
> Current failure (from CI log _Apache_Ignite_2.x_Tests_Cache_3_43882.log)
> The test starts at 15:19:30 and is interrupted after the hardened 600s 
> timeout (getTestTimeout() = 10 * 60_000 overridden by suite/CI watchdog). 
> Reported failure:
>      [ERROR] 
> org.apache.ignite.internal.processors.cache.IgniteCacheGroupsTest.testRestartsAndCacheCreateDestroy
>              -- Time elapsed: 601.1 s <<< ERROR!
>      java.util.concurrent.TimeoutException: Test has been timed out 
> [test=testRestartsAndCacheCreateDestroy, timeout=600000]
>     Main thread stack (at dump time, blocked in `.get()`):
>      
> o.a.i.IgniteCacheGroupsTest.testRestartsAndCacheCreateDestroy(IgniteCacheGroupsTest.java:3865)
>          at 
> o.a.i.i.util.future.GridFutureAdapter.get(GridFutureAdapter.java:147)
>          at 
> o.a.i.i.util.future.GridFutureAdapter.get0(GridFutureAdapter.java:184)
>          at jdk.internal.misc.Unsafe.park(Native Method)
>     Cache destroy thread (`async-runnable-runner-1`) blocked in 
> `destroyCache`:
>      o.a.i.IgniteCacheGroupsTest$41.run(IgniteCacheGroupsTest.java:3791)
>          at o.a.i.i.IgniteKernal.destroyCache(IgniteKernal.java:2374)
>          at o.a.i.i.IgniteKernal.destroyCache0(IgniteKernal.java:2384)
>          at 
> o.a.i.i.util.future.GridFutureAdapter.get(GridFutureAdapter.java:147)
>          at 
> o.a.i.i.util.future.GridFutureAdapter.get0(GridFutureAdapter.java:184)
>          at java.util.concurrent.locks.LockSupport.park(Native Method)
>     All op threads (`op-thread-3..10`) parked on operation futures, e.g.:
>      
> o.a.i.IgniteCacheGroupsTest.cacheOperation(IgniteCacheGroupsTest.java:4120)  
> // put
>      
> o.a.i.IgniteCacheGroupsTest.cacheOperation(IgniteCacheGroupsTest.java:4155)  
> // putAll
>      
> o.a.i.IgniteCacheGroupsTest.cacheOperation(IgniteCacheGroupsTest.java:4145)  
> // getAll
>          at 
> o.a.i.i.processors.cache.GridCacheAdapter.syncOp(GridCacheAdapter.java:3906)
>          at 
> o.a.i.i.util.future.GridFutureAdapter.get(GridFutureAdapter.java:147)
>          at 
> o.a.i.i.util.future.GridFutureAdapter.get0(GridFutureAdapter.java:184)
>          at java.util.concurrent.locks.LockSupport.park(Native Method)
> *Root cause of the test failure*
> IgniteCacheGroupsTest#testRestartsAndCacheCreateDestroy fails not due to test 
> timeouts or hung transactions, but due to a client-initiated exchange 
> deadlock (dynamic cache change) racing against a server node restart that 
> rejoins with the same consistentId/port.
> *Mechanism:*
>      1. The client initiates a dynamic cache change (destroy/create c0) — a 
> separate distributed exchange (topVer=6.3) started from the client node.
>      2. At the same time the restart thread stops a server node (node 2, 
> consistentId=127.0.0.1:47502) and restarts it with the same 
> consistentId/port. The rejoin spawns its own chain of exchanges (NODE_LEFT, 
> NODE_JOINED, …) which merge with the client's exchange.
>      3. The client waits for the coordinator to confirm exchange 6.3 
> ("waiting for coordinator response"), but its partition single-messages are 
> never acknowledged (msgsAckedByRmt=0, recovery descriptor connected=false).
>      4. Because the client's exchange is never completed, the cluster-wide 
> merge is blocked; startGrid(2) in the restart thread hangs on await exchange, 
> and restartFut.get(...) fails with IgniteFutureTimeoutCheckedException at 
> IgniteCacheGroupsTest.java:3904.
> Key detail: the restarted node keeps its identity (consistentId/discPort), 
> which breaks the client→coordinator recovery session during the rejoin. It's 
> a race of "client-initiated dynamic-cache-change ⇄ restart of a node with the 
> same consistentId".
> *Proposed fix*
> Synchronize client create/destroy and node restarts with a shared 
> ReentrantLock restartLock in the test:
> - restart thread: lock → stopGrid/startGrid → unlock;
> - cache thread: lock → destroyCache/createCache → unlock.
> A node restart therefore executes sequentially and never overlaps an 
> in-flight client create/destroy (which is what triggers the deadlock), while 
> ordinary cache operations continue running concurrently with restarts. The 
> client stays the initiator of create/destroy, so test coverage is preserved.
> A side refinement was made to the group assertion loop to iterate over both 
> GROUP1/GROUP2 and tolerate a group being absent on a node (all its caches 
> re-created under another group during the iteration).



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to