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

ibessonov 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 211732556c IGNITE-20518 Use CatalogService in JdbcMetadataCatalog 
(#2643)
211732556c is described below

commit 211732556c90e63749280ec5e93d92205b9fa169
Author: Roman Puchkovskiy <[email protected]>
AuthorDate: Mon Oct 2 11:29:45 2023 +0400

    IGNITE-20518 Use CatalogService in JdbcMetadataCatalog (#2643)
---
 modules/client-handler/build.gradle                |   3 +
 .../apache/ignite/client/handler/TestServer.java   |   6 +-
 .../ignite/client/handler/ClientHandlerModule.java |  20 +++-
 .../handler/ClientInboundMessageHandler.java       |  16 ++-
 .../handler/requests/jdbc/JdbcMetadataCatalog.java | 119 ++++++++++++---------
 modules/client/build.gradle                        |   2 +
 .../ignite/client/TestClientHandlerModule.java     |   8 +-
 .../java/org/apache/ignite/client/TestServer.java  |   8 +-
 .../org/apache/ignite/internal/app/IgniteImpl.java |   6 +-
 .../internal/schema/CatalogSchemaManager.java      |   2 +-
 .../table/distributed/TableManagerTest.java        |   4 +-
 .../PartitionReplicaListenerIndexLockingTest.java  |   4 +-
 .../replication/PartitionReplicaListenerTest.java  |   5 +-
 .../apache/ignite/distributed/ItTxTestCluster.java |   3 +-
 .../schema/AlwaysSyncedSchemaSyncService.java      |  34 ++++++
 .../table/impl/DummyInternalTableImpl.java         |   4 +-
 16 files changed, 172 insertions(+), 72 deletions(-)

diff --git a/modules/client-handler/build.gradle 
b/modules/client-handler/build.gradle
index 46ebd57241..5fcbe609dd 100644
--- a/modules/client-handler/build.gradle
+++ b/modules/client-handler/build.gradle
@@ -36,6 +36,7 @@ dependencies {
     implementation project(':ignite-security')
     implementation project(':ignite-metrics')
     implementation project(':ignite-transactions')
+    implementation project(':ignite-catalog')
     implementation libs.jetbrains.annotations
     implementation libs.fastutil.core
     implementation libs.netty.common
@@ -60,8 +61,10 @@ dependencies {
     integrationTestImplementation project(':ignite-metrics')
     integrationTestImplementation project(':ignite-security')
     integrationTestImplementation project(':ignite-transactions')
+    integrationTestImplementation project(':ignite-catalog')
     
integrationTestImplementation(testFixtures(project(':ignite-configuration')))
     integrationTestImplementation(testFixtures(project(':ignite-core')))
+    integrationTestImplementation(testFixtures(project(':ignite-table')))
     integrationTestImplementation libs.msgpack.core
     integrationTestImplementation libs.netty.handler
     integrationTestImplementation libs.jetbrains.annotations
diff --git 
a/modules/client-handler/src/integrationTest/java/org/apache/ignite/client/handler/TestServer.java
 
b/modules/client-handler/src/integrationTest/java/org/apache/ignite/client/handler/TestServer.java
index a1a857b1f6..55772b2391 100644
--- 
a/modules/client-handler/src/integrationTest/java/org/apache/ignite/client/handler/TestServer.java
+++ 
b/modules/client-handler/src/integrationTest/java/org/apache/ignite/client/handler/TestServer.java
@@ -26,6 +26,7 @@ import java.util.UUID;
 import java.util.concurrent.CompletableFuture;
 import 
org.apache.ignite.client.handler.configuration.ClientConnectorConfiguration;
 import org.apache.ignite.compute.IgniteCompute;
+import org.apache.ignite.internal.catalog.CatalogService;
 import org.apache.ignite.internal.configuration.AuthenticationConfiguration;
 import org.apache.ignite.internal.configuration.ConfigurationManager;
 import org.apache.ignite.internal.configuration.ConfigurationTreeGenerator;
@@ -38,6 +39,7 @@ import 
org.apache.ignite.internal.security.authentication.AuthenticationManager;
 import 
org.apache.ignite.internal.security.authentication.AuthenticationManagerImpl;
 import org.apache.ignite.internal.sql.engine.QueryProcessor;
 import org.apache.ignite.internal.table.IgniteTablesInternal;
+import 
org.apache.ignite.internal.table.distributed.schema.AlwaysSyncedSchemaSyncService;
 import org.apache.ignite.internal.tx.impl.IgniteTransactionsImpl;
 import org.apache.ignite.network.ClusterService;
 import org.apache.ignite.network.NettyBootstrapFactory;
@@ -130,7 +132,9 @@ public class TestServer {
                 metrics,
                 authenticationManager(),
                 authenticationConfiguration,
-                new HybridClockImpl()
+                new HybridClockImpl(),
+                new AlwaysSyncedSchemaSyncService(),
+                mock(CatalogService.class)
         );
 
         module.start();
diff --git 
a/modules/client-handler/src/main/java/org/apache/ignite/client/handler/ClientHandlerModule.java
 
b/modules/client-handler/src/main/java/org/apache/ignite/client/handler/ClientHandlerModule.java
index 0a3ded7715..01230b856d 100644
--- 
a/modules/client-handler/src/main/java/org/apache/ignite/client/handler/ClientHandlerModule.java
+++ 
b/modules/client-handler/src/main/java/org/apache/ignite/client/handler/ClientHandlerModule.java
@@ -35,6 +35,7 @@ import java.util.function.Supplier;
 import 
org.apache.ignite.client.handler.configuration.ClientConnectorConfiguration;
 import org.apache.ignite.client.handler.configuration.ClientConnectorView;
 import org.apache.ignite.compute.IgniteCompute;
+import org.apache.ignite.internal.catalog.CatalogService;
 import org.apache.ignite.internal.client.proto.ClientMessageDecoder;
 import org.apache.ignite.internal.configuration.AuthenticationConfiguration;
 import org.apache.ignite.internal.configuration.ConfigurationRegistry;
@@ -48,6 +49,7 @@ import 
org.apache.ignite.internal.network.ssl.SslContextProvider;
 import 
org.apache.ignite.internal.security.authentication.AuthenticationManager;
 import org.apache.ignite.internal.sql.engine.QueryProcessor;
 import org.apache.ignite.internal.table.IgniteTablesInternal;
+import org.apache.ignite.internal.table.distributed.schema.SchemaSyncService;
 import org.apache.ignite.internal.tx.impl.IgniteTransactionsImpl;
 import org.apache.ignite.lang.ErrorGroups;
 import org.apache.ignite.lang.IgniteException;
@@ -106,6 +108,10 @@ public class ClientHandlerModule implements 
IgniteComponent {
 
     private final HybridClock clock;
 
+    private final SchemaSyncService schemaSyncService;
+
+    private final CatalogService catalogService;
+
     /**
      * Constructor.
      *
@@ -137,7 +143,10 @@ public class ClientHandlerModule implements 
IgniteComponent {
             ClientHandlerMetricSource metrics,
             AuthenticationManager authenticationManager,
             AuthenticationConfiguration authenticationConfiguration,
-            HybridClock clock) {
+            HybridClock clock,
+            SchemaSyncService schemaSyncService,
+            CatalogService catalogService
+    ) {
         assert igniteTables != null;
         assert registry != null;
         assert queryProcessor != null;
@@ -151,6 +160,8 @@ public class ClientHandlerModule implements IgniteComponent 
{
         assert authenticationManager != null;
         assert authenticationConfiguration != null;
         assert clock != null;
+        assert schemaSyncService != null;
+        assert catalogService != null;
 
         this.queryProcessor = queryProcessor;
         this.igniteTables = igniteTables;
@@ -166,6 +177,8 @@ public class ClientHandlerModule implements IgniteComponent 
{
         this.authenticationManager = authenticationManager;
         this.authenticationConfiguration = authenticationConfiguration;
         this.clock = clock;
+        this.schemaSyncService = schemaSyncService;
+        this.catalogService = catalogService;
     }
 
     /** {@inheritDoc} */
@@ -301,7 +314,10 @@ public class ClientHandlerModule implements 
IgniteComponent {
                 clusterId,
                 metrics,
                 authenticationManager,
-                clock);
+                clock,
+                schemaSyncService,
+                catalogService
+        );
         authenticationConfiguration.listen(clientInboundMessageHandler);
         return clientInboundMessageHandler;
     }
diff --git 
a/modules/client-handler/src/main/java/org/apache/ignite/client/handler/ClientInboundMessageHandler.java
 
b/modules/client-handler/src/main/java/org/apache/ignite/client/handler/ClientInboundMessageHandler.java
index 687c13717f..089cd60f7a 100644
--- 
a/modules/client-handler/src/main/java/org/apache/ignite/client/handler/ClientInboundMessageHandler.java
+++ 
b/modules/client-handler/src/main/java/org/apache/ignite/client/handler/ClientInboundMessageHandler.java
@@ -82,6 +82,7 @@ import 
org.apache.ignite.client.handler.requests.tx.ClientTransactionRollbackReq
 import org.apache.ignite.compute.IgniteCompute;
 import org.apache.ignite.configuration.notifications.ConfigurationListener;
 import 
org.apache.ignite.configuration.notifications.ConfigurationNotificationEvent;
+import org.apache.ignite.internal.catalog.CatalogService;
 import org.apache.ignite.internal.client.proto.ClientMessageCommon;
 import org.apache.ignite.internal.client.proto.ClientMessagePacker;
 import org.apache.ignite.internal.client.proto.ClientMessageUnpacker;
@@ -107,6 +108,7 @@ import 
org.apache.ignite.internal.security.authentication.UserDetails;
 import 
org.apache.ignite.internal.security.authentication.UsernamePasswordRequest;
 import org.apache.ignite.internal.sql.engine.QueryProcessor;
 import org.apache.ignite.internal.table.IgniteTablesInternal;
+import org.apache.ignite.internal.table.distributed.schema.SchemaSyncService;
 import org.apache.ignite.internal.tx.impl.IgniteTransactionsImpl;
 import org.apache.ignite.internal.util.ExceptionUtils;
 import org.apache.ignite.lang.IgniteException;
@@ -203,7 +205,9 @@ public class ClientInboundMessageHandler extends 
ChannelInboundHandlerAdapter im
             CompletableFuture<UUID> clusterId,
             ClientHandlerMetricSource metrics,
             AuthenticationManager authenticationManager,
-            HybridClock clock
+            HybridClock clock,
+            SchemaSyncService schemaSyncService,
+            CatalogService catalogService
     ) {
         assert igniteTables != null;
         assert igniteTransactions != null;
@@ -216,6 +220,8 @@ public class ClientInboundMessageHandler extends 
ChannelInboundHandlerAdapter im
         assert metrics != null;
         assert authenticationManager != null;
         assert clock != null;
+        assert schemaSyncService != null;
+        assert catalogService != null;
 
         this.igniteTables = igniteTables;
         this.igniteTransactions = igniteTransactions;
@@ -229,8 +235,12 @@ public class ClientInboundMessageHandler extends 
ChannelInboundHandlerAdapter im
         this.clock = clock;
 
         jdbcQueryCursorHandler = new JdbcQueryCursorHandlerImpl(resources);
-        jdbcQueryEventHandler = 
-                new JdbcQueryEventHandlerImpl(processor, new 
JdbcMetadataCatalog(igniteTables), resources, igniteTransactions);
+        jdbcQueryEventHandler = new JdbcQueryEventHandlerImpl(
+                processor,
+                new JdbcMetadataCatalog(clock, schemaSyncService, 
catalogService),
+                resources,
+                igniteTransactions
+        );
 
         this.partitionAssignmentsChangeListener = 
this::onPartitionAssignmentChanged;
         
igniteTables.addAssignmentsChangeListener(partitionAssignmentsChangeListener);
diff --git 
a/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/jdbc/JdbcMetadataCatalog.java
 
b/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/jdbc/JdbcMetadataCatalog.java
index cece9365e4..595e72938b 100644
--- 
a/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/jdbc/JdbcMetadataCatalog.java
+++ 
b/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/jdbc/JdbcMetadataCatalog.java
@@ -17,8 +17,11 @@
 
 package org.apache.ignite.client.handler.requests.jdbc;
 
+import static java.util.stream.Collectors.toCollection;
+import static java.util.stream.Collectors.toList;
+import static java.util.stream.Collectors.toSet;
+
 import java.sql.DatabaseMetaData;
-import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.Comparator;
@@ -28,19 +31,23 @@ import java.util.SortedSet;
 import java.util.TreeSet;
 import java.util.concurrent.CompletableFuture;
 import java.util.function.Function;
-import java.util.stream.Collectors;
+import java.util.stream.Stream;
+import org.apache.ignite.internal.catalog.CatalogService;
+import org.apache.ignite.internal.catalog.descriptors.CatalogTableDescriptor;
+import org.apache.ignite.internal.hlc.HybridClock;
+import org.apache.ignite.internal.hlc.HybridTimestamp;
 import org.apache.ignite.internal.jdbc.proto.event.JdbcColumnMeta;
 import org.apache.ignite.internal.jdbc.proto.event.JdbcPrimaryKeyMeta;
 import org.apache.ignite.internal.jdbc.proto.event.JdbcTableMeta;
 import org.apache.ignite.internal.schema.Column;
 import org.apache.ignite.internal.schema.NativeType;
 import org.apache.ignite.internal.schema.SchemaDescriptor;
-import org.apache.ignite.internal.schema.SchemaRegistry;
+import 
org.apache.ignite.internal.schema.catalog.CatalogToSchemaDescriptorConverter;
 import org.apache.ignite.internal.sql.engine.util.Commons;
-import org.apache.ignite.internal.table.TableImpl;
+import org.apache.ignite.internal.table.distributed.schema.SchemaSyncService;
 import org.apache.ignite.internal.util.Pair;
-import org.apache.ignite.table.Table;
 import org.apache.ignite.table.manager.IgniteTables;
+import org.jetbrains.annotations.Nullable;
 
 //TODO IGNITE-15525 Filter by table type must be added after 'view' type will 
appear.
 
@@ -57,24 +64,32 @@ public class JdbcMetadataCatalog {
     /** Default schema name. */
     private static final String DEFAULT_SCHEMA_NAME = "PUBLIC";
 
-    /** Ignite tables interface. Used to get all the database metadata. */
-    private final IgniteTables tables;
+    private final HybridClock clock;
+
+    private final SchemaSyncService schemaSyncService;
+
+    private final CatalogService catalogService;
 
     /** Comparator for {@link Column} by schema then table name then column 
order. */
     private static final Comparator<Pair<String, Column>> 
bySchemaThenTabNameThenColOrder
             = Comparator.comparing((Function<Pair<String, Column>, String>) 
Pair::getFirst)
             .thenComparingInt(o -> o.getSecond().columnOrder());
 
-    /** Comparator for {@link JdbcTableMeta} by table type then schema then 
table name. */
-    private static final Comparator<Table> byTblTypeThenSchemaThenTblName = 
Comparator.comparing(Table::name);
+    /** Comparator for {@link JdbcTableMeta} by table name. */
+    private static final Comparator<CatalogTableDescriptor> 
byTblTypeThenSchemaThenTblName
+            = Comparator.comparing(CatalogTableDescriptor::name);
 
     /**
      * Initializes info.
      *
-     * @param tables IgniteTables.
+     * @param clock The clock.
+     * @param schemaSyncService Used to wait for schemas' completeness.
+     * @param catalogService Used to get table descriptions.
      */
-    public JdbcMetadataCatalog(IgniteTables tables) {
-        this.tables = tables;
+    public JdbcMetadataCatalog(HybridClock clock, SchemaSyncService 
schemaSyncService, CatalogService catalogService) {
+        this.clock = clock;
+        this.schemaSyncService = schemaSyncService;
+        this.catalogService = catalogService;
     }
 
     /**
@@ -90,12 +105,19 @@ public class JdbcMetadataCatalog {
         String schemaNameRegex = translateSqlWildcardsToRegex(schemaNamePtrn);
         String tlbNameRegex = translateSqlWildcardsToRegex(tblNamePtrn);
 
-        return tables.tablesAsync().thenApply(tableList -> tableList.stream()
-                .filter(t -> matches(DEFAULT_SCHEMA_NAME, schemaNameRegex))
-                .filter(t -> matches(t.name(), tlbNameRegex))
-                .map(this::createPrimaryKeyMeta)
-                .collect(Collectors.toSet())
-        );
+        return tablesAtNow()
+                .thenApply(tables -> tables.stream()
+                        .filter(t -> tableNameAndSchemaMatches(t, 
schemaNameRegex, tlbNameRegex))
+                        .map(this::createPrimaryKeyMeta)
+                        .collect(toSet())
+                );
+    }
+
+    private CompletableFuture<Collection<CatalogTableDescriptor>> 
tablesAtNow() {
+        HybridTimestamp now = clock.now();
+
+        return schemaSyncService.waitForMetadataCompleteness(now)
+                .thenApply(unused -> 
catalogService.tables(catalogService.activeCatalogVersion(now.longValue())));
     }
 
     /**
@@ -115,16 +137,23 @@ public class JdbcMetadataCatalog {
         String schemaNameRegex = translateSqlWildcardsToRegex(schemaNamePtrn);
         String tlbNameRegex = translateSqlWildcardsToRegex(tblNamePtrn);
 
-        return tables.tablesAsync().thenApply(tablesList -> {
-            return tablesList.stream()
-                    .filter(t -> matches(DEFAULT_SCHEMA_NAME, schemaNameRegex))
-                    .filter(t -> matches(t.name(), tlbNameRegex))
+        return tablesAtNow().thenApply(tables -> {
+            return tables.stream()
+                    .filter(t -> tableNameAndSchemaMatches(t, schemaNameRegex, 
tlbNameRegex))
                     .sorted(byTblTypeThenSchemaThenTblName)
                     .map(t -> new JdbcTableMeta(DEFAULT_SCHEMA_NAME, t.name(), 
TBL_TYPE))
-                    .collect(Collectors.toList());
+                    .collect(toList());
         });
     }
 
+    private static boolean tableNameAndSchemaMatches(
+            CatalogTableDescriptor table,
+            @Nullable String schemaNameRegex,
+            @Nullable String tlbNameRegex
+    ) {
+        return matches(DEFAULT_SCHEMA_NAME, schemaNameRegex) && 
matches(table.name(), tlbNameRegex);
+    }
+
     /**
      * See {@link DatabaseMetaData#getColumns(String, String, String, String)} 
for details.
      *
@@ -140,29 +169,19 @@ public class JdbcMetadataCatalog {
         String tlbNameRegex = translateSqlWildcardsToRegex(tblNamePtrn);
         String colNameRegex = translateSqlWildcardsToRegex(colNamePtrn);
 
-        return tables.tablesAsync().thenApply(tablesList -> tablesList.stream()
-                .filter(t -> matches(DEFAULT_SCHEMA_NAME, schemaNameRegex))
-                .filter(t -> matches(t.name(), tlbNameRegex))
+        return tablesAtNow().thenApply(tablesList -> tablesList.stream()
+                .filter(t -> tableNameAndSchemaMatches(t, schemaNameRegex, 
tlbNameRegex))
                 .flatMap(
                     tbl -> {
-                        SchemaDescriptor schema = ((TableImpl) 
tbl).schemaView().schema();
-
-                        List<Pair<String, Column>> tblColPairs = new 
ArrayList<>();
+                        SchemaDescriptor schema = 
CatalogToSchemaDescriptorConverter.convert(tbl);
 
-                        for (Column column : schema.keyColumns().columns()) {
-                            tblColPairs.add(new Pair<>(tbl.name(), column));
-                        }
-
-                        for (Column column : schema.valueColumns().columns()) {
-                            tblColPairs.add(new Pair<>(tbl.name(), column));
-                        }
-
-                        return tblColPairs.stream();
+                        return 
Stream.concat(Arrays.stream(schema.keyColumns().columns()), 
Arrays.stream(schema.valueColumns().columns()))
+                                .map(column -> new Pair<>(tbl.name(), column));
                     })
                 .filter(e -> matches(e.getSecond().name(), colNameRegex))
                 .sorted(bySchemaThenTabNameThenColOrder)
                 .map(pair -> createColumnMeta(pair.getFirst(), 
pair.getSecond()))
-                .collect(Collectors.toCollection(LinkedHashSet::new)));
+                .collect(toCollection(LinkedHashSet::new)));
     }
 
     /**
@@ -182,28 +201,24 @@ public class JdbcMetadataCatalog {
             schemas.add(DEFAULT_SCHEMA_NAME);
         }
 
-        return tables.tablesAsync().thenApply(tablesList ->
-                tablesList.stream()
+        return tablesAtNow().thenApply(tables ->
+                tables.stream()
                     .map(tbl -> DEFAULT_SCHEMA_NAME)
                     .filter(schema -> matches(schema, schemaNameRegex))
-                    .collect(Collectors.toCollection(() -> schemas))
+                    .collect(toCollection(() -> schemas))
         );
     }
 
     /**
-     * Creates primary key metadata from table object.
+     * Creates primary key metadata from a table descriptor.
      *
      * @param tbl Table.
      * @return Jdbc primary key metadata.
      */
-    private JdbcPrimaryKeyMeta createPrimaryKeyMeta(Table tbl) {
-        final String keyName = PK + tbl.name();
-
-        SchemaRegistry registry = ((TableImpl) tbl).schemaView();
+    private JdbcPrimaryKeyMeta createPrimaryKeyMeta(CatalogTableDescriptor 
tbl) {
+        String keyName = PK + tbl.name();
 
-        List<String> keyColNames = 
Arrays.stream(registry.schema().keyColumns().columns())
-                .map(Column::name)
-                .collect(Collectors.toList());
+        List<String> keyColNames = List.copyOf(tbl.primaryKeyColumns());
 
         return new JdbcPrimaryKeyMeta(DEFAULT_SCHEMA_NAME, tbl.name(), 
keyName, keyColNames);
     }
@@ -237,7 +252,7 @@ public class JdbcMetadataCatalog {
      * @param sqlPtrn Pattern.
      * @return Whether string matches pattern.
      */
-    private static boolean matches(String str, String sqlPtrn) {
+    private static boolean matches(@Nullable String str, @Nullable String 
sqlPtrn) {
         if (str == null) {
             return false;
         }
@@ -266,7 +281,7 @@ public class JdbcMetadataCatalog {
      * @param sqlPtrn Sql pattern.
      * @return Java regex pattern.
      */
-    private static String translateSqlWildcardsToRegex(String sqlPtrn) {
+    private static @Nullable String translateSqlWildcardsToRegex(String 
sqlPtrn) {
         if (sqlPtrn == null || sqlPtrn.isEmpty()) {
             return sqlPtrn;
         }
diff --git a/modules/client/build.gradle b/modules/client/build.gradle
index b13531ca99..6d092bb37b 100644
--- a/modules/client/build.gradle
+++ b/modules/client/build.gradle
@@ -51,9 +51,11 @@ dependencies {
     testImplementation project(':ignite-storage-api')
     testImplementation project(':ignite-security')
     testImplementation project(':ignite-metrics')
+    testImplementation project(':ignite-catalog')
     testImplementation(testFixtures(project(':ignite-core')))
     testImplementation(testFixtures(project(':ignite-configuration')))
     testImplementation(testFixtures(project(':ignite-sql-engine')))
+    testImplementation(testFixtures(project(':ignite-table')))
     testImplementation libs.hamcrest.core
     testImplementation libs.junit5.params
     testImplementation libs.mockito.junit
diff --git 
a/modules/client/src/test/java/org/apache/ignite/client/TestClientHandlerModule.java
 
b/modules/client/src/test/java/org/apache/ignite/client/TestClientHandlerModule.java
index bbbccc5d54..a65c4cf189 100644
--- 
a/modules/client/src/test/java/org/apache/ignite/client/TestClientHandlerModule.java
+++ 
b/modules/client/src/test/java/org/apache/ignite/client/TestClientHandlerModule.java
@@ -38,6 +38,7 @@ import 
org.apache.ignite.client.handler.ClientHandlerMetricSource;
 import org.apache.ignite.client.handler.ClientInboundMessageHandler;
 import 
org.apache.ignite.client.handler.configuration.ClientConnectorConfiguration;
 import org.apache.ignite.compute.IgniteCompute;
+import org.apache.ignite.internal.catalog.CatalogService;
 import org.apache.ignite.internal.client.proto.ClientMessageDecoder;
 import org.apache.ignite.internal.configuration.AuthenticationConfiguration;
 import org.apache.ignite.internal.configuration.ConfigurationRegistry;
@@ -47,6 +48,7 @@ import 
org.apache.ignite.internal.security.authentication.AuthenticationManager;
 import 
org.apache.ignite.internal.security.authentication.AuthenticationManagerImpl;
 import org.apache.ignite.internal.sql.engine.QueryProcessor;
 import org.apache.ignite.internal.table.IgniteTablesInternal;
+import 
org.apache.ignite.internal.table.distributed.schema.AlwaysSyncedSchemaSyncService;
 import org.apache.ignite.internal.tx.impl.IgniteTransactionsImpl;
 import org.apache.ignite.lang.IgniteException;
 import org.apache.ignite.network.ClusterService;
@@ -202,7 +204,11 @@ public class TestClientHandlerModule implements 
IgniteComponent {
                                         
CompletableFuture.completedFuture(clusterId),
                                         metrics,
                                         
authenticationManager(authenticationConfiguration),
-                                        clock));
+                                        clock,
+                                        new AlwaysSyncedSchemaSyncService(),
+                                        mock(CatalogService.class)
+                                )
+                        );
                     }
                 })
                 .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 
configuration.connectTimeout());
diff --git 
a/modules/client/src/test/java/org/apache/ignite/client/TestServer.java 
b/modules/client/src/test/java/org/apache/ignite/client/TestServer.java
index 4b9a1313ef..9b63115e5f 100644
--- a/modules/client/src/test/java/org/apache/ignite/client/TestServer.java
+++ b/modules/client/src/test/java/org/apache/ignite/client/TestServer.java
@@ -40,6 +40,7 @@ import 
org.apache.ignite.client.handler.ClientHandlerMetricSource;
 import org.apache.ignite.client.handler.ClientHandlerModule;
 import 
org.apache.ignite.client.handler.configuration.ClientConnectorConfiguration;
 import org.apache.ignite.compute.IgniteCompute;
+import org.apache.ignite.internal.catalog.CatalogService;
 import org.apache.ignite.internal.client.ClientClusterNode;
 import org.apache.ignite.internal.configuration.AuthenticationConfiguration;
 import org.apache.ignite.internal.configuration.ConfigurationRegistry;
@@ -54,6 +55,7 @@ import 
org.apache.ignite.internal.network.configuration.NetworkConfiguration;
 import 
org.apache.ignite.internal.security.authentication.AuthenticationManager;
 import 
org.apache.ignite.internal.security.authentication.AuthenticationManagerImpl;
 import org.apache.ignite.internal.table.IgniteTablesInternal;
+import 
org.apache.ignite.internal.table.distributed.schema.AlwaysSyncedSchemaSyncService;
 import org.apache.ignite.internal.tx.impl.IgniteTransactionsImpl;
 import org.apache.ignite.network.ClusterNode;
 import org.apache.ignite.network.ClusterService;
@@ -220,8 +222,10 @@ public class TestServer implements AutoCloseable {
                         metrics,
                         authenticationManager(authenticationConfigToApply),
                         authenticationConfigToApply,
-                        clock
-                        );
+                        clock,
+                        new AlwaysSyncedSchemaSyncService(),
+                        mock(CatalogService.class)
+                );
 
         module.start();
     }
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 94dd53e894..fb5548b715 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
@@ -633,8 +633,10 @@ public class IgniteImpl implements Ignite {
                 new ClientHandlerMetricSource(),
                 authenticationManager,
                 authenticationConfiguration,
-                clock
-                );
+                clock,
+                schemaSyncService,
+                catalogManager
+        );
 
         restComponent = createRestComponent(name);
     }
diff --git 
a/modules/schema/src/main/java/org/apache/ignite/internal/schema/CatalogSchemaManager.java
 
b/modules/schema/src/main/java/org/apache/ignite/internal/schema/CatalogSchemaManager.java
index f50587b64e..e4c0c9aac9 100644
--- 
a/modules/schema/src/main/java/org/apache/ignite/internal/schema/CatalogSchemaManager.java
+++ 
b/modules/schema/src/main/java/org/apache/ignite/internal/schema/CatalogSchemaManager.java
@@ -149,7 +149,7 @@ public class CatalogSchemaManager implements 
IgniteComponent {
             int newSchemaVersion = tableDescriptor.tableVersion();
 
             if (searchSchemaByVersion(tableId, newSchemaVersion) != null) {
-                return completedFuture(null);
+                return completedFuture(false);
             }
 
             SchemaDescriptor newSchema = 
SchemaUtils.prepareSchemaDescriptor(tableDescriptor);
diff --git 
a/modules/table/src/test/java/org/apache/ignite/internal/table/distributed/TableManagerTest.java
 
b/modules/table/src/test/java/org/apache/ignite/internal/table/distributed/TableManagerTest.java
index 83912c6855..3c11b74cee 100644
--- 
a/modules/table/src/test/java/org/apache/ignite/internal/table/distributed/TableManagerTest.java
+++ 
b/modules/table/src/test/java/org/apache/ignite/internal/table/distributed/TableManagerTest.java
@@ -103,7 +103,7 @@ import 
org.apache.ignite.internal.storage.pagememory.configuration.schema.Persis
 import org.apache.ignite.internal.table.TableImpl;
 import org.apache.ignite.internal.table.TableTestUtils;
 import 
org.apache.ignite.internal.table.distributed.raft.snapshot.outgoing.OutgoingSnapshotsManager;
-import org.apache.ignite.internal.table.distributed.schema.SchemaSyncService;
+import 
org.apache.ignite.internal.table.distributed.schema.AlwaysSyncedSchemaSyncService;
 import org.apache.ignite.internal.testframework.IgniteAbstractTest;
 import org.apache.ignite.internal.tx.HybridTimestampTracker;
 import org.apache.ignite.internal.tx.TxManager;
@@ -718,7 +718,7 @@ public class TableManagerTest extends IgniteAbstractTest {
                 mock(TopologyAwareRaftGroupServiceFactory.class),
                 vaultManager,
                 distributionZoneManager,
-                mock(SchemaSyncService.class, invocation -> 
completedFuture(null)),
+                new AlwaysSyncedSchemaSyncService(),
                 catalogManager,
                 new HybridTimestampTracker(),
                 new TestPlacementDriver(NODE_NAME)
diff --git 
a/modules/table/src/test/java/org/apache/ignite/internal/table/distributed/replication/PartitionReplicaListenerIndexLockingTest.java
 
b/modules/table/src/test/java/org/apache/ignite/internal/table/distributed/replication/PartitionReplicaListenerIndexLockingTest.java
index 5bd9a811e1..e652b2cab2 100644
--- 
a/modules/table/src/test/java/org/apache/ignite/internal/table/distributed/replication/PartitionReplicaListenerIndexLockingTest.java
+++ 
b/modules/table/src/test/java/org/apache/ignite/internal/table/distributed/replication/PartitionReplicaListenerIndexLockingTest.java
@@ -88,7 +88,7 @@ import 
org.apache.ignite.internal.table.distributed.replication.request.BinaryRo
 import 
org.apache.ignite.internal.table.distributed.replicator.PartitionReplicaListener;
 import 
org.apache.ignite.internal.table.distributed.replicator.TransactionStateResolver;
 import 
org.apache.ignite.internal.table.distributed.replicator.action.RequestType;
-import org.apache.ignite.internal.table.distributed.schema.SchemaSyncService;
+import 
org.apache.ignite.internal.table.distributed.schema.AlwaysSyncedSchemaSyncService;
 import org.apache.ignite.internal.table.impl.DummyInternalTableImpl;
 import org.apache.ignite.internal.table.impl.DummySchemaManagerImpl;
 import org.apache.ignite.internal.table.impl.DummySchemas;
@@ -241,7 +241,7 @@ public class PartitionReplicaListenerIndexLockingTest 
extends IgniteAbstractTest
                 localNode,
                 new TestMvTableStorage(TABLE_ID, DEFAULT_PARTITION_COUNT),
                 mock(IndexBuilder.class),
-                mock(SchemaSyncService.class, invocation -> 
completedFuture(null)),
+                new AlwaysSyncedSchemaSyncService(),
                 catalogService,
                 new TestPlacementDriver(localNode.name())
         );
diff --git 
a/modules/table/src/test/java/org/apache/ignite/internal/table/distributed/replication/PartitionReplicaListenerTest.java
 
b/modules/table/src/test/java/org/apache/ignite/internal/table/distributed/replication/PartitionReplicaListenerTest.java
index 26a792399e..a921284989 100644
--- 
a/modules/table/src/test/java/org/apache/ignite/internal/table/distributed/replication/PartitionReplicaListenerTest.java
+++ 
b/modules/table/src/test/java/org/apache/ignite/internal/table/distributed/replication/PartitionReplicaListenerTest.java
@@ -145,6 +145,7 @@ import 
org.apache.ignite.internal.table.distributed.replicator.LeaderOrTxState;
 import 
org.apache.ignite.internal.table.distributed.replicator.PartitionReplicaListener;
 import 
org.apache.ignite.internal.table.distributed.replicator.TransactionStateResolver;
 import 
org.apache.ignite.internal.table.distributed.replicator.action.RequestType;
+import 
org.apache.ignite.internal.table.distributed.schema.AlwaysSyncedSchemaSyncService;
 import org.apache.ignite.internal.table.distributed.schema.FullTableSchema;
 import org.apache.ignite.internal.table.distributed.schema.SchemaSyncService;
 import org.apache.ignite.internal.table.distributed.schema.Schemas;
@@ -193,6 +194,7 @@ import org.mockito.Captor;
 import org.mockito.InOrder;
 import org.mockito.Mock;
 import org.mockito.Mockito;
+import org.mockito.Spy;
 import org.mockito.junit.jupiter.MockitoExtension;
 import org.mockito.junit.jupiter.MockitoSettings;
 import org.mockito.quality.Strictness;
@@ -291,7 +293,8 @@ public class PartitionReplicaListenerTest extends 
IgniteAbstractTest {
     @Mock
     private Schemas schemas;
 
-    private final SchemaSyncService schemaSyncService = 
mock(SchemaSyncService.class, invocation -> completedFuture(null));
+    @Spy
+    private final SchemaSyncService schemaSyncService = new 
AlwaysSyncedSchemaSyncService();
 
     @Mock
     private CatalogService catalogService;
diff --git 
a/modules/table/src/testFixtures/java/org/apache/ignite/distributed/ItTxTestCluster.java
 
b/modules/table/src/testFixtures/java/org/apache/ignite/distributed/ItTxTestCluster.java
index 8960532fae..8fd876bc23 100644
--- 
a/modules/table/src/testFixtures/java/org/apache/ignite/distributed/ItTxTestCluster.java
+++ 
b/modules/table/src/testFixtures/java/org/apache/ignite/distributed/ItTxTestCluster.java
@@ -105,6 +105,7 @@ import 
org.apache.ignite.internal.table.distributed.raft.PartitionDataStorage;
 import org.apache.ignite.internal.table.distributed.raft.PartitionListener;
 import 
org.apache.ignite.internal.table.distributed.replicator.PartitionReplicaListener;
 import 
org.apache.ignite.internal.table.distributed.replicator.TransactionStateResolver;
+import 
org.apache.ignite.internal.table.distributed.schema.AlwaysSyncedSchemaSyncService;
 import org.apache.ignite.internal.table.distributed.schema.SchemaSyncService;
 import org.apache.ignite.internal.table.distributed.schema.Schemas;
 import org.apache.ignite.internal.table.distributed.storage.InternalTableImpl;
@@ -519,7 +520,7 @@ public class ItTxTestCluster {
                                         consistentIdToNode.apply(assignment),
                                         mvTableStorage,
                                         mock(IndexBuilder.class),
-                                        mock(SchemaSyncService.class, 
invocation -> completedFuture(null)),
+                                        new AlwaysSyncedSchemaSyncService(),
                                         catalogService,
                                         placementDriver
                                 );
diff --git 
a/modules/table/src/testFixtures/java/org/apache/ignite/internal/table/distributed/schema/AlwaysSyncedSchemaSyncService.java
 
b/modules/table/src/testFixtures/java/org/apache/ignite/internal/table/distributed/schema/AlwaysSyncedSchemaSyncService.java
new file mode 100644
index 0000000000..b7331a9ab2
--- /dev/null
+++ 
b/modules/table/src/testFixtures/java/org/apache/ignite/internal/table/distributed/schema/AlwaysSyncedSchemaSyncService.java
@@ -0,0 +1,34 @@
+/*
+ * 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.table.distributed.schema;
+
+import static java.util.concurrent.CompletableFuture.completedFuture;
+
+import java.util.concurrent.CompletableFuture;
+import org.apache.ignite.internal.hlc.HybridTimestamp;
+
+/**
+ * Test implementation of {@link SchemaSyncService} that never waits and 
always behaves as if the metadata was already in sync for any
+ * passed ts.
+ */
+public class AlwaysSyncedSchemaSyncService implements SchemaSyncService {
+    @Override
+    public CompletableFuture<Void> waitForMetadataCompleteness(HybridTimestamp 
ts) {
+        return completedFuture(null);
+    }
+}
diff --git 
a/modules/table/src/testFixtures/java/org/apache/ignite/internal/table/impl/DummyInternalTableImpl.java
 
b/modules/table/src/testFixtures/java/org/apache/ignite/internal/table/impl/DummyInternalTableImpl.java
index 21977360ca..f7efbf495e 100644
--- 
a/modules/table/src/testFixtures/java/org/apache/ignite/internal/table/impl/DummyInternalTableImpl.java
+++ 
b/modules/table/src/testFixtures/java/org/apache/ignite/internal/table/impl/DummyInternalTableImpl.java
@@ -83,7 +83,7 @@ import 
org.apache.ignite.internal.table.distributed.raft.PartitionDataStorage;
 import org.apache.ignite.internal.table.distributed.raft.PartitionListener;
 import 
org.apache.ignite.internal.table.distributed.replicator.PartitionReplicaListener;
 import 
org.apache.ignite.internal.table.distributed.replicator.TransactionStateResolver;
-import org.apache.ignite.internal.table.distributed.schema.SchemaSyncService;
+import 
org.apache.ignite.internal.table.distributed.schema.AlwaysSyncedSchemaSyncService;
 import org.apache.ignite.internal.table.distributed.storage.InternalTableImpl;
 import org.apache.ignite.internal.tx.HybridTimestampTracker;
 import org.apache.ignite.internal.tx.InternalTransaction;
@@ -375,7 +375,7 @@ public class DummyInternalTableImpl extends 
InternalTableImpl {
                 LOCAL_NODE,
                 mock(MvTableStorage.class),
                 mock(IndexBuilder.class),
-                mock(SchemaSyncService.class, invocation -> 
completedFuture(null)),
+                new AlwaysSyncedSchemaSyncService(),
                 catalogService,
                 new TestPlacementDriver(LOCAL_NODE.name())
         );


Reply via email to