/** * @param wfg Wait-for-graph. */ private static void assertAllNull(Map<GridCacheVersion, Set<GridCacheVersion>> wfg, GridCacheVersion... ignore) { Set<GridCacheVersion> excl = F.asSet(ignore); for (GridCacheVersion tx : ALL) { if (!excl.contains(tx)) assertNull(tx + " could not be part of cycle", findCycle(wfg, tx)); } }
/** * Performs deadlock detection for given keys. * * @param tx Target tx. * @param keys Keys. * @return Detection result. */ public IgniteInternalFuture<TxDeadlock> detectDeadlock( IgniteInternalTx tx, Set<IgniteTxKey> keys ) { return txDeadlockDetection.detectDeadlock(tx, keys); }
EVT_NODE_FAILED, EVT_NODE_LEFT); this.txDeadlockDetection = new TxDeadlockDetection(cctx);
EVT_NODE_FAILED, EVT_NODE_LEFT); this.txDeadlockDetection = new TxDeadlockDetection(cctx);
/** * @throws Exception If failed. */ @Test public void testFindCycle4() throws Exception { Map<GridCacheVersion, Set<GridCacheVersion>> wfg = new HashMap<GridCacheVersion, Set<GridCacheVersion>>() {{ put(T1, Collections.singleton(T2)); put(T2, asLinkedHashSet(T3, T4)); put(T3, Collections.singleton(T4)); put(T4, Collections.singleton(T5)); put(T6, Collections.singleton(T3)); }}; assertNull(findCycle(wfg, T1)); }
/** * Performs deadlock detection for given keys. * * @param tx Target tx. * @param keys Keys. * @return Detection result. */ public IgniteInternalFuture<TxDeadlock> detectDeadlock( IgniteInternalTx tx, Set<IgniteTxKey> keys ) { return txDeadlockDetection.detectDeadlock(tx, keys); }
/** * @param res Response. */ private void detect(TxLocksResponse res) { assert res != null; merge(res); updateWaitForGraph(res.txLocks()); List<GridCacheVersion> cycle = findCycle(wfg, txId); if (cycle != null) onDone(new TxDeadlock(cycle, txs, txLockedKeys, txRequestedKeys)); else map(res.keys(), res.txLocks()); }
List<GridCacheVersion> cycle = findCycle(wfg, new GridCacheVersion(j, 0, 0));
}}; assertEquals(F.asList(T2, T1, T2), findCycle(wfg, T1)); assertEquals(F.asList(T1, T2, T1), findCycle(wfg, T2)); assertAllNull(wfg, T1, T2); assertEquals(F.asList(T3, T2, T3), findCycle(wfg, T1)); assertEquals(F.asList(T3, T2, T3), findCycle(wfg, T2)); assertEquals(F.asList(T2, T3, T2), findCycle(wfg, T3)); assertAllNull(wfg, T1, T2, T3); assertEquals(F.asList(T2, T1, T2), findCycle(wfg, T1)); assertEquals(F.asList(T1, T2, T1), findCycle(wfg, T2)); assertEquals(F.asList(T2, T3, T2), findCycle(wfg, T3)); assertAllNull(wfg, T1, T2, T3); assertEquals(F.asList(T2, T1, T2), findCycle(wfg, T1)); assertEquals(F.asList(T4, T3, T4), findCycle(wfg, T2)); assertEquals(F.asList(T4, T3, T4), findCycle(wfg, T3)); assertEquals(F.asList(T3, T4, T3), findCycle(wfg, T4)); assertAllNull(wfg, T1, T2, T3, T4); assertEquals(F.asList(T6, T5, T6), findCycle(wfg, T1)); assertEquals(F.asList(T6, T5, T6), findCycle(wfg, T2)); assertEquals(F.asList(T6, T5, T6), findCycle(wfg, T3)); assertEquals(F.asList(T6, T5, T6), findCycle(wfg, T4)); assertEquals(F.asList(T6, T5, T6), findCycle(wfg, T5)); assertEquals(F.asList(T5, T6, T5), findCycle(wfg, T6));
}}; assertEquals(F.asList(T3, T2, T1, T3), findCycle(wfg, T1)); assertEquals(F.asList(T1, T3, T2, T1), findCycle(wfg, T2)); assertEquals(F.asList(T2, T1, T3, T2), findCycle(wfg, T3)); assertAllNull(wfg, T1, T2, T3); }}; assertEquals(F.asList(T4, T3, T2, T4), findCycle(wfg, T1)); assertEquals(F.asList(T4, T3, T2, T4), findCycle(wfg, T2)); assertEquals(F.asList(T2, T4, T3, T2), findCycle(wfg, T3)); assertEquals(F.asList(T3, T2, T4, T3), findCycle(wfg, T4)); assertAllNull(wfg, T1, T2, T3, T4); assertEquals(F.asList(T6, T5, T4, T6), findCycle(wfg, T1)); assertEquals(F.asList(T6, T5, T4, T6), findCycle(wfg, T2)); assertEquals(F.asList(T2, T1, T3, T2), findCycle(wfg, T3)); }}; assertEquals(F.asList(T6, T5, T4, T6), findCycle(wfg, T1)); assertEquals(F.asList(T6, T5, T4, T6), findCycle(wfg, T2)); assertEquals(F.asList(T6, T5, T4, T6), findCycle(wfg, T3)); assertEquals(F.asList(T6, T5, T4, T6), findCycle(wfg, T4)); assertEquals(F.asList(T4, T6, T5, T4), findCycle(wfg, T5)); assertEquals(F.asList(T5, T4, T6, T5), findCycle(wfg, T6));
assertNull(findCycle(Collections.<GridCacheVersion, Set<GridCacheVersion>>emptyMap(), T1));
/** * @param res Response. */ private void detect(TxLocksResponse res) { assert res != null; merge(res); updateWaitForGraph(res.txLocks()); List<GridCacheVersion> cycle = findCycle(wfg, txId); if (cycle != null) onDone(new TxDeadlock(cycle, txs, txLockedKeys, txRequestedKeys)); else map(res.keys(), res.txLocks()); }