Repository: ignite Updated Branches: refs/heads/master f48759929 -> 6440e0c09
IGNITE-8863 Tx rollback can cause remote tx hang. - Fixes #4262. Signed-off-by: Ivan Rakov <ira...@apache.org> Project: http://git-wip-us.apache.org/repos/asf/ignite/repo Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/6440e0c0 Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/6440e0c0 Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/6440e0c0 Branch: refs/heads/master Commit: 6440e0c094da2bb85d99fbd6f329f52a67b2c759 Parents: f487599 Author: Aleksei Scherbakov <alexey.scherbak...@gmail.com> Authored: Thu Jul 12 12:17:56 2018 +0300 Committer: Ivan Rakov <ira...@apache.org> Committed: Thu Jul 12 12:17:56 2018 +0300 ---------------------------------------------------------------------- .../distributed/dht/GridDhtTxFinishRequest.java | 6 ++++++ .../distributed/dht/GridDhtTxPrepareRequest.java | 15 ++++++++++----- .../distributed/near/GridNearTxFinishFuture.java | 5 +---- .../distributed/near/GridNearTxFinishRequest.java | 6 ++++++ .../distributed/near/GridNearTxPrepareRequest.java | 6 ++++++ .../cache/transactions/IgniteTxHandler.java | 6 +++--- 6 files changed, 32 insertions(+), 12 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ignite/blob/6440e0c0/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtTxFinishRequest.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtTxFinishRequest.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtTxFinishRequest.java index 90f3687..823b5fe 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtTxFinishRequest.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtTxFinishRequest.java @@ -29,6 +29,7 @@ import org.apache.ignite.internal.processors.cache.version.GridCacheVersion; import org.apache.ignite.internal.util.GridLongList; import org.apache.ignite.internal.util.tostring.GridToStringInclude; import org.apache.ignite.internal.util.typedef.internal.S; +import org.apache.ignite.internal.util.typedef.internal.U; import org.apache.ignite.lang.IgniteUuid; import org.apache.ignite.plugin.extensions.communication.MessageCollectionItemType; import org.apache.ignite.plugin.extensions.communication.MessageReader; @@ -474,6 +475,11 @@ public class GridDhtTxFinishRequest extends GridDistributedTxFinishRequest { } /** {@inheritDoc} */ + @Override public int partition() { + return U.safeAbs(version().hashCode()); + } + + /** {@inheritDoc} */ @Override public String toString() { return S.toString(GridDhtTxFinishRequest.class, this, super.toString()); } http://git-wip-us.apache.org/repos/asf/ignite/blob/6440e0c0/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtTxPrepareRequest.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtTxPrepareRequest.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtTxPrepareRequest.java index 12819bf..88da7b0 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtTxPrepareRequest.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtTxPrepareRequest.java @@ -381,11 +381,6 @@ public class GridDhtTxPrepareRequest extends GridDistributedTxPrepareRequest { } /** {@inheritDoc} */ - @Override public String toString() { - return S.toString(GridDhtTxPrepareRequest.class, this, "super", super.toString()); - } - - /** {@inheritDoc} */ @Override public boolean writeTo(ByteBuffer buf, MessageWriter writer) { writer.setBuffer(buf); @@ -612,4 +607,14 @@ public class GridDhtTxPrepareRequest extends GridDistributedTxPrepareRequest { @Override public byte fieldsCount() { return 33; } + + /** {@inheritDoc} */ + @Override public int partition() { + return U.safeAbs(version().hashCode()); + } + + /** {@inheritDoc} */ + @Override public String toString() { + return S.toString(GridDhtTxPrepareRequest.class, this, "super", super.toString()); + } } http://git-wip-us.apache.org/repos/asf/ignite/blob/6440e0c0/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearTxFinishFuture.java ---------------------------------------------------------------------- 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 da8c6c8..ede8a4e 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 @@ -757,9 +757,6 @@ public final class GridNearTxFinishFuture<K, V> extends GridCacheCompoundIdentit if (m.explicitLock()) syncMode = FULL_SYNC; - // Version to be added in completed versions on primary node. - GridCacheVersion completedVer = !commit && useCompletedVer ? tx.xidVersion() : null; - GridNearTxFinishRequest req = new GridNearTxFinishRequest( futId, tx.xidVersion(), @@ -772,7 +769,7 @@ public final class GridNearTxFinishFuture<K, V> extends GridCacheCompoundIdentit m.explicitLock(), tx.storeEnabled(), tx.topologyVersion(), - completedVer, // Reuse 'baseVersion' to do not add new fields in message. + null, null, null, tx.size(), http://git-wip-us.apache.org/repos/asf/ignite/blob/6440e0c0/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearTxFinishRequest.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearTxFinishRequest.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearTxFinishRequest.java index dc32263..00c29e5 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearTxFinishRequest.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearTxFinishRequest.java @@ -26,6 +26,7 @@ import org.apache.ignite.internal.processors.affinity.AffinityTopologyVersion; import org.apache.ignite.internal.processors.cache.distributed.GridDistributedTxFinishRequest; import org.apache.ignite.internal.processors.cache.version.GridCacheVersion; import org.apache.ignite.internal.util.tostring.GridToStringBuilder; +import org.apache.ignite.internal.util.typedef.internal.U; import org.apache.ignite.lang.IgniteUuid; import org.apache.ignite.plugin.extensions.communication.MessageReader; import org.apache.ignite.plugin.extensions.communication.MessageWriter; @@ -217,6 +218,11 @@ public class GridNearTxFinishRequest extends GridDistributedTxFinishRequest { } /** {@inheritDoc} */ + @Override public int partition() { + return U.safeAbs(version().hashCode()); + } + + /** {@inheritDoc} */ @Override public String toString() { return GridToStringBuilder.toString(GridNearTxFinishRequest.class, this, "super", super.toString()); } http://git-wip-us.apache.org/repos/asf/ignite/blob/6440e0c0/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearTxPrepareRequest.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearTxPrepareRequest.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearTxPrepareRequest.java index 063eb27..a670609 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearTxPrepareRequest.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearTxPrepareRequest.java @@ -30,6 +30,7 @@ import org.apache.ignite.internal.processors.cache.transactions.IgniteTxEntry; import org.apache.ignite.internal.util.tostring.GridToStringExclude; import org.apache.ignite.internal.util.typedef.F; import org.apache.ignite.internal.util.typedef.internal.S; +import org.apache.ignite.internal.util.typedef.internal.U; import org.apache.ignite.lang.IgniteUuid; import org.apache.ignite.plugin.extensions.communication.MessageReader; import org.apache.ignite.plugin.extensions.communication.MessageWriter; @@ -416,6 +417,11 @@ public class GridNearTxPrepareRequest extends GridDistributedTxPrepareRequest { } /** {@inheritDoc} */ + @Override public int partition() { + return U.safeAbs(version().hashCode()); + } + + /** {@inheritDoc} */ @Override public String toString() { StringBuilder flags = new StringBuilder(); http://git-wip-us.apache.org/repos/asf/ignite/blob/6440e0c0/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxHandler.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxHandler.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxHandler.java index 6bfa1e8..8f2dbc0 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxHandler.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxHandler.java @@ -797,9 +797,9 @@ public class IgniteTxHandler { if (locTx != null) req.txState(locTx.txState()); - // 'baseVersion' message field is re-used for version to be added in completed versions. - if (!req.commit() && req.baseVersion() != null) - ctx.tm().addRolledbackTx(null, req.baseVersion()); + // Always add near version to rollback history to prevent races with rollbacks. + if (!req.commit()) + ctx.tm().addRolledbackTx(null, req.version()); // Transaction on local cache only. if (locTx != null && !locTx.nearLocallyMapped() && !locTx.colocatedLocallyMapped())