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

apolovtsev 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 08be5eb73b IGNITE-21120 Add indexes system view (#3342)
08be5eb73b is described below

commit 08be5eb73b4a5cb1da3bc25271de12eb8f6fa260
Author: Phillippko <[email protected]>
AuthorDate: Thu Mar 7 13:11:41 2024 +0400

    IGNITE-21120 Add indexes system view (#3342)
---
 .../internal/catalog/CatalogManagerImpl.java       | 139 ++++++++++++++++-----
 .../internal/catalog/CatalogManagerSelfTest.java   |  16 ++-
 .../internal/catalog/BaseCatalogManagerTest.java   |   1 +
 .../ignite/internal/catalog/CatalogTestUtils.java  |  13 +-
 ...niteDistributionZoneManagerNodeRestartTest.java |   2 +-
 .../internal/index/ChangeIndexStatusTaskTest.java  |   2 +-
 .../runner/app/ItIgniteNodeRestartTest.java        |  25 ++--
 .../org/apache/ignite/internal/app/IgniteImpl.java |   1 +
 .../sql/engine/ItIndexesSystemViewTest.java        |  96 ++++++++++++++
 .../rebalance/ItRebalanceDistributedTest.java      |   1 +
 10 files changed, 235 insertions(+), 61 deletions(-)

diff --git 
a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/CatalogManagerImpl.java
 
b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/CatalogManagerImpl.java
index 293b1376c6..86cafcb482 100644
--- 
a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/CatalogManagerImpl.java
+++ 
b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/CatalogManagerImpl.java
@@ -20,8 +20,15 @@ package org.apache.ignite.internal.catalog;
 import static java.util.concurrent.CompletableFuture.allOf;
 import static java.util.concurrent.CompletableFuture.completedFuture;
 import static java.util.concurrent.CompletableFuture.failedFuture;
+import static java.util.stream.Collectors.joining;
 import static 
org.apache.ignite.internal.catalog.commands.CatalogUtils.clusterWideEnsuredActivationTimestamp;
 import static 
org.apache.ignite.internal.catalog.commands.CatalogUtils.fromParams;
+import static 
org.apache.ignite.internal.catalog.descriptors.CatalogIndexDescriptor.CatalogIndexDescriptorType.HASH;
+import static 
org.apache.ignite.internal.catalog.descriptors.CatalogIndexStatus.AVAILABLE;
+import static org.apache.ignite.internal.type.NativeTypes.BOOLEAN;
+import static org.apache.ignite.internal.type.NativeTypes.INT32;
+import static org.apache.ignite.internal.type.NativeTypes.STRING;
+import static org.apache.ignite.internal.type.NativeTypes.stringOf;
 import static org.apache.ignite.internal.util.CollectionUtils.nullOrEmpty;
 import static 
org.apache.ignite.internal.util.CompletableFutures.nullCompletedFuture;
 
@@ -41,10 +48,12 @@ import java.util.function.Consumer;
 import java.util.function.Function;
 import java.util.function.LongSupplier;
 import java.util.function.Predicate;
+import 
org.apache.ignite.internal.catalog.descriptors.CatalogHashIndexDescriptor;
 import org.apache.ignite.internal.catalog.descriptors.CatalogIndexDescriptor;
 import org.apache.ignite.internal.catalog.descriptors.CatalogIndexStatus;
 import org.apache.ignite.internal.catalog.descriptors.CatalogObjectDescriptor;
 import org.apache.ignite.internal.catalog.descriptors.CatalogSchemaDescriptor;
+import 
org.apache.ignite.internal.catalog.descriptors.CatalogSortedIndexDescriptor;
 import 
org.apache.ignite.internal.catalog.descriptors.CatalogSystemViewDescriptor;
 import 
org.apache.ignite.internal.catalog.descriptors.CatalogTableColumnDescriptor;
 import org.apache.ignite.internal.catalog.descriptors.CatalogTableDescriptor;
@@ -61,6 +70,7 @@ import 
org.apache.ignite.internal.catalog.storage.UpdateLog.OnUpdateHandler;
 import org.apache.ignite.internal.catalog.storage.UpdateLogEvent;
 import org.apache.ignite.internal.catalog.storage.VersionedUpdate;
 import org.apache.ignite.internal.event.AbstractEventProducer;
+import org.apache.ignite.internal.hlc.HybridClock;
 import org.apache.ignite.internal.hlc.HybridTimestamp;
 import org.apache.ignite.internal.lang.IgniteInternalException;
 import org.apache.ignite.internal.lang.NodeStoppingException;
@@ -69,7 +79,6 @@ import org.apache.ignite.internal.logger.Loggers;
 import org.apache.ignite.internal.systemview.api.SystemView;
 import org.apache.ignite.internal.systemview.api.SystemViewProvider;
 import org.apache.ignite.internal.systemview.api.SystemViews;
-import org.apache.ignite.internal.type.NativeTypes;
 import org.apache.ignite.internal.util.IgniteSpinBusyLock;
 import org.apache.ignite.internal.util.PendingComparableValuesTracker;
 import org.apache.ignite.internal.util.SubscriptionUtils;
@@ -121,18 +130,26 @@ public class CatalogManagerImpl extends 
AbstractEventProducer<CatalogEvent, Cata
     /** Busy lock to stop synchronously. */
     private final IgniteSpinBusyLock busyLock = new IgniteSpinBusyLock();
 
+    /** Clock. */
+    private final HybridClock clock;
+
     /**
      * Constructor.
      */
-    public CatalogManagerImpl(UpdateLog updateLog, ClockWaiter clockWaiter) {
-        this(updateLog, clockWaiter, DEFAULT_DELAY_DURATION, 
DEFAULT_PARTITION_IDLE_SAFE_TIME_PROPAGATION_PERIOD);
+    public CatalogManagerImpl(UpdateLog updateLog, ClockWaiter clockWaiter, 
HybridClock clock) {
+        this(updateLog, clockWaiter, clock, DEFAULT_DELAY_DURATION, 
DEFAULT_PARTITION_IDLE_SAFE_TIME_PROPAGATION_PERIOD);
     }
 
     /**
      * Constructor.
      */
-    CatalogManagerImpl(UpdateLog updateLog, ClockWaiter clockWaiter, long 
delayDurationMs, long partitionIdleSafeTimePropagationPeriod) {
-        this(updateLog, clockWaiter, () -> delayDurationMs, () -> 
partitionIdleSafeTimePropagationPeriod);
+    CatalogManagerImpl(UpdateLog updateLog,
+            ClockWaiter clockWaiter,
+            HybridClock clock,
+            long delayDurationMs,
+            long partitionIdleSafeTimePropagationPeriod
+    ) {
+        this(updateLog, clockWaiter, clock, () -> delayDurationMs, () -> 
partitionIdleSafeTimePropagationPeriod);
     }
 
     /**
@@ -141,11 +158,13 @@ public class CatalogManagerImpl extends 
AbstractEventProducer<CatalogEvent, Cata
     public CatalogManagerImpl(
             UpdateLog updateLog,
             ClockWaiter clockWaiter,
+            HybridClock clock,
             LongSupplier delayDurationMsSupplier,
             LongSupplier partitionIdleSafeTimePropagationPeriodMsSupplier
     ) {
         this.updateLog = updateLog;
         this.clockWaiter = clockWaiter;
+        this.clock = clock;
         this.delayDurationMsSupplier = delayDurationMsSupplier;
         this.partitionIdleSafeTimePropagationPeriodMsSupplier = 
partitionIdleSafeTimePropagationPeriodMsSupplier;
     }
@@ -437,7 +456,8 @@ public class CatalogManagerImpl extends 
AbstractEventProducer<CatalogEvent, Cata
         return List.of(
                 createSystemViewsView(),
                 createSystemViewColumnsView(),
-                createSystemViewZonesView()
+                createZonesView(),
+                createIndexesView()
         );
     }
 
@@ -566,7 +586,7 @@ public class CatalogManagerImpl extends 
AbstractEventProducer<CatalogEvent, Cata
         // All indexes, which were ever in available state.
         catalogByVer.tailMap(startVersion, true).values().stream()
                 .flatMap(c -> c.indexes().stream())
-                .filter(idx -> idx.status() == CatalogIndexStatus.AVAILABLE)
+                .filter(idx -> idx.status() == AVAILABLE)
                 .forEach(action);
     }
 
@@ -617,9 +637,7 @@ public class CatalogManagerImpl extends 
AbstractEventProducer<CatalogEvent, Cata
 
     private SystemView<?> createSystemViewsView() {
         Iterable<SchemaAwareDescriptor<CatalogSystemViewDescriptor>> viewData 
= () -> {
-            int version = latestCatalogVersion();
-
-            Catalog catalog = catalog(version);
+            Catalog catalog = catalogAt(clock.nowLong());
 
             return catalog.schemas().stream()
                     .flatMap(schema -> Arrays.stream(schema.systemViews())
@@ -632,12 +650,12 @@ public class CatalogManagerImpl extends 
AbstractEventProducer<CatalogEvent, Cata
 
         return 
SystemViews.<SchemaAwareDescriptor<CatalogSystemViewDescriptor>>clusterViewBuilder()
                 .name("SYSTEM_VIEWS")
-                .addColumn("ID", NativeTypes.INT32, entry -> 
entry.descriptor.id())
-                .addColumn("SCHEMA", 
NativeTypes.stringOf(SYSTEM_VIEW_STRING_COLUMN_LENGTH),
+                .addColumn("ID", INT32, entry -> entry.descriptor.id())
+                .addColumn("SCHEMA", 
stringOf(SYSTEM_VIEW_STRING_COLUMN_LENGTH),
                         entry -> entry.schema)
-                .addColumn("NAME", 
NativeTypes.stringOf(SYSTEM_VIEW_STRING_COLUMN_LENGTH),
+                .addColumn("NAME", stringOf(SYSTEM_VIEW_STRING_COLUMN_LENGTH),
                         entry -> entry.descriptor.name())
-                .addColumn("TYPE", 
NativeTypes.stringOf(SYSTEM_VIEW_STRING_COLUMN_LENGTH),
+                .addColumn("TYPE", stringOf(SYSTEM_VIEW_STRING_COLUMN_LENGTH),
                         entry -> entry.descriptor.systemViewType().name())
                 .dataProvider(viewDataPublisher)
                 .build();
@@ -645,9 +663,7 @@ public class CatalogManagerImpl extends 
AbstractEventProducer<CatalogEvent, Cata
 
     private SystemView<?> createSystemViewColumnsView() {
         Iterable<ParentIdAwareDescriptor<CatalogTableColumnDescriptor>> 
viewData = () -> {
-            int version = latestCatalogVersion();
-
-            Catalog catalog = catalog(version);
+            Catalog catalog = catalogAt(clock.nowLong());
 
             return catalog.schemas().stream()
                     .flatMap(schema -> Arrays.stream(schema.systemViews()))
@@ -661,31 +677,75 @@ public class CatalogManagerImpl extends 
AbstractEventProducer<CatalogEvent, Cata
 
         return 
SystemViews.<ParentIdAwareDescriptor<CatalogTableColumnDescriptor>>clusterViewBuilder()
                 .name("SYSTEM_VIEW_COLUMNS")
-                .addColumn("VIEW_ID", NativeTypes.INT32, entry -> entry.id)
-                .addColumn("NAME", 
NativeTypes.stringOf(SYSTEM_VIEW_STRING_COLUMN_LENGTH), entry -> 
entry.descriptor.name())
-                .addColumn("TYPE", 
NativeTypes.stringOf(SYSTEM_VIEW_STRING_COLUMN_LENGTH), entry -> 
entry.descriptor.type().name())
-                .addColumn("NULLABLE", NativeTypes.BOOLEAN, entry -> 
entry.descriptor.nullable())
-                .addColumn("PRECISION", NativeTypes.INT32, entry -> 
entry.descriptor.precision())
-                .addColumn("SCALE", NativeTypes.INT32, entry -> 
entry.descriptor.scale())
-                .addColumn("LENGTH", NativeTypes.INT32, entry -> 
entry.descriptor.length())
+                .addColumn("VIEW_ID", INT32, entry -> entry.id)
+                .addColumn("NAME", stringOf(SYSTEM_VIEW_STRING_COLUMN_LENGTH), 
entry -> entry.descriptor.name())
+                .addColumn("TYPE", stringOf(SYSTEM_VIEW_STRING_COLUMN_LENGTH), 
entry -> entry.descriptor.type().name())
+                .addColumn("NULLABLE", BOOLEAN, entry -> 
entry.descriptor.nullable())
+                .addColumn("PRECISION", INT32, entry -> 
entry.descriptor.precision())
+                .addColumn("SCALE", INT32, entry -> entry.descriptor.scale())
+                .addColumn("LENGTH", INT32, entry -> entry.descriptor.length())
                 .dataProvider(viewDataPublisher)
                 .build();
     }
 
-    private SystemView<?> createSystemViewZonesView() {
+    private SystemView<?> createZonesView() {
         return SystemViews.<CatalogZoneDescriptor>clusterViewBuilder()
                 .name("ZONES")
-                .addColumn("NAME", NativeTypes.STRING, 
CatalogZoneDescriptor::name)
-                .addColumn("PARTITIONS", NativeTypes.INT32, 
CatalogZoneDescriptor::partitions)
-                .addColumn("REPLICAS", NativeTypes.INT32, 
CatalogZoneDescriptor::replicas)
-                .addColumn("DATA_NODES_AUTO_ADJUST_SCALE_UP", 
NativeTypes.INT32, CatalogZoneDescriptor::dataNodesAutoAdjustScaleUp)
-                .addColumn("DATA_NODES_AUTO_ADJUST_SCALE_DOWN", 
NativeTypes.INT32, CatalogZoneDescriptor::dataNodesAutoAdjustScaleDown)
-                .addColumn("DATA_NODES_FILTER", NativeTypes.STRING, 
CatalogZoneDescriptor::filter)
-                .addColumn("IS_DEFAULT_ZONE", NativeTypes.BOOLEAN, 
isDefaultZone())
-                .dataProvider(SubscriptionUtils.fromIterable(() -> 
catalog(latestCatalogVersion()).zones().iterator()))
+                .addColumn("NAME", STRING, CatalogZoneDescriptor::name)
+                .addColumn("PARTITIONS", INT32, 
CatalogZoneDescriptor::partitions)
+                .addColumn("REPLICAS", INT32, CatalogZoneDescriptor::replicas)
+                .addColumn("DATA_NODES_AUTO_ADJUST_SCALE_UP", INT32, 
CatalogZoneDescriptor::dataNodesAutoAdjustScaleUp)
+                .addColumn("DATA_NODES_AUTO_ADJUST_SCALE_DOWN", INT32, 
CatalogZoneDescriptor::dataNodesAutoAdjustScaleDown)
+                .addColumn("DATA_NODES_FILTER", STRING, 
CatalogZoneDescriptor::filter)
+                .addColumn("IS_DEFAULT_ZONE", BOOLEAN, isDefaultZone())
+                .dataProvider(SubscriptionUtils.fromIterable(() -> 
catalogAt(clock.nowLong()).zones().iterator()))
                 .build();
     }
 
+    private SystemView<?> createIndexesView() {
+        Iterable<CatalogAwareDescriptor<CatalogIndexDescriptor>> viewData = () 
-> {
+            Catalog catalog = catalogAt(clock.nowLong());
+
+            return catalog.indexes().stream()
+                    .filter(index -> index.status().isAlive())
+                    .map(index -> new CatalogAwareDescriptor<>(index, catalog))
+                    .iterator();
+        };
+
+        return 
SystemViews.<CatalogAwareDescriptor<CatalogIndexDescriptor>>clusterViewBuilder()
+                .name("INDEXES")
+                .addColumn("INDEX_ID", INT32, entry -> entry.descriptor.id())
+                .addColumn("INDEX_NAME", STRING, entry -> 
entry.descriptor.name())
+                .addColumn("TABLE_ID", INT32, entry -> 
entry.descriptor.tableId())
+                .addColumn("TABLE_NAME", STRING, entry -> 
getTableDescriptor(entry).name())
+                .addColumn("SCHEMA_ID", INT32, CatalogManagerImpl::getSchemaId)
+                .addColumn("SCHEMA_NAME", STRING, entry -> 
entry.catalog.schema(getSchemaId(entry)).name())
+                .addColumn("TYPE", STRING, entry -> 
entry.descriptor.indexType().name())
+                .addColumn("IS_UNIQUE", BOOLEAN, entry -> 
entry.descriptor.unique())
+                .addColumn("COLUMNS", STRING, 
CatalogManagerImpl::getColumnsString)
+                .addColumn("STATUS", STRING, entry -> 
entry.descriptor.status().name())
+                .dataProvider(SubscriptionUtils.fromIterable(viewData))
+                .build();
+    }
+
+    private static int 
getSchemaId(CatalogAwareDescriptor<CatalogIndexDescriptor> entry) {
+        return getTableDescriptor(entry).schemaId();
+    }
+
+    private static CatalogTableDescriptor 
getTableDescriptor(CatalogAwareDescriptor<CatalogIndexDescriptor> entry) {
+        return entry.catalog.table(entry.descriptor.tableId());
+    }
+
+    private static String 
getColumnsString(CatalogAwareDescriptor<CatalogIndexDescriptor> entry) {
+        return entry.descriptor.indexType() == HASH
+                ? String.join(", ", ((CatalogHashIndexDescriptor) 
entry.descriptor).columns())
+                : ((CatalogSortedIndexDescriptor) entry.descriptor)
+                        .columns()
+                        .stream()
+                        .map(column -> column.name() + 
(column.collation().asc() ? " ASC" : " DESC"))
+                        .collect(joining(", "));
+    }
+
     private static Function<CatalogZoneDescriptor, Boolean> isDefaultZone() {
         return zone -> zone.name().equals(DEFAULT_ZONE_NAME);
     }
@@ -716,4 +776,17 @@ public class CatalogManagerImpl extends 
AbstractEventProducer<CatalogEvent, Cata
             this.id = id;
         }
     }
+
+    /**
+     * A container that keeps given descriptor along with the catalog it 
belongs to.
+     */
+    private static class CatalogAwareDescriptor<T> {
+        private final T descriptor;
+        private final Catalog catalog;
+
+        CatalogAwareDescriptor(T descriptor, Catalog catalog) {
+            this.descriptor = descriptor;
+            this.catalog = catalog;
+        }
+    }
 }
diff --git 
a/modules/catalog/src/test/java/org/apache/ignite/internal/catalog/CatalogManagerSelfTest.java
 
b/modules/catalog/src/test/java/org/apache/ignite/internal/catalog/CatalogManagerSelfTest.java
index 5bc20d6216..b7e6afc88e 100644
--- 
a/modules/catalog/src/test/java/org/apache/ignite/internal/catalog/CatalogManagerSelfTest.java
+++ 
b/modules/catalog/src/test/java/org/apache/ignite/internal/catalog/CatalogManagerSelfTest.java
@@ -1088,7 +1088,7 @@ public class CatalogManagerSelfTest extends 
BaseCatalogManagerTest {
 
         
doNothing().when(updateLogMock).registerUpdateHandler(updateHandlerCapture.capture());
 
-        CatalogManagerImpl manager = new CatalogManagerImpl(updateLogMock, 
clockWaiter);
+        CatalogManagerImpl manager = new CatalogManagerImpl(updateLogMock, 
clockWaiter, clock);
         manager.start();
 
         when(updateLogMock.append(any())).thenAnswer(invocation -> {
@@ -1120,7 +1120,7 @@ public class CatalogManagerSelfTest extends 
BaseCatalogManagerTest {
     public void catalogActivationTime() throws Exception {
         long delayDuration = TimeUnit.DAYS.toMillis(365);
 
-        CatalogManagerImpl manager = new CatalogManagerImpl(updateLog, 
clockWaiter, delayDuration, 0);
+        CatalogManagerImpl manager = new CatalogManagerImpl(updateLog, 
clockWaiter, clock, delayDuration, 0);
 
         manager.start();
 
@@ -1151,7 +1151,7 @@ public class CatalogManagerSelfTest extends 
BaseCatalogManagerTest {
     public void catalogServiceManagesUpdateLogLifecycle() throws Exception {
         UpdateLog updateLogMock = mock(UpdateLog.class);
 
-        CatalogManagerImpl manager = new CatalogManagerImpl(updateLogMock, 
clockWaiter);
+        CatalogManagerImpl manager = new CatalogManagerImpl(updateLogMock, 
clockWaiter, clock);
 
         manager.start();
 
@@ -1542,7 +1542,7 @@ public class CatalogManagerSelfTest extends 
BaseCatalogManagerTest {
 
         HybridTimestamp startTs = clock.now();
 
-        CatalogManagerImpl manager = new CatalogManagerImpl(updateLog, 
clockWaiter, delayDuration, 0);
+        CatalogManagerImpl manager = new CatalogManagerImpl(updateLog, 
clockWaiter, clock, delayDuration, 0);
 
         manager.start();
 
@@ -1572,7 +1572,13 @@ public class CatalogManagerSelfTest extends 
BaseCatalogManagerTest {
 
         HybridTimestamp startTs = clock.now();
 
-        CatalogManagerImpl manager = new CatalogManagerImpl(updateLog, 
clockWaiter, delayDuration, partitionIdleSafeTimePropagationPeriod);
+        CatalogManagerImpl manager = new CatalogManagerImpl(
+                updateLog,
+                clockWaiter,
+                clock,
+                delayDuration,
+                partitionIdleSafeTimePropagationPeriod
+        );
 
         manager.start();
 
diff --git 
a/modules/catalog/src/testFixtures/java/org/apache/ignite/internal/catalog/BaseCatalogManagerTest.java
 
b/modules/catalog/src/testFixtures/java/org/apache/ignite/internal/catalog/BaseCatalogManagerTest.java
index 988d101d5e..703ebd6f74 100644
--- 
a/modules/catalog/src/testFixtures/java/org/apache/ignite/internal/catalog/BaseCatalogManagerTest.java
+++ 
b/modules/catalog/src/testFixtures/java/org/apache/ignite/internal/catalog/BaseCatalogManagerTest.java
@@ -92,6 +92,7 @@ public abstract class BaseCatalogManagerTest extends 
BaseIgniteAbstractTest {
         manager = new CatalogManagerImpl(
                 updateLog,
                 clockWaiter,
+                clock,
                 delayDuration::get,
                 () -> 
CatalogManagerImpl.DEFAULT_PARTITION_IDLE_SAFE_TIME_PROPAGATION_PERIOD
         );
diff --git 
a/modules/catalog/src/testFixtures/java/org/apache/ignite/internal/catalog/CatalogTestUtils.java
 
b/modules/catalog/src/testFixtures/java/org/apache/ignite/internal/catalog/CatalogTestUtils.java
index 10e6dd46eb..15e3e1b5a6 100644
--- 
a/modules/catalog/src/testFixtures/java/org/apache/ignite/internal/catalog/CatalogTestUtils.java
+++ 
b/modules/catalog/src/testFixtures/java/org/apache/ignite/internal/catalog/CatalogTestUtils.java
@@ -71,7 +71,7 @@ public class CatalogTestUtils {
 
         var clockWaiter = new ClockWaiter(nodeName, clock);
 
-        return new CatalogManagerImpl(new UpdateLogImpl(metastore), 
clockWaiter) {
+        return new CatalogManagerImpl(new UpdateLogImpl(metastore), 
clockWaiter, clock) {
             @Override
             public CompletableFuture<Void> start() {
                 return allOf(metastore.start(), clockWaiter.start(), 
super.start()).thenCompose(unused -> metastore.deployWatches());
@@ -102,11 +102,12 @@ public class CatalogTestUtils {
      *
      * @param nodeName Node name.
      * @param clockWaiter Clock waiter.
+     * @param clock Hybrid clock.
      */
-    public static CatalogManager createTestCatalogManager(String nodeName, 
ClockWaiter clockWaiter) {
+    public static CatalogManager createTestCatalogManager(String nodeName, 
ClockWaiter clockWaiter, HybridClock clock) {
         StandaloneMetaStorageManager metastore = 
StandaloneMetaStorageManager.create(new 
SimpleInMemoryKeyValueStorage(nodeName));
 
-        return new CatalogManagerImpl(new UpdateLogImpl(metastore), 
clockWaiter) {
+        return new CatalogManagerImpl(new UpdateLogImpl(metastore), 
clockWaiter, clock) {
             @Override
             public CompletableFuture<Void> start() {
                 return allOf(metastore.start(), 
super.start()).thenCompose(unused -> metastore.deployWatches());
@@ -140,7 +141,7 @@ public class CatalogTestUtils {
     public static CatalogManager createTestCatalogManager(String nodeName, 
HybridClock clock, MetaStorageManager metastore) {
         var clockWaiter = new ClockWaiter(nodeName, clock);
 
-        return new CatalogManagerImpl(new UpdateLogImpl(metastore), 
clockWaiter) {
+        return new CatalogManagerImpl(new UpdateLogImpl(metastore), 
clockWaiter, clock) {
             @Override
             public CompletableFuture<Void> start() {
                 return allOf(clockWaiter.start(), super.start());
@@ -189,7 +190,7 @@ public class CatalogTestUtils {
         };
 
 
-        return new CatalogManagerImpl(updateLog, clockWaiter) {
+        return new CatalogManagerImpl(updateLog, clockWaiter, clock) {
             @Override
             public CompletableFuture<Void> start() {
                 return allOf(clockWaiter.start(), super.start());
@@ -227,7 +228,7 @@ public class CatalogTestUtils {
     public static CatalogManager createCatalogManagerWithTestUpdateLog(String 
nodeName, HybridClock clock) {
         var clockWaiter = new ClockWaiter(nodeName, clock);
 
-        return new CatalogManagerImpl(new TestUpdateLog(clock), clockWaiter) {
+        return new CatalogManagerImpl(new TestUpdateLog(clock), clockWaiter, 
clock) {
             @Override
             public CompletableFuture<Void> start() {
                 return allOf(clockWaiter.start(), super.start());
diff --git 
a/modules/distribution-zones/src/integrationTest/java/org/apache/ignite/internal/distributionzones/ItIgniteDistributionZoneManagerNodeRestartTest.java
 
b/modules/distribution-zones/src/integrationTest/java/org/apache/ignite/internal/distributionzones/ItIgniteDistributionZoneManagerNodeRestartTest.java
index 7ddbc87d39..4db0136dd4 100644
--- 
a/modules/distribution-zones/src/integrationTest/java/org/apache/ignite/internal/distributionzones/ItIgniteDistributionZoneManagerNodeRestartTest.java
+++ 
b/modules/distribution-zones/src/integrationTest/java/org/apache/ignite/internal/distributionzones/ItIgniteDistributionZoneManagerNodeRestartTest.java
@@ -247,7 +247,7 @@ public class ItIgniteDistributionZoneManagerNodeRestartTest 
extends BaseIgniteRe
 
         var clockWaiter = new ClockWaiter(name, clock);
 
-        var catalogManager = new CatalogManagerImpl(new 
UpdateLogImpl(metastore), clockWaiter);
+        var catalogManager = new CatalogManagerImpl(new 
UpdateLogImpl(metastore), clockWaiter, clock);
 
         ScheduledExecutorService rebalanceScheduler = new 
ScheduledThreadPoolExecutor(REBALANCE_SCHEDULER_POOL_SIZE,
                 NamedThreadFactory.create(name, "test-rebalance-scheduler", 
logger()));
diff --git 
a/modules/index/src/test/java/org/apache/ignite/internal/index/ChangeIndexStatusTaskTest.java
 
b/modules/index/src/test/java/org/apache/ignite/internal/index/ChangeIndexStatusTaskTest.java
index 11b7c04217..2a203ccf0b 100644
--- 
a/modules/index/src/test/java/org/apache/ignite/internal/index/ChangeIndexStatusTaskTest.java
+++ 
b/modules/index/src/test/java/org/apache/ignite/internal/index/ChangeIndexStatusTaskTest.java
@@ -123,7 +123,7 @@ public class ChangeIndexStatusTaskTest extends 
IgniteAbstractTest {
 
     @BeforeEach
     void setUp() {
-        catalogManager = createTestCatalogManager(NODE_NAME, clockWaiter);
+        catalogManager = createTestCatalogManager(NODE_NAME, clockWaiter, 
clock);
 
         assertThat(allOf(clockWaiter.start(), catalogManager.start()), 
willCompleteSuccessfully());
 
diff --git 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/ItIgniteNodeRestartTest.java
 
b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/ItIgniteNodeRestartTest.java
index aaca79a957..1f9d7a988e 100644
--- 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/ItIgniteNodeRestartTest.java
+++ 
b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/ItIgniteNodeRestartTest.java
@@ -217,6 +217,9 @@ public class ItIgniteNodeRestartTest extends 
BaseIgniteRestartTest {
     /** Test table name. */
     private static final String TABLE_NAME = "Table1";
 
+    /** Assume that the table id will always be 8 for the test table. There is 
an assertion to check if this is true. */
+    private static final int TABLE_ID = 8;
+
     /** Test table name. */
     private static final String TABLE_NAME_2 = "Table2";
 
@@ -501,6 +504,7 @@ public class ItIgniteNodeRestartTest extends 
BaseIgniteRestartTest {
         var catalogManager = new CatalogManagerImpl(
                 new UpdateLogImpl(metaStorageMgr),
                 clockWaiter,
+                hybridClock,
                 delayDurationMsSupplier,
                 partitionIdleSafeTimePropagationPeriodMsSupplier
         );
@@ -1433,10 +1437,7 @@ public class ItIgniteNodeRestartTest extends 
BaseIgniteRestartTest {
             );
         }
 
-        // Assume that the table id will always be 7 for the test table. There 
is an assertion below to check this is true.
-        int tableId = 7;
-
-        var partId = new TablePartitionId(tableId, 0);
+        var partId = new TablePartitionId(TABLE_ID, 0);
 
         // Populate the stable assignments before calling table create, if 
needed.
         if (populateStableAssignmentsBeforeTableCreation) {
@@ -1460,7 +1461,7 @@ public class ItIgniteNodeRestartTest extends 
BaseIgniteRestartTest {
                     + "(id INT PRIMARY KEY, name VARCHAR) WITH PRIMARY_ZONE='" 
+ zoneName + "';");
         }
 
-        assertEquals(tableId, tableId(node, TABLE_NAME));
+        assertEquals(TABLE_ID, tableId(node, TABLE_NAME));
 
         node.metaStorageManager().put(new 
ByteArray(testPrefix.getBytes(StandardCharsets.UTF_8)), new byte[0]);
 
@@ -1538,10 +1539,7 @@ public class ItIgniteNodeRestartTest extends 
BaseIgniteRestartTest {
         String tableName = "TEST";
         String zoneName = "ZONE_TEST";
 
-        // Assume that the table id is always 7, there is an assertion below 
to ensure this.
-        int tableId = 7;
-
-        var assignmentsKey = stablePartAssignmentsKey(new 
TablePartitionId(tableId, 0));
+        var assignmentsKey = stablePartAssignmentsKey(new 
TablePartitionId(TABLE_ID, 0));
 
         var metaStorageInterceptorFut = new CompletableFuture<>();
         var metaStorageInterceptorInnerFut = new CompletableFuture<>();
@@ -1616,7 +1614,7 @@ public class ItIgniteNodeRestartTest extends 
BaseIgniteRestartTest {
         nodeInhibitor0.stopInhibit();
         waitForValueInLocalMs(node0.metaStorageManager(), assignmentsKey);
 
-        assertEquals(tableId, tableId(node0, tableName));
+        assertEquals(TABLE_ID, tableId(node0, tableName));
 
         Set<Assignment> expectedAssignments = 
dataNodesMockByNode.get(nodeThatWrittenAssignments).get().join()
                 .stream().map(Assignment::forPeer).collect(toSet());
@@ -1646,10 +1644,7 @@ public class ItIgniteNodeRestartTest extends 
BaseIgniteRestartTest {
         nodeInhibitor0.startInhibit();
         nodeInhibitor1.startInhibit();
 
-        // Assume that the table id is always 7, there is an assertion below 
to ensure this.
-        int tableId = 7;
-
-        var assignmentsKey = stablePartAssignmentsKey(new 
TablePartitionId(tableId, 0));
+        var assignmentsKey = stablePartAssignmentsKey(new 
TablePartitionId(TABLE_ID, 0));
 
         var tableFut = createTableInCatalog(node0.catalogManager(), tableName, 
zoneName);
 
@@ -1684,7 +1679,7 @@ public class ItIgniteNodeRestartTest extends 
BaseIgniteRestartTest {
         assertThat(tableFut, willCompleteSuccessfully());
         assertThat(alterZoneFut, willCompleteSuccessfully());
 
-        assertEquals(tableId, tableId(node0, tableName));
+        assertEquals(TABLE_ID, tableId(node0, tableName));
 
         waitForValueInLocalMs(node0.metaStorageManager(), assignmentsKey);
 
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 a1b7d947e6..59514b0468 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
@@ -628,6 +628,7 @@ public class IgniteImpl implements Ignite {
         CatalogManagerImpl catalogManager = new CatalogManagerImpl(
                 new UpdateLogImpl(metaStorageMgr),
                 clockWaiter,
+                clock,
                 delayDurationMsSupplier,
                 partitionIdleSafeTimePropagationPeriodMsSupplier
         );
diff --git 
a/modules/sql-engine/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItIndexesSystemViewTest.java
 
b/modules/sql-engine/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItIndexesSystemViewTest.java
new file mode 100644
index 0000000000..2f01e2369f
--- /dev/null
+++ 
b/modules/sql-engine/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItIndexesSystemViewTest.java
@@ -0,0 +1,96 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.sql.engine;
+
+import static 
org.apache.ignite.internal.catalog.CatalogService.DEFAULT_SCHEMA_NAME;
+import static 
org.apache.ignite.internal.catalog.descriptors.CatalogIndexDescriptor.CatalogIndexDescriptorType.HASH;
+
+import java.util.Collection;
+import org.apache.ignite.internal.app.IgniteImpl;
+import org.apache.ignite.internal.catalog.Catalog;
+import org.apache.ignite.internal.catalog.CatalogManager;
+import org.apache.ignite.internal.catalog.descriptors.CatalogIndexDescriptor;
+import org.apache.ignite.internal.catalog.descriptors.CatalogTableDescriptor;
+import org.apache.ignite.internal.sql.BaseSqlIntegrationTest;
+import org.apache.ignite.internal.testframework.IgniteTestUtils;
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.TestInfo;
+
+/** End-to-end tests to verify indexes system view. */
+public class ItIndexesSystemViewTest extends BaseSqlIntegrationTest {
+    private static final String TABLE_NAME = "TEST_TABLE";
+
+    private static final String COLUMNS = "ID, NAME";
+
+    private static final String COLUMNS_COLLATIONS = "ID DESC, NAME ASC";
+
+    @Override
+    @BeforeAll
+    protected void beforeAll(TestInfo testInfo) {
+        super.beforeAll(testInfo);
+
+        IgniteTestUtils.await(systemViewManager().completeRegistration());
+    }
+
+    @Test
+    public void multipleIndexes() {
+        sql(String.format("CREATE TABLE %S (ID INT, NAME VARCHAR, CONSTRAINT 
PK PRIMARY KEY (ID, NAME));", TABLE_NAME));
+
+        sql(createIndexSql("TEST_INDEX_HASH", TABLE_NAME, HASH.name(), 
COLUMNS));
+        sql(createIndexSql("TEST_INDEX_SORTED", TABLE_NAME, "TREE", 
COLUMNS_COLLATIONS));
+
+        IgniteImpl ignite = CLUSTER.aliveNode();
+        CatalogManager catalogManager = ignite.catalogManager();
+        int version = catalogManager.latestCatalogVersion();
+        Catalog catalog = catalogManager.catalog(version);
+
+        CatalogTableDescriptor tableDescriptor = catalog.tables().stream()
+                .filter(table -> table.name().equals(TABLE_NAME))
+                .findAny()
+                .orElseThrow();
+
+        Collection<CatalogIndexDescriptor> tableIndexes = catalog.indexes();
+
+        tableIndexes.forEach(index ->
+                assertQuery(selectFromIndexesSystemView(index.name())).returns(
+                        index.id(),
+                        index.name(),
+                        index.indexType().name(),
+                        index.tableId(),
+                        TABLE_NAME,
+                        tableDescriptor.schemaId(),
+                        DEFAULT_SCHEMA_NAME,
+                        index.unique(),
+                        index.indexType() == HASH ? COLUMNS : 
COLUMNS_COLLATIONS,
+                        index.status().name()
+                ).check()
+        );
+    }
+
+    private static String createIndexSql(String name, String tableName, String 
type, String columnString) {
+        return String.format("CREATE INDEX %s ON %s USING %S (%s);", name, 
tableName, type, columnString);
+    }
+
+    private static String selectFromIndexesSystemView(String indexName) {
+        String sqlFormat = "SELECT INDEX_ID, INDEX_NAME, TYPE, TABLE_ID, 
TABLE_NAME, SCHEMA_ID, SCHEMA_NAME, IS_UNIQUE, COLUMNS, STATUS "
+                + " FROM SYSTEM.INDEXES WHERE INDEX_NAME = '%s'";
+
+        return String.format(sqlFormat, indexName);
+    }
+}
diff --git 
a/modules/table/src/integrationTest/java/org/apache/ignite/internal/rebalance/ItRebalanceDistributedTest.java
 
b/modules/table/src/integrationTest/java/org/apache/ignite/internal/rebalance/ItRebalanceDistributedTest.java
index 8b81daf750..33354bd9f1 100644
--- 
a/modules/table/src/integrationTest/java/org/apache/ignite/internal/rebalance/ItRebalanceDistributedTest.java
+++ 
b/modules/table/src/integrationTest/java/org/apache/ignite/internal/rebalance/ItRebalanceDistributedTest.java
@@ -1158,6 +1158,7 @@ public class ItRebalanceDistributedTest extends 
BaseIgniteAbstractTest {
             catalogManager = new CatalogManagerImpl(
                     new UpdateLogImpl(metaStorageManager),
                     clockWaiter,
+                    hybridClock,
                     delayDurationMsSupplier,
                     partitionIdleSafeTimePropagationPeriodMsSupplier
             );


Reply via email to