This is an automated email from the ASF dual-hosted git repository. amashenkov pushed a commit to branch ignite-17123 in repository https://gitbox.apache.org/repos/asf/ignite.git
commit 4a0e017525d4281df4afe5d0bfb582d885ce0781 Author: Andrew Mashenkov <[email protected]> AuthorDate: Tue Jun 7 13:14:42 2022 +0300 Fix wrong partition counter calculation for NOOP invoke operation on backup. --- .../distributed/dht/GridDhtTxPrepareFuture.java | 1 + .../cache/transactions/IgniteTxEntry.java | 25 ++++++++++++++++++---- .../cache/transactions/IgniteTxHandler.java | 3 ++- 3 files changed, 24 insertions(+), 5 deletions(-) diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtTxPrepareFuture.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtTxPrepareFuture.java index 79fde4bd5d5..a20532bce11 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtTxPrepareFuture.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtTxPrepareFuture.java @@ -498,6 +498,7 @@ public final class GridDhtTxPrepareFuture extends GridCacheCompoundFuture<Ignite } txEntry.entryProcessorCalculatedValue(new T2<>(op, op == NOOP ? null : val)); + txEntry.noop(op == NOOP); if (retVal) { if (err != null || procRes != null) diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxEntry.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxEntry.java index ff23050390a..5b8ab389e9d 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxEntry.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxEntry.java @@ -84,16 +84,19 @@ public class IgniteTxEntry implements GridPeerDeployAware, Message { public static final GridCacheVersion GET_ENTRY_INVALID_VER_AFTER_GET = new GridCacheVersion(0, 0, 3); /** Skip store flag bit mask. */ - private static final int TX_ENTRY_SKIP_STORE_FLAG_MASK = 0x01; + private static final int TX_ENTRY_SKIP_STORE_FLAG_MASK = 1; /** Keep binary flag. */ - private static final int TX_ENTRY_KEEP_BINARY_FLAG_MASK = 0x02; + private static final int TX_ENTRY_KEEP_BINARY_FLAG_MASK = 1 << 1; /** Flag indicating that old value for 'invoke' operation was non null on primary node. */ - private static final int TX_ENTRY_OLD_VAL_ON_PRIMARY = 0x04; + private static final int TX_ENTRY_OLD_VAL_ON_PRIMARY = 1 << 2; /** Flag indicating that near cache is enabled on originating node and it should be added as reader. */ - private static final int TX_ENTRY_ADD_READER_FLAG_MASK = 0x08; + private static final int TX_ENTRY_ADD_READER_FLAG_MASK = 1 << 3; + + /** Flag indicating that 'invoke' operation was no-op on primary. */ + private static final int TX_ENTRY_NOOP_ON_PRIMARY = 1 << 4; /** Prepared flag updater. */ private static final AtomicIntegerFieldUpdater<IgniteTxEntry> PREPARED_UPD = @@ -559,6 +562,20 @@ public class IgniteTxEntry implements GridPeerDeployAware, Message { return isFlag(TX_ENTRY_ADD_READER_FLAG_MASK); } + /** + * @param noop Add no-op flag. + */ + public void noop(boolean noop) { + setFlag(noop, TX_ENTRY_NOOP_ON_PRIMARY); + } + + /** + * @return {@code true} if noop flag is set, {@code false} otherwise. + */ + public boolean noop() { + return isFlag(TX_ENTRY_NOOP_ON_PRIMARY); + } + /** * Sets flag mask. * 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 9e6e0acbdb6..77bf58fa869 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 @@ -107,6 +107,7 @@ import org.jetbrains.annotations.Nullable; import static org.apache.ignite.cache.CacheWriteSynchronizationMode.FULL_SYNC; import static org.apache.ignite.internal.managers.communication.GridIoPolicy.SYSTEM_POOL; import static org.apache.ignite.internal.managers.communication.GridIoPolicy.UTILITY_CACHE_POOL; +import static org.apache.ignite.internal.processors.cache.GridCacheOperation.NOOP; import static org.apache.ignite.internal.processors.cache.GridCacheOperation.TRANSFORM; import static org.apache.ignite.internal.processors.cache.GridCacheUtils.isNearEnabled; import static org.apache.ignite.internal.processors.cache.distributed.dht.topology.GridDhtPartitionState.RENTING; @@ -1795,7 +1796,7 @@ public class IgniteTxHandler { if (reserved) { tx.addWrite(entry, ctx.deploy().globalLoader()); - if (txCounters != null) { + if (txCounters != null && entry.op() != NOOP && !(entry.op() == TRANSFORM && entry.noop())) { Long cntr = txCounters.generateNextCounter(entry.cacheId(), part); if (cntr != null) // Counter is null if entry is no-op.
