IGNITE-24172 wip
diff --git a/modules/table/src/main/java/org/apache/ignite/internal/table/distributed/index/IndexMetaStorage.java b/modules/table/src/main/java/org/apache/ignite/internal/table/distributed/index/IndexMetaStorage.java
index c779af3..3047cf3 100644
--- a/modules/table/src/main/java/org/apache/ignite/internal/table/distributed/index/IndexMetaStorage.java
+++ b/modules/table/src/main/java/org/apache/ignite/internal/table/distributed/index/IndexMetaStorage.java
@@ -31,7 +31,9 @@
 import static org.apache.ignite.internal.event.EventListener.fromFunction;
 import static org.apache.ignite.internal.hlc.HybridTimestamp.hybridTimestampToLong;
 import static org.apache.ignite.internal.lowwatermark.event.LowWatermarkEvent.LOW_WATERMARK_CHANGED;
+import static org.apache.ignite.internal.metastorage.dsl.Conditions.and;
 import static org.apache.ignite.internal.metastorage.dsl.Conditions.exists;
+import static org.apache.ignite.internal.metastorage.dsl.Conditions.notExists;
 import static org.apache.ignite.internal.metastorage.dsl.Conditions.value;
 import static org.apache.ignite.internal.metastorage.dsl.Operations.noop;
 import static org.apache.ignite.internal.metastorage.dsl.Operations.put;
@@ -80,6 +82,7 @@
 import org.apache.ignite.internal.metastorage.Entry;
 import org.apache.ignite.internal.metastorage.MetaStorageManager;
 import org.apache.ignite.internal.metastorage.Revisions;
+import org.apache.ignite.internal.metastorage.dsl.Operation;
 import org.apache.ignite.internal.util.Cursor;
 import org.apache.ignite.internal.versioned.VersionedSerialization;
 import org.jetbrains.annotations.Nullable;
@@ -211,7 +214,7 @@
 
         Catalog catalog = catalog(parameters.catalogVersion());
 
-        return updateAndSaveIndexMetaToMetastore(indexId, indexMeta -> {
+        return createAndSaveIndexMetaToMetastore(indexId, indexMeta -> {
             assert indexMeta == null : "indexId=" + indexId + "catalogVersion=" + catalog.version();
 
             return IndexMeta.of(indexId, catalog);
@@ -336,7 +339,7 @@
 
                 if (fromMetastore == null) {
                     // We did not have time to save at the index creation event.
-                    futures.add(updateAndSaveIndexMetaToMetastore(indexId, indexMeta -> IndexMeta.of(indexId, catalog)));
+                    futures.add(createAndSaveIndexMetaToMetastore(indexId, indexMeta -> IndexMeta.of(indexId, catalog)));
                 } else if (fromMetastore.catalogVersion() < catalog.version()) {
                     if (!catalogIndexDescriptor.name().equals(fromMetastore.indexName())) {
                         // We did not have time to process the index renaming event.
@@ -437,17 +440,22 @@
         return ByteArray.fromString(INDEX_META_VALUE_KEY_PREFIX + indexMeta.indexId());
     }
 
-    private CompletableFuture<?> saveToMetastore(IndexMeta newMeta) {
-        ByteArray versionKey = indexMetaVersionKey(newMeta);
+    private CompletableFuture<?> createInMetastore(IndexMeta indexMeta) {
+        return metaStorageManager.invoke(
+                notExists(indexMetaVersionKey(indexMeta)),
+                saveIndexMetaOperations(indexMeta),
+                List.of(noop())
+        );
+    }
+
+    private CompletableFuture<?> updateInMetastore(IndexMeta indexMeta) {
+        ByteArray versionKey = indexMetaVersionKey(indexMeta);
         // We need to keep order for the comparison to work correctly.
-        byte[] versionValue = intToBytesKeepingOrder(newMeta.catalogVersion());
+        byte[] versionValue = intToBytesKeepingOrder(indexMeta.catalogVersion());
 
         return metaStorageManager.invoke(
-                value(versionKey).lt(versionValue),
-                List.of(
-                        put(versionKey, versionValue),
-                        put(indexMetaValueKey(newMeta), VersionedSerialization.toBytes(newMeta, IndexMetaSerializer.INSTANCE))
-                ),
+                and(exists(versionKey), value(versionKey).lt(versionValue)),
+                saveIndexMetaOperations(indexMeta),
                 List.of(noop())
         );
     }
@@ -462,13 +470,32 @@
         );
     }
 
+    private static List<Operation> saveIndexMetaOperations(IndexMeta indexMeta) {
+        // We need to keep order for the comparison to work correctly.
+        byte[] versionValue = intToBytesKeepingOrder(indexMeta.catalogVersion());
+
+        return List.of(
+                put(indexMetaVersionKey(indexMeta), versionValue),
+                put(indexMetaValueKey(indexMeta), VersionedSerialization.toBytes(indexMeta, IndexMetaSerializer.INSTANCE))
+        );
+    }
+
+    private CompletableFuture<?> createAndSaveIndexMetaToMetastore(
+            int indexId,
+            Function<@Nullable IndexMeta, IndexMeta> updateFunction
+    ) {
+        IndexMeta newMeta = indexMetaByIndexId.compute(indexId, (id, indexMeta) -> updateFunction.apply(indexMeta));
+
+        return createInMetastore(newMeta);
+    }
+
     private CompletableFuture<?> updateAndSaveIndexMetaToMetastore(
             int indexId,
             Function<@Nullable IndexMeta, IndexMeta> updateFunction
     ) {
         IndexMeta newMeta = indexMetaByIndexId.compute(indexId, (id, indexMeta) -> updateFunction.apply(indexMeta));
 
-        return saveToMetastore(newMeta);
+        return updateInMetastore(newMeta);
     }
 
     private int lwmCatalogVersion(@Nullable HybridTimestamp lwm) {
diff --git a/modules/table/src/test/java/org/apache/ignite/internal/table/distributed/index/IndexMetaStorageRecoveryTest.java b/modules/table/src/test/java/org/apache/ignite/internal/table/distributed/index/IndexMetaStorageRecoveryTest.java
index a6c94f6..9665df8 100644
--- a/modules/table/src/test/java/org/apache/ignite/internal/table/distributed/index/IndexMetaStorageRecoveryTest.java
+++ b/modules/table/src/test/java/org/apache/ignite/internal/table/distributed/index/IndexMetaStorageRecoveryTest.java
@@ -88,7 +88,7 @@
                 scheduledExecutorService
         );
 
-        return StandaloneMetaStorageManager.create(keyValueStorage, readOperationForCompactionTracker);
+        return StandaloneMetaStorageManager.create(keyValueStorage, clock, readOperationForCompactionTracker);
     }
 
     @Override