This is an automated email from the ASF dual-hosted git repository.

tkalkirill pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/ignite-3.git


The following commit(s) were added to refs/heads/main by this push:
     new 12e58d00bc IGNITE-23357 Get rid of metastorage Entry#updateCounter 
(#4507)
12e58d00bc is described below

commit 12e58d00bcaecf9e27f43e763bd2f60e2a042cf1
Author: Kirill Tkalenko <[email protected]>
AuthorDate: Fri Oct 4 14:59:16 2024 +0300

    IGNITE-23357 Get rid of metastorage Entry#updateCounter (#4507)
---
 .../DistributionZoneRebalanceEngineTest.java       |   2 +-
 .../apache/ignite/internal/metastorage/Entry.java  |   9 --
 .../metastorage/TestMetasStorageUtils.java         |   7 +-
 .../ItMetaStorageMultipleNodesVsStorageTest.java   |   4 +-
 .../impl/ItMetaStorageServicePersistenceTest.java  |  13 +-
 .../metastorage/impl/ItMetaStorageServiceTest.java |   3 -
 .../server/raft/ItMetaStorageRaftGroupTest.java    |   2 -
 .../internal/metastorage/impl/EntryImpl.java       |  27 +---
 .../metastorage/server/KeyValueStorage.java        |   7 -
 .../ignite/internal/metastorage/server/Value.java  |  11 +-
 .../server/persistence/RocksDbKeyValueStorage.java | 134 +++++------------
 .../server/persistence/RocksStorageUtils.java      |  20 +--
 .../internal/metastorage/impl/EntryImplTest.java   |   4 +-
 .../metastorage/server/AndConditionTest.java       |   6 +-
 .../server/BasicOperationsKeyValueStorageTest.java | 160 ---------------------
 .../metastorage/server/ExistenceConditionTest.java |   4 +-
 .../metastorage/server/OrConditionTest.java        |   6 +-
 .../metastorage/server/RevisionConditionTest.java  |  16 +--
 .../metastorage/server/TombstoneConditionTest.java |   4 +-
 .../metastorage/server/ValueConditionTest.java     |  28 ++--
 .../metastorage/server/WatchProcessorTest.java     |  26 ++--
 .../server/SimpleInMemoryKeyValueStorage.java      |  42 ++----
 .../SimpleInMemoryKeyValueStorageSnapshot.java     |   4 -
 .../internal/metastorage/server/ValueSnapshot.java |   5 +-
 .../internal/placementdriver/LeaseTrackerTest.java |   4 +-
 .../internal/placementdriver/LeaseUpdaterTest.java |   1 -
 26 files changed, 115 insertions(+), 434 deletions(-)

diff --git 
a/modules/distribution-zones/src/test/java/org/apache/ignite/internal/distributionzones/rebalance/DistributionZoneRebalanceEngineTest.java
 
b/modules/distribution-zones/src/test/java/org/apache/ignite/internal/distributionzones/rebalance/DistributionZoneRebalanceEngineTest.java
index 51fdf95f94..4b07a4591c 100644
--- 
a/modules/distribution-zones/src/test/java/org/apache/ignite/internal/distributionzones/rebalance/DistributionZoneRebalanceEngineTest.java
+++ 
b/modules/distribution-zones/src/test/java/org/apache/ignite/internal/distributionzones/rebalance/DistributionZoneRebalanceEngineTest.java
@@ -542,7 +542,7 @@ public class DistributionZoneRebalanceEngineTest extends 
IgniteAbstractTest {
             newLogicalTopology = null;
         }
 
-        Entry newEntry = new EntryImpl(zoneDataNodesKey(zoneId).bytes(), 
newLogicalTopology, rev, 1, clock.now());
+        Entry newEntry = new EntryImpl(zoneDataNodesKey(zoneId).bytes(), 
newLogicalTopology, rev, clock.now());
 
         EntryEvent entryEvent = new EntryEvent(null, newEntry);
 
diff --git 
a/modules/metastorage-api/src/main/java/org/apache/ignite/internal/metastorage/Entry.java
 
b/modules/metastorage-api/src/main/java/org/apache/ignite/internal/metastorage/Entry.java
index 7f15c716db..007c3aebc2 100644
--- 
a/modules/metastorage-api/src/main/java/org/apache/ignite/internal/metastorage/Entry.java
+++ 
b/modules/metastorage-api/src/main/java/org/apache/ignite/internal/metastorage/Entry.java
@@ -29,8 +29,6 @@ import org.jetbrains.annotations.Nullable;
  *     <li>key - an unique entry's key. Keys are comparable in lexicographic 
manner.</li>
  *     <li>value - a data which is associated with a key and represented as an 
array of bytes.</li>
  *     <li>revision - a number which denotes a version of whole meta storage. 
Each change increments the revision.</li>
- *     <li>updateCounter - a number which denotes a number of times entries in 
the meta storage have been updated. Each change increments
- *     the updateCounter.</li>
  *     <li>timestamp - a timestamp of execution of the operation that changed 
the entry in the meta storage. ach change increments the
  *     timestamp.</li>
  * </ul>
@@ -49,13 +47,6 @@ public interface Entry extends Serializable {
      */
     long revision();
 
-    /**
-     * Returns the metastorage update counter in which the entry was created, 
{@code 0} for an {@link #empty empty entry}.
-     *
-     * <p>Update counter increases both when one key and each key in the batch 
are changed under one revision.</p>
-     */
-    long updateCounter();
-
     /** Returns {@code true} if entry is empty (never existed or was destroyed 
by the compaction), otherwise - {@code false}. */
     boolean empty();
 
diff --git 
a/modules/metastorage/src/integrationTest/java/org/apache/ignite/internal/metastorage/TestMetasStorageUtils.java
 
b/modules/metastorage/src/integrationTest/java/org/apache/ignite/internal/metastorage/TestMetasStorageUtils.java
index a9e5474497..bb55ddc9d5 100644
--- 
a/modules/metastorage/src/integrationTest/java/org/apache/ignite/internal/metastorage/TestMetasStorageUtils.java
+++ 
b/modules/metastorage/src/integrationTest/java/org/apache/ignite/internal/metastorage/TestMetasStorageUtils.java
@@ -31,9 +31,8 @@ public class TestMetasStorageUtils {
     public static final HybridTimestamp ANY_TIMESTAMP = new 
HybridTimestamp(1L, 0);
 
     /** Checks the metastore entry. */
-    public static void checkEntry(Entry actEntry, byte[] expKey, byte 
@Nullable [] expValue, long expRevision, long expUpdateCounter) {
+    public static void checkEntry(Entry actEntry, byte[] expKey, byte 
@Nullable [] expValue, long expRevision) {
         assertEquals(expRevision, actEntry.revision(), () -> "entry=" + 
actEntry);
-        assertEquals(expUpdateCounter, actEntry.updateCounter(), () -> 
"entry=" + actEntry);
         assertArrayEquals(expKey, actEntry.key(), () -> "entry=" + actEntry);
         assertArrayEquals(expValue, actEntry.value(), () -> "entry=" + 
actEntry);
     }
@@ -44,10 +43,6 @@ public class TestMetasStorageUtils {
             return false;
         }
 
-        if (act.updateCounter() != exp.updateCounter()) {
-            return false;
-        }
-
         if (act.timestamp() != ANY_TIMESTAMP && exp.timestamp() != 
ANY_TIMESTAMP) {
             if (!Objects.equals(act.timestamp(), exp.timestamp())) {
                 return false;
diff --git 
a/modules/metastorage/src/integrationTest/java/org/apache/ignite/internal/metastorage/impl/ItMetaStorageMultipleNodesVsStorageTest.java
 
b/modules/metastorage/src/integrationTest/java/org/apache/ignite/internal/metastorage/impl/ItMetaStorageMultipleNodesVsStorageTest.java
index ee38859fc4..d334257776 100644
--- 
a/modules/metastorage/src/integrationTest/java/org/apache/ignite/internal/metastorage/impl/ItMetaStorageMultipleNodesVsStorageTest.java
+++ 
b/modules/metastorage/src/integrationTest/java/org/apache/ignite/internal/metastorage/impl/ItMetaStorageMultipleNodesVsStorageTest.java
@@ -124,8 +124,8 @@ abstract class ItMetaStorageMultipleNodesVsStorageTest 
extends ItMetaStorageMult
 
         assertThat(awaitFuture, willCompleteSuccessfully());
 
-        checkEntry(awaitFuture.join().oldEntry(), key.bytes(), value, 1, 1);
-        checkEntry(awaitFuture.join().newEntry(), key.bytes(), newValue, 2, 3);
+        checkEntry(awaitFuture.join().oldEntry(), key.bytes(), value, 1);
+        checkEntry(awaitFuture.join().newEntry(), key.bytes(), newValue, 2);
 
         // Check that the second node has been registered as a learner.
         assertThat(firstNode.getMetaStorageLearners(), 
willBe(Set.of(secondNode.name())));
diff --git 
a/modules/metastorage/src/integrationTest/java/org/apache/ignite/internal/metastorage/impl/ItMetaStorageServicePersistenceTest.java
 
b/modules/metastorage/src/integrationTest/java/org/apache/ignite/internal/metastorage/impl/ItMetaStorageServicePersistenceTest.java
index 48c5586e29..875c8457ef 100644
--- 
a/modules/metastorage/src/integrationTest/java/org/apache/ignite/internal/metastorage/impl/ItMetaStorageServicePersistenceTest.java
+++ 
b/modules/metastorage/src/integrationTest/java/org/apache/ignite/internal/metastorage/impl/ItMetaStorageServicePersistenceTest.java
@@ -93,7 +93,7 @@ public class ItMetaStorageServicePersistenceTest extends 
ItAbstractListenerSnaps
         assertThat(metaStorage.put(FIRST_KEY, FIRST_VALUE), 
willCompleteSuccessfully());
 
         // Check that data has been written successfully
-        checkEntry(FIRST_KEY.bytes(), FIRST_VALUE, 1, 1);
+        checkEntry(FIRST_KEY.bytes(), FIRST_VALUE, 1);
     }
 
     @Override
@@ -110,13 +110,13 @@ public class ItMetaStorageServicePersistenceTest extends 
ItAbstractListenerSnaps
         assertThat(metaStorage.remove(FIRST_KEY), willCompleteSuccessfully());
 
         // Check that data has been removed
-        checkEntry(FIRST_KEY.bytes(), null, 2, 2);
+        checkEntry(FIRST_KEY.bytes(), null, 2);
 
         // Put same data again
         assertThat(metaStorage.put(FIRST_KEY, FIRST_VALUE), 
willCompleteSuccessfully());
 
         // Check that it has been written
-        checkEntry(FIRST_KEY.bytes(), FIRST_VALUE, 3, 3);
+        checkEntry(FIRST_KEY.bytes(), FIRST_VALUE, 3);
     }
 
     @Override
@@ -134,9 +134,8 @@ public class ItMetaStorageServicePersistenceTest extends 
ItAbstractListenerSnaps
         byte[] lastValue = interactedAfterSnapshot ? SECOND_VALUE : 
FIRST_VALUE;
 
         int expectedRevision = interactedAfterSnapshot ? 4 : 3;
-        int expectedUpdateCounter = interactedAfterSnapshot ? 4 : 3;
 
-        Entry expectedLastEntry = new EntryImpl(lastKey, lastValue, 
expectedRevision, expectedUpdateCounter, ANY_TIMESTAMP);
+        Entry expectedLastEntry = new EntryImpl(lastKey, lastValue, 
expectedRevision, ANY_TIMESTAMP);
 
         return () -> TestMetasStorageUtils.equals(storage.get(lastKey), 
expectedLastEntry);
     }
@@ -171,12 +170,12 @@ public class ItMetaStorageServicePersistenceTest extends 
ItAbstractListenerSnaps
         return new 
ThreadLocalOptimizedMarshaller(clusterService.serializationRegistry());
     }
 
-    private void checkEntry(byte[] expKey, byte @Nullable [] expValue, long 
expRevision, long expUpdateCounter) {
+    private void checkEntry(byte[] expKey, byte @Nullable [] expValue, long 
expRevision) {
         CompletableFuture<Entry> future = metaStorage.get(new 
ByteArray(expKey));
 
         assertThat(future, willCompleteSuccessfully());
 
-        TestMetasStorageUtils.checkEntry(future.join(), expKey, expValue, 
expRevision, expUpdateCounter);
+        TestMetasStorageUtils.checkEntry(future.join(), expKey, expValue, 
expRevision);
     }
 
     private static ClusterNode getNode(RaftServer server) {
diff --git 
a/modules/metastorage/src/integrationTest/java/org/apache/ignite/internal/metastorage/impl/ItMetaStorageServiceTest.java
 
b/modules/metastorage/src/integrationTest/java/org/apache/ignite/internal/metastorage/impl/ItMetaStorageServiceTest.java
index 0ca65e4edc..7e06ecc851 100644
--- 
a/modules/metastorage/src/integrationTest/java/org/apache/ignite/internal/metastorage/impl/ItMetaStorageServiceTest.java
+++ 
b/modules/metastorage/src/integrationTest/java/org/apache/ignite/internal/metastorage/impl/ItMetaStorageServiceTest.java
@@ -145,7 +145,6 @@ public class ItMetaStorageServiceTest extends 
BaseIgniteAbstractTest {
             new byte[]{1},
             new byte[]{2},
             10,
-            2,
             ANY_TIMESTAMP
     );
 
@@ -164,7 +163,6 @@ public class ItMetaStorageServiceTest extends 
BaseIgniteAbstractTest {
                 new byte[]{1},
                 new byte[]{2},
                 10,
-                2,
                 ANY_TIMESTAMP
         );
 
@@ -174,7 +172,6 @@ public class ItMetaStorageServiceTest extends 
BaseIgniteAbstractTest {
                 new byte[]{3},
                 new byte[]{4},
                 10,
-                3,
                 ANY_TIMESTAMP
         );
 
diff --git 
a/modules/metastorage/src/integrationTest/java/org/apache/ignite/internal/metastorage/server/raft/ItMetaStorageRaftGroupTest.java
 
b/modules/metastorage/src/integrationTest/java/org/apache/ignite/internal/metastorage/server/raft/ItMetaStorageRaftGroupTest.java
index 72476742bc..920ab7bdf1 100644
--- 
a/modules/metastorage/src/integrationTest/java/org/apache/ignite/internal/metastorage/server/raft/ItMetaStorageRaftGroupTest.java
+++ 
b/modules/metastorage/src/integrationTest/java/org/apache/ignite/internal/metastorage/server/raft/ItMetaStorageRaftGroupTest.java
@@ -115,7 +115,6 @@ public class ItMetaStorageRaftGroupTest extends 
IgniteAbstractTest {
                     new byte[]{1},
                     new byte[]{2},
                     10,
-                    2,
                     ANY_TIMESTAMP
             );
 
@@ -125,7 +124,6 @@ public class ItMetaStorageRaftGroupTest extends 
IgniteAbstractTest {
                     new byte[]{3},
                     new byte[]{4},
                     11,
-                    3,
                     ANY_TIMESTAMP
             );
 
diff --git 
a/modules/metastorage/src/main/java/org/apache/ignite/internal/metastorage/impl/EntryImpl.java
 
b/modules/metastorage/src/main/java/org/apache/ignite/internal/metastorage/impl/EntryImpl.java
index 8aceb58f41..8646bdbc60 100644
--- 
a/modules/metastorage/src/main/java/org/apache/ignite/internal/metastorage/impl/EntryImpl.java
+++ 
b/modules/metastorage/src/main/java/org/apache/ignite/internal/metastorage/impl/EntryImpl.java
@@ -35,16 +35,13 @@ public final class EntryImpl implements Entry {
 
     private final long revision;
 
-    private final long updateCounter;
-
     private final @Nullable HybridTimestamp timestamp;
 
     /** Constructor. */
-    public EntryImpl(byte[] key, byte @Nullable [] value, long revision, long 
updateCounter, @Nullable HybridTimestamp timestamp) {
+    public EntryImpl(byte[] key, byte @Nullable [] value, long revision, 
@Nullable HybridTimestamp timestamp) {
         this.key = key;
         this.value = value;
         this.revision = revision;
-        this.updateCounter = updateCounter;
         this.timestamp = timestamp;
     }
 
@@ -63,11 +60,6 @@ public final class EntryImpl implements Entry {
         return revision;
     }
 
-    @Override
-    public long updateCounter() {
-        return updateCounter;
-    }
-
     @Override
     public @Nullable HybridTimestamp timestamp() {
         return timestamp;
@@ -75,22 +67,22 @@ public final class EntryImpl implements Entry {
 
     @Override
     public boolean tombstone() {
-        return value == null && revision > 0 && updateCounter > 0;
+        return value == null && timestamp != null;
     }
 
     /** Creates an instance of tombstone entry. */
-    public static Entry tombstone(byte[] key, long revision, long 
updateCounter, HybridTimestamp timestamp) {
-        return new EntryImpl(key, null, revision, updateCounter, timestamp);
+    public static Entry tombstone(byte[] key, long revision, HybridTimestamp 
timestamp) {
+        return new EntryImpl(key, null, revision, timestamp);
     }
 
     @Override
     public boolean empty() {
-        return value == null && revision == 0 && updateCounter == 0;
+        return timestamp == null;
     }
 
     /** Creates an instance of empty entry for a given key. */
     public static Entry empty(byte[] key) {
-        return new EntryImpl(key, null, 0, 0, null);
+        return new EntryImpl(key, null, 0, null);
     }
 
     @Override
@@ -109,10 +101,6 @@ public final class EntryImpl implements Entry {
             return false;
         }
 
-        if (updateCounter != entry.updateCounter) {
-            return false;
-        }
-
         if (!Objects.equals(timestamp, entry.timestamp)) {
             return false;
         }
@@ -132,8 +120,6 @@ public final class EntryImpl implements Entry {
 
         res = 31 * res + (int) (revision ^ (revision >>> 32));
 
-        res = 31 * res + (int) (updateCounter ^ (updateCounter >>> 32));
-
         res = 31 * res + Objects.hashCode(timestamp);
 
         return res;
@@ -145,7 +131,6 @@ public final class EntryImpl implements Entry {
                 + "key=" + new String(key, UTF_8)
                 + ", value=" + Arrays.toString(value)
                 + ", revision=" + revision
-                + ", updateCounter=" + updateCounter
                 + ", timestamp=" + timestamp
                 + '}';
     }
diff --git 
a/modules/metastorage/src/main/java/org/apache/ignite/internal/metastorage/server/KeyValueStorage.java
 
b/modules/metastorage/src/main/java/org/apache/ignite/internal/metastorage/server/KeyValueStorage.java
index 06dc9f7178..d3cf016875 100644
--- 
a/modules/metastorage/src/main/java/org/apache/ignite/internal/metastorage/server/KeyValueStorage.java
+++ 
b/modules/metastorage/src/main/java/org/apache/ignite/internal/metastorage/server/KeyValueStorage.java
@@ -55,13 +55,6 @@ public interface KeyValueStorage extends ManuallyCloseable {
      */
     long revision();
 
-    /**
-     * Returns update counter.
-     *
-     * @return Update counter.
-     */
-    long updateCounter();
-
     /**
      * Returns an entry by the given key.
      *
diff --git 
a/modules/metastorage/src/main/java/org/apache/ignite/internal/metastorage/server/Value.java
 
b/modules/metastorage/src/main/java/org/apache/ignite/internal/metastorage/server/Value.java
index 7acf9d5c3d..962eb0eb27 100644
--- 
a/modules/metastorage/src/main/java/org/apache/ignite/internal/metastorage/server/Value.java
+++ 
b/modules/metastorage/src/main/java/org/apache/ignite/internal/metastorage/server/Value.java
@@ -26,20 +26,16 @@ public class Value {
 
     private final byte[] bytes;
 
-    private final long updateCounter;
-
     private final HybridTimestamp operationTimestamp;
 
     /**
      * Constructs value.
      *
      * @param bytes Value bytes or {@code #TOMBSTONE}.
-     * @param updateCounter Storage update counter when value changes.
      * @param operationTimestamp Timestamp of the value change operation.
      */
-    public Value(byte[] bytes, long updateCounter, HybridTimestamp 
operationTimestamp) {
+    public Value(byte[] bytes, HybridTimestamp operationTimestamp) {
         this.bytes = bytes;
-        this.updateCounter = updateCounter;
         this.operationTimestamp = operationTimestamp;
     }
 
@@ -48,11 +44,6 @@ public class Value {
         return bytes;
     }
 
-    /** Returns Storage update counter when value changes. */
-    public long updateCounter() {
-        return updateCounter;
-    }
-
     /** Returns the timestamp of the value change operation. */
     public HybridTimestamp operationTimestamp() {
         return operationTimestamp;
diff --git 
a/modules/metastorage/src/main/java/org/apache/ignite/internal/metastorage/server/persistence/RocksDbKeyValueStorage.java
 
b/modules/metastorage/src/main/java/org/apache/ignite/internal/metastorage/server/persistence/RocksDbKeyValueStorage.java
index 31d50fab0d..24150794fb 100644
--- 
a/modules/metastorage/src/main/java/org/apache/ignite/internal/metastorage/server/persistence/RocksDbKeyValueStorage.java
+++ 
b/modules/metastorage/src/main/java/org/apache/ignite/internal/metastorage/server/persistence/RocksDbKeyValueStorage.java
@@ -124,12 +124,12 @@ import org.rocksdb.WriteBatch;
 import org.rocksdb.WriteOptions;
 
 /**
- * Key-value storage based on RocksDB. Keys are stored with revision. Values 
are stored in the default column family with an update counter
- * and a boolean flag which represents whether this record is a tombstone.
+ * Key-value storage based on RocksDB. Keys are stored with revision. Values 
are stored in the default column family with an operation
+ * timestamp and a boolean flag which represents whether this record is a 
tombstone.
  * <br>
  * Key: [8 bytes revision, N bytes key itself].
  * <br>
- * Value: [8 bytes update counter, 1 byte tombstone flag, N bytes value].
+ * Value: [8 bytes operation timestamp, 1 byte tombstone flag, N bytes value].
  * <br>
  * The mapping from the key to the set of the storage's revisions is stored in 
the "index" column family. A key represents the key of an
  * entry and the value is a {@code byte[]} that represents a {@code long[]} 
where every item is a revision of the storage.
@@ -146,12 +146,6 @@ public class RocksDbKeyValueStorage implements 
KeyValueStorage {
             "SYSTEM_REVISION_KEY".getBytes(UTF_8)
     );
 
-    /** Update counter key. */
-    private static final byte[] UPDATE_COUNTER_KEY = keyToRocksKey(
-            SYSTEM_REVISION_MARKER_VALUE,
-            "SYSTEM_UPDATE_COUNTER_KEY".getBytes(UTF_8)
-    );
-
     /** Compaction revision key. */
     private static final byte[] COMPACTION_REVISION_KEY = keyToRocksKey(
             SYSTEM_REVISION_MARKER_VALUE,
@@ -211,13 +205,6 @@ public class RocksDbKeyValueStorage implements 
KeyValueStorage {
      */
     private long rev;
 
-    /**
-     * Update counter. Will be incremented for each update of any particular 
entry.
-     *
-     * <p>Multi-threaded access is guarded by {@link #rwLock}.</p>
-     */
-    private long updCntr;
-
     /**
      * Last compaction revision that was set or restored from a snapshot.
      *
@@ -337,7 +324,7 @@ public class RocksDbKeyValueStorage implements 
KeyValueStorage {
         );
     }
 
-    protected DBOptions createDbOptions() {
+    private DBOptions createDbOptions() {
         DBOptions options = new DBOptions()
                 .setCreateMissingColumnFamilies(true)
                 .setCreateIfMissing(true);
@@ -347,7 +334,7 @@ public class RocksDbKeyValueStorage implements 
KeyValueStorage {
         return options;
     }
 
-    protected void createDb() throws RocksDBException {
+    private void createDb() throws RocksDBException {
         List<ColumnFamilyDescriptor> descriptors = cfDescriptors();
 
         assert descriptors.size() == 4;
@@ -452,8 +439,6 @@ public class RocksDbKeyValueStorage implements 
KeyValueStorage {
 
             rev = bytesToLong(data.get(REVISION_KEY));
 
-            updCntr = bytesToLong(data.get(UPDATE_COUNTER_KEY));
-
             byte[] compactionRevisionBytes = data.get(COMPACTION_REVISION_KEY);
 
             if (compactionRevisionBytes != null) {
@@ -479,17 +464,6 @@ public class RocksDbKeyValueStorage implements 
KeyValueStorage {
         }
     }
 
-    @Override
-    public long updateCounter() {
-        rwLock.readLock().lock();
-
-        try {
-            return updCntr;
-        } finally {
-            rwLock.readLock().unlock();
-        }
-    }
-
     @Override
     public void put(byte[] key, byte[] value, HybridTimestamp opTs) {
         rwLock.writeLock().lock();
@@ -497,13 +471,11 @@ public class RocksDbKeyValueStorage implements 
KeyValueStorage {
         try (WriteBatch batch = new WriteBatch()) {
             long curRev = rev + 1;
 
-            long cntr = updCntr + 1;
-
-            addDataToBatch(batch, key, value, curRev, cntr, opTs);
+            addDataToBatch(batch, key, value, curRev, opTs);
 
             updateKeysIndex(batch, key, curRev);
 
-            fillAndWriteBatch(batch, curRev, cntr, opTs);
+            fillAndWriteBatch(batch, curRev, opTs);
         } catch (RocksDBException e) {
             throw new MetaStorageException(OP_EXECUTION_ERR, e);
         } finally {
@@ -531,18 +503,16 @@ public class RocksDbKeyValueStorage implements 
KeyValueStorage {
     }
 
     /**
-     * Fills the batch with system values (the update counter and the 
revision) and writes it to the db.
+     * Fills the batch with system values and writes it to the db.
      *
-     * @param batch   Write batch.
-     * @param newRev  New revision.
-     * @param newCntr New update counter.
-     * @param ts      Operation's timestamp.
+     * @param batch Write batch.
+     * @param newRev New revision.
+     * @param ts Operation's timestamp.
      * @throws RocksDBException If failed.
      */
-    private void fillAndWriteBatch(WriteBatch batch, long newRev, long 
newCntr, @Nullable HybridTimestamp ts) throws RocksDBException {
+    private void fillAndWriteBatch(WriteBatch batch, long newRev, @Nullable 
HybridTimestamp ts) throws RocksDBException {
         byte[] revisionBytes = longToBytes(newRev);
 
-        data.put(batch, UPDATE_COUNTER_KEY, longToBytes(newCntr));
         data.put(batch, REVISION_KEY, revisionBytes);
 
         if (ts != null) {
@@ -555,7 +525,6 @@ public class RocksDbKeyValueStorage implements 
KeyValueStorage {
         db.write(defaultWriteOptions, batch);
 
         rev = newRev;
-        updCntr = newCntr;
 
         updatedEntries.ts = ts;
 
@@ -570,8 +539,8 @@ public class RocksDbKeyValueStorage implements 
KeyValueStorage {
 
     private static Entry entry(byte[] key, long revision, Value value) {
         return value.tombstone()
-                ? EntryImpl.tombstone(key, revision, value.updateCounter(), 
value.operationTimestamp())
-                : new EntryImpl(key, value.bytes(), revision, 
value.updateCounter(), value.operationTimestamp());
+                ? EntryImpl.tombstone(key, revision, 
value.operationTimestamp())
+                : new EntryImpl(key, value.bytes(), revision, 
value.operationTimestamp());
     }
 
     @Override
@@ -581,13 +550,13 @@ public class RocksDbKeyValueStorage implements 
KeyValueStorage {
         try (WriteBatch batch = new WriteBatch()) {
             long curRev = rev + 1;
 
-            long counter = addAllToBatch(batch, keys, values, curRev, opTs);
+            addAllToBatch(batch, keys, values, curRev, opTs);
 
             for (byte[] key : keys) {
                 updateKeysIndex(batch, key, curRev);
             }
 
-            fillAndWriteBatch(batch, curRev, counter, opTs);
+            fillAndWriteBatch(batch, curRev, opTs);
         } catch (RocksDBException e) {
             throw new MetaStorageException(OP_EXECUTION_ERR, e);
         } finally {
@@ -656,12 +625,11 @@ public class RocksDbKeyValueStorage implements 
KeyValueStorage {
 
         try (WriteBatch batch = new WriteBatch()) {
             long curRev = rev + 1;
-            long counter = updCntr + 1;
 
-            if (addToBatchForRemoval(batch, key, curRev, counter, opTs)) {
+            if (addToBatchForRemoval(batch, key, curRev, opTs)) {
                 updateKeysIndex(batch, key, curRev);
 
-                fillAndWriteBatch(batch, curRev, counter, opTs);
+                fillAndWriteBatch(batch, curRev, opTs);
             }
         } catch (RocksDBException e) {
             throw new MetaStorageException(OP_EXECUTION_ERR, e);
@@ -679,13 +647,9 @@ public class RocksDbKeyValueStorage implements 
KeyValueStorage {
 
             List<byte[]> existingKeys = new ArrayList<>(keys.size());
 
-            long counter = updCntr;
-
             for (byte[] key : keys) {
-                if (addToBatchForRemoval(batch, key, curRev, counter + 1, 
opTs)) {
+                if (addToBatchForRemoval(batch, key, curRev, opTs)) {
                     existingKeys.add(key);
-
-                    counter++;
                 }
             }
 
@@ -693,7 +657,7 @@ public class RocksDbKeyValueStorage implements 
KeyValueStorage {
                 updateKeysIndex(batch, key, curRev);
             }
 
-            fillAndWriteBatch(batch, curRev, counter, opTs);
+            fillAndWriteBatch(batch, curRev, opTs);
         } catch (RocksDBException e) {
             throw new MetaStorageException(OP_EXECUTION_ERR, e);
         } finally {
@@ -782,8 +746,6 @@ public class RocksDbKeyValueStorage implements 
KeyValueStorage {
 
         boolean modified = false;
 
-        long counter = updCntr;
-
         List<byte[]> updatedKeys = new ArrayList<>();
 
         try (WriteBatch batch = new WriteBatch()) {
@@ -792,9 +754,7 @@ public class RocksDbKeyValueStorage implements 
KeyValueStorage {
 
                 switch (op.type()) {
                     case PUT:
-                        counter++;
-
-                        addDataToBatch(batch, key, toByteArray(op.value()), 
curRev, counter, opTs);
+                        addDataToBatch(batch, key, toByteArray(op.value()), 
curRev, opTs);
 
                         updatedKeys.add(key);
 
@@ -803,13 +763,9 @@ public class RocksDbKeyValueStorage implements 
KeyValueStorage {
                         break;
 
                     case REMOVE:
-                        counter++;
-
-                        boolean removed = addToBatchForRemoval(batch, key, 
curRev, counter, opTs);
+                        boolean removed = addToBatchForRemoval(batch, key, 
curRev, opTs);
 
-                        if (!removed) {
-                            counter--;
-                        } else {
+                        if (removed) {
                             updatedKeys.add(key);
                         }
 
@@ -830,7 +786,7 @@ public class RocksDbKeyValueStorage implements 
KeyValueStorage {
                     updateKeysIndex(batch, key, curRev);
                 }
 
-                fillAndWriteBatch(batch, curRev, counter, opTs);
+                fillAndWriteBatch(batch, curRev, opTs);
             }
         }
     }
@@ -1056,7 +1012,6 @@ public class RocksDbKeyValueStorage implements 
KeyValueStorage {
      * @param batch Write batch.
      * @param key Target key.
      * @param curRev Revision.
-     * @param counter Update counter.
      * @param opTs Operation timestamp.
      * @return {@code true} if an entry can be deleted.
      * @throws RocksDBException If failed.
@@ -1065,7 +1020,6 @@ public class RocksDbKeyValueStorage implements 
KeyValueStorage {
             WriteBatch batch,
             byte[] key,
             long curRev,
-            long counter,
             HybridTimestamp opTs
     ) throws RocksDBException {
         Entry e = doGet(key, curRev);
@@ -1074,7 +1028,7 @@ public class RocksDbKeyValueStorage implements 
KeyValueStorage {
             return false;
         }
 
-        addDataToBatch(batch, key, TOMBSTONE, curRev, counter, opTs);
+        addDataToBatch(batch, key, TOMBSTONE, curRev, opTs);
 
         return true;
     }
@@ -1319,10 +1273,10 @@ public class RocksDbKeyValueStorage implements 
KeyValueStorage {
         Value lastVal = bytesToValue(valueBytes);
 
         if (lastVal.tombstone()) {
-            return EntryImpl.tombstone(key, revision, lastVal.updateCounter(), 
lastVal.operationTimestamp());
+            return EntryImpl.tombstone(key, revision, 
lastVal.operationTimestamp());
         }
 
-        return new EntryImpl(key, lastVal.bytes(), revision, 
lastVal.updateCounter(), lastVal.operationTimestamp());
+        return new EntryImpl(key, lastVal.bytes(), revision, 
lastVal.operationTimestamp());
     }
 
     /**
@@ -1332,7 +1286,6 @@ public class RocksDbKeyValueStorage implements 
KeyValueStorage {
      * @param key Key.
      * @param value Value.
      * @param curRev Revision.
-     * @param cntr Update counter.
      * @param opTs Operation timestamp.
      * @throws RocksDBException If failed.
      */
@@ -1341,59 +1294,40 @@ public class RocksDbKeyValueStorage implements 
KeyValueStorage {
             byte[] key,
             byte[] value,
             long curRev,
-            long cntr,
             HybridTimestamp opTs
     ) throws RocksDBException {
         byte[] rocksKey = keyToRocksKey(curRev, key);
 
-        byte[] rocksValue = valueToBytes(value, cntr, opTs);
+        byte[] rocksValue = valueToBytes(value, opTs);
 
         data.put(batch, rocksKey, rocksValue);
 
-        updatedEntries.add(entry(key, curRev, new Value(value, cntr, opTs)));
+        updatedEntries.add(entry(key, curRev, new Value(value, opTs)));
     }
 
     /**
      * Adds all entries to the batch.
      *
-     * @param batch  Write batch.
-     * @param keys   Keys.
+     * @param batch Write batch.
+     * @param keys Keys.
      * @param values Values.
      * @param curRev Revision.
      * @param opTs Operation timestamp.
-     * @return New update counter value.
      * @throws RocksDBException If failed.
      */
-    private long addAllToBatch(
+    private void addAllToBatch(
             WriteBatch batch,
             List<byte[]> keys,
             List<byte[]> values,
             long curRev,
             HybridTimestamp opTs
     ) throws RocksDBException {
-        long counter = this.updCntr;
-
         for (int i = 0; i < keys.size(); i++) {
-            counter++;
-
             byte[] key = keys.get(i);
-
             byte[] bytes = values.get(i);
 
-            addDataToBatch(batch, key, bytes, curRev, counter, opTs);
+            addDataToBatch(batch, key, bytes, curRev, opTs);
         }
-
-        return counter;
-    }
-
-    /**
-     * Gets last revision from the list.
-     *
-     * @param revs Revisions.
-     * @return Last revision.
-     */
-    private static long lastRevision(long[] revs) {
-        return revs[revs.length - 1];
     }
 
     /**
@@ -1577,7 +1511,7 @@ public class RocksDbKeyValueStorage implements 
KeyValueStorage {
         @Nullable
         private HybridTimestamp ts;
 
-        public UpdatedEntries() {
+        private UpdatedEntries() {
             this.updatedEntries = new ArrayList<>();
         }
 
diff --git 
a/modules/metastorage/src/main/java/org/apache/ignite/internal/metastorage/server/persistence/RocksStorageUtils.java
 
b/modules/metastorage/src/main/java/org/apache/ignite/internal/metastorage/server/persistence/RocksStorageUtils.java
index 57115a2ea8..d4e19e1333 100644
--- 
a/modules/metastorage/src/main/java/org/apache/ignite/internal/metastorage/server/persistence/RocksStorageUtils.java
+++ 
b/modules/metastorage/src/main/java/org/apache/ignite/internal/metastorage/server/persistence/RocksStorageUtils.java
@@ -133,15 +133,11 @@ class RocksStorageUtils {
 
     /** Converts from a byte array to a {@link Value}. */
     static Value bytesToValue(byte[] valueBytes) {
-        // At least an 8-byte update counter, 8-bytes operation timestamp and 
a 1-byte boolean.
-        assert valueBytes.length > 2 * Long.BYTES;
+        // At least an 8-bytes operation timestamp and a 1-byte boolean.
+        assert valueBytes.length > Long.BYTES;
 
         var pos = 0;
 
-        // Read an update counter (8-byte long) from the entry.
-        long updateCounter = (long) LONG_ARRAY_HANDLE.get(valueBytes, pos);
-        pos += Long.BYTES;
-
         // Read an operation timestamp (8-byte long) from the entry.
         long operationTimestamp = (long) LONG_ARRAY_HANDLE.get(valueBytes, 
pos);
         pos += Long.BYTES;
@@ -157,24 +153,20 @@ class RocksStorageUtils {
             val = TOMBSTONE;
         }
 
-        return new Value(val, updateCounter, 
hybridTimestamp(operationTimestamp));
+        return new Value(val, hybridTimestamp(operationTimestamp));
     }
 
     /**
      * Converts the contents of a {@link Value} to a byte array.
      *
      * @param value Value byte array.
-     * @param updateCounter Update counter.
      * @param operationTimestamp Operation timestamp.
-     * @return Value with an update counter and a tombstone.
+     * @return Value bytes.
      */
-    static byte[] valueToBytes(byte[] value, long updateCounter, 
HybridTimestamp operationTimestamp) {
-        var bytes = new byte[Long.BYTES + Long.BYTES + Byte.BYTES + 
value.length];
+    static byte[] valueToBytes(byte[] value, HybridTimestamp 
operationTimestamp) {
+        var bytes = new byte[Long.BYTES + Byte.BYTES + value.length];
         var pos = 0;
 
-        LONG_ARRAY_HANDLE.set(bytes, pos, updateCounter);
-        pos += Long.BYTES;
-
         LONG_ARRAY_HANDLE.set(bytes, pos, operationTimestamp.longValue());
         pos += Long.BYTES;
 
diff --git 
a/modules/metastorage/src/test/java/org/apache/ignite/internal/metastorage/impl/EntryImplTest.java
 
b/modules/metastorage/src/test/java/org/apache/ignite/internal/metastorage/impl/EntryImplTest.java
index 93824b46ff..a30f6fd29f 100644
--- 
a/modules/metastorage/src/test/java/org/apache/ignite/internal/metastorage/impl/EntryImplTest.java
+++ 
b/modules/metastorage/src/test/java/org/apache/ignite/internal/metastorage/impl/EntryImplTest.java
@@ -39,7 +39,6 @@ public class EntryImplTest {
         assertFalse(entry.tombstone());
 
         assertEquals(0, entry.revision());
-        assertEquals(0, entry.updateCounter());
 
         assertArrayEquals(KEY, entry.key());
 
@@ -49,13 +48,12 @@ public class EntryImplTest {
 
     @Test
     void testTombstone() {
-        Entry entry = EntryImpl.tombstone(KEY, 1, 2, hybridTimestamp(10L));
+        Entry entry = EntryImpl.tombstone(KEY, 1, hybridTimestamp(10L));
 
         assertFalse(entry.empty());
         assertTrue(entry.tombstone());
 
         assertEquals(1, entry.revision());
-        assertEquals(2, entry.updateCounter());
         assertEquals(hybridTimestamp(10L), entry.timestamp());
 
         assertArrayEquals(KEY, entry.key());
diff --git 
a/modules/metastorage/src/test/java/org/apache/ignite/internal/metastorage/server/AndConditionTest.java
 
b/modules/metastorage/src/test/java/org/apache/ignite/internal/metastorage/server/AndConditionTest.java
index 939dd88a0c..4a3bf7293d 100644
--- 
a/modules/metastorage/src/test/java/org/apache/ignite/internal/metastorage/server/AndConditionTest.java
+++ 
b/modules/metastorage/src/test/java/org/apache/ignite/internal/metastorage/server/AndConditionTest.java
@@ -50,9 +50,9 @@ public class AndConditionTest extends BaseIgniteAbstractTest {
     private final HybridClock clock = new HybridClockImpl();
 
     private final Entry[] entries = {
-            new EntryImpl(new byte[]{1}, new byte[]{10}, 1, 1, clock.now()),
-            new EntryImpl(new byte[]{2}, new byte[]{20}, 2, 3, clock.now()),
-            new EntryImpl(new byte[]{3}, new byte[]{30}, 3, 4, clock.now()),
+            new EntryImpl(new byte[]{1}, new byte[]{10}, 1, clock.now()),
+            new EntryImpl(new byte[]{2}, new byte[]{20}, 2, clock.now()),
+            new EntryImpl(new byte[]{3}, new byte[]{30}, 3, clock.now()),
     };
 
     @BeforeEach
diff --git 
a/modules/metastorage/src/test/java/org/apache/ignite/internal/metastorage/server/BasicOperationsKeyValueStorageTest.java
 
b/modules/metastorage/src/test/java/org/apache/ignite/internal/metastorage/server/BasicOperationsKeyValueStorageTest.java
index f1e6f7b57d..5709bc2d9c 100644
--- 
a/modules/metastorage/src/test/java/org/apache/ignite/internal/metastorage/server/BasicOperationsKeyValueStorageTest.java
+++ 
b/modules/metastorage/src/test/java/org/apache/ignite/internal/metastorage/server/BasicOperationsKeyValueStorageTest.java
@@ -91,32 +91,27 @@ public abstract class BasicOperationsKeyValueStorageTest 
extends AbstractKeyValu
         byte[] val = keyValue(1, 1);
 
         assertEquals(0, storage.revision());
-        assertEquals(0, storage.updateCounter());
         assertTrue(storage.get(key).empty());
 
         putToMs(key, val);
 
         assertEquals(1, storage.revision());
-        assertEquals(1, storage.updateCounter());
 
         Entry e = storage.get(key);
 
         assertFalse(e.empty());
         assertFalse(e.tombstone());
         assertEquals(1, e.revision());
-        assertEquals(1, e.updateCounter());
 
         putToMs(key, val);
 
         assertEquals(2, storage.revision());
-        assertEquals(2, storage.updateCounter());
 
         e = storage.get(key);
 
         assertFalse(e.empty());
         assertFalse(e.tombstone());
         assertEquals(2, e.revision());
-        assertEquals(2, e.updateCounter());
     }
 
     @Test
@@ -134,7 +129,6 @@ public abstract class BasicOperationsKeyValueStorageTest 
extends AbstractKeyValu
         byte[] key4 = key(4);
 
         assertEquals(0, storage.revision());
-        assertEquals(0, storage.updateCounter());
 
         // Regular put.
         putToMs(key1, val1);
@@ -148,14 +142,12 @@ public abstract class BasicOperationsKeyValueStorageTest 
extends AbstractKeyValu
         removeFromMs(key3);
 
         assertEquals(5, storage.revision());
-        assertEquals(5, storage.updateCounter());
 
         // Bounded by revision 2.
         Entry key1EntryBounded2 = storage.get(key1, 2);
 
         assertNotNull(key1EntryBounded2);
         assertEquals(1, key1EntryBounded2.revision());
-        assertEquals(1, key1EntryBounded2.updateCounter());
         assertArrayEquals(val1, key1EntryBounded2.value());
         assertFalse(key1EntryBounded2.tombstone());
         assertFalse(key1EntryBounded2.empty());
@@ -164,7 +156,6 @@ public abstract class BasicOperationsKeyValueStorageTest 
extends AbstractKeyValu
 
         assertNotNull(key2EntryBounded2);
         assertEquals(2, key2EntryBounded2.revision());
-        assertEquals(2, key2EntryBounded2.updateCounter());
         assertArrayEquals(val21, key2EntryBounded2.value());
         assertFalse(key2EntryBounded2.tombstone());
         assertFalse(key2EntryBounded2.empty());
@@ -173,7 +164,6 @@ public abstract class BasicOperationsKeyValueStorageTest 
extends AbstractKeyValu
 
         assertNotNull(key3EntryBounded2);
         assertEquals(0, key3EntryBounded2.revision());
-        assertEquals(0, key3EntryBounded2.updateCounter());
         assertNull(key3EntryBounded2.value());
         assertFalse(key3EntryBounded2.tombstone());
         assertTrue(key3EntryBounded2.empty());
@@ -183,7 +173,6 @@ public abstract class BasicOperationsKeyValueStorageTest 
extends AbstractKeyValu
 
         assertNotNull(key1EntryBounded5);
         assertEquals(1, key1EntryBounded5.revision());
-        assertEquals(1, key1EntryBounded5.updateCounter());
         assertArrayEquals(val1, key1EntryBounded5.value());
         assertFalse(key1EntryBounded5.tombstone());
         assertFalse(key1EntryBounded5.empty());
@@ -192,7 +181,6 @@ public abstract class BasicOperationsKeyValueStorageTest 
extends AbstractKeyValu
 
         assertNotNull(key2EntryBounded5);
         assertEquals(3, key2EntryBounded5.revision());
-        assertEquals(3, key2EntryBounded5.updateCounter());
         assertArrayEquals(val22, key2EntryBounded5.value());
         assertFalse(key2EntryBounded5.tombstone());
         assertFalse(key2EntryBounded5.empty());
@@ -201,7 +189,6 @@ public abstract class BasicOperationsKeyValueStorageTest 
extends AbstractKeyValu
 
         assertNotNull(key3EntryBounded5);
         assertEquals(5, key3EntryBounded5.revision());
-        assertEquals(5, key3EntryBounded5.updateCounter());
         assertTrue(key3EntryBounded5.tombstone());
         assertNull(key3EntryBounded5.value());
         assertFalse(key3EntryBounded5.empty());
@@ -223,7 +210,6 @@ public abstract class BasicOperationsKeyValueStorageTest 
extends AbstractKeyValu
         byte[] val9 = keyValue(1, 9);
 
         assertEquals(0, storage.revision());
-        assertEquals(0, storage.updateCounter());
 
         putToMs(key1, val1);
         putToMs(key1, val2);
@@ -238,7 +224,6 @@ public abstract class BasicOperationsKeyValueStorageTest 
extends AbstractKeyValu
         removeFromMs(key1);
 
         assertEquals(10, storage.revision());
-        assertEquals(10, storage.updateCounter());
 
         // Check that a lower revision and an upper revision are inclusive.
         // Check that entry with another key is not included in a result list.
@@ -303,7 +288,6 @@ public abstract class BasicOperationsKeyValueStorageTest 
extends AbstractKeyValu
         byte[] key4 = key(4);
 
         assertEquals(0, storage.revision());
-        assertEquals(0, storage.updateCounter());
 
         // Regular put.
         putToMs(key1, val1);
@@ -317,7 +301,6 @@ public abstract class BasicOperationsKeyValueStorageTest 
extends AbstractKeyValu
         removeFromMs(key3);
 
         assertEquals(5, storage.revision());
-        assertEquals(5, storage.updateCounter());
 
         Collection<Entry> entries = storage.getAll(List.of(key1, key2, key3, 
key4));
 
@@ -330,7 +313,6 @@ public abstract class BasicOperationsKeyValueStorageTest 
extends AbstractKeyValu
 
         assertNotNull(e1);
         assertEquals(1, e1.revision());
-        assertEquals(1, e1.updateCounter());
         assertFalse(e1.tombstone());
         assertFalse(e1.empty());
         assertArrayEquals(val1, e1.value());
@@ -340,7 +322,6 @@ public abstract class BasicOperationsKeyValueStorageTest 
extends AbstractKeyValu
 
         assertNotNull(e2);
         assertEquals(3, e2.revision());
-        assertEquals(3, e2.updateCounter());
         assertFalse(e2.tombstone());
         assertFalse(e2.empty());
         assertArrayEquals(val22, e2.value());
@@ -350,7 +331,6 @@ public abstract class BasicOperationsKeyValueStorageTest 
extends AbstractKeyValu
 
         assertNotNull(e3);
         assertEquals(5, e3.revision());
-        assertEquals(5, e3.updateCounter());
         assertTrue(e3.tombstone());
         assertFalse(e3.empty());
 
@@ -377,7 +357,6 @@ public abstract class BasicOperationsKeyValueStorageTest 
extends AbstractKeyValu
         byte[] key4 = key(4);
 
         assertEquals(0, storage.revision());
-        assertEquals(0, storage.updateCounter());
 
         // Regular put.
         putToMs(key1, val1);
@@ -391,7 +370,6 @@ public abstract class BasicOperationsKeyValueStorageTest 
extends AbstractKeyValu
         removeFromMs(key3);
 
         assertEquals(5, storage.revision());
-        assertEquals(5, storage.updateCounter());
 
         // Bounded by revision 2.
         Collection<Entry> entries = storage.getAll(List.of(key1, key2, key3, 
key4), 2);
@@ -405,7 +383,6 @@ public abstract class BasicOperationsKeyValueStorageTest 
extends AbstractKeyValu
 
         assertNotNull(e1);
         assertEquals(1, e1.revision());
-        assertEquals(1, e1.updateCounter());
         assertFalse(e1.tombstone());
         assertFalse(e1.empty());
         assertArrayEquals(val1, e1.value());
@@ -415,7 +392,6 @@ public abstract class BasicOperationsKeyValueStorageTest 
extends AbstractKeyValu
 
         assertNotNull(e2);
         assertEquals(2, e2.revision());
-        assertEquals(2, e2.updateCounter());
         assertFalse(e2.tombstone());
         assertFalse(e2.empty());
         assertArrayEquals(val21, e2.value());
@@ -443,7 +419,6 @@ public abstract class BasicOperationsKeyValueStorageTest 
extends AbstractKeyValu
 
         assertNotNull(e1);
         assertEquals(1, e1.revision());
-        assertEquals(1, e1.updateCounter());
         assertFalse(e1.tombstone());
         assertFalse(e1.empty());
         assertArrayEquals(val1, e1.value());
@@ -453,7 +428,6 @@ public abstract class BasicOperationsKeyValueStorageTest 
extends AbstractKeyValu
 
         assertNotNull(e2);
         assertEquals(3, e2.revision());
-        assertEquals(3, e2.updateCounter());
         assertFalse(e2.tombstone());
         assertFalse(e2.empty());
         assertArrayEquals(val22, e2.value());
@@ -463,7 +437,6 @@ public abstract class BasicOperationsKeyValueStorageTest 
extends AbstractKeyValu
 
         assertNotNull(e3);
         assertEquals(4, e3.revision());
-        assertEquals(4, e3.updateCounter());
         assertFalse(e3.tombstone());
         assertFalse(e3.empty());
         assertArrayEquals(val3, e3.value());
@@ -491,7 +464,6 @@ public abstract class BasicOperationsKeyValueStorageTest 
extends AbstractKeyValu
         byte[] key4 = key(4);
 
         assertEquals(0, storage.revision());
-        assertEquals(0, storage.updateCounter());
 
         // Must be rewritten.
         putToMs(key2, val21);
@@ -501,12 +473,10 @@ public abstract class BasicOperationsKeyValueStorageTest 
extends AbstractKeyValu
         removeFromMs(key3);
 
         assertEquals(3, storage.revision());
-        assertEquals(3, storage.updateCounter());
 
         putAllToMs(List.of(key1, key2, key3), List.of(val1, val22, val32));
 
         assertEquals(4, storage.revision());
-        assertEquals(6, storage.updateCounter());
 
         Collection<Entry> entries = storage.getAll(List.of(key1, key2, key3, 
key4));
 
@@ -519,7 +489,6 @@ public abstract class BasicOperationsKeyValueStorageTest 
extends AbstractKeyValu
 
         assertNotNull(e1);
         assertEquals(4, e1.revision());
-        assertEquals(4, e1.updateCounter());
         assertFalse(e1.tombstone());
         assertFalse(e1.empty());
         assertArrayEquals(val1, e1.value());
@@ -529,7 +498,6 @@ public abstract class BasicOperationsKeyValueStorageTest 
extends AbstractKeyValu
 
         assertNotNull(e2);
         assertEquals(4, e2.revision());
-        assertEquals(5, e2.updateCounter());
         assertFalse(e2.tombstone());
         assertFalse(e2.empty());
         assertArrayEquals(val22, e2.value());
@@ -539,7 +507,6 @@ public abstract class BasicOperationsKeyValueStorageTest 
extends AbstractKeyValu
 
         assertNotNull(e3);
         assertEquals(4, e3.revision());
-        assertEquals(6, e3.updateCounter());
         assertFalse(e3.tombstone());
         assertFalse(e3.empty());
 
@@ -557,46 +524,39 @@ public abstract class BasicOperationsKeyValueStorageTest 
extends AbstractKeyValu
         byte[] val = keyValue(1, 1);
 
         assertEquals(0, storage.revision());
-        assertEquals(0, storage.updateCounter());
         assertTrue(storage.get(key).empty());
 
         // Remove non-existent entry.
         removeFromMs(key);
 
         assertEquals(0, storage.revision());
-        assertEquals(0, storage.updateCounter());
         assertTrue(storage.get(key).empty());
 
         putToMs(key, val);
 
         assertEquals(1, storage.revision());
-        assertEquals(1, storage.updateCounter());
 
         // Remove existent entry.
         removeFromMs(key);
 
         assertEquals(2, storage.revision());
-        assertEquals(2, storage.updateCounter());
 
         Entry e = storage.get(key);
 
         assertFalse(e.empty());
         assertTrue(e.tombstone());
         assertEquals(2, e.revision());
-        assertEquals(2, e.updateCounter());
 
         // Remove already removed entry (tombstone can't be removed).
         removeFromMs(key);
 
         assertEquals(2, storage.revision());
-        assertEquals(2, storage.updateCounter());
 
         e = storage.get(key);
 
         assertFalse(e.empty());
         assertTrue(e.tombstone());
         assertEquals(2, e.revision());
-        assertEquals(2, e.updateCounter());
     }
 
     @Test
@@ -614,7 +574,6 @@ public abstract class BasicOperationsKeyValueStorageTest 
extends AbstractKeyValu
         byte[] key4 = key(4);
 
         assertEquals(0, storage.revision());
-        assertEquals(0, storage.updateCounter());
 
         // Regular put.
         putToMs(key1, val1);
@@ -628,12 +587,10 @@ public abstract class BasicOperationsKeyValueStorageTest 
extends AbstractKeyValu
         removeFromMs(key3);
 
         assertEquals(5, storage.revision());
-        assertEquals(5, storage.updateCounter());
 
         removeAllFromMs(List.of(key1, key2, key3, key4));
 
         assertEquals(6, storage.revision());
-        assertEquals(7, storage.updateCounter()); // Only two keys are updated.
 
         Collection<Entry> entries = storage.getAll(List.of(key1, key2, key3, 
key4));
 
@@ -646,7 +603,6 @@ public abstract class BasicOperationsKeyValueStorageTest 
extends AbstractKeyValu
 
         assertNotNull(e1);
         assertEquals(6, e1.revision());
-        assertEquals(6, e1.updateCounter());
         assertTrue(e1.tombstone());
         assertFalse(e1.empty());
 
@@ -655,7 +611,6 @@ public abstract class BasicOperationsKeyValueStorageTest 
extends AbstractKeyValu
 
         assertNotNull(e2);
         assertEquals(6, e2.revision());
-        assertEquals(7, e2.updateCounter());
         assertTrue(e2.tombstone());
         assertFalse(e2.empty());
 
@@ -664,7 +619,6 @@ public abstract class BasicOperationsKeyValueStorageTest 
extends AbstractKeyValu
 
         assertNotNull(e3);
         assertEquals(5, e3.revision());
-        assertEquals(5, e3.updateCounter());
         assertTrue(e3.tombstone());
         assertFalse(e3.empty());
 
@@ -689,12 +643,10 @@ public abstract class BasicOperationsKeyValueStorageTest 
extends AbstractKeyValu
         byte[] val3 = keyValue(3, 3);
 
         assertEquals(0, storage.revision());
-        assertEquals(0, storage.updateCounter());
 
         putToMs(key1, val11);
 
         assertEquals(1, storage.revision());
-        assertEquals(1, storage.updateCounter());
 
         boolean branch = invokeOnMs(
                 new RevisionCondition(RevisionCondition.Type.EQUAL, key1, 1),
@@ -705,14 +657,12 @@ public abstract class BasicOperationsKeyValueStorageTest 
extends AbstractKeyValu
         // "Success" branch is applied.
         assertTrue(branch);
         assertEquals(2, storage.revision());
-        assertEquals(4, storage.updateCounter());
 
         Entry e1 = storage.get(key1);
 
         assertFalse(e1.empty());
         assertFalse(e1.tombstone());
         assertEquals(2, e1.revision());
-        assertEquals(2, e1.updateCounter());
         assertArrayEquals(val12, e1.value());
 
         Entry e2 = storage.get(key2);
@@ -720,7 +670,6 @@ public abstract class BasicOperationsKeyValueStorageTest 
extends AbstractKeyValu
         assertFalse(e2.empty());
         assertFalse(e2.tombstone());
         assertEquals(2, e2.revision());
-        assertEquals(3, e2.updateCounter());
         assertArrayEquals(val2, e2.value());
 
         // "Failure" branch isn't applied.
@@ -742,12 +691,10 @@ public abstract class BasicOperationsKeyValueStorageTest 
extends AbstractKeyValu
         byte[] val3 = keyValue(3, 3);
 
         assertEquals(0, storage.revision());
-        assertEquals(0, storage.updateCounter());
 
         putToMs(key1, val11);
 
         assertEquals(1, storage.revision());
-        assertEquals(1, storage.updateCounter());
 
         boolean branch = invokeOnMs(
                 new RevisionCondition(RevisionCondition.Type.EQUAL, key1, 2),
@@ -758,14 +705,12 @@ public abstract class BasicOperationsKeyValueStorageTest 
extends AbstractKeyValu
         // "Failure" branch is applied.
         assertFalse(branch);
         assertEquals(2, storage.revision());
-        assertEquals(4, storage.updateCounter());
 
         Entry e1 = storage.get(key1);
 
         assertFalse(e1.empty());
         assertFalse(e1.tombstone());
         assertEquals(2, e1.revision());
-        assertEquals(2, e1.updateCounter());
         assertArrayEquals(val12, e1.value());
 
         Entry e2 = storage.get(key2);
@@ -773,7 +718,6 @@ public abstract class BasicOperationsKeyValueStorageTest 
extends AbstractKeyValu
         assertFalse(e2.empty());
         assertFalse(e2.tombstone());
         assertEquals(2, e2.revision());
-        assertEquals(3, e2.updateCounter());
         assertArrayEquals(val2, e2.value());
 
         // "Success" branch isn't applied.
@@ -795,12 +739,10 @@ public abstract class BasicOperationsKeyValueStorageTest 
extends AbstractKeyValu
         byte[] val3 = keyValue(3, 3);
 
         assertEquals(0, storage.revision());
-        assertEquals(0, storage.updateCounter());
 
         putToMs(key1, val11);
 
         assertEquals(1, storage.revision());
-        assertEquals(1, storage.updateCounter());
 
         boolean branch = invokeOnMs(
                 new ExistenceCondition(ExistenceCondition.Type.EXISTS, key1),
@@ -811,14 +753,12 @@ public abstract class BasicOperationsKeyValueStorageTest 
extends AbstractKeyValu
         // "Success" branch is applied.
         assertTrue(branch);
         assertEquals(2, storage.revision());
-        assertEquals(4, storage.updateCounter());
 
         Entry e1 = storage.get(key1);
 
         assertFalse(e1.empty());
         assertFalse(e1.tombstone());
         assertEquals(2, e1.revision());
-        assertEquals(2, e1.updateCounter());
         assertArrayEquals(val12, e1.value());
 
         Entry e2 = storage.get(key2);
@@ -826,7 +766,6 @@ public abstract class BasicOperationsKeyValueStorageTest 
extends AbstractKeyValu
         assertFalse(e2.empty());
         assertFalse(e2.tombstone());
         assertEquals(2, e2.revision());
-        assertEquals(3, e2.updateCounter());
         assertArrayEquals(val2, e2.value());
 
         // "Failure" branch isn't applied.
@@ -848,12 +787,10 @@ public abstract class BasicOperationsKeyValueStorageTest 
extends AbstractKeyValu
         byte[] val3 = keyValue(3, 3);
 
         assertEquals(0, storage.revision());
-        assertEquals(0, storage.updateCounter());
 
         putToMs(key1, val11);
 
         assertEquals(1, storage.revision());
-        assertEquals(1, storage.updateCounter());
 
         boolean branch = invokeOnMs(
                 new ExistenceCondition(ExistenceCondition.Type.EXISTS, key3),
@@ -864,14 +801,12 @@ public abstract class BasicOperationsKeyValueStorageTest 
extends AbstractKeyValu
         // "Failure" branch is applied.
         assertFalse(branch);
         assertEquals(2, storage.revision());
-        assertEquals(4, storage.updateCounter());
 
         Entry e1 = storage.get(key1);
 
         assertFalse(e1.empty());
         assertFalse(e1.tombstone());
         assertEquals(2, e1.revision());
-        assertEquals(2, e1.updateCounter());
         assertArrayEquals(val12, e1.value());
 
         Entry e2 = storage.get(key2);
@@ -879,7 +814,6 @@ public abstract class BasicOperationsKeyValueStorageTest 
extends AbstractKeyValu
         assertFalse(e2.empty());
         assertFalse(e2.tombstone());
         assertEquals(2, e2.revision());
-        assertEquals(3, e2.updateCounter());
         assertArrayEquals(val2, e2.value());
 
         // "Success" branch isn't applied.
@@ -901,12 +835,10 @@ public abstract class BasicOperationsKeyValueStorageTest 
extends AbstractKeyValu
         byte[] val3 = keyValue(3, 3);
 
         assertEquals(0, storage.revision());
-        assertEquals(0, storage.updateCounter());
 
         putToMs(key1, val11);
 
         assertEquals(1, storage.revision());
-        assertEquals(1, storage.updateCounter());
 
         boolean branch = invokeOnMs(
                 new ExistenceCondition(ExistenceCondition.Type.NOT_EXISTS, 
key2),
@@ -917,14 +849,12 @@ public abstract class BasicOperationsKeyValueStorageTest 
extends AbstractKeyValu
         // "Success" branch is applied.
         assertTrue(branch);
         assertEquals(2, storage.revision());
-        assertEquals(4, storage.updateCounter());
 
         Entry e1 = storage.get(key1);
 
         assertFalse(e1.empty());
         assertFalse(e1.tombstone());
         assertEquals(2, e1.revision());
-        assertEquals(2, e1.updateCounter());
         assertArrayEquals(val12, e1.value());
 
         Entry e2 = storage.get(key2);
@@ -932,7 +862,6 @@ public abstract class BasicOperationsKeyValueStorageTest 
extends AbstractKeyValu
         assertFalse(e2.empty());
         assertFalse(e2.tombstone());
         assertEquals(2, e2.revision());
-        assertEquals(3, e2.updateCounter());
         assertArrayEquals(val2, e2.value());
 
         // "Failure" branch isn't applied.
@@ -954,12 +883,10 @@ public abstract class BasicOperationsKeyValueStorageTest 
extends AbstractKeyValu
         byte[] val3 = keyValue(3, 3);
 
         assertEquals(0, storage.revision());
-        assertEquals(0, storage.updateCounter());
 
         putToMs(key1, val11);
 
         assertEquals(1, storage.revision());
-        assertEquals(1, storage.updateCounter());
 
         boolean branch = invokeOnMs(
                 new ExistenceCondition(ExistenceCondition.Type.NOT_EXISTS, 
key1),
@@ -973,14 +900,12 @@ public abstract class BasicOperationsKeyValueStorageTest 
extends AbstractKeyValu
         // "Failure" branch is applied.
         assertFalse(branch);
         assertEquals(2, storage.revision());
-        assertEquals(4, storage.updateCounter());
 
         Entry e1 = storage.get(key1);
 
         assertFalse(e1.empty());
         assertFalse(e1.tombstone());
         assertEquals(2, e1.revision());
-        assertEquals(2, e1.updateCounter());
         assertArrayEquals(val12, e1.value());
 
         Entry e2 = storage.get(key2);
@@ -988,7 +913,6 @@ public abstract class BasicOperationsKeyValueStorageTest 
extends AbstractKeyValu
         assertFalse(e2.empty());
         assertFalse(e2.tombstone());
         assertEquals(2, e2.revision());
-        assertEquals(3, e2.updateCounter());
         assertArrayEquals(val2, e2.value());
 
         // "Success" branch isn't applied.
@@ -1009,13 +933,11 @@ public abstract class BasicOperationsKeyValueStorageTest 
extends AbstractKeyValu
         byte[] val3 = keyValue(3, 3);
 
         assertEquals(0, storage.revision());
-        assertEquals(0, storage.updateCounter());
 
         putToMs(key1, val11);
         removeFromMs(key1); // Should be tombstone after remove.
 
         assertEquals(2, storage.revision());
-        assertEquals(2, storage.updateCounter());
 
         boolean branch = invokeOnMs(
                 new TombstoneCondition(TombstoneCondition.Type.TOMBSTONE, 
key1),
@@ -1026,14 +948,12 @@ public abstract class BasicOperationsKeyValueStorageTest 
extends AbstractKeyValu
         // "Success" branch is applied.
         assertTrue(branch);
         assertEquals(3, storage.revision());
-        assertEquals(4, storage.updateCounter());
 
         Entry e1 = storage.get(key1);
 
         assertFalse(e1.empty());
         assertTrue(e1.tombstone());
         assertEquals(2, e1.revision());
-        assertEquals(2, e1.updateCounter());
         assertNull(e1.value());
 
         Entry e2 = storage.get(key2);
@@ -1041,7 +961,6 @@ public abstract class BasicOperationsKeyValueStorageTest 
extends AbstractKeyValu
         assertFalse(e2.empty());
         assertFalse(e2.tombstone());
         assertEquals(3, e2.revision());
-        assertEquals(3, e2.updateCounter());
         assertArrayEquals(val2, e2.value());
 
         // "Failure" branch isn't applied.
@@ -1062,12 +981,10 @@ public abstract class BasicOperationsKeyValueStorageTest 
extends AbstractKeyValu
         byte[] val3 = keyValue(3, 3);
 
         assertEquals(0, storage.revision());
-        assertEquals(0, storage.updateCounter());
 
         putToMs(key1, val11);
 
         assertEquals(1, storage.revision());
-        assertEquals(1, storage.updateCounter());
 
         boolean branch = invokeOnMs(
                 new TombstoneCondition(TombstoneCondition.Type.TOMBSTONE, 
key1),
@@ -1078,14 +995,12 @@ public abstract class BasicOperationsKeyValueStorageTest 
extends AbstractKeyValu
         // "Failure" branch is applied.
         assertFalse(branch);
         assertEquals(2, storage.revision());
-        assertEquals(3, storage.updateCounter());
 
         Entry e1 = storage.get(key1);
 
         assertFalse(e1.empty());
         assertFalse(e1.tombstone());
         assertEquals(1, e1.revision());
-        assertEquals(1, e1.updateCounter());
         assertArrayEquals(val11, e1.value());
 
         Entry e3 = storage.get(key3);
@@ -1093,7 +1008,6 @@ public abstract class BasicOperationsKeyValueStorageTest 
extends AbstractKeyValu
         assertFalse(e3.empty());
         assertFalse(e3.tombstone());
         assertEquals(2, e3.revision());
-        assertEquals(2, e3.updateCounter());
         assertArrayEquals(val3, e3.value());
 
         // "Success" branch isn't applied.
@@ -1114,12 +1028,10 @@ public abstract class 
BasicOperationsKeyValueStorageTest extends AbstractKeyValu
         byte[] val3 = keyValue(3, 3);
 
         assertEquals(0, storage.revision());
-        assertEquals(0, storage.updateCounter());
 
         putToMs(key1, val11);
 
         assertEquals(1, storage.revision());
-        assertEquals(1, storage.updateCounter());
 
         boolean branch = invokeOnMs(
                 new TombstoneCondition(TombstoneCondition.Type.NOT_TOMBSTONE, 
key1),
@@ -1130,14 +1042,12 @@ public abstract class 
BasicOperationsKeyValueStorageTest extends AbstractKeyValu
         // "Success" branch is applied.
         assertTrue(branch);
         assertEquals(2, storage.revision());
-        assertEquals(3, storage.updateCounter());
 
         Entry e1 = storage.get(key1);
 
         assertFalse(e1.empty());
         assertFalse(e1.tombstone());
         assertEquals(1, e1.revision());
-        assertEquals(1, e1.updateCounter());
         assertArrayEquals(val11, e1.value());
 
         Entry e2 = storage.get(key2);
@@ -1145,7 +1055,6 @@ public abstract class BasicOperationsKeyValueStorageTest 
extends AbstractKeyValu
         assertFalse(e2.empty());
         assertFalse(e2.tombstone());
         assertEquals(2, e2.revision());
-        assertEquals(2, e2.updateCounter());
         assertArrayEquals(val2, e2.value());
 
         // "Failure" branch isn't applied.
@@ -1166,13 +1075,11 @@ public abstract class 
BasicOperationsKeyValueStorageTest extends AbstractKeyValu
         byte[] val3 = keyValue(3, 3);
 
         assertEquals(0, storage.revision());
-        assertEquals(0, storage.updateCounter());
 
         putToMs(key1, val11);
         removeFromMs(key1); // Should be tombstone after remove.
 
         assertEquals(2, storage.revision());
-        assertEquals(2, storage.updateCounter());
 
         boolean branch = invokeOnMs(
                 new TombstoneCondition(TombstoneCondition.Type.NOT_TOMBSTONE, 
key1),
@@ -1183,14 +1090,12 @@ public abstract class 
BasicOperationsKeyValueStorageTest extends AbstractKeyValu
         // "Failure" branch is applied.
         assertFalse(branch);
         assertEquals(3, storage.revision());
-        assertEquals(4, storage.updateCounter());
 
         Entry e1 = storage.get(key1);
 
         assertFalse(e1.empty());
         assertTrue(e1.tombstone());
         assertEquals(2, e1.revision());
-        assertEquals(2, e1.updateCounter());
         assertNull(e1.value());
 
         Entry e3 = storage.get(key3);
@@ -1198,7 +1103,6 @@ public abstract class BasicOperationsKeyValueStorageTest 
extends AbstractKeyValu
         assertFalse(e3.empty());
         assertFalse(e3.tombstone());
         assertEquals(3, e3.revision());
-        assertEquals(3, e3.updateCounter());
         assertArrayEquals(val3, e3.value());
 
         // "Success" branch isn't applied.
@@ -1220,12 +1124,10 @@ public abstract class 
BasicOperationsKeyValueStorageTest extends AbstractKeyValu
         byte[] val3 = keyValue(3, 3);
 
         assertEquals(0, storage.revision());
-        assertEquals(0, storage.updateCounter());
 
         putToMs(key1, val11);
 
         assertEquals(1, storage.revision());
-        assertEquals(1, storage.updateCounter());
 
         boolean branch = invokeOnMs(
                 new ValueCondition(ValueCondition.Type.EQUAL, key1, val11),
@@ -1239,14 +1141,12 @@ public abstract class 
BasicOperationsKeyValueStorageTest extends AbstractKeyValu
         // "Success" branch is applied.
         assertTrue(branch);
         assertEquals(2, storage.revision());
-        assertEquals(4, storage.updateCounter());
 
         Entry e1 = storage.get(key1);
 
         assertFalse(e1.empty());
         assertFalse(e1.tombstone());
         assertEquals(2, e1.revision());
-        assertEquals(2, e1.updateCounter());
         assertArrayEquals(val12, e1.value());
 
         Entry e2 = storage.get(key2);
@@ -1254,7 +1154,6 @@ public abstract class BasicOperationsKeyValueStorageTest 
extends AbstractKeyValu
         assertFalse(e2.empty());
         assertFalse(e2.tombstone());
         assertEquals(2, e2.revision());
-        assertEquals(3, e2.updateCounter());
         assertArrayEquals(val2, e2.value());
 
         // "Failure" branch isn't applied.
@@ -1276,12 +1175,10 @@ public abstract class 
BasicOperationsKeyValueStorageTest extends AbstractKeyValu
         byte[] val3 = keyValue(3, 3);
 
         assertEquals(0, storage.revision());
-        assertEquals(0, storage.updateCounter());
 
         putToMs(key1, val11);
 
         assertEquals(1, storage.revision());
-        assertEquals(1, storage.updateCounter());
 
         boolean branch = invokeOnMs(
                 new ValueCondition(ValueCondition.Type.EQUAL, key1, val12),
@@ -1295,14 +1192,12 @@ public abstract class 
BasicOperationsKeyValueStorageTest extends AbstractKeyValu
         // "Failure" branch is applied.
         assertFalse(branch);
         assertEquals(2, storage.revision());
-        assertEquals(4, storage.updateCounter());
 
         Entry e1 = storage.get(key1);
 
         assertFalse(e1.empty());
         assertFalse(e1.tombstone());
         assertEquals(2, e1.revision());
-        assertEquals(2, e1.updateCounter());
         assertArrayEquals(val12, e1.value());
 
         Entry e2 = storage.get(key2);
@@ -1310,7 +1205,6 @@ public abstract class BasicOperationsKeyValueStorageTest 
extends AbstractKeyValu
         assertFalse(e2.empty());
         assertFalse(e2.tombstone());
         assertEquals(2, e2.revision());
-        assertEquals(3, e2.updateCounter());
         assertArrayEquals(val2, e2.value());
 
         // "Success" branch isn't applied.
@@ -1331,12 +1225,10 @@ public abstract class 
BasicOperationsKeyValueStorageTest extends AbstractKeyValu
         byte[] val3 = keyValue(3, 3);
 
         assertEquals(0, storage.revision());
-        assertEquals(0, storage.updateCounter());
 
         putToMs(key1, val1);
 
         assertEquals(1, storage.revision());
-        assertEquals(1, storage.updateCounter());
 
         // No-op.
         boolean branch = invokeOnMs(
@@ -1349,7 +1241,6 @@ public abstract class BasicOperationsKeyValueStorageTest 
extends AbstractKeyValu
 
         // No updates.
         assertEquals(2, storage.revision());
-        assertEquals(2, storage.updateCounter());
 
         // Put.
         branch = invokeOnMs(
@@ -1364,14 +1255,12 @@ public abstract class 
BasicOperationsKeyValueStorageTest extends AbstractKeyValu
         assertTrue(branch);
 
         assertEquals(3, storage.revision());
-        assertEquals(5, storage.updateCounter());
 
         Entry e2 = storage.get(key2);
 
         assertFalse(e2.empty());
         assertFalse(e2.tombstone());
         assertEquals(3, e2.revision());
-        assertEquals(3, e2.updateCounter());
         assertArrayEquals(key2, e2.key());
         assertArrayEquals(val2, e2.value());
 
@@ -1380,7 +1269,6 @@ public abstract class BasicOperationsKeyValueStorageTest 
extends AbstractKeyValu
         assertFalse(e3.empty());
         assertFalse(e3.tombstone());
         assertEquals(3, e3.revision());
-        assertEquals(4, e3.updateCounter());
         assertArrayEquals(key3, e3.key());
         assertArrayEquals(val3, e3.value());
 
@@ -1397,14 +1285,12 @@ public abstract class 
BasicOperationsKeyValueStorageTest extends AbstractKeyValu
         assertTrue(branch);
 
         assertEquals(4, storage.revision());
-        assertEquals(8, storage.updateCounter());
 
         e2 = storage.get(key2);
 
         assertFalse(e2.empty());
         assertTrue(e2.tombstone());
         assertEquals(4, e2.revision());
-        assertEquals(6, e2.updateCounter());
         assertArrayEquals(key2, e2.key());
 
         e3 = storage.get(key3);
@@ -1412,7 +1298,6 @@ public abstract class BasicOperationsKeyValueStorageTest 
extends AbstractKeyValu
         assertFalse(e3.empty());
         assertTrue(e3.tombstone());
         assertEquals(4, e3.revision());
-        assertEquals(7, e3.updateCounter());
         assertArrayEquals(key3, e3.key());
     }
 
@@ -1445,22 +1330,18 @@ public abstract class 
BasicOperationsKeyValueStorageTest extends AbstractKeyValu
         byte[] rval3 = keyValue(2, 6);
 
         assertEquals(0, storage.revision());
-        assertEquals(0, storage.updateCounter());
 
         putToMs(key1, val1);
 
         assertEquals(1, storage.revision());
-        assertEquals(1, storage.updateCounter());
 
         putToMs(key2, val2);
 
         assertEquals(2, storage.revision());
-        assertEquals(2, storage.updateCounter());
 
         putToMs(key3, val3);
 
         assertEquals(3, storage.revision());
-        assertEquals(3, storage.updateCounter());
 
         If iif = new If(
                 new OrCondition(new ValueCondition(Type.EQUAL, key1, val1), 
new ExistenceCondition(ExistenceCondition.Type.EXISTS, key2)),
@@ -1476,7 +1357,6 @@ public abstract class BasicOperationsKeyValueStorageTest 
extends AbstractKeyValu
         assertEquals(1, branch.getAsInt());
 
         assertEquals(4, storage.revision());
-        assertEquals(5, storage.updateCounter());
 
         Entry e1 = storage.get(key1);
         assertEquals(4, e1.revision());
@@ -1519,27 +1399,22 @@ public abstract class 
BasicOperationsKeyValueStorageTest extends AbstractKeyValu
         byte[] rval3 = keyValue(2, 6);
 
         assertEquals(0, storage.revision());
-        assertEquals(0, storage.updateCounter());
 
         putToMs(key1, val1);
 
         assertEquals(1, storage.revision());
-        assertEquals(1, storage.updateCounter());
 
         putToMs(key2, val2);
 
         assertEquals(2, storage.revision());
-        assertEquals(2, storage.updateCounter());
 
         putToMs(key3, val3);
 
         assertEquals(3, storage.revision());
-        assertEquals(3, storage.updateCounter());
 
         putToMs(key3, val3);
 
         assertEquals(4, storage.revision());
-        assertEquals(4, storage.updateCounter());
 
         If iif = new If(
                 new OrCondition(new ValueCondition(Type.EQUAL, key1, val1), 
new ExistenceCondition(ExistenceCondition.Type.EXISTS, key2)),
@@ -1554,7 +1429,6 @@ public abstract class BasicOperationsKeyValueStorageTest 
extends AbstractKeyValu
         assertEquals(2, branch.getAsInt());
 
         assertEquals(5, storage.revision());
-        assertEquals(7, storage.updateCounter());
 
         Entry e1 = storage.get(key1);
         assertEquals(5, e1.revision());
@@ -1598,17 +1472,14 @@ public abstract class 
BasicOperationsKeyValueStorageTest extends AbstractKeyValu
         byte[] rval3 = keyValue(2, 6);
 
         assertEquals(0, storage.revision());
-        assertEquals(0, storage.updateCounter());
 
         putToMs(key1, val2);
 
         assertEquals(1, storage.revision());
-        assertEquals(1, storage.updateCounter());
 
         putToMs(key3, val3);
 
         assertEquals(2, storage.revision());
-        assertEquals(2, storage.updateCounter());
 
         If iif = new If(
                 new OrCondition(new ValueCondition(Type.EQUAL, key1, val1), 
new ExistenceCondition(ExistenceCondition.Type.EXISTS, key2)),
@@ -1623,7 +1494,6 @@ public abstract class BasicOperationsKeyValueStorageTest 
extends AbstractKeyValu
         assertEquals(3, branch.getAsInt());
 
         assertEquals(3, storage.revision());
-        assertEquals(4, storage.updateCounter());
 
         Entry e1 = storage.get(key1);
         assertEquals(1, e1.revision());
@@ -1649,12 +1519,10 @@ public abstract class 
BasicOperationsKeyValueStorageTest extends AbstractKeyValu
         byte[] val3 = keyValue(3, 3);
 
         assertEquals(0, storage.revision());
-        assertEquals(0, storage.updateCounter());
 
         putAllToMs(List.of(key1, key2, key3), List.of(val1, val2, val3));
 
         assertEquals(1, storage.revision());
-        assertEquals(3, storage.updateCounter());
 
         // Range for latest revision without max bound.
         try (Cursor<Entry> cur = storage.range(key1, null)) {
@@ -1667,7 +1535,6 @@ public abstract class BasicOperationsKeyValueStorageTest 
extends AbstractKeyValu
             assertArrayEquals(key1, e1.key());
             assertArrayEquals(val1, e1.value());
             assertEquals(1, e1.revision());
-            assertEquals(1, e1.updateCounter());
 
             assertTrue(cur.hasNext());
 
@@ -1678,7 +1545,6 @@ public abstract class BasicOperationsKeyValueStorageTest 
extends AbstractKeyValu
             assertArrayEquals(key2, e2.key());
             assertArrayEquals(val2, e2.value());
             assertEquals(1, e2.revision());
-            assertEquals(2, e2.updateCounter());
 
             // Deliberately don't call cur.hasNext()
 
@@ -1689,7 +1555,6 @@ public abstract class BasicOperationsKeyValueStorageTest 
extends AbstractKeyValu
             assertArrayEquals(key3, e3.key());
             assertArrayEquals(val3, e3.value());
             assertEquals(1, e3.revision());
-            assertEquals(3, e3.updateCounter());
 
             assertFalse(cur.hasNext());
 
@@ -1713,7 +1578,6 @@ public abstract class BasicOperationsKeyValueStorageTest 
extends AbstractKeyValu
             assertArrayEquals(key1, e1.key());
             assertArrayEquals(val1, e1.value());
             assertEquals(1, e1.revision());
-            assertEquals(1, e1.updateCounter());
 
             assertTrue(cur.hasNext());
 
@@ -1724,7 +1588,6 @@ public abstract class BasicOperationsKeyValueStorageTest 
extends AbstractKeyValu
             assertArrayEquals(key2, e2.key());
             assertArrayEquals(val2, e2.value());
             assertEquals(1, e2.revision());
-            assertEquals(2, e2.updateCounter());
 
             assertFalse(cur.hasNext());
 
@@ -1782,7 +1645,6 @@ public abstract class BasicOperationsKeyValueStorageTest 
extends AbstractKeyValu
     @Test
     public void watchLexicographicTest() {
         assertEquals(0, storage.revision());
-        assertEquals(0, storage.updateCounter());
 
         byte[] key = key(0);
         byte[] val = keyValue(0, 0);
@@ -1806,7 +1668,6 @@ public abstract class BasicOperationsKeyValueStorageTest 
extends AbstractKeyValu
         }
 
         assertEquals(count, storage.revision());
-        assertEquals(count, storage.updateCounter());
 
         assertThat(awaitFuture, willCompleteSuccessfully());
     }
@@ -1824,7 +1685,6 @@ public abstract class BasicOperationsKeyValueStorageTest 
extends AbstractKeyValu
         byte[] val31 = keyValue(3, 31);
 
         assertEquals(0, storage.revision());
-        assertEquals(0, storage.updateCounter());
 
         // Watch for all updates starting from revision 2.
         CompletableFuture<Void> awaitFuture = watchRange(key1, null, 2, 2, 
(event, state) -> {
@@ -1846,7 +1706,6 @@ public abstract class BasicOperationsKeyValueStorageTest 
extends AbstractKeyValu
                 assertFalse(oldEntry2.empty());
                 assertFalse(oldEntry2.tombstone());
                 assertEquals(1, oldEntry2.revision());
-                assertEquals(2, oldEntry2.updateCounter());
                 assertArrayEquals(key2, oldEntry2.key());
                 assertArrayEquals(val21, oldEntry2.value());
 
@@ -1855,7 +1714,6 @@ public abstract class BasicOperationsKeyValueStorageTest 
extends AbstractKeyValu
                 assertFalse(newEntry2.empty());
                 assertFalse(newEntry2.tombstone());
                 assertEquals(2, newEntry2.revision());
-                assertEquals(3, newEntry2.updateCounter());
                 assertArrayEquals(key2, newEntry2.key());
                 assertArrayEquals(val22, newEntry2.value());
 
@@ -1875,7 +1733,6 @@ public abstract class BasicOperationsKeyValueStorageTest 
extends AbstractKeyValu
                 assertFalse(newEntry3.empty());
                 assertFalse(newEntry3.tombstone());
                 assertEquals(2, newEntry3.revision());
-                assertEquals(4, newEntry3.updateCounter());
                 assertArrayEquals(key3, newEntry3.key());
                 assertArrayEquals(val31, newEntry3.value());
             } else if (state == 2) {
@@ -1888,7 +1745,6 @@ public abstract class BasicOperationsKeyValueStorageTest 
extends AbstractKeyValu
                 assertFalse(oldEntry1.empty());
                 assertFalse(oldEntry1.tombstone());
                 assertEquals(1, oldEntry1.revision());
-                assertEquals(1, oldEntry1.updateCounter());
                 assertArrayEquals(key1, oldEntry1.key());
                 assertArrayEquals(val11, oldEntry1.value());
 
@@ -1897,7 +1753,6 @@ public abstract class BasicOperationsKeyValueStorageTest 
extends AbstractKeyValu
                 assertFalse(newEntry1.empty());
                 assertTrue(newEntry1.tombstone());
                 assertEquals(3, newEntry1.revision());
-                assertEquals(5, newEntry1.updateCounter());
                 assertArrayEquals(key1, newEntry1.key());
                 assertNull(newEntry1.value());
             }
@@ -1906,12 +1761,10 @@ public abstract class 
BasicOperationsKeyValueStorageTest extends AbstractKeyValu
         putAllToMs(List.of(key1, key2), List.of(val11, val21));
 
         assertEquals(1, storage.revision());
-        assertEquals(2, storage.updateCounter());
 
         putAllToMs(List.of(key2, key3), List.of(val22, val31));
 
         assertEquals(2, storage.revision());
-        assertEquals(4, storage.updateCounter());
 
         removeFromMs(key1);
 
@@ -1929,7 +1782,6 @@ public abstract class BasicOperationsKeyValueStorageTest 
extends AbstractKeyValu
         byte[] val22 = keyValue(2, 22);
 
         assertEquals(0, storage.revision());
-        assertEquals(0, storage.updateCounter());
 
         CompletableFuture<Void> awaitFuture = watchExact(key1, 1, 2, (event, 
state) -> {
             if (state == 1) {
@@ -1947,7 +1799,6 @@ public abstract class BasicOperationsKeyValueStorageTest 
extends AbstractKeyValu
                 assertFalse(newEntry1.empty());
                 assertFalse(newEntry1.tombstone());
                 assertEquals(1, newEntry1.revision());
-                assertEquals(1, newEntry1.updateCounter());
                 assertArrayEquals(key1, newEntry1.key());
                 assertArrayEquals(val11, newEntry1.value());
             } else if (state == 2) {
@@ -1960,7 +1811,6 @@ public abstract class BasicOperationsKeyValueStorageTest 
extends AbstractKeyValu
                 assertFalse(oldEntry1.empty());
                 assertFalse(oldEntry1.tombstone());
                 assertEquals(1, oldEntry1.revision());
-                assertEquals(1, oldEntry1.updateCounter());
                 assertArrayEquals(key1, oldEntry1.key());
                 assertArrayEquals(val11, oldEntry1.value());
 
@@ -1969,7 +1819,6 @@ public abstract class BasicOperationsKeyValueStorageTest 
extends AbstractKeyValu
                 assertFalse(newEntry1.empty());
                 assertFalse(newEntry1.tombstone());
                 assertEquals(3, newEntry1.revision());
-                assertEquals(4, newEntry1.updateCounter());
                 assertArrayEquals(key1, newEntry1.key());
                 assertArrayEquals(val12, newEntry1.value());
             }
@@ -1978,7 +1827,6 @@ public abstract class BasicOperationsKeyValueStorageTest 
extends AbstractKeyValu
         putAllToMs(List.of(key1, key2), List.of(val11, val21));
 
         assertEquals(1, storage.revision());
-        assertEquals(2, storage.updateCounter());
 
         putToMs(key2, val22);
         putToMs(key1, val12);
@@ -1996,7 +1844,6 @@ public abstract class BasicOperationsKeyValueStorageTest 
extends AbstractKeyValu
         byte[] val2 = keyValue(2, 21);
 
         assertEquals(0, storage.revision());
-        assertEquals(0, storage.updateCounter());
 
         CompletableFuture<Void> awaitFuture = watchExact(key2, 1, 1, (event, 
state) -> {
             assertTrue(event.single());
@@ -2013,7 +1860,6 @@ public abstract class BasicOperationsKeyValueStorageTest 
extends AbstractKeyValu
             assertFalse(newEntry1.empty());
             assertFalse(newEntry1.tombstone());
             assertEquals(3, newEntry1.revision());
-            assertEquals(3, newEntry1.updateCounter());
             assertArrayEquals(key2, newEntry1.key());
             assertArrayEquals(val2, newEntry1.value());
         });
@@ -2023,7 +1869,6 @@ public abstract class BasicOperationsKeyValueStorageTest 
extends AbstractKeyValu
         putToMs(key2, val2);
 
         assertEquals(3, storage.revision());
-        assertEquals(3, storage.updateCounter());
 
         assertThat(awaitFuture, willCompleteSuccessfully());
     }
@@ -2042,7 +1887,6 @@ public abstract class BasicOperationsKeyValueStorageTest 
extends AbstractKeyValu
         byte[] val32 = keyValue(3, 32);
 
         assertEquals(0, storage.revision());
-        assertEquals(0, storage.updateCounter());
 
         CompletableFuture<Void> awaitFuture = watchExact(List.of(key1, key2), 
1, 2, (event, state) -> {
             if (state == 1) {
@@ -2055,7 +1899,6 @@ public abstract class BasicOperationsKeyValueStorageTest 
extends AbstractKeyValu
         putAllToMs(List.of(key1, key2, key3), List.of(val11, val21, val31));
 
         assertEquals(1, storage.revision());
-        assertEquals(3, storage.updateCounter());
 
         putToMs(key2, val22);
 
@@ -2308,13 +2151,11 @@ public abstract class 
BasicOperationsKeyValueStorageTest extends AbstractKeyValu
         restartStorage();
 
         assertEquals(0L, storage.revision());
-        assertEquals(0L, storage.updateCounter());
         assertTrue(storage.get(key).empty());
 
         storage.restoreSnapshot(snapshotDir);
 
         assertEquals(1L, storage.revision());
-        assertEquals(1L, storage.updateCounter());
         assertFalse(storage.get(key).empty());
     }
 
@@ -2334,7 +2175,6 @@ public abstract class BasicOperationsKeyValueStorageTest 
extends AbstractKeyValu
         storage.restoreSnapshot(snapshotDir);
 
         assertEquals(1L, storage.revision());
-        assertEquals(1L, storage.updateCounter());
         assertFalse(storage.get(key0).empty());
         assertTrue(storage.get(key1).empty());
     }
diff --git 
a/modules/metastorage/src/test/java/org/apache/ignite/internal/metastorage/server/ExistenceConditionTest.java
 
b/modules/metastorage/src/test/java/org/apache/ignite/internal/metastorage/server/ExistenceConditionTest.java
index 5968b6f433..f4f939474f 100644
--- 
a/modules/metastorage/src/test/java/org/apache/ignite/internal/metastorage/server/ExistenceConditionTest.java
+++ 
b/modules/metastorage/src/test/java/org/apache/ignite/internal/metastorage/server/ExistenceConditionTest.java
@@ -43,13 +43,13 @@ public class ExistenceConditionTest {
     private static final byte[] VAL = {1};
 
     /** Regular entry. */
-    private static final Entry ENTRY = new EntryImpl(KEY, VAL, 1, 1, 
CLOCK.now());
+    private static final Entry ENTRY = new EntryImpl(KEY, VAL, 1, CLOCK.now());
 
     /** Empty entry. */
     private static final Entry EMPTY = EntryImpl.empty(KEY);
 
     /** Tombstone entry. */
-    private static final Entry TOMBSTONE = EntryImpl.tombstone(KEY, 1, 1, 
CLOCK.now());
+    private static final Entry TOMBSTONE = EntryImpl.tombstone(KEY, 1, 
CLOCK.now());
 
     /**
      * Tests {@link ExistenceCondition.Type#EXISTS} condition for regular, 
empty and tombstone entries.
diff --git 
a/modules/metastorage/src/test/java/org/apache/ignite/internal/metastorage/server/OrConditionTest.java
 
b/modules/metastorage/src/test/java/org/apache/ignite/internal/metastorage/server/OrConditionTest.java
index 6006fe11a4..bc9b65b341 100644
--- 
a/modules/metastorage/src/test/java/org/apache/ignite/internal/metastorage/server/OrConditionTest.java
+++ 
b/modules/metastorage/src/test/java/org/apache/ignite/internal/metastorage/server/OrConditionTest.java
@@ -50,9 +50,9 @@ public class OrConditionTest extends BaseIgniteAbstractTest {
     private final HybridClock clock = new HybridClockImpl();
 
     private final Entry[] entries = {
-            new EntryImpl(new byte[]{1}, new byte[]{10}, 1, 1, clock.now()),
-            new EntryImpl(new byte[]{2}, new byte[]{20}, 2, 3, clock.now()),
-            new EntryImpl(new byte[]{3}, new byte[]{30}, 3, 4, clock.now()),
+            new EntryImpl(new byte[]{1}, new byte[]{10}, 1, clock.now()),
+            new EntryImpl(new byte[]{2}, new byte[]{20}, 2, clock.now()),
+            new EntryImpl(new byte[]{3}, new byte[]{30}, 3, clock.now()),
     };
 
     @BeforeEach
diff --git 
a/modules/metastorage/src/test/java/org/apache/ignite/internal/metastorage/server/RevisionConditionTest.java
 
b/modules/metastorage/src/test/java/org/apache/ignite/internal/metastorage/server/RevisionConditionTest.java
index 1abf8f3668..fcb64d553e 100644
--- 
a/modules/metastorage/src/test/java/org/apache/ignite/internal/metastorage/server/RevisionConditionTest.java
+++ 
b/modules/metastorage/src/test/java/org/apache/ignite/internal/metastorage/server/RevisionConditionTest.java
@@ -52,7 +52,7 @@ public class RevisionConditionTest {
         Condition cond = new RevisionCondition(EQUAL, KEY, 1);
 
         // 1 == 1.
-        assertTrue(cond.test(new EntryImpl(KEY, VAL, 1, 1, clock.now())));
+        assertTrue(cond.test(new EntryImpl(KEY, VAL, 1, clock.now())));
     }
 
     /**
@@ -63,7 +63,7 @@ public class RevisionConditionTest {
         Condition cond = new RevisionCondition(NOT_EQUAL, KEY, 1);
 
         // 2 != 1.
-        assertTrue(cond.test(new EntryImpl(KEY, VAL, 2, 1, clock.now())));
+        assertTrue(cond.test(new EntryImpl(KEY, VAL, 2, clock.now())));
     }
 
     /**
@@ -74,7 +74,7 @@ public class RevisionConditionTest {
         Condition cond = new RevisionCondition(GREATER, KEY, 1);
 
         // 2 > 1.
-        assertTrue(cond.test(new EntryImpl(KEY, VAL, 2, 1, clock.now())));
+        assertTrue(cond.test(new EntryImpl(KEY, VAL, 2, clock.now())));
     }
 
     /**
@@ -85,10 +85,10 @@ public class RevisionConditionTest {
         Condition cond = new RevisionCondition(GREATER_OR_EQUAL, KEY, 1);
 
         // 2 >= 1 (2 > 1).
-        assertTrue(cond.test(new EntryImpl(KEY, VAL, 2, 1, clock.now())));
+        assertTrue(cond.test(new EntryImpl(KEY, VAL, 2, clock.now())));
 
         // 1 >= 1 (1 == 1).
-        assertTrue(cond.test(new EntryImpl(KEY, VAL, 1, 1, clock.now())));
+        assertTrue(cond.test(new EntryImpl(KEY, VAL, 1, clock.now())));
     }
 
     /**
@@ -99,7 +99,7 @@ public class RevisionConditionTest {
         Condition cond = new RevisionCondition(LESS, KEY, 2);
 
         // 1 < 2
-        assertTrue(cond.test(new EntryImpl(KEY, VAL, 1, 1, clock.now())));
+        assertTrue(cond.test(new EntryImpl(KEY, VAL, 1, clock.now())));
     }
 
     /**
@@ -110,9 +110,9 @@ public class RevisionConditionTest {
         Condition cond = new RevisionCondition(LESS_OR_EQUAL, KEY, 2);
 
         // 1 <= 2 (1 < 2)
-        assertTrue(cond.test(new EntryImpl(KEY, VAL, 1, 1, clock.now())));
+        assertTrue(cond.test(new EntryImpl(KEY, VAL, 1, clock.now())));
 
         // 1 <= 1 (1 == 1).
-        assertTrue(cond.test(new EntryImpl(KEY, VAL, 1, 1, clock.now())));
+        assertTrue(cond.test(new EntryImpl(KEY, VAL, 1, clock.now())));
     }
 }
diff --git 
a/modules/metastorage/src/test/java/org/apache/ignite/internal/metastorage/server/TombstoneConditionTest.java
 
b/modules/metastorage/src/test/java/org/apache/ignite/internal/metastorage/server/TombstoneConditionTest.java
index 48176cdec4..d4a2ef878e 100644
--- 
a/modules/metastorage/src/test/java/org/apache/ignite/internal/metastorage/server/TombstoneConditionTest.java
+++ 
b/modules/metastorage/src/test/java/org/apache/ignite/internal/metastorage/server/TombstoneConditionTest.java
@@ -41,13 +41,13 @@ public class TombstoneConditionTest {
     private static final byte[] VAL = {1};
 
     /** Regular entry. */
-    private static final Entry ENTRY = new EntryImpl(KEY, VAL, 1, 1, 
CLOCK.now());
+    private static final Entry ENTRY = new EntryImpl(KEY, VAL, 1, CLOCK.now());
 
     /** Empty entry. */
     private static final Entry EMPTY = EntryImpl.empty(KEY);
 
     /** Tombstone entry. */
-    private static final Entry TOMBSTONE = EntryImpl.tombstone(KEY, 1, 1, 
CLOCK.now());
+    private static final Entry TOMBSTONE = EntryImpl.tombstone(KEY, 1, 
CLOCK.now());
 
     /**
      * Tests {@link TombstoneCondition.Type#TOMBSTONE} condition for regular, 
empty and tombstone entries.
diff --git 
a/modules/metastorage/src/test/java/org/apache/ignite/internal/metastorage/server/ValueConditionTest.java
 
b/modules/metastorage/src/test/java/org/apache/ignite/internal/metastorage/server/ValueConditionTest.java
index f5d0e70886..b707896864 100644
--- 
a/modules/metastorage/src/test/java/org/apache/ignite/internal/metastorage/server/ValueConditionTest.java
+++ 
b/modules/metastorage/src/test/java/org/apache/ignite/internal/metastorage/server/ValueConditionTest.java
@@ -58,9 +58,9 @@ public class ValueConditionTest {
     public void eq() {
         Condition cond = new ValueCondition(EQUAL, KEY, VAL_1);
 
-        assertTrue(cond.test(new EntryImpl(KEY, VAL_1, 1, 1, clock.now())));
+        assertTrue(cond.test(new EntryImpl(KEY, VAL_1, 1, clock.now())));
 
-        assertFalse(cond.test(new EntryImpl(KEY, VAL_2, 1, 1, clock.now())));
+        assertFalse(cond.test(new EntryImpl(KEY, VAL_2, 1, clock.now())));
     }
 
     /**
@@ -70,9 +70,9 @@ public class ValueConditionTest {
     public void ne() {
         Condition cond = new ValueCondition(NOT_EQUAL, KEY, VAL_1);
 
-        assertTrue(cond.test(new EntryImpl(KEY, VAL_2, 1, 1, clock.now())));
+        assertTrue(cond.test(new EntryImpl(KEY, VAL_2, 1, clock.now())));
 
-        assertFalse(cond.test(new EntryImpl(KEY, VAL_1, 1, 1, clock.now())));
+        assertFalse(cond.test(new EntryImpl(KEY, VAL_1, 1, clock.now())));
     }
 
     /**
@@ -83,10 +83,10 @@ public class ValueConditionTest {
         Condition cond = new ValueCondition(GREATER, KEY, VAL_1);
 
         // byte[]{22} > byte[]{11}.
-        assertTrue(cond.test(new EntryImpl(KEY, VAL_2, 1, 1, clock.now())));
+        assertTrue(cond.test(new EntryImpl(KEY, VAL_2, 1, clock.now())));
 
         // byte[]{11} > byte[]{11}.
-        assertFalse(cond.test(new EntryImpl(KEY, VAL_1, 1, 1, clock.now())));
+        assertFalse(cond.test(new EntryImpl(KEY, VAL_1, 1, clock.now())));
     }
 
     /**
@@ -97,13 +97,13 @@ public class ValueConditionTest {
         Condition cond = new ValueCondition(GREATER_OR_EQUAL, KEY, VAL_2);
 
         // byte[]{33} >= byte[]{22}.
-        assertTrue(cond.test(new EntryImpl(KEY, VAL_3, 1, 1, clock.now())));
+        assertTrue(cond.test(new EntryImpl(KEY, VAL_3, 1, clock.now())));
 
         // byte[]{22} >= byte[]{22}.
-        assertTrue(cond.test(new EntryImpl(KEY, VAL_2, 1, 1, clock.now())));
+        assertTrue(cond.test(new EntryImpl(KEY, VAL_2, 1, clock.now())));
 
         // byte[]{11} >= byte[]{22}.
-        assertFalse(cond.test(new EntryImpl(KEY, VAL_1, 1, 1, clock.now())));
+        assertFalse(cond.test(new EntryImpl(KEY, VAL_1, 1, clock.now())));
     }
 
     /**
@@ -114,10 +114,10 @@ public class ValueConditionTest {
         Condition cond = new ValueCondition(LESS, KEY, VAL_2);
 
         // byte[]{11} < byte[]{22}
-        assertTrue(cond.test(new EntryImpl(KEY, VAL_1, 1, 1, clock.now())));
+        assertTrue(cond.test(new EntryImpl(KEY, VAL_1, 1, clock.now())));
 
         // byte[]{22} < byte[]{22}
-        assertFalse(cond.test(new EntryImpl(KEY, VAL_2, 1, 1, clock.now())));
+        assertFalse(cond.test(new EntryImpl(KEY, VAL_2, 1, clock.now())));
     }
 
     /**
@@ -128,12 +128,12 @@ public class ValueConditionTest {
         Condition cond = new ValueCondition(LESS_OR_EQUAL, KEY, VAL_2);
 
         // byte[]{11} <= byte[]{22}
-        assertTrue(cond.test(new EntryImpl(KEY, VAL_1, 1, 1, clock.now())));
+        assertTrue(cond.test(new EntryImpl(KEY, VAL_1, 1, clock.now())));
 
         // byte[]{22} <= byte[]{22}
-        assertTrue(cond.test(new EntryImpl(KEY, VAL_2, 1, 1, clock.now())));
+        assertTrue(cond.test(new EntryImpl(KEY, VAL_2, 1, clock.now())));
 
         // byte[]{33} <= byte[]{22}
-        assertFalse(cond.test(new EntryImpl(KEY, VAL_3, 1, 1, clock.now())));
+        assertFalse(cond.test(new EntryImpl(KEY, VAL_3, 1, clock.now())));
     }
 }
diff --git 
a/modules/metastorage/src/test/java/org/apache/ignite/internal/metastorage/server/WatchProcessorTest.java
 
b/modules/metastorage/src/test/java/org/apache/ignite/internal/metastorage/server/WatchProcessorTest.java
index 7ee5169ce5..d7e1f4c90c 100644
--- 
a/modules/metastorage/src/test/java/org/apache/ignite/internal/metastorage/server/WatchProcessorTest.java
+++ 
b/modules/metastorage/src/test/java/org/apache/ignite/internal/metastorage/server/WatchProcessorTest.java
@@ -81,8 +81,8 @@ public class WatchProcessorTest extends 
BaseIgniteAbstractTest {
         watchProcessor.addWatch(new Watch(0, listener1, key -> 
Arrays.equals(key, "foo".getBytes(UTF_8))));
         watchProcessor.addWatch(new Watch(0, listener2, key -> 
Arrays.equals(key, "bar".getBytes(UTF_8))));
 
-        var entry1 = new EntryImpl("foo".getBytes(UTF_8), null, 1, 0, 
TIMESTAMP);
-        var entry2 = new EntryImpl("bar".getBytes(UTF_8), null, 1, 0, 
TIMESTAMP);
+        var entry1 = new EntryImpl("foo".getBytes(UTF_8), null, 1, TIMESTAMP);
+        var entry2 = new EntryImpl("bar".getBytes(UTF_8), null, 1, TIMESTAMP);
 
         CompletableFuture<Void> notificationFuture = 
watchProcessor.notifyWatches(List.of(entry1, entry2), 
HybridTimestamp.MAX_VALUE);
 
@@ -108,8 +108,8 @@ public class WatchProcessorTest extends 
BaseIgniteAbstractTest {
         watchProcessor.addWatch(new Watch(0, listener1, key -> 
Arrays.equals(key, "foo".getBytes(UTF_8))));
         watchProcessor.addWatch(new Watch(0, listener2, key -> 
Arrays.equals(key, "bar".getBytes(UTF_8))));
 
-        var entry1 = new EntryImpl("foo".getBytes(UTF_8), null, 1, 0, 
TIMESTAMP);
-        var entry2 = new EntryImpl("bar".getBytes(UTF_8), null, 2, 0, 
TIMESTAMP);
+        var entry1 = new EntryImpl("foo".getBytes(UTF_8), null, 1, TIMESTAMP);
+        var entry2 = new EntryImpl("bar".getBytes(UTF_8), null, 2, TIMESTAMP);
 
         HybridTimestamp ts = new HybridTimestamp(1, 2);
 
@@ -150,8 +150,8 @@ public class WatchProcessorTest extends 
BaseIgniteAbstractTest {
         watchProcessor.addWatch(new Watch(0, listener1, key -> 
Arrays.equals(key, "foo".getBytes(UTF_8))));
         watchProcessor.addWatch(new Watch(0, listener2, key -> 
Arrays.equals(key, "bar".getBytes(UTF_8))));
 
-        var entry1 = new EntryImpl("foo".getBytes(UTF_8), null, 1, 0, 
TIMESTAMP);
-        var entry2 = new EntryImpl("bar".getBytes(UTF_8), null, 1, 0, 
TIMESTAMP);
+        var entry1 = new EntryImpl("foo".getBytes(UTF_8), null, 1, TIMESTAMP);
+        var entry2 = new EntryImpl("bar".getBytes(UTF_8), null, 1, TIMESTAMP);
 
         CompletableFuture<Void> notificationFuture = 
watchProcessor.notifyWatches(List.of(entry1, entry2), 
HybridTimestamp.MAX_VALUE);
 
@@ -184,16 +184,16 @@ public class WatchProcessorTest extends 
BaseIgniteAbstractTest {
         watchProcessor.addWatch(new Watch(0, listener1, key -> 
Arrays.equals(key, "foo".getBytes(UTF_8))));
         watchProcessor.addWatch(new Watch(0, listener2, key -> 
Arrays.equals(key, "bar".getBytes(UTF_8))));
 
-        var entry1 = new EntryImpl("foo".getBytes(UTF_8), null, 1, 0, 
TIMESTAMP);
-        var entry2 = new EntryImpl("bar".getBytes(UTF_8), null, 1, 0, 
TIMESTAMP);
+        var entry1 = new EntryImpl("foo".getBytes(UTF_8), null, 1, TIMESTAMP);
+        var entry2 = new EntryImpl("bar".getBytes(UTF_8), null, 1, TIMESTAMP);
 
         watchProcessor.notifyWatches(List.of(entry1, entry2), 
HybridTimestamp.MAX_VALUE);
 
         verify(listener1, timeout(1_000)).onUpdate(new WatchEvent(new 
EntryEvent(oldEntry(entry1), entry1)));
         verify(listener2, timeout(1_000)).onUpdate(new WatchEvent(new 
EntryEvent(oldEntry(entry2), entry2)));
 
-        var entry3 = new EntryImpl("foo".getBytes(UTF_8), null, 2, 0, 
TIMESTAMP);
-        var entry4 = new EntryImpl("bar".getBytes(UTF_8), null, 2, 0, 
TIMESTAMP);
+        var entry3 = new EntryImpl("foo".getBytes(UTF_8), null, 2, TIMESTAMP);
+        var entry4 = new EntryImpl("bar".getBytes(UTF_8), null, 2, TIMESTAMP);
 
         CompletableFuture<Void> notificationFuture = 
watchProcessor.notifyWatches(List.of(entry3, entry4), 
HybridTimestamp.MAX_VALUE);
 
@@ -218,7 +218,7 @@ public class WatchProcessorTest extends 
BaseIgniteAbstractTest {
 
         watchProcessor.addWatch(new Watch(0, listener, key -> 
Arrays.equals(key, "foo".getBytes(UTF_8))));
 
-        var entry = new EntryImpl("bar".getBytes(UTF_8), null, 1, 0, 
TIMESTAMP);
+        var entry = new EntryImpl("bar".getBytes(UTF_8), null, 1, TIMESTAMP);
 
         CompletableFuture<Void> notificationFuture = 
watchProcessor.notifyWatches(List.of(entry), HybridTimestamp.MAX_VALUE);
 
@@ -236,10 +236,10 @@ public class WatchProcessorTest extends 
BaseIgniteAbstractTest {
     }
 
     private static Entry oldEntry(byte[] key, long revision) {
-        return new EntryImpl(key, null, revision, 0, TIMESTAMP);
+        return new EntryImpl(key, null, revision, TIMESTAMP);
     }
 
     private static Entry oldEntry(Entry entry) {
-        return new EntryImpl(entry.key(), null, entry.revision() - 1, 0, 
TIMESTAMP);
+        return new EntryImpl(entry.key(), null, entry.revision() - 1, 
TIMESTAMP);
     }
 }
diff --git 
a/modules/metastorage/src/testFixtures/java/org/apache/ignite/internal/metastorage/server/SimpleInMemoryKeyValueStorage.java
 
b/modules/metastorage/src/testFixtures/java/org/apache/ignite/internal/metastorage/server/SimpleInMemoryKeyValueStorage.java
index a0ff4be9ad..6ba48f9213 100644
--- 
a/modules/metastorage/src/testFixtures/java/org/apache/ignite/internal/metastorage/server/SimpleInMemoryKeyValueStorage.java
+++ 
b/modules/metastorage/src/testFixtures/java/org/apache/ignite/internal/metastorage/server/SimpleInMemoryKeyValueStorage.java
@@ -113,13 +113,6 @@ public class SimpleInMemoryKeyValueStorage implements 
KeyValueStorage {
      */
     private long rev;
 
-    /**
-     * Update counter. Will be incremented for each update of any particular 
entry.
-     *
-     * <p>Multi-threaded access is guarded by {@link #mux}.</p>
-     */
-    private long updCntr;
-
     /**
      * Last compaction revision that was set or restored from a snapshot.
      *
@@ -169,13 +162,6 @@ public class SimpleInMemoryKeyValueStorage implements 
KeyValueStorage {
         }
     }
 
-    @Override
-    public long updateCounter() {
-        synchronized (mux) {
-            return updCntr;
-        }
-    }
-
     @Override
     public void put(byte[] key, byte[] value, HybridTimestamp opTs) {
         synchronized (mux) {
@@ -524,7 +510,7 @@ public class SimpleInMemoryKeyValueStorage implements 
KeyValueStorage {
         revsIdx.tailMap(minWatchRevision)
                 .forEach((revision, entries) -> {
                     entries.forEach((key, value) -> {
-                        var entry = new EntryImpl(key, value.bytes(), 
revision, value.updateCounter(), value.operationTimestamp());
+                        var entry = new EntryImpl(key, value.bytes(), 
revision, value.operationTimestamp());
 
                         updatedEntries.add(entry);
                     });
@@ -609,7 +595,6 @@ public class SimpleInMemoryKeyValueStorage implements 
KeyValueStorage {
                         Map.copyOf(revToTsMap),
                         revsIdxCopy,
                         rev,
-                        updCntr,
                         savedCompactionRevision
                 );
 
@@ -652,7 +637,6 @@ public class SimpleInMemoryKeyValueStorage implements 
KeyValueStorage {
                 });
 
                 rev = snapshot.rev;
-                updCntr = snapshot.updCntr;
                 compactionRevision = snapshot.savedCompactionRevision;
                 savedCompactionRevision = snapshot.savedCompactionRevision;
             } catch (Throwable t) {
@@ -851,24 +835,20 @@ public class SimpleInMemoryKeyValueStorage implements 
KeyValueStorage {
         Value lastVal = lastRevVals.get(key);
 
         if (lastVal.tombstone()) {
-            return EntryImpl.tombstone(key, lastRev, lastVal.updateCounter(), 
lastVal.operationTimestamp());
+            return EntryImpl.tombstone(key, lastRev, 
lastVal.operationTimestamp());
         }
 
-        return new EntryImpl(key, lastVal.bytes(), lastRev, 
lastVal.updateCounter(), lastVal.operationTimestamp());
+        return new EntryImpl(key, lastVal.bytes(), lastRev, 
lastVal.operationTimestamp());
     }
 
-    private long doPut(byte[] key, byte[] bytes, long curRev, HybridTimestamp 
opTs) {
-        long curUpdCntr = ++updCntr;
-
+    private void doPut(byte[] key, byte[] bytes, long curRev, HybridTimestamp 
opTs) {
         // Update keysIdx.
         List<Long> revs = keysIdx.computeIfAbsent(key, k -> new ArrayList<>());
 
-        long lastRev = revs.isEmpty() ? 0 : lastRevision(revs);
-
         revs.add(curRev);
 
         // Update revsIdx.
-        Value val = new Value(bytes, curUpdCntr, opTs);
+        Value val = new Value(bytes, opTs);
 
         revsIdx.compute(
                 curRev,
@@ -883,14 +863,13 @@ public class SimpleInMemoryKeyValueStorage implements 
KeyValueStorage {
                 }
         );
 
-        var updatedEntry = new EntryImpl(key, val.tombstone() ? null : bytes, 
curRev, curUpdCntr, val.operationTimestamp());
+        var updatedEntry = new EntryImpl(key, val.tombstone() ? null : bytes, 
curRev, val.operationTimestamp());
 
         updatedEntries.add(updatedEntry);
 
-        return lastRev;
     }
 
-    private long doPutAll(long curRev, List<byte[]> keys, List<byte[]> 
bytesList, HybridTimestamp opTs) {
+    private void doPutAll(long curRev, List<byte[]> keys, List<byte[]> 
bytesList, HybridTimestamp opTs) {
         synchronized (mux) {
             // Update revsIdx.
             NavigableMap<byte[], Value> entries = new TreeMap<>(CMP);
@@ -900,25 +879,22 @@ public class SimpleInMemoryKeyValueStorage implements 
KeyValueStorage {
 
                 byte[] bytes = bytesList.get(i);
 
-                long curUpdCntr = ++updCntr;
-
                 // Update keysIdx.
                 List<Long> revs = keysIdx.computeIfAbsent(key, k -> new 
ArrayList<>());
 
                 revs.add(curRev);
 
-                Value val = new Value(bytes, curUpdCntr, opTs);
+                Value val = new Value(bytes, opTs);
 
                 entries.put(key, val);
 
-                updatedEntries.add(new EntryImpl(key, bytes, curRev, 
curUpdCntr, opTs));
+                updatedEntries.add(new EntryImpl(key, bytes, curRev, opTs));
 
                 revsIdx.put(curRev, entries);
             }
 
             updateRevision(curRev, opTs);
 
-            return curRev;
         }
     }
 
diff --git 
a/modules/metastorage/src/testFixtures/java/org/apache/ignite/internal/metastorage/server/SimpleInMemoryKeyValueStorageSnapshot.java
 
b/modules/metastorage/src/testFixtures/java/org/apache/ignite/internal/metastorage/server/SimpleInMemoryKeyValueStorageSnapshot.java
index 16a726e691..040ca11c24 100644
--- 
a/modules/metastorage/src/testFixtures/java/org/apache/ignite/internal/metastorage/server/SimpleInMemoryKeyValueStorageSnapshot.java
+++ 
b/modules/metastorage/src/testFixtures/java/org/apache/ignite/internal/metastorage/server/SimpleInMemoryKeyValueStorageSnapshot.java
@@ -44,8 +44,6 @@ class SimpleInMemoryKeyValueStorageSnapshot implements 
Serializable {
 
     final long rev;
 
-    final long updCntr;
-
     final long savedCompactionRevision;
 
     SimpleInMemoryKeyValueStorageSnapshot(
@@ -54,7 +52,6 @@ class SimpleInMemoryKeyValueStorageSnapshot implements 
Serializable {
             Map<Long, HybridTimestamp> revToTsMap,
             Map<Long, Map<byte[], ValueSnapshot>> revsIdx,
             long rev,
-            long updCntr,
             long savedCompactionRevision
     ) {
         this.keysIdx = keysIdx;
@@ -62,7 +59,6 @@ class SimpleInMemoryKeyValueStorageSnapshot implements 
Serializable {
         this.revToTsMap = revToTsMap;
         this.revsIdx = revsIdx;
         this.rev = rev;
-        this.updCntr = updCntr;
         this.savedCompactionRevision = savedCompactionRevision;
     }
 }
diff --git 
a/modules/metastorage/src/testFixtures/java/org/apache/ignite/internal/metastorage/server/ValueSnapshot.java
 
b/modules/metastorage/src/testFixtures/java/org/apache/ignite/internal/metastorage/server/ValueSnapshot.java
index 0d1865aa3d..9fad118b80 100644
--- 
a/modules/metastorage/src/testFixtures/java/org/apache/ignite/internal/metastorage/server/ValueSnapshot.java
+++ 
b/modules/metastorage/src/testFixtures/java/org/apache/ignite/internal/metastorage/server/ValueSnapshot.java
@@ -26,20 +26,17 @@ class ValueSnapshot implements Serializable {
 
     private final byte[] bytes;
 
-    private final long updCntr;
-
     private final boolean tombstone;
 
     private final HybridTimestamp operationTimestamp;
 
     ValueSnapshot(Value value) {
         bytes = value.bytes();
-        updCntr = value.updateCounter();
         tombstone = value.tombstone();
         operationTimestamp = value.operationTimestamp();
     }
 
     Value toValue() {
-        return tombstone ? new Value(Value.TOMBSTONE, updCntr, 
operationTimestamp) : new Value(bytes, updCntr, operationTimestamp);
+        return tombstone ? new Value(Value.TOMBSTONE, operationTimestamp) : 
new Value(bytes, operationTimestamp);
     }
 }
diff --git 
a/modules/placement-driver/src/test/java/org/apache/ignite/internal/placementdriver/LeaseTrackerTest.java
 
b/modules/placement-driver/src/test/java/org/apache/ignite/internal/placementdriver/LeaseTrackerTest.java
index fb44d2eb83..cae9d40442 100644
--- 
a/modules/placement-driver/src/test/java/org/apache/ignite/internal/placementdriver/LeaseTrackerTest.java
+++ 
b/modules/placement-driver/src/test/java/org/apache/ignite/internal/placementdriver/LeaseTrackerTest.java
@@ -101,8 +101,8 @@ public class LeaseTrackerTest extends 
BaseIgniteAbstractTest {
                 .acceptLease(new HybridTimestamp(2000, 0));
 
         // In entry0, there are leases for partition ids partId0 and partId1. 
In entry1, there is only partId0, so partId1 is expired.
-        Entry entry0 = new EntryImpl(leasesKeyBytes, new 
LeaseBatch(List.of(lease0, lease1)).bytes(), 0, 0, clock.now());
-        Entry entry1 = new EntryImpl(leasesKeyBytes, new 
LeaseBatch(List.of(lease0)).bytes(), 0, 1, clock.now());
+        Entry entry0 = new EntryImpl(leasesKeyBytes, new 
LeaseBatch(List.of(lease0, lease1)).bytes(), 0, clock.now());
+        Entry entry1 = new EntryImpl(leasesKeyBytes, new 
LeaseBatch(List.of(lease0)).bytes(), 0, clock.now());
         listenerRef.get().onUpdate(new WatchEvent(new EntryEvent(emptyEntry, 
entry0)));
 
         assertNull(parametersRef.get());
diff --git 
a/modules/placement-driver/src/test/java/org/apache/ignite/internal/placementdriver/LeaseUpdaterTest.java
 
b/modules/placement-driver/src/test/java/org/apache/ignite/internal/placementdriver/LeaseUpdaterTest.java
index e7e2dcc46b..9a7cd175c4 100644
--- 
a/modules/placement-driver/src/test/java/org/apache/ignite/internal/placementdriver/LeaseUpdaterTest.java
+++ 
b/modules/placement-driver/src/test/java/org/apache/ignite/internal/placementdriver/LeaseUpdaterTest.java
@@ -120,7 +120,6 @@ public class LeaseUpdaterTest extends 
BaseIgniteAbstractTest {
                 stablePartAssignmentsKey(new TablePartitionId(1, 0)).bytes(),
                 Assignments.of(HybridTimestamp.MIN_VALUE.longValue(), 
Assignment.forPeer(node.name())).toBytes(),
                 1,
-                0,
                 clock.now()
         );
 

Reply via email to