From ab5267134966b466a2d4bfba15d0c7e3ebe91139 Mon Sep 17 00:00:00 2001 From: sboikov Date: Fri, 7 Jul 2017 13:14:18 +0300 Subject: [PATCH] 2.1 More simple tx cancel on node stop --- .../processors/cache/GridCacheProcessor.java | 2 ++ .../distributed/dht/GridDhtTxFinishFuture.java | 4 +++- .../distributed/near/GridNearTxFinishFuture.java | 4 ++-- .../cache/transactions/IgniteTxAdapter.java | 4 ++-- .../cache/transactions/IgniteTxLocalAdapter.java | 15 +++++++++------ 5 files changed, 18 insertions(+), 11 deletions(-) diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheProcessor.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheProcessor.java index 716482e4d4957..321e6dd31ed6c 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheProcessor.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheProcessor.java @@ -964,6 +964,8 @@ public void blockGateways() { // No new caches should be added after this point. exch.onKernalStop(cancel); + sharedCtx.mvcc().onStop(); + for (CacheGroupContext grp : cacheGrps.values()) grp.onKernalStop(); diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtTxFinishFuture.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtTxFinishFuture.java index d8180b452f289..5311ddc84495d 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtTxFinishFuture.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtTxFinishFuture.java @@ -225,7 +225,9 @@ public void onResult(UUID nodeId, GridDhtTxFinishResponse res) { if (this.tx.onePhaseCommit() && (this.tx.state() == COMMITTING)) { try { - this.tx.tmFinish(err == null); + boolean nodeStop = err != null && X.hasCause(err, NodeStoppingException.class); + + this.tx.tmFinish(err == null, nodeStop); } catch (IgniteCheckedException finishErr) { U.error(log, "Failed to finish tx: " + tx, e); diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearTxFinishFuture.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearTxFinishFuture.java index 7f6f79337058c..c45eb7bd26178 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearTxFinishFuture.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearTxFinishFuture.java @@ -327,7 +327,7 @@ else if (err != null) finishOnePhase(commit); try { - tx.tmFinish(commit); + tx.tmFinish(commit, nodeStop); } catch (IgniteCheckedException e) { U.error(log, "Failed to finish tx: " + tx, e); @@ -338,7 +338,7 @@ else if (err != null) } if (super.onDone(tx0, err)) { - if (error() instanceof IgniteTxHeuristicCheckedException) { + if (error() instanceof IgniteTxHeuristicCheckedException && !nodeStop) { AffinityTopologyVersion topVer = tx.topologyVersion(); for (IgniteTxEntry e : tx.writeMap().values()) { diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxAdapter.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxAdapter.java index 51956ac6cd5bd..880d9b91299aa 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxAdapter.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxAdapter.java @@ -435,9 +435,9 @@ protected void uncommit(boolean nodeStopping) { break; } } - } - cctx.tm().uncommitTx(this); + cctx.tm().uncommitTx(this); + } } catch (Exception ex) { U.error(log, "Failed to do uncommit.", ex); diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxLocalAdapter.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxLocalAdapter.java index 49b67da4194b0..e7ebaaea7670d 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxLocalAdapter.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxLocalAdapter.java @@ -898,17 +898,20 @@ assert ownsLock(txEntry.cached()): * Commits transaction to transaction manager. Used for one-phase commit transactions only. * * @param commit If {@code true} commits transaction, otherwise rollbacks. + * @param nodeStop If {@code true} tx is cancelled on node stop. * @throws IgniteCheckedException If failed. */ - public void tmFinish(boolean commit) throws IgniteCheckedException { + public void tmFinish(boolean commit, boolean nodeStop) throws IgniteCheckedException { assert onePhaseCommit(); if (DONE_FLAG_UPD.compareAndSet(this, 0, 1)) { - // Unlock all locks. - if (commit) - cctx.tm().commitTx(this); - else - cctx.tm().rollbackTx(this); + if (!nodeStop) { + // Unlock all locks. + if (commit) + cctx.tm().commitTx(this); + else + cctx.tm().rollbackTx(this); + } state(commit ? COMMITTED : ROLLED_BACK);