You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by sd...@apache.org on 2023/06/28 14:51:33 UTC

[ignite-3] branch ignite-19778 created (now b3dcc174f2)

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

sdanilov pushed a change to branch ignite-19778
in repository https://gitbox.apache.org/repos/asf/ignite-3.git


      at b3dcc174f2 IGNITE-19778 Initial

This branch includes the following new commits:

     new b3dcc174f2 IGNITE-19778 Initial

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.



[ignite-3] 01/01: IGNITE-19778 Initial

Posted by sd...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit b3dcc174f20c75d839957cca3e6d7c53b3c30232
Author: Semyon Danilov <sa...@yandex.ru>
AuthorDate: Wed Jun 28 18:51:26 2023 +0400

    IGNITE-19778 Initial
---
 .../configuration/ConfigurationChanger.java        | 40 +++++-----
 .../storage/ConfigurationStorage.java              | 11 ---
 .../storage/TestConfigurationStorage.java          |  6 --
 .../java/org/apache/ignite/lang/ByteArray.java     |  4 +
 .../internal/metastorage/MetaStorageManager.java   |  3 +
 .../metastorage/impl/MetaStorageManagerImpl.java   | 32 ++++----
 .../server/persistence/RocksDbKeyValueStorage.java |  4 +-
 .../server/SimpleInMemoryKeyValueStorage.java      |  4 +-
 .../ItDistributedConfigurationStorageTest.java     |  1 -
 .../org/apache/ignite/internal/app/IgniteImpl.java | 10 +--
 .../storage/DistributedConfigurationStorage.java   | 88 ++++------------------
 .../storage/LocalConfigurationStorage.java         |  7 --
 .../storage/LocalFileConfigurationStorage.java     |  5 --
 13 files changed, 57 insertions(+), 158 deletions(-)

diff --git a/modules/configuration/src/main/java/org/apache/ignite/internal/configuration/ConfigurationChanger.java b/modules/configuration/src/main/java/org/apache/ignite/internal/configuration/ConfigurationChanger.java
index fa1e4bd7e6..6b115f5995 100644
--- a/modules/configuration/src/main/java/org/apache/ignite/internal/configuration/ConfigurationChanger.java
+++ b/modules/configuration/src/main/java/org/apache/ignite/internal/configuration/ConfigurationChanger.java
@@ -644,28 +644,24 @@ public abstract class ConfigurationChanger implements DynamicConfigurationChange
                     rwLock.writeLock().unlock();
                 }
 
-                // Save revisions for recovery.
-                return storage.writeConfigurationRevision(oldStorageRoots.version, newStorageRoots.version)
-                        .thenCompose(unused -> {
-                            long notificationNumber = notificationListenerCnt.incrementAndGet();
-
-                            CompletableFuture<Void> notificationFuture;
-
-                            if (dataValuesPrefixMap.isEmpty()) {
-                                notificationFuture = configurationUpdateListener.onRevisionUpdated(newChangeId, notificationNumber);
-                            } else {
-                                notificationFuture = configurationUpdateListener
-                                        .onConfigurationUpdated(oldSuperRoot, newSuperRoot, newChangeId, notificationNumber);
-                            }
-
-                            return notificationFuture.whenComplete((v, t) -> {
-                                if (t == null) {
-                                    oldStorageRoots.changeFuture.complete(null);
-                                } else {
-                                    oldStorageRoots.changeFuture.completeExceptionally(t);
-                                }
-                            });
-                        });
+                long notificationNumber = notificationListenerCnt.incrementAndGet();
+
+                CompletableFuture<Void> notificationFuture;
+
+                if (dataValuesPrefixMap.isEmpty()) {
+                    notificationFuture = configurationUpdateListener.onRevisionUpdated(newChangeId, notificationNumber);
+                } else {
+                    notificationFuture = configurationUpdateListener
+                            .onConfigurationUpdated(oldSuperRoot, newSuperRoot, newChangeId, notificationNumber);
+                }
+
+                return notificationFuture.whenComplete((v, t) -> {
+                    if (t == null) {
+                        oldStorageRoots.changeFuture.complete(null);
+                    } else {
+                        oldStorageRoots.changeFuture.completeExceptionally(t);
+                    }
+                });
             }
 
             @Override
diff --git a/modules/configuration/src/main/java/org/apache/ignite/internal/configuration/storage/ConfigurationStorage.java b/modules/configuration/src/main/java/org/apache/ignite/internal/configuration/storage/ConfigurationStorage.java
index e31f7d4e33..d9663eb284 100644
--- a/modules/configuration/src/main/java/org/apache/ignite/internal/configuration/storage/ConfigurationStorage.java
+++ b/modules/configuration/src/main/java/org/apache/ignite/internal/configuration/storage/ConfigurationStorage.java
@@ -79,17 +79,6 @@ public interface ConfigurationStorage extends ManuallyCloseable {
      */
     CompletableFuture<Long> lastRevision();
 
-    /**
-     * Writes previous and current configuration's MetaStorage revision for recovery.
-     * We need previous and current for the fail-safety: in case if node fails before changing master key on configuration update,
-     * MetaStorage's applied revision will be lower than {@code currentRevision} and we will be using previous revision.
-     *
-     * @param prevRevision Previous revision.
-     * @param currentRevision Current revision.
-     * @return A future that will be completed when revisions are written to the storage.
-     */
-    CompletableFuture<Void> writeConfigurationRevision(long prevRevision, long currentRevision);
-
     /**
      * Closes the storage.
      */
diff --git a/modules/configuration/src/testFixtures/java/org/apache/ignite/internal/configuration/storage/TestConfigurationStorage.java b/modules/configuration/src/testFixtures/java/org/apache/ignite/internal/configuration/storage/TestConfigurationStorage.java
index 37aa61facc..4231915b31 100644
--- a/modules/configuration/src/testFixtures/java/org/apache/ignite/internal/configuration/storage/TestConfigurationStorage.java
+++ b/modules/configuration/src/testFixtures/java/org/apache/ignite/internal/configuration/storage/TestConfigurationStorage.java
@@ -170,12 +170,6 @@ public class TestConfigurationStorage implements ConfigurationStorage {
         return CompletableFuture.completedFuture(version);
     }
 
-    /** {@inheritDoc} */
-    @Override
-    public CompletableFuture<Void> writeConfigurationRevision(long prevRevision, long currentRevision) {
-        return CompletableFuture.completedFuture(null);
-    }
-
     /**
      * Increase the current revision of the storage.
      *
diff --git a/modules/core/src/main/java/org/apache/ignite/lang/ByteArray.java b/modules/core/src/main/java/org/apache/ignite/lang/ByteArray.java
index 76129b6d55..e8900917aa 100644
--- a/modules/core/src/main/java/org/apache/ignite/lang/ByteArray.java
+++ b/modules/core/src/main/java/org/apache/ignite/lang/ByteArray.java
@@ -77,6 +77,10 @@ public final class ByteArray implements Comparable<ByteArray> {
         return arr;
     }
 
+    public int length() {
+        return arr.length;
+    }
+
     /** {@inheritDoc} */
     @Override
     public boolean equals(Object o) {
diff --git a/modules/metastorage-api/src/main/java/org/apache/ignite/internal/metastorage/MetaStorageManager.java b/modules/metastorage-api/src/main/java/org/apache/ignite/internal/metastorage/MetaStorageManager.java
index a862817aef..8451acf691 100644
--- a/modules/metastorage-api/src/main/java/org/apache/ignite/internal/metastorage/MetaStorageManager.java
+++ b/modules/metastorage-api/src/main/java/org/apache/ignite/internal/metastorage/MetaStorageManager.java
@@ -33,6 +33,7 @@ import org.apache.ignite.internal.metastorage.dsl.StatementResult;
 import org.apache.ignite.internal.metastorage.exceptions.CompactedException;
 import org.apache.ignite.internal.metastorage.exceptions.OperationTimeoutException;
 import org.apache.ignite.internal.metastorage.server.time.ClusterTime;
+import org.apache.ignite.internal.util.Cursor;
 import org.apache.ignite.lang.ByteArray;
 import org.apache.ignite.lang.NodeStoppingException;
 import org.jetbrains.annotations.Nullable;
@@ -86,6 +87,8 @@ public interface MetaStorageManager extends IgniteComponent {
      */
     Entry getLocally(byte[] key, long revUpperBound);
 
+    Cursor<Entry> getLocally(ByteArray startKey, ByteArray endKey, long revision);
+
     /**
      * Looks up a timestamp by a revision. This should only be invoked if it is guaranteed that the
      * revision is available in the local storage. This method always operates locally.
diff --git a/modules/metastorage/src/main/java/org/apache/ignite/internal/metastorage/impl/MetaStorageManagerImpl.java b/modules/metastorage/src/main/java/org/apache/ignite/internal/metastorage/impl/MetaStorageManagerImpl.java
index 3d3702dbaa..532fea80aa 100644
--- a/modules/metastorage/src/main/java/org/apache/ignite/internal/metastorage/impl/MetaStorageManagerImpl.java
+++ b/modules/metastorage/src/main/java/org/apache/ignite/internal/metastorage/impl/MetaStorageManagerImpl.java
@@ -62,6 +62,7 @@ import org.apache.ignite.internal.raft.RaftManager;
 import org.apache.ignite.internal.raft.RaftNodeDisruptorConfiguration;
 import org.apache.ignite.internal.raft.RaftNodeId;
 import org.apache.ignite.internal.raft.service.RaftGroupService;
+import org.apache.ignite.internal.util.Cursor;
 import org.apache.ignite.internal.util.IgniteSpinBusyLock;
 import org.apache.ignite.internal.util.IgniteUtils;
 import org.apache.ignite.internal.vault.VaultEntry;
@@ -171,7 +172,7 @@ public class MetaStorageManagerImpl implements MetaStorageManager {
 
                 assert targetRevision != null;
 
-                listenForRecovery(recoveryFinishedFuture, targetRevision);
+                listenForRecovery(targetRevision);
             });
 
             return recoveryFinishedFuture;
@@ -180,10 +181,10 @@ public class MetaStorageManagerImpl implements MetaStorageManager {
         }
     }
 
-    private void listenForRecovery(CompletableFuture<Long> res, long targetRevision) {
+    private void listenForRecovery(long targetRevision) {
         storage.setRecoveryRevisionListener(storageRevision -> {
             if (!busyLock.enterBusy()) {
-                res.completeExceptionally(new NodeStoppingException());
+                recoveryFinishedFuture.completeExceptionally(new NodeStoppingException());
 
                 return;
             }
@@ -195,7 +196,7 @@ public class MetaStorageManagerImpl implements MetaStorageManager {
 
                 storage.setRecoveryRevisionListener(null);
 
-                if (res.complete(targetRevision)) {
+                if (recoveryFinishedFuture.complete(targetRevision)) {
                     LOG.info("Finished MetaStorage recovery");
                 }
             } finally {
@@ -204,7 +205,7 @@ public class MetaStorageManagerImpl implements MetaStorageManager {
         });
 
         if (!busyLock.enterBusy()) {
-            res.completeExceptionally(new NodeStoppingException());
+            recoveryFinishedFuture.completeExceptionally(new NodeStoppingException());
 
             return;
         }
@@ -214,7 +215,7 @@ public class MetaStorageManagerImpl implements MetaStorageManager {
             if (storage.revision() >= targetRevision) {
                 storage.setRecoveryRevisionListener(null);
 
-                if (res.complete(targetRevision)) {
+                if (recoveryFinishedFuture.complete(targetRevision)) {
                     LOG.info("Finished MetaStorage recovery");
                 }
             }
@@ -425,6 +426,11 @@ public class MetaStorageManagerImpl implements MetaStorageManager {
         }
     }
 
+    @Override
+    public Cursor<Entry> getLocally(ByteArray startKey, ByteArray endKey, long revision) {
+        return storage.range(startKey.bytes(), endKey.bytes(), revision);
+    }
+
     @Override
     public HybridTimestamp timestampByRevision(long revision) {
         if (!busyLock.enterBusy()) {
@@ -735,19 +741,7 @@ public class MetaStorageManagerImpl implements MetaStorageManager {
         clusterTime.updateSafeTime(time);
 
         try {
-            CompletableFuture<Void> saveToVaultFuture;
-
-            if (watchEvent.entryEvents().isEmpty()) {
-                saveToVaultFuture = vaultMgr.put(APPLIED_REV_KEY, longToBytes(watchEvent.revision()));
-            } else {
-                Map<ByteArray, byte[]> batch = IgniteUtils.newHashMap(watchEvent.entryEvents().size() + 1);
-
-                batch.put(APPLIED_REV_KEY, longToBytes(watchEvent.revision()));
-
-                watchEvent.entryEvents().forEach(e -> batch.put(new ByteArray(e.newEntry().key()), e.newEntry().value()));
-
-                saveToVaultFuture = vaultMgr.putAll(batch);
-            }
+            CompletableFuture<Void> saveToVaultFuture = vaultMgr.put(APPLIED_REV_KEY, longToBytes(watchEvent.revision()));
 
             return saveToVaultFuture.thenRun(() -> appliedRevision = watchEvent.revision());
         } finally {
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 08ff0c2cb7..2bc2c7f05f 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
@@ -1495,9 +1495,7 @@ public class RocksDbKeyValueStorage implements KeyValueStorage {
     }
 
     private void replayUpdates(long lowerRevision, long upperRevision) {
-        // TODO: https://issues.apache.org/jira/browse/IGNITE-19778 Should be Math.max, so we start from the revision that
-        // components restored their state to (lowerRevision).
-        long minWatchRevision = Math.min(lowerRevision, watchProcessor.minWatchRevision().orElse(-1));
+        long minWatchRevision = Math.max(lowerRevision, watchProcessor.minWatchRevision().orElse(-1));
 
         if (minWatchRevision == -1 || minWatchRevision > upperRevision) {
             // No events to replay, we can start processing more recent events from the event queue.
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 2461c4bece..b8cb0d3508 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
@@ -492,9 +492,7 @@ public class SimpleInMemoryKeyValueStorage implements KeyValueStorage {
     }
 
     private void replayUpdates(long startRevision) {
-        // TODO: https://issues.apache.org/jira/browse/IGNITE-19778 Should be Math.max, so we start from the revision that
-        // components restored their state to (lowerRevision).
-        long minWatchRevision = Math.min(startRevision, watchProcessor.minWatchRevision().orElse(-1));
+        long minWatchRevision = Math.max(startRevision, watchProcessor.minWatchRevision().orElse(-1));
 
         if (minWatchRevision <= 0) {
             return;
diff --git a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/configuration/storage/ItDistributedConfigurationStorageTest.java b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/configuration/storage/ItDistributedConfigurationStorageTest.java
index 89dfa81caa..59facf67b4 100644
--- a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/configuration/storage/ItDistributedConfigurationStorageTest.java
+++ b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/configuration/storage/ItDistributedConfigurationStorageTest.java
@@ -212,7 +212,6 @@ public class ItDistributedConfigurationStorageTest {
             node.waitWatches();
 
             assertThat(node.cfgStorage.write(data, 0), willBe(equalTo(true)));
-            assertThat(node.cfgStorage.writeConfigurationRevision(0, 1), willCompleteSuccessfully());
 
             assertTrue(waitForCondition(
                     () -> node.metaStorageManager.appliedRevision() != 0,
diff --git a/modules/runner/src/main/java/org/apache/ignite/internal/app/IgniteImpl.java b/modules/runner/src/main/java/org/apache/ignite/internal/app/IgniteImpl.java
index 32eb73e031..c35e246cd3 100644
--- a/modules/runner/src/main/java/org/apache/ignite/internal/app/IgniteImpl.java
+++ b/modules/runner/src/main/java/org/apache/ignite/internal/app/IgniteImpl.java
@@ -99,8 +99,6 @@ import org.apache.ignite.internal.raft.Loza;
 import org.apache.ignite.internal.raft.client.TopologyAwareRaftGroupServiceFactory;
 import org.apache.ignite.internal.raft.configuration.RaftConfiguration;
 import org.apache.ignite.internal.raft.storage.impl.VolatileLogStorageFactoryCreator;
-import org.apache.ignite.internal.recovery.ConfigurationCatchUpListener;
-import org.apache.ignite.internal.recovery.RecoveryCompletionFutureFactory;
 import org.apache.ignite.internal.replicator.ReplicaManager;
 import org.apache.ignite.internal.replicator.ReplicaService;
 import org.apache.ignite.internal.rest.RestComponent;
@@ -748,16 +746,10 @@ public class IgniteImpl implements Ignite {
                     .thenComposeAsync(v -> {
                         LOG.info("Components started, performing recovery");
 
-                        // Recovery future must be created before configuration listeners are triggered.
-                        CompletableFuture<?> recoveryFuture = RecoveryCompletionFutureFactory.create(
-                                clusterCfgMgr,
-                                fut -> new ConfigurationCatchUpListener(cfgStorage, fut, LOG)
-                        );
-
                         return notifyConfigurationListeners()
                                 .thenComposeAsync(t -> {
                                     // Deploy all registered watches because all components are ready and have registered their listeners.
-                                    return metaStorageMgr.deployWatches().thenCompose(unused -> recoveryFuture);
+                                    return metaStorageMgr.deployWatches();
                                 }, startupExecutor);
                     }, startupExecutor)
                     .thenRunAsync(() -> {
diff --git a/modules/runner/src/main/java/org/apache/ignite/internal/configuration/storage/DistributedConfigurationStorage.java b/modules/runner/src/main/java/org/apache/ignite/internal/configuration/storage/DistributedConfigurationStorage.java
index f0dd8e74c1..102b966191 100644
--- a/modules/runner/src/main/java/org/apache/ignite/internal/configuration/storage/DistributedConfigurationStorage.java
+++ b/modules/runner/src/main/java/org/apache/ignite/internal/configuration/storage/DistributedConfigurationStorage.java
@@ -50,10 +50,8 @@ import org.apache.ignite.internal.thread.NamedThreadFactory;
 import org.apache.ignite.internal.util.ByteUtils;
 import org.apache.ignite.internal.util.Cursor;
 import org.apache.ignite.internal.util.IgniteUtils;
-import org.apache.ignite.internal.vault.VaultEntry;
 import org.apache.ignite.internal.vault.VaultManager;
 import org.apache.ignite.lang.ByteArray;
-import org.jetbrains.annotations.Nullable;
 
 /**
  * Distributed configuration storage.
@@ -70,11 +68,6 @@ public class DistributedConfigurationStorage implements ConfigurationStorage {
      */
     private static final ByteArray MASTER_KEY = new ByteArray(DISTRIBUTED_PREFIX + "$master$key");
 
-    /**
-     * Vault's key for a value of previous and current configuration's MetaStorage revision.
-     */
-    private static final ByteArray CONFIGURATION_REVISIONS_KEY = new ByteArray("$revisions");
-
     /**
      * Prefix for all keys in the distributed storage. This key is expected to be the first key in lexicographical order of distributed
      * configuration keys.
@@ -91,9 +84,6 @@ public class DistributedConfigurationStorage implements ConfigurationStorage {
     /** Meta storage manager. */
     private final MetaStorageManager metaStorageMgr;
 
-    /** Vault manager. */
-    private final VaultManager vaultMgr;
-
     /** Configuration changes listener. */
     private volatile ConfigurationStorageListener lsnr;
 
@@ -127,8 +117,6 @@ public class DistributedConfigurationStorage implements ConfigurationStorage {
      */
     public DistributedConfigurationStorage(MetaStorageManager metaStorageMgr, VaultManager vaultMgr) {
         this.metaStorageMgr = metaStorageMgr;
-
-        this.vaultMgr = vaultMgr;
     }
 
     @Override
@@ -206,60 +194,40 @@ public class DistributedConfigurationStorage implements ConfigurationStorage {
 
     @Override
     public CompletableFuture<Data> readDataOnRecovery() throws StorageException {
-        CompletableFuture<Data> future = vaultMgr.get(CONFIGURATION_REVISIONS_KEY)
-                .thenApplyAsync(entry -> {
-                    long revision = resolveRevision(metaStorageMgr.appliedRevision(), entry);
-
-                    return readDataOnRecovery0(revision);
-                }, threadPool);
+        CompletableFuture<Data> future = metaStorageMgr.recoveryFinishedFuture()
+                .thenApplyAsync(this::readDataOnRecovery0);
 
         return registerFuture(future);
     }
 
-    /**
-     * Resolves current configuration revision based on the saved in the Vault revision of the metastorage and also previous and current
-     * revisions of the configuration saved in the Vault.
-     *
-     * @param metaStorageRevision Meta Storage revision.
-     * @param revisionsEntry Configuration revisions entry.
-     * @return Configuration revision.
-     */
-    private static long resolveRevision(long metaStorageRevision, @Nullable VaultEntry revisionsEntry) {
-        if (revisionsEntry != null) {
-            byte[] value = revisionsEntry.value();
-            long prevMasterKeyRevision = ByteUtils.bytesToLong(value, 0);
-            long curMasterKeyRevision = ByteUtils.bytesToLong(value, Long.BYTES);
-
-            // If current master key revision is higher than applied revision, then node failed
-            // before applied revision changed, so we have to use previous master key revision
-            return curMasterKeyRevision <= metaStorageRevision ? curMasterKeyRevision : prevMasterKeyRevision;
-        } else {
-            // Configuration has not been updated yet, so it is safe to return 0 as the revision for the master key.
-            return 0L;
-        }
-    }
-
     private Data readDataOnRecovery0(long cfgRevision) {
         var data = new HashMap<String, Serializable>();
 
-        try (Cursor<VaultEntry> entries = storedDistributedConfigKeys()) {
-            for (VaultEntry entry : entries) {
-                ByteArray key = entry.key();
+        byte[] masterKey = MASTER_KEY.bytes();
+        boolean sawMasterKey = false;
+
+        try (Cursor<Entry> cursor = metaStorageMgr.getLocally(DST_KEYS_START_RANGE, DST_KEYS_END_RANGE, cfgRevision)) {
+            for (Entry entry : cursor) {
+                byte[] key = entry.key();
                 byte[] value = entry.value();
 
-                // vault iterator should not return nulls as values
+                // MetaStorage iterator should not return nulls as values.
                 assert value != null;
 
-                if (key.equals(MASTER_KEY)) {
+                if (!sawMasterKey && Arrays.equals(masterKey, key)) {
+                    sawMasterKey = true;
+
                     continue;
                 }
 
-                String dataKey = key.toString().substring(DISTRIBUTED_PREFIX.length());
+                byte[] keyWithoutPrefix = Arrays.copyOfRange(key, DST_KEYS_START_RANGE.length(), key.length);
+
+                var dataKey = new String(keyWithoutPrefix, UTF_8);
 
                 data.put(dataKey, ConfigurationSerializationUtil.fromBytes(value));
             }
         } catch (Exception e) {
-            throw new StorageException("Exception when closing a Vault cursor", e);
+            throw new StorageException("Exception reading data on recovery", e);
         }
 
         assert data.isEmpty() || cfgRevision > 0;
@@ -374,30 +342,6 @@ public class DistributedConfigurationStorage implements ConfigurationStorage {
         return metaStorageMgr.get(MASTER_KEY).thenApply(Entry::revision);
     }
 
-    /** {@inheritDoc} */
-    @Override
-    public CompletableFuture<Void> writeConfigurationRevision(long prevRevision, long currentRevision) {
-        byte[] value = new byte[Long.BYTES * 2];
-
-        ByteUtils.putLongToBytes(prevRevision, value, 0);
-        ByteUtils.putLongToBytes(currentRevision, value, Long.BYTES);
-
-        return vaultMgr.put(CONFIGURATION_REVISIONS_KEY, value);
-    }
-
-    /**
-     * Method that returns all distributed configuration keys from the meta storage that were stored in the vault filtered out by the
-     * current applied revision as an upper bound. Applied revision is a revision of the last successful vault update.
-     *
-     * <p>This is possible to distinguish cfg keys from meta storage because we add a special prefix {@link
-     * DistributedConfigurationStorage#DISTRIBUTED_PREFIX} to all configuration keys that we put to the meta storage.
-     *
-     * @return Iterator built upon all distributed configuration entries stored in vault.
-     */
-    private Cursor<VaultEntry> storedDistributedConfigKeys() {
-        return vaultMgr.range(DST_KEYS_START_RANGE, DST_KEYS_END_RANGE);
-    }
-
     /**
      * Increments the last character of the given string.
      */
diff --git a/modules/runner/src/main/java/org/apache/ignite/internal/configuration/storage/LocalConfigurationStorage.java b/modules/runner/src/main/java/org/apache/ignite/internal/configuration/storage/LocalConfigurationStorage.java
index e81129304c..c026a6aa04 100644
--- a/modules/runner/src/main/java/org/apache/ignite/internal/configuration/storage/LocalConfigurationStorage.java
+++ b/modules/runner/src/main/java/org/apache/ignite/internal/configuration/storage/LocalConfigurationStorage.java
@@ -223,13 +223,6 @@ public class LocalConfigurationStorage implements ConfigurationStorage {
                 .thenApply(entry -> entry == null ? 0 : (Long) fromBytes(entry.value()));
     }
 
-    /** {@inheritDoc} */
-    @Override
-    public CompletableFuture<Void> writeConfigurationRevision(long prevRevision, long currentRevision) {
-        // No-op.
-        return CompletableFuture.completedFuture(null);
-    }
-
     /**
      * Increments the last character of the given string.
      */
diff --git a/modules/runner/src/main/java/org/apache/ignite/internal/configuration/storage/LocalFileConfigurationStorage.java b/modules/runner/src/main/java/org/apache/ignite/internal/configuration/storage/LocalFileConfigurationStorage.java
index 7afc824278..742745c4cb 100644
--- a/modules/runner/src/main/java/org/apache/ignite/internal/configuration/storage/LocalFileConfigurationStorage.java
+++ b/modules/runner/src/main/java/org/apache/ignite/internal/configuration/storage/LocalFileConfigurationStorage.java
@@ -219,11 +219,6 @@ public class LocalFileConfigurationStorage implements ConfigurationStorage {
         return CompletableFuture.completedFuture(lastRevision);
     }
 
-    @Override
-    public CompletableFuture<Void> writeConfigurationRevision(long prevRevision, long currentRevision) {
-        return CompletableFuture.completedFuture(null);
-    }
-
     @Override
     public void close() {
         futureTracker.cancelInFlightFutures();