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

Reply via email to