You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by am...@apache.org on 2022/06/07 10:14:59 UTC

[ignite] 02/02: Fix wrong partition counter calculation for NOOP invoke operation on backup.

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 <an...@gmail.com>
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.