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