IGNITE-6181 wip.
Project: http://git-wip-us.apache.org/repos/asf/ignite/repo Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/b0177135 Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/b0177135 Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/b0177135 Branch: refs/heads/ignite-6181-1 Commit: b01771355b697b9bd4b23ce6c807d777510b87c0 Parents: 225d4f5 Author: ascherbakoff <[email protected]> Authored: Tue Sep 12 23:03:30 2017 +0300 Committer: ascherbakoff <[email protected]> Committed: Tue Sep 12 23:03:30 2017 +0300 ---------------------------------------------------------------------- .../org/apache/ignite/IgniteTransactions.java | 3 +- .../configuration/TransactionConfiguration.java | 6 --- .../near/GridNearOptimisticTxPrepareFuture.java | 3 +- .../cache/distributed/near/GridNearTxLocal.java | 3 +- .../transactions/IgniteTransactionsImpl.java | 2 +- .../cache/transactions/IgniteTxManager.java | 7 +-- ...niteTxConfigCacheForceTxTimeoutSelfTest.java | 43 +++++++++++++++ .../cache/IgniteTxConfigCacheSelfTest.java | 2 +- .../transactions/TxRollbackOnTimeoutTest.java | 55 +++++++++++++++++++- .../ignite/testsuites/IgniteCacheTestSuite.java | 2 + .../hadoop/impl/HadoopTxConfigCacheTest.java | 2 +- 11 files changed, 110 insertions(+), 18 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ignite/blob/b0177135/modules/core/src/main/java/org/apache/ignite/IgniteTransactions.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/IgniteTransactions.java b/modules/core/src/main/java/org/apache/ignite/IgniteTransactions.java index 9da862d..dfe6a1a 100644 --- a/modules/core/src/main/java/org/apache/ignite/IgniteTransactions.java +++ b/modules/core/src/main/java/org/apache/ignite/IgniteTransactions.java @@ -77,8 +77,7 @@ public interface IgniteTransactions { * * @param concurrency Concurrency. * @param isolation Isolation. - * @param timeout Timeout. See {@link TransactionConfiguration#setDefaultTxTimeout(long)} - * for additional info on transaction timeouts. + * @param timeout Timeout. * @param txSize Number of entries participating in transaction (may be approximate). * @return New transaction. * @throws IllegalStateException If transaction is already started by this thread. http://git-wip-us.apache.org/repos/asf/ignite/blob/b0177135/modules/core/src/main/java/org/apache/ignite/configuration/TransactionConfiguration.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/configuration/TransactionConfiguration.java b/modules/core/src/main/java/org/apache/ignite/configuration/TransactionConfiguration.java index cbd2d82..0063afc 100644 --- a/modules/core/src/main/java/org/apache/ignite/configuration/TransactionConfiguration.java +++ b/modules/core/src/main/java/org/apache/ignite/configuration/TransactionConfiguration.java @@ -19,7 +19,6 @@ package org.apache.ignite.configuration; import java.io.Serializable; import javax.cache.configuration.Factory; -import org.apache.ignite.IgniteTransactions; import org.apache.ignite.transactions.Transaction; import org.apache.ignite.transactions.TransactionConcurrency; import org.apache.ignite.transactions.TransactionIsolation; @@ -182,11 +181,6 @@ public class TransactionConfiguration implements Serializable { /** * Sets default transaction timeout in milliseconds. By default this value is defined by {@link * #DFLT_TRANSACTION_TIMEOUT}. - * <p> - * If transaction's execution is not completed by calling {@link Transaction#commit()}, - * {@link Transaction#rollback()} or {@link Transaction#close()} - * before timeout expires, it will be rolled back asynchronously. All further caches operations will fail until new - * explicit transaction is started in current thread by calling {@link IgniteTransactions#txStart()}. * * @param dfltTxTimeout Default transaction timeout. * @return {@code this} for chaining. http://git-wip-us.apache.org/repos/asf/ignite/blob/b0177135/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearOptimisticTxPrepareFuture.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearOptimisticTxPrepareFuture.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearOptimisticTxPrepareFuture.java index 2c23a7a..822651c 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearOptimisticTxPrepareFuture.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearOptimisticTxPrepareFuture.java @@ -913,8 +913,7 @@ public class GridNearOptimisticTxPrepareFuture extends GridNearOptimisticTxPrepa return; if (RCV_RES_UPD.compareAndSet(this, 0, 1)) { - if (parent.cctx.tm().deadlockDetectionEnabled() && - (parent.tx.remainingTime() == -1 || res.error() instanceof IgniteTxTimeoutCheckedException)) { + if (parent.tx.remainingTime() == -1 || res.error() instanceof IgniteTxTimeoutCheckedException) { parent.onTimeout(); return; http://git-wip-us.apache.org/repos/asf/ignite/blob/b0177135/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearTxLocal.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearTxLocal.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearTxLocal.java index 2308d71..ee5797e 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearTxLocal.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearTxLocal.java @@ -4033,7 +4033,8 @@ public class GridNearTxLocal extends GridDhtTxLocalAdapter implements GridTimeou if (state(MARKED_ROLLBACK, true)) { cctx.kernalContext().closure().runLocalSafe(new Runnable() { @Override public void run() { - log().error("Transaction is timed out and will be rolled back: " + GridNearTxLocal.this); + log().error("Transaction is timed out and will be rolled back [timeout=" + timeout() + + ", tx=" + GridNearTxLocal.this + ']'); rollbackNearTxLocalAsync(); } http://git-wip-us.apache.org/repos/asf/ignite/blob/b0177135/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTransactionsImpl.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTransactionsImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTransactionsImpl.java index 997fd8c..7adfb82 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTransactionsImpl.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTransactionsImpl.java @@ -154,7 +154,7 @@ public class IgniteTransactionsImpl<K, V> implements IgniteTransactionsEx { try { GridNearTxLocal tx = cctx.tm().userTx(sysCacheCtx); - // Allow to override timed out transactions. + // Allow overriding timed out transaction. if (tx != null && !tx.timedOut()) throw new IllegalStateException("Failed to start new transaction " + "(current thread already has a transaction): " + tx); http://git-wip-us.apache.org/repos/asf/ignite/blob/b0177135/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxManager.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxManager.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxManager.java index 2214e10..db7a600 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxManager.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxManager.java @@ -1422,8 +1422,9 @@ public class IgniteTxManager extends GridCacheSharedManagerAdapter { */ private void clearThreadMap(IgniteInternalTx tx) { if (tx.local() && !tx.dht()) { - if (!tx.system() && !tx.timedOut()) - threadMap.remove(tx.threadId(), tx); + if (!tx.system()) + if (deadlockDetectionEnabled() || !tx.timedOut()) + threadMap.remove(tx.threadId(), tx); else { Integer cacheId = tx.txState().firstCacheId(); @@ -1711,7 +1712,7 @@ public class IgniteTxManager extends GridCacheSharedManagerAdapter { } /** - * Remove tx from map. + * Removes tx from map. */ public void onLocalClose(IgniteInternalTx tx) { threadMap.remove(tx.threadId(), tx); http://git-wip-us.apache.org/repos/asf/ignite/blob/b0177135/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/IgniteTxConfigCacheForceTxTimeoutSelfTest.java ---------------------------------------------------------------------- diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/IgniteTxConfigCacheForceTxTimeoutSelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/IgniteTxConfigCacheForceTxTimeoutSelfTest.java new file mode 100644 index 0000000..34a1dc5 --- /dev/null +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/IgniteTxConfigCacheForceTxTimeoutSelfTest.java @@ -0,0 +1,43 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.ignite.internal.processors.cache; + +import static org.apache.ignite.IgniteSystemProperties.IGNITE_TX_DEADLOCK_DETECTION_MAX_ITERS; + +/** + * Test checks that grid transaction configuration doesn't influence system caches. + */ +public class IgniteTxConfigCacheForceTxTimeoutSelfTest extends IgniteTxConfigCacheSelfTest { + /** {@inheritDoc} */ + @Override protected void beforeTestsStarted() throws Exception { + System.setProperty(IGNITE_TX_DEADLOCK_DETECTION_MAX_ITERS, "0"); + + super.beforeTestsStarted(); + } + + /** {@inheritDoc} */ + @Override protected void afterTestsStopped() throws Exception { + super.afterTestsStopped(); + + System.clearProperty(IGNITE_TX_DEADLOCK_DETECTION_MAX_ITERS); + } + + @Override public void testUserTxTimeout() throws Exception { + super.testUserTxTimeout(); + } +} http://git-wip-us.apache.org/repos/asf/ignite/blob/b0177135/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/IgniteTxConfigCacheSelfTest.java ---------------------------------------------------------------------- diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/IgniteTxConfigCacheSelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/IgniteTxConfigCacheSelfTest.java index f2e17e4..af09858 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/IgniteTxConfigCacheSelfTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/IgniteTxConfigCacheSelfTest.java @@ -63,7 +63,7 @@ public class IgniteTxConfigCacheSelfTest extends GridCommonAbstractTest { private static final String CACHE_NAME = "cache_name"; /** Timeout of transaction. */ - private static final long TX_TIMEOUT = 100; + private static final long TX_TIMEOUT = 300; /** {@inheritDoc} */ @Override protected IgniteConfiguration getConfiguration(String igniteInstanceName) throws Exception { http://git-wip-us.apache.org/repos/asf/ignite/blob/b0177135/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/transactions/TxRollbackOnTimeoutTest.java ---------------------------------------------------------------------- diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/transactions/TxRollbackOnTimeoutTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/transactions/TxRollbackOnTimeoutTest.java index 0a2601d..20f6695 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/transactions/TxRollbackOnTimeoutTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/transactions/TxRollbackOnTimeoutTest.java @@ -227,6 +227,59 @@ public class TxRollbackOnTimeoutTest extends GridCommonAbstractTest { } /** + * Tests if deadlock is unblocked on timeout. + * @throws Exception + */ + public void testDeadlockUnblockedOnTimeout() throws Exception { + final CountDownLatch l = new CountDownLatch(2); + + IgniteInternalFuture<?> fut1 = multithreadedAsync(new Runnable() { + @Override + public void run() { + try { + try (Transaction tx = ignite(0).transactions().txStart()) { + ignite(0).cache(CACHE_NAME).put(1, 1); + + l.countDown(); + U.awaitQuiet(l); + + ignite(0).cache(CACHE_NAME).put(2, 2); + + tx.commit(); + + fail(); + } + } catch (CacheException e) { + // No-op. + } + } + }, 1, "First"); + + IgniteInternalFuture<?> fut2 = multithreadedAsync(new Runnable() { + @Override public void run() { + U.awaitQuiet(blocked); + + try (Transaction tx = ignite(1).transactions().txStart(PESSIMISTIC, REPEATABLE_READ, TX_TIMEOUT, 1)) { + ignite(1).cache(CACHE_NAME).put(2, 2); + + l.countDown(); + U.awaitQuiet(l); + + ignite(1).cache(CACHE_NAME).put(1, 1); + + tx.commit(); + } + } + }, 1, "Second"); + + fut1.get(); + fut2.get(); + + assertTrue(ignite(0).cache(CACHE_NAME).containsKey(1)); + assertTrue(ignite(0).cache(CACHE_NAME).containsKey(2)); + } + + /** * Tests timeout object cleanup on tx commit. * * @throws Exception If failed. @@ -442,7 +495,7 @@ public class TxRollbackOnTimeoutTest extends GridCommonAbstractTest { tx.commit(); } } - }, 2, "Second"); + }, 1, "Second"); try { fut1.get(); http://git-wip-us.apache.org/repos/asf/ignite/blob/b0177135/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheTestSuite.java ---------------------------------------------------------------------- diff --git a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheTestSuite.java b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheTestSuite.java index c06647a..35331e9 100755 --- a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheTestSuite.java +++ b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheTestSuite.java @@ -102,6 +102,7 @@ import org.apache.ignite.internal.processors.cache.IgniteClientAffinityAssignmen import org.apache.ignite.internal.processors.cache.IgniteIncompleteCacheObjectSelfTest; import org.apache.ignite.internal.processors.cache.IgnitePutAllLargeBatchSelfTest; import org.apache.ignite.internal.processors.cache.IgnitePutAllUpdateNonPreloadedPartitionSelfTest; +import org.apache.ignite.internal.processors.cache.IgniteTxConfigCacheForceTxTimeoutSelfTest; import org.apache.ignite.internal.processors.cache.IgniteTxConfigCacheSelfTest; import org.apache.ignite.internal.processors.cache.context.IgniteCacheAtomicExecutionContextTest; import org.apache.ignite.internal.processors.cache.context.IgniteCacheContinuousExecutionContextTest; @@ -302,6 +303,7 @@ public class IgniteCacheTestSuite extends TestSuite { suite.addTestSuite(CachePutEventListenerErrorSelfTest.class); suite.addTestSuite(IgniteTxConfigCacheSelfTest.class); + suite.addTestSuite(IgniteTxConfigCacheForceTxTimeoutSelfTest.class); suite.addTestSuite(CacheTxFastFinishTest.class); http://git-wip-us.apache.org/repos/asf/ignite/blob/b0177135/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/impl/HadoopTxConfigCacheTest.java ---------------------------------------------------------------------- diff --git a/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/impl/HadoopTxConfigCacheTest.java b/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/impl/HadoopTxConfigCacheTest.java index e85baed..554c489 100644 --- a/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/impl/HadoopTxConfigCacheTest.java +++ b/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/impl/HadoopTxConfigCacheTest.java @@ -25,7 +25,7 @@ import org.apache.ignite.internal.util.typedef.internal.CU; /** * Test checks whether hadoop system cache doesn't use user defined TX config. */ -public class HadoopTxConfigCacheTest extends IgniteTxConfigCacheSelfTest { +public class HadoopTxConfigCacheTest extends IgniteTxConfigCacheSelfTest { /** * Success if system caches weren't timed out. *
