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
);