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

sk0x50 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 d5f7ef18c1e IGNITE-28105 Ensure new leader clock is not lower than 
last applied cmd (#7731)
d5f7ef18c1e is described below

commit d5f7ef18c1e04287855ddb457469610309b92546
Author: Egor <[email protected]>
AuthorDate: Thu Mar 19 23:16:26 2026 +0700

    IGNITE-28105 Ensure new leader clock is not lower than last applied cmd 
(#7731)
    
    Co-authored-by: Egor Kuts <[email protected]>
    Co-authored-by: Aleksei Scherbakov <[email protected]>
---
 .../java/org/apache/ignite/internal/hlc/ClockService.java   | 11 +++++++++++
 .../org/apache/ignite/internal/hlc/ClockServiceImpl.java    |  6 +++++-
 .../org/apache/ignite/internal/hlc/TestClockService.java    |  5 +++++
 .../raft/ItZonePartitionRaftListenerRecoveryTest.java       | 10 +++++++++-
 .../replicator/PartitionReplicaLifecycleManager.java        |  3 ++-
 .../internal/partition/replicator/ZoneResourcesManager.java | 10 ++++++++--
 .../replicator/raft/ZonePartitionRaftListener.java          |  8 +++++++-
 .../replicator/PartitionReplicaLifecycleManagerTest.java    |  3 ++-
 .../partition/replicator/ZoneResourcesManagerTest.java      |  4 +++-
 .../replicator/raft/ZonePartitionRaftListenerTest.java      | 13 ++++++++++++-
 .../ignite/distributed/ReplicasSafeTimePropagationTest.java |  8 +++++++-
 .../distributed/raft/PartitionCommandListenerTest.java      |  9 +++++++++
 .../java/org/apache/ignite/distributed/ItTxTestCluster.java |  3 ++-
 .../ignite/internal/table/impl/DummyInternalTableImpl.java  |  8 +++++++-
 14 files changed, 89 insertions(+), 12 deletions(-)

diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/hlc/ClockService.java 
b/modules/core/src/main/java/org/apache/ignite/internal/hlc/ClockService.java
index b538ab51aaf..3c8a059d94c 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/hlc/ClockService.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/hlc/ClockService.java
@@ -64,6 +64,17 @@ public interface ClockService {
      */
     HybridTimestamp updateClock(HybridTimestamp requestTime);
 
+    /**
+     * Advances the clock in accordance with the request time. If the request 
time is ahead of the clock,
+     * the clock is advanced to the tick that is next to the request time; 
otherwise, it's advanced to the tick
+     * that is next to the local time.
+     *
+     * @param requestTime Timestamp from request.
+     * @param checkClockSkew Whether to check for clock skew and log warnings 
if exceeded.
+     * @return New local hybrid timestamp that is on the clock (it is ahead of 
both the old clock time and the request time).
+     */
+    HybridTimestamp updateClock(HybridTimestamp requestTime, boolean 
checkClockSkew);
+
     /**
      * Wait for the clock to reach the given timestamp.
      *
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/hlc/ClockServiceImpl.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/hlc/ClockServiceImpl.java
index e96271dbf80..dc112e11bcb 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/hlc/ClockServiceImpl.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/hlc/ClockServiceImpl.java
@@ -85,10 +85,14 @@ public class ClockServiceImpl implements ClockService {
                     currentLocalTimestamp, maxClockSkewMillis());
             onMaxClockSkewExceededClosure.accept(requestTimePhysical - 
currentLocalTimePhysical);
         }
-
         return clock.update(requestTime);
     }
 
+    @Override
+    public HybridTimestamp updateClock(HybridTimestamp requestTime, boolean 
checkClockSkew) {
+        return checkClockSkew ? updateClock(requestTime) : 
clock.update(requestTime);
+    }
+
     @Override
     public CompletableFuture<Void> waitFor(HybridTimestamp targetTimestamp) {
         return clockWaiter.waitFor(targetTimestamp);
diff --git 
a/modules/core/src/testFixtures/java/org/apache/ignite/internal/hlc/TestClockService.java
 
b/modules/core/src/testFixtures/java/org/apache/ignite/internal/hlc/TestClockService.java
index bcaf0a3537e..5fae8626d4c 100644
--- 
a/modules/core/src/testFixtures/java/org/apache/ignite/internal/hlc/TestClockService.java
+++ 
b/modules/core/src/testFixtures/java/org/apache/ignite/internal/hlc/TestClockService.java
@@ -70,6 +70,11 @@ public class TestClockService implements ClockService {
         return clock.update(requestTime);
     }
 
+    @Override
+    public HybridTimestamp updateClock(HybridTimestamp requestTime, boolean 
checkClockSkew) {
+        return clock.update(requestTime);
+    }
+
     @Override
     public CompletableFuture<Void> waitFor(HybridTimestamp targetTimestamp) {
         if (clockWaiter == null) {
diff --git 
a/modules/partition-replicator/src/integrationTest/java/org/apache/ignite/internal/partition/replicator/raft/ItZonePartitionRaftListenerRecoveryTest.java
 
b/modules/partition-replicator/src/integrationTest/java/org/apache/ignite/internal/partition/replicator/raft/ItZonePartitionRaftListenerRecoveryTest.java
index 9380a6d0c8a..b94f9374847 100644
--- 
a/modules/partition-replicator/src/integrationTest/java/org/apache/ignite/internal/partition/replicator/raft/ItZonePartitionRaftListenerRecoveryTest.java
+++ 
b/modules/partition-replicator/src/integrationTest/java/org/apache/ignite/internal/partition/replicator/raft/ItZonePartitionRaftListenerRecoveryTest.java
@@ -66,6 +66,7 @@ import org.apache.ignite.internal.hlc.ClockService;
 import org.apache.ignite.internal.hlc.HybridClock;
 import org.apache.ignite.internal.hlc.HybridClockImpl;
 import org.apache.ignite.internal.hlc.HybridTimestamp;
+import org.apache.ignite.internal.hlc.TestClockService;
 import org.apache.ignite.internal.lang.IgniteInternalException;
 import org.apache.ignite.internal.lang.NodeStoppingException;
 import org.apache.ignite.internal.manager.ComponentContext;
@@ -182,6 +183,8 @@ class ItZonePartitionRaftListenerRecoveryTest extends 
IgniteAbstractTest {
 
     private final HybridClock clock = new HybridClockImpl();
 
+    private final ClockService clockService = new TestClockService(clock);
+
     private final Map<Integer, MockMvPartitionStorage> storagesByTableId = new 
HashMap<>();
 
     private static class MockMvPartitionStorage {
@@ -336,7 +339,8 @@ class ItZonePartitionRaftListenerRecoveryTest extends 
IgniteAbstractTest {
                 new SafeTimeValuesTracker(HybridTimestamp.MIN_VALUE),
                 new PendingComparableValuesTracker<>(0L),
                 outgoingSnapshotsManager,
-                executor
+                executor,
+                clockService
         );
 
         for (int tableId : tableIds) {
@@ -392,6 +396,10 @@ class ItZonePartitionRaftListenerRecoveryTest extends 
IgniteAbstractTest {
 
         ClockService clockService = mock(ClockService.class);
         lenient().when(clockService.current()).thenReturn(clock.current());
+        lenient().when(clockService.updateClock(any(), 
anyBoolean())).thenAnswer(invocation -> {
+            HybridTimestamp requestTime = invocation.getArgument(0);
+            return clock.update(requestTime);
+        });
 
         return new TablePartitionProcessor(
                 txManager,
diff --git 
a/modules/partition-replicator/src/main/java/org/apache/ignite/internal/partition/replicator/PartitionReplicaLifecycleManager.java
 
b/modules/partition-replicator/src/main/java/org/apache/ignite/internal/partition/replicator/PartitionReplicaLifecycleManager.java
index d931f6806a5..1764b1bbc6e 100644
--- 
a/modules/partition-replicator/src/main/java/org/apache/ignite/internal/partition/replicator/PartitionReplicaLifecycleManager.java
+++ 
b/modules/partition-replicator/src/main/java/org/apache/ignite/internal/partition/replicator/PartitionReplicaLifecycleManager.java
@@ -382,7 +382,8 @@ public class PartitionReplicaLifecycleManager extends
                         catalogService,
                         failureProcessor,
                         partitionOperationsExecutor,
-                        replicaMgr
+                        replicaMgr,
+                        clockService
                 ),
                 metricManager,
                 messagingService,
diff --git 
a/modules/partition-replicator/src/main/java/org/apache/ignite/internal/partition/replicator/ZoneResourcesManager.java
 
b/modules/partition-replicator/src/main/java/org/apache/ignite/internal/partition/replicator/ZoneResourcesManager.java
index 099bc16255b..3249c451168 100644
--- 
a/modules/partition-replicator/src/main/java/org/apache/ignite/internal/partition/replicator/ZoneResourcesManager.java
+++ 
b/modules/partition-replicator/src/main/java/org/apache/ignite/internal/partition/replicator/ZoneResourcesManager.java
@@ -28,6 +28,7 @@ import java.util.concurrent.Executor;
 import org.apache.ignite.internal.catalog.CatalogService;
 import org.apache.ignite.internal.close.ManuallyCloseable;
 import org.apache.ignite.internal.failure.FailureProcessor;
+import org.apache.ignite.internal.hlc.ClockService;
 import org.apache.ignite.internal.network.TopologyService;
 import 
org.apache.ignite.internal.partition.replicator.raft.ZonePartitionRaftListener;
 import 
org.apache.ignite.internal.partition.replicator.raft.snapshot.LogStorageAccessImpl;
@@ -71,6 +72,8 @@ public class ZoneResourcesManager implements 
ManuallyCloseable {
 
     private final ReplicaManager replicaManager;
 
+    private final ClockService clockService;
+
     private final RaftSnapshotsMetricsSource snapshotsMetricsSource = new 
RaftSnapshotsMetricsSource();
 
     /** Map from zone IDs to their resource holders. */
@@ -86,7 +89,8 @@ public class ZoneResourcesManager implements 
ManuallyCloseable {
             CatalogService catalogService,
             FailureProcessor failureProcessor,
             Executor partitionOperationsExecutor,
-            ReplicaManager replicaManager
+            ReplicaManager replicaManager,
+            ClockService clockService
     ) {
         this.sharedTxStateStorage = sharedTxStateStorage;
         this.txManager = txManager;
@@ -96,6 +100,7 @@ public class ZoneResourcesManager implements 
ManuallyCloseable {
         this.failureProcessor = failureProcessor;
         this.partitionOperationsExecutor = partitionOperationsExecutor;
         this.replicaManager = replicaManager;
+        this.clockService = clockService;
     }
 
     ZonePartitionResources allocateZonePartitionResources(
@@ -119,7 +124,8 @@ public class ZoneResourcesManager implements 
ManuallyCloseable {
                 safeTimeTracker,
                 storageIndexTracker,
                 outgoingSnapshotsManager,
-                partitionOperationsExecutor
+                partitionOperationsExecutor,
+                clockService
         );
 
         var snapshotStorage = new PartitionSnapshotStorage(
diff --git 
a/modules/partition-replicator/src/main/java/org/apache/ignite/internal/partition/replicator/raft/ZonePartitionRaftListener.java
 
b/modules/partition-replicator/src/main/java/org/apache/ignite/internal/partition/replicator/raft/ZonePartitionRaftListener.java
index 9eabd1db070..3011de42ad7 100644
--- 
a/modules/partition-replicator/src/main/java/org/apache/ignite/internal/partition/replicator/raft/ZonePartitionRaftListener.java
+++ 
b/modules/partition-replicator/src/main/java/org/apache/ignite/internal/partition/replicator/raft/ZonePartitionRaftListener.java
@@ -28,6 +28,7 @@ import java.nio.file.Path;
 import java.util.Iterator;
 import java.util.concurrent.Executor;
 import java.util.function.Consumer;
+import org.apache.ignite.internal.hlc.ClockService;
 import org.apache.ignite.internal.hlc.HybridTimestamp;
 import org.apache.ignite.internal.logger.IgniteLogger;
 import org.apache.ignite.internal.logger.Loggers;
@@ -111,6 +112,8 @@ public class ZonePartitionRaftListener implements 
RaftGroupListener {
 
     private final RaftGroupConfigurationConverter 
raftGroupConfigurationConverter = new RaftGroupConfigurationConverter();
 
+    private final ClockService clockService;
+
     /** Constructor. */
     public ZonePartitionRaftListener(
             ZonePartitionId zonePartitionId,
@@ -119,13 +122,15 @@ public class ZonePartitionRaftListener implements 
RaftGroupListener {
             SafeTimeValuesTracker safeTimeTracker,
             PendingComparableValuesTracker<Long, Void> storageIndexTracker,
             PartitionsSnapshots partitionsSnapshots,
-            Executor partitionOperationsExecutor
+            Executor partitionOperationsExecutor,
+            ClockService clockService
     ) {
         this.safeTimeTracker = safeTimeTracker;
         this.storageIndexTracker = storageIndexTracker;
         this.partitionsSnapshots = partitionsSnapshots;
         this.txStateStorage = txStatePartitionStorage;
         this.partitionKey = new PartitionKey(zonePartitionId.zoneId(), 
zonePartitionId.partitionId());
+        this.clockService = clockService;
 
         onSnapshotSaveHandler = new 
OnSnapshotSaveHandler(txStatePartitionStorage, partitionOperationsExecutor);
 
@@ -261,6 +266,7 @@ public class ZonePartitionRaftListener implements 
RaftGroupListener {
                     // Adjust safe time before completing update to reduce 
waiting.
                     if (safeTimestamp != null) {
                         try {
+                            clockService.updateClock(safeTimestamp, false);
                             safeTimeTracker.update(safeTimestamp, 
commandIndex, commandTerm, command);
                         } catch (TrackerClosedException ignored) {
                             // Ignored.
diff --git 
a/modules/partition-replicator/src/test/java/org/apache/ignite/internal/partition/replicator/PartitionReplicaLifecycleManagerTest.java
 
b/modules/partition-replicator/src/test/java/org/apache/ignite/internal/partition/replicator/PartitionReplicaLifecycleManagerTest.java
index ff9e319a599..eec1e20389d 100644
--- 
a/modules/partition-replicator/src/test/java/org/apache/ignite/internal/partition/replicator/PartitionReplicaLifecycleManagerTest.java
+++ 
b/modules/partition-replicator/src/test/java/org/apache/ignite/internal/partition/replicator/PartitionReplicaLifecycleManagerTest.java
@@ -263,7 +263,8 @@ class PartitionReplicaLifecycleManagerTest extends 
BaseIgniteAbstractTest {
                 catalogService,
                 failureManager,
                 executorService,
-                replicaManager
+                replicaManager,
+                mock(ClockService.class)
         ) {
             @Override
             protected TxStateStorage createTxStateStorage(int zoneId, int 
partitionCount) {
diff --git 
a/modules/partition-replicator/src/test/java/org/apache/ignite/internal/partition/replicator/ZoneResourcesManagerTest.java
 
b/modules/partition-replicator/src/test/java/org/apache/ignite/internal/partition/replicator/ZoneResourcesManagerTest.java
index 99a1ab48328..d4866d764a0 100644
--- 
a/modules/partition-replicator/src/test/java/org/apache/ignite/internal/partition/replicator/ZoneResourcesManagerTest.java
+++ 
b/modules/partition-replicator/src/test/java/org/apache/ignite/internal/partition/replicator/ZoneResourcesManagerTest.java
@@ -38,6 +38,7 @@ import java.util.stream.IntStream;
 import org.apache.ignite.internal.catalog.CatalogService;
 import org.apache.ignite.internal.components.LogSyncer;
 import org.apache.ignite.internal.failure.FailureProcessor;
+import org.apache.ignite.internal.hlc.ClockService;
 import org.apache.ignite.internal.hlc.HybridTimestamp;
 import org.apache.ignite.internal.lang.IgniteInternalException;
 import org.apache.ignite.internal.manager.ComponentContext;
@@ -96,7 +97,8 @@ class ZoneResourcesManagerTest extends IgniteAbstractTest {
                 catalogService,
                 mock(FailureProcessor.class),
                 executor,
-                replicaManager
+                replicaManager,
+                mock(ClockService.class)
         );
         assertThat(sharedStorage.startAsync(new ComponentContext()), 
willCompleteSuccessfully());
     }
diff --git 
a/modules/partition-replicator/src/test/java/org/apache/ignite/internal/partition/replicator/raft/ZonePartitionRaftListenerTest.java
 
b/modules/partition-replicator/src/test/java/org/apache/ignite/internal/partition/replicator/raft/ZonePartitionRaftListenerTest.java
index 650036f82f8..ebd0631df6b 100644
--- 
a/modules/partition-replicator/src/test/java/org/apache/ignite/internal/partition/replicator/raft/ZonePartitionRaftListenerTest.java
+++ 
b/modules/partition-replicator/src/test/java/org/apache/ignite/internal/partition/replicator/raft/ZonePartitionRaftListenerTest.java
@@ -193,6 +193,12 @@ class ZonePartitionRaftListenerTest extends 
BaseIgniteAbstractTest {
     }
 
     private ZonePartitionRaftListener createListener() {
+        HybridClock clock = mock(HybridClock.class);
+        ClockService clockService = mock(ClockService.class);
+        lenient().when(clockService.updateClock(any(), 
anyBoolean())).thenAnswer(invocation -> {
+            HybridTimestamp requestTime = invocation.getArgument(0);
+            return clock.update(requestTime);
+        });
         return new ZonePartitionRaftListener(
                 new ZonePartitionId(ZONE_ID, PARTITION_ID),
                 txStatePartitionStorage,
@@ -200,7 +206,8 @@ class ZonePartitionRaftListenerTest extends 
BaseIgniteAbstractTest {
                 safeTimeTracker,
                 storageIndexTracker,
                 outgoingSnapshotsManager,
-                executor
+                executor,
+                clockService
         );
     }
 
@@ -950,6 +957,10 @@ class ZonePartitionRaftListenerTest extends 
BaseIgniteAbstractTest {
 
         ClockService clockService = mock(ClockService.class);
         lenient().when(clockService.current()).thenReturn(clock.current());
+        lenient().when(clockService.updateClock(any(), 
anyBoolean())).thenAnswer(invocation -> {
+            HybridTimestamp requestTime = invocation.getArgument(0);
+            return clock.update(requestTime);
+        });
 
         StorageUpdateHandler storageUpdateHandler = 
mock(StorageUpdateHandler.class);
 
diff --git 
a/modules/table/src/integrationTest/java/org/apache/ignite/distributed/ReplicasSafeTimePropagationTest.java
 
b/modules/table/src/integrationTest/java/org/apache/ignite/distributed/ReplicasSafeTimePropagationTest.java
index 30452f0b0e6..545908c4228 100644
--- 
a/modules/table/src/integrationTest/java/org/apache/ignite/distributed/ReplicasSafeTimePropagationTest.java
+++ 
b/modules/table/src/integrationTest/java/org/apache/ignite/distributed/ReplicasSafeTimePropagationTest.java
@@ -27,6 +27,7 @@ import static org.junit.jupiter.api.Assertions.assertNotNull;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 import static org.junit.jupiter.api.Assertions.fail;
 import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyBoolean;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
@@ -380,6 +381,10 @@ public class ReplicasSafeTimePropagationTest extends 
IgniteAbstractTest {
 
             ClockService clockService = mock(ClockService.class);
             when(clockService.current()).thenReturn(clock.current());
+            when(clockService.updateClock(any(), 
anyBoolean())).thenAnswer(invocation -> {
+                HybridTimestamp requestTime = invocation.getArgument(0);
+                return clock.update(requestTime);
+            });
 
             OutgoingSnapshotsManager outgoingSnapshotsManager = new 
OutgoingSnapshotsManager(
                     clusterService.nodeName(),
@@ -397,7 +402,8 @@ public class ReplicasSafeTimePropagationTest extends 
IgniteAbstractTest {
                             safeTs,
                             
mock(PendingIndependentComparableValuesTracker.class),
                             outgoingSnapshotsManager,
-                            mock(Executor.class)
+                            mock(Executor.class),
+                            clockService
                     ) {
                         @Override
                         public void 
onWrite(Iterator<CommandClosure<WriteCommand>> iterator) {
diff --git 
a/modules/table/src/test/java/org/apache/ignite/internal/table/distributed/raft/PartitionCommandListenerTest.java
 
b/modules/table/src/test/java/org/apache/ignite/internal/table/distributed/raft/PartitionCommandListenerTest.java
index 54eb7e8ee5f..2cf97e58337 100644
--- 
a/modules/table/src/test/java/org/apache/ignite/internal/table/distributed/raft/PartitionCommandListenerTest.java
+++ 
b/modules/table/src/test/java/org/apache/ignite/internal/table/distributed/raft/PartitionCommandListenerTest.java
@@ -27,6 +27,7 @@ import static 
org.apache.ignite.internal.testframework.IgniteTestUtils.deriveUui
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertNotNull;
 import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.mockito.ArgumentMatchers.anyBoolean;
 import static org.mockito.ArgumentMatchers.anyInt;
 import static org.mockito.ArgumentMatchers.anyLong;
 import static org.mockito.ArgumentMatchers.eq;
@@ -264,6 +265,10 @@ public class PartitionCommandListenerTest extends 
BaseIgniteAbstractTest {
 
         ClockService clockService = mock(ClockService.class);
         
lenient().when(clockService.current()).thenReturn(hybridClock.current());
+        lenient().when(clockService.updateClock(any(), 
anyBoolean())).thenAnswer(invocation -> {
+            HybridTimestamp requestTime = invocation.getArgument(0);
+            return hybridClock.update(requestTime);
+        });
 
         commandListener = new TablePartitionProcessor(
                 mock(TxManager.class),
@@ -592,6 +597,10 @@ public class PartitionCommandListenerTest extends 
BaseIgniteAbstractTest {
 
         ClockService clockService = mock(ClockService.class);
         
lenient().when(clockService.current()).thenReturn(hybridClock.current());
+        lenient().when(clockService.updateClock(any(), 
anyBoolean())).thenAnswer(invocation -> {
+            HybridTimestamp requestTime = invocation.getArgument(0);
+            return hybridClock.update(requestTime);
+        });
 
         
when(indexUpdateHandler.getNextRowIdToBuildIndex(anyInt())).thenReturn(RowId.lowestRowId(PARTITION_ID));
         doNothing().when(indexUpdateHandler).buildIndex(eq(indexId), 
any(Stream.class), any());
diff --git 
a/modules/table/src/testFixtures/java/org/apache/ignite/distributed/ItTxTestCluster.java
 
b/modules/table/src/testFixtures/java/org/apache/ignite/distributed/ItTxTestCluster.java
index 816dd602018..000c34dc4ec 100644
--- 
a/modules/table/src/testFixtures/java/org/apache/ignite/distributed/ItTxTestCluster.java
+++ 
b/modules/table/src/testFixtures/java/org/apache/ignite/distributed/ItTxTestCluster.java
@@ -915,7 +915,8 @@ public class ItTxTestCluster {
                         safeTimeTracker,
                         storageIndexTracker,
                         mock(PartitionsSnapshots.class, RETURNS_DEEP_STUBS),
-                        partitionOperationsExecutor
+                        partitionOperationsExecutor,
+                        clockServices.get(assignment)
                 )
         );
 
diff --git 
a/modules/table/src/testFixtures/java/org/apache/ignite/internal/table/impl/DummyInternalTableImpl.java
 
b/modules/table/src/testFixtures/java/org/apache/ignite/internal/table/impl/DummyInternalTableImpl.java
index dfe814ccef1..d44eb9f8286 100644
--- 
a/modules/table/src/testFixtures/java/org/apache/ignite/internal/table/impl/DummyInternalTableImpl.java
+++ 
b/modules/table/src/testFixtures/java/org/apache/ignite/internal/table/impl/DummyInternalTableImpl.java
@@ -25,6 +25,7 @@ import static 
org.apache.ignite.internal.util.CompletableFutures.nullCompletedFu
 import static org.apache.ignite.lang.ErrorGroups.Common.INTERNAL_ERR;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyBoolean;
 import static org.mockito.ArgumentMatchers.anyInt;
 import static org.mockito.ArgumentMatchers.anyLong;
 import static org.mockito.ArgumentMatchers.anyString;
@@ -540,6 +541,10 @@ public class DummyInternalTableImpl extends 
InternalTableImpl {
         HybridClock clock = new HybridClockImpl();
         ClockService clockService = mock(ClockService.class);
         lenient().when(clockService.current()).thenReturn(clock.current());
+        lenient().when(clockService.updateClock(any(), 
anyBoolean())).thenAnswer(invocation -> {
+            HybridTimestamp requestTime = invocation.getArgument(0);
+            return clock.update(requestTime);
+        });
 
         PendingComparableValuesTracker<Long, Void> storageIndexTracker = new 
PendingComparableValuesTracker<>(0L);
         var tablePartitionListener = new TablePartitionProcessor(
@@ -563,7 +568,8 @@ public class DummyInternalTableImpl extends 
InternalTableImpl {
                 safeTime,
                 storageIndexTracker,
                 new NoOpPartitionsSnapshots(),
-                mock(Executor.class)
+                mock(Executor.class),
+                clockService
         );
 
         zoneRaftListener.addTableProcessor(tableId, tablePartitionListener);

Reply via email to