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/61dfb65f Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/61dfb65f Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/61dfb65f Branch: refs/heads/ignite-6181-1 Commit: 61dfb65f97c1d2d532d0f69b78ef4db37a727caf Parents: 7f5d80d Author: Aleksei Scherbakov <[email protected]> Authored: Tue Aug 29 20:14:31 2017 +0300 Committer: Aleksei Scherbakov <[email protected]> Committed: Tue Aug 29 20:14:31 2017 +0300 ---------------------------------------------------------------------- .../cache/distributed/near/GridNearTxLocal.java | 39 +++++++++++++++++- .../cache/transactions/IgniteTxManager.java | 43 +++++++++++++++++++- .../transactions/TxTimeoutHandlingTest.java | 4 +- 3 files changed, 81 insertions(+), 5 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ignite/blob/61dfb65f/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 2fb0ff3..ac35ad9 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 @@ -34,6 +34,7 @@ import javax.cache.CacheException; import javax.cache.expiry.ExpiryPolicy; import javax.cache.processor.EntryProcessor; import org.apache.ignite.IgniteCheckedException; +import org.apache.ignite.IgniteException; import org.apache.ignite.cluster.ClusterNode; import org.apache.ignite.internal.IgniteInternalFuture; import org.apache.ignite.internal.NodeStoppingException; @@ -67,6 +68,7 @@ import org.apache.ignite.internal.processors.cache.transactions.IgniteTxKey; import org.apache.ignite.internal.processors.cache.transactions.TransactionProxy; import org.apache.ignite.internal.processors.cache.transactions.TransactionProxyImpl; import org.apache.ignite.internal.processors.cache.version.GridCacheVersion; +import org.apache.ignite.internal.processors.timeout.GridTimeoutObject; import org.apache.ignite.internal.transactions.IgniteTxOptimisticCheckedException; import org.apache.ignite.internal.transactions.IgniteTxRollbackCheckedException; import org.apache.ignite.internal.transactions.IgniteTxTimeoutCheckedException; @@ -105,14 +107,12 @@ import static org.apache.ignite.internal.processors.cache.GridCacheOperation.TRA import static org.apache.ignite.internal.processors.cache.GridCacheOperation.UPDATE; import static org.apache.ignite.internal.processors.cache.transactions.IgniteTxEntry.SER_READ_EMPTY_ENTRY_VER; import static org.apache.ignite.internal.processors.cache.transactions.IgniteTxEntry.SER_READ_NOT_EMPTY_VER; -import static org.apache.ignite.transactions.TransactionState.ACTIVE; import static org.apache.ignite.transactions.TransactionState.COMMITTED; import static org.apache.ignite.transactions.TransactionState.COMMITTING; import static org.apache.ignite.transactions.TransactionState.PREPARED; import static org.apache.ignite.transactions.TransactionState.PREPARING; import static org.apache.ignite.transactions.TransactionState.ROLLED_BACK; import static org.apache.ignite.transactions.TransactionState.ROLLING_BACK; -import static org.apache.ignite.transactions.TransactionState.SUSPENDED; import static org.apache.ignite.transactions.TransactionState.UNKNOWN; /** @@ -175,6 +175,10 @@ public class GridNearTxLocal extends GridDhtTxLocalAdapter implements AutoClosea @GridToStringExclude private TransactionProxyImpl proxy; + /** */ + @GridToStringExclude + private GridTimeoutObject timeoutHandler; + /** * Empty constructor required for {@link Externalizable}. */ @@ -3148,6 +3152,12 @@ public class GridNearTxLocal extends GridDhtTxLocalAdapter implements AutoClosea // Prepare was called explicitly. return fut; + // Clears timeout handler before prepare, because prepare phase will clean up everything right up. + if (!clearTimeoutHandler()) { + // Timeout closure has been invoked, tx will be rolled back. + throw new IgniteException("Bad"); + } + mapExplicitLocks(); fut.prepare(); @@ -3170,6 +3180,15 @@ public class GridNearTxLocal extends GridDhtTxLocalAdapter implements AutoClosea } /** + * Clears timeout handler. + */ + public boolean clearTimeoutHandler() { + timeoutHandler = null; + + return true; + } + + /** * @return Prepare future. */ private IgniteInternalFuture<?> prepareAsync() { @@ -3250,6 +3269,8 @@ public class GridNearTxLocal extends GridDhtTxLocalAdapter implements AutoClosea * @throws IgniteCheckedException If failed. */ public void rollback() throws IgniteCheckedException { + clearTimeoutHandler(); + rollbackNearTxLocalAsync().get(); } @@ -3765,6 +3786,20 @@ public class GridNearTxLocal extends GridDhtTxLocalAdapter implements AutoClosea } /** + * @return Timeout handler. + */ + public GridTimeoutObject timeoutHandler() { + return timeoutHandler; + } + + /** + * @param timeoutHnd New timeout handler. + */ + public void timeoutHandler(GridTimeoutObject timeoutHnd) { + timeoutHandler = timeoutHnd; + } + + /** * @return Public API proxy. */ public TransactionProxy proxy() { http://git-wip-us.apache.org/repos/asf/ignite/blob/61dfb65f/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 6c59706..64624dd 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 @@ -69,6 +69,7 @@ import org.apache.ignite.internal.processors.cache.distributed.near.GridNearOpti import org.apache.ignite.internal.processors.cache.distributed.near.GridNearTxLocal; import org.apache.ignite.internal.processors.cache.transactions.TxDeadlockDetection.TxDeadlockFuture; import org.apache.ignite.internal.processors.cache.version.GridCacheVersion; +import org.apache.ignite.internal.processors.timeout.GridTimeoutObject; import org.apache.ignite.internal.processors.timeout.GridTimeoutObjectAdapter; import org.apache.ignite.internal.transactions.IgniteTxOptimisticCheckedException; import org.apache.ignite.internal.transactions.IgniteTxTimeoutCheckedException; @@ -459,7 +460,12 @@ public class IgniteTxManager extends GridCacheSharedManagerAdapter { tx.topologyVersion(topVer); } - return onCreated(sysCacheCtx, tx); + tx = onCreated(sysCacheCtx, tx); + + if (tx != null && tx.timeout() > 0) + cctx.time().addTimeoutObject(new TxEagerTimeoutObject(tx)); + + return tx; } /** @@ -2399,6 +2405,41 @@ public class IgniteTxManager extends GridCacheSharedManagerAdapter { } /** + * Timeout object for tx timeout handler. + */ + private final class TxEagerTimeoutObject extends GridTimeoutObjectAdapter { + /** */ + private final GridNearTxLocal tx; + + /** + * @param tx Tx. + */ + public TxEagerTimeoutObject(final GridNearTxLocal tx) { + super(tx.timeout()); + + this.tx = tx; + + tx.timeoutHandler(this); + } + + /** {@inheritDoc} */ + @Override public void onTimeout() { + GridTimeoutObject hnd = tx.timeoutHandler(); + + if (hnd == null) + return; + + if (!tx.clearTimeoutHandler()) // Transaction is prepared or rolled back concurrently. + return; + + log.error("Transaction is timed out and will be rolled back: [tx=" + tx + ']'); + + if (tx.setRollbackOnly()) + tx.rollbackAsync(); + } + } + + /** * Per-thread key for system transactions. */ private static class TxThreadKey { http://git-wip-us.apache.org/repos/asf/ignite/blob/61dfb65f/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/transactions/TxTimeoutHandlingTest.java ---------------------------------------------------------------------- diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/transactions/TxTimeoutHandlingTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/transactions/TxTimeoutHandlingTest.java index 2ac0f1a..8b17127 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/transactions/TxTimeoutHandlingTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/transactions/TxTimeoutHandlingTest.java @@ -130,7 +130,7 @@ public class TxTimeoutHandlingTest extends GridCommonAbstractTest { Thread.sleep(TX_TIMEOUT + 1_000); - fut2.get(1, TimeUnit.SECONDS); + fut2.get(); startGrid(1); @@ -144,4 +144,4 @@ public class TxTimeoutHandlingTest extends GridCommonAbstractTest { stopAllGrids(); } } -} +} \ No newline at end of file
