This is an automated email from the ASF dual-hosted git repository. zhangliang pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/shardingsphere.git
The following commit(s) were added to refs/heads/master by this push: new 71b8236db32 Add DatabaseMetaDataPersistFacade.persistAlteredTables() (#35012) 71b8236db32 is described below commit 71b8236db321c0108d4c70d15e9cdec0e6a0be64 Author: Liang Zhang <zhangli...@apache.org> AuthorDate: Sun Mar 16 16:05:24 2025 +0800 Add DatabaseMetaDataPersistFacade.persistAlteredTables() (#35012) * Add DatabaseMetaDataPersistFacade.persistAlteredTables() * Add DatabaseMetaDataPersistFacade.persistAlteredTables() --- .../metadata/DatabaseMetaDataPersistFacade.java | 29 ++++++++++++++++++++ .../ClusterMetaDataManagerPersistService.java | 28 ++----------------- .../StandaloneMetaDataManagerPersistService.java | 32 +++++++--------------- ...tandaloneMetaDataManagerPersistServiceTest.java | 4 --- 4 files changed, 41 insertions(+), 52 deletions(-) diff --git a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/persist/metadata/DatabaseMetaDataPersistFacade.java b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/persist/metadata/DatabaseMetaDataPersistFacade.java index 8ae46cc8fdd..3a832929a97 100644 --- a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/persist/metadata/DatabaseMetaDataPersistFacade.java +++ b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/persist/metadata/DatabaseMetaDataPersistFacade.java @@ -38,6 +38,7 @@ import org.apache.shardingsphere.mode.spi.repository.PersistRepository; import java.sql.SQLException; import java.util.Collection; +import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; @@ -148,4 +149,32 @@ public final class DatabaseMetaDataPersistFacade { throw new LoadTableMetaDataFailedException(databaseName, ex); } } + + /** + * Persist altered tables. + * + * @param databaseName database name + * @param reloadMetaDataContexts reload meta data contexts + * @param needReloadTables need reload tables + * @return altered schema and tables map + * @throws LoadTableMetaDataFailedException if an error occurs while loading table metadata + */ + public Map<String, Collection<ShardingSphereTable>> persistAlteredTables(final String databaseName, final MetaDataContexts reloadMetaDataContexts, final Collection<String> needReloadTables) { + ShardingSphereDatabase database = reloadMetaDataContexts.getMetaData().getDatabase(databaseName); + GenericSchemaBuilderMaterial material = new GenericSchemaBuilderMaterial(database.getResourceMetaData().getStorageUnits(), + database.getRuleMetaData().getRules(), reloadMetaDataContexts.getMetaData().getProps(), + new DatabaseTypeRegistry(database.getProtocolType()).getDefaultSchemaName(databaseName)); + try { + Map<String, ShardingSphereSchema> schemas = GenericSchemaBuilder.build(needReloadTables, database.getProtocolType(), material); + Map<String, Collection<ShardingSphereTable>> result = new HashMap<>(schemas.size(), 1F); + for (Entry<String, ShardingSphereSchema> entry : schemas.entrySet()) { + Collection<ShardingSphereTable> tables = GenericSchemaManager.getToBeAddedTables(entry.getValue(), database.getSchema(entry.getKey())); + table.persist(databaseName, entry.getKey(), tables); + result.put(entry.getKey(), tables); + } + return result; + } catch (final SQLException ex) { + throw new LoadTableMetaDataFailedException(databaseName, needReloadTables, ex); + } + } } diff --git a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/persist/service/ClusterMetaDataManagerPersistService.java b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/persist/service/ClusterMetaDataManagerPersistService.java index 9de8f21d0b6..b1bfe34d4e1 100644 --- a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/persist/service/ClusterMetaDataManagerPersistService.java +++ b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/persist/service/ClusterMetaDataManagerPersistService.java @@ -19,21 +19,15 @@ package org.apache.shardingsphere.mode.manager.cluster.persist.service; import lombok.SneakyThrows; import org.apache.shardingsphere.infra.config.rule.RuleConfiguration; -import org.apache.shardingsphere.infra.database.core.type.DatabaseTypeRegistry; import org.apache.shardingsphere.infra.datasource.pool.props.domain.DataSourcePoolProperties; import org.apache.shardingsphere.infra.exception.core.ShardingSpherePreconditions; import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase; import org.apache.shardingsphere.infra.metadata.database.rule.RuleMetaData; -import org.apache.shardingsphere.infra.metadata.database.schema.builder.GenericSchemaBuilder; -import org.apache.shardingsphere.infra.metadata.database.schema.builder.GenericSchemaBuilderMaterial; -import org.apache.shardingsphere.infra.metadata.database.schema.manager.GenericSchemaManager; -import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSchema; import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereTable; import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereView; import org.apache.shardingsphere.infra.metadata.statistics.DatabaseStatistics; import org.apache.shardingsphere.infra.metadata.statistics.SchemaStatistics; import org.apache.shardingsphere.infra.util.retry.RetryExecutor; -import org.apache.shardingsphere.mode.exception.LoadTableMetaDataFailedException; import org.apache.shardingsphere.mode.manager.cluster.exception.ReloadMetaDataContextFailedException; import org.apache.shardingsphere.mode.manager.cluster.persist.coordinator.database.ClusterDatabaseListenerCoordinatorType; import org.apache.shardingsphere.mode.manager.cluster.persist.coordinator.database.ClusterDatabaseListenerPersistCoordinator; @@ -46,7 +40,6 @@ import org.apache.shardingsphere.mode.repository.cluster.ClusterPersistRepositor import org.apache.shardingsphere.single.config.SingleRuleConfiguration; import org.apache.shardingsphere.single.rule.SingleRule; -import java.sql.SQLException; import java.util.Collection; import java.util.Collections; import java.util.Map; @@ -188,7 +181,7 @@ public final class ClusterMetaDataManagerPersistService implements MetaDataManag Collection<String> needReloadTables = getNeedReloadTables(database, toBeAlteredRuleConfig); MetaDataContexts originalMetaDataContexts = new MetaDataContexts(metaDataContextManager.getMetaDataContexts().getMetaData(), metaDataContextManager.getMetaDataContexts().getStatistics()); metaDataPersistFacade.getDatabaseRuleService().persist(database.getName(), Collections.singleton(toBeAlteredRuleConfig)); - reloadAlteredTables(database.getName(), originalMetaDataContexts, needReloadTables); + metaDataPersistFacade.getDatabaseMetaDataFacade().persistAlteredTables(database.getName(), getReloadedMetaDataContexts(originalMetaDataContexts), needReloadTables); } @Override @@ -199,24 +192,7 @@ public final class ClusterMetaDataManagerPersistService implements MetaDataManag Collection<String> needReloadTables = getNeedReloadTables(database, toBeRemovedRuleConfig); MetaDataContexts originalMetaDataContexts = new MetaDataContexts(metaDataContextManager.getMetaDataContexts().getMetaData(), metaDataContextManager.getMetaDataContexts().getStatistics()); metaDataPersistFacade.getDatabaseRuleService().delete(database.getName(), Collections.singleton(toBeRemovedRuleConfig)); - reloadAlteredTables(database.getName(), originalMetaDataContexts, needReloadTables); - } - - private void reloadAlteredTables(final String databaseName, final MetaDataContexts originalMetaDataContexts, final Collection<String> needReloadTables) { - MetaDataContexts reloadMetaDataContexts = getReloadedMetaDataContexts(originalMetaDataContexts); - ShardingSphereDatabase database = reloadMetaDataContexts.getMetaData().getDatabase(databaseName); - GenericSchemaBuilderMaterial material = new GenericSchemaBuilderMaterial(database.getResourceMetaData().getStorageUnits(), - database.getRuleMetaData().getRules(), reloadMetaDataContexts.getMetaData().getProps(), - new DatabaseTypeRegistry(database.getProtocolType()).getDefaultSchemaName(databaseName)); - try { - Map<String, ShardingSphereSchema> schemas = GenericSchemaBuilder.build(needReloadTables, database.getProtocolType(), material); - for (Entry<String, ShardingSphereSchema> entry : schemas.entrySet()) { - Collection<ShardingSphereTable> tables = GenericSchemaManager.getToBeAddedTables(entry.getValue(), database.getSchema(entry.getKey())); - metaDataPersistFacade.getDatabaseMetaDataFacade().getTable().persist(databaseName, entry.getKey(), tables); - } - } catch (final SQLException ex) { - throw new LoadTableMetaDataFailedException(databaseName, needReloadTables, ex); - } + metaDataPersistFacade.getDatabaseMetaDataFacade().persistAlteredTables(database.getName(), getReloadedMetaDataContexts(originalMetaDataContexts), needReloadTables); } private Collection<String> getNeedReloadTables(final ShardingSphereDatabase originalShardingDatabase, final RuleConfiguration toBeAlteredRuleConfig) { diff --git a/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/persist/service/StandaloneMetaDataManagerPersistService.java b/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/persist/service/StandaloneMetaDataManagerPersistService.java index 6e0cecf3991..74e396beeb3 100644 --- a/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/persist/service/StandaloneMetaDataManagerPersistService.java +++ b/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/persist/service/StandaloneMetaDataManagerPersistService.java @@ -18,21 +18,15 @@ package org.apache.shardingsphere.mode.manager.standalone.persist.service; import org.apache.shardingsphere.infra.config.rule.RuleConfiguration; -import org.apache.shardingsphere.infra.database.core.type.DatabaseTypeRegistry; import org.apache.shardingsphere.infra.datasource.pool.props.domain.DataSourcePoolProperties; import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData; import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase; import org.apache.shardingsphere.infra.metadata.database.rule.RuleMetaData; -import org.apache.shardingsphere.infra.metadata.database.schema.builder.GenericSchemaBuilder; -import org.apache.shardingsphere.infra.metadata.database.schema.builder.GenericSchemaBuilderMaterial; -import org.apache.shardingsphere.infra.metadata.database.schema.manager.GenericSchemaManager; -import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSchema; import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereTable; import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereView; import org.apache.shardingsphere.infra.rule.scope.GlobalRule; import org.apache.shardingsphere.infra.rule.scope.GlobalRule.GlobalRuleChangedType; import org.apache.shardingsphere.infra.spi.type.ordered.cache.OrderedServicesCache; -import org.apache.shardingsphere.mode.exception.LoadTableMetaDataFailedException; import org.apache.shardingsphere.mode.metadata.MetaDataContexts; import org.apache.shardingsphere.mode.metadata.changed.RuleItemChangedNodePathBuilder; import org.apache.shardingsphere.mode.metadata.manager.ActiveVersionChecker; @@ -221,7 +215,9 @@ public final class StandaloneMetaDataManagerPersistService implements MetaDataMa metaDataContextManager.getDatabaseRuleItemManager().alter(databaseRuleNodePath.get()); } } - reloadAlteredTables(database.getName(), needReloadTables); + Map<String, Collection<ShardingSphereTable>> schemaAndTablesMap = metaDataPersistFacade.getDatabaseMetaDataFacade().persistAlteredTables( + database.getName(), metaDataContextManager.getMetaDataContexts(), needReloadTables); + alterTables(database, schemaAndTablesMap); OrderedServicesCache.clearCache(); } @@ -238,25 +234,17 @@ public final class StandaloneMetaDataManagerPersistService implements MetaDataMa metaDataContextManager.getDatabaseRuleItemManager().drop(databaseRuleNodePath.get()); } } - reloadAlteredTables(database.getName(), needReloadTables); + Map<String, Collection<ShardingSphereTable>> schemaAndTablesMap = metaDataPersistFacade.getDatabaseMetaDataFacade().persistAlteredTables( + database.getName(), metaDataContextManager.getMetaDataContexts(), needReloadTables); + alterTables(database, schemaAndTablesMap); OrderedServicesCache.clearCache(); } - private void reloadAlteredTables(final String databaseName, final Collection<String> needReloadTables) { - MetaDataContexts reloadMetaDataContexts = metaDataContextManager.getMetaDataContexts(); - ShardingSphereDatabase database = reloadMetaDataContexts.getMetaData().getDatabase(databaseName); - GenericSchemaBuilderMaterial material = new GenericSchemaBuilderMaterial(database.getResourceMetaData().getStorageUnits(), - database.getRuleMetaData().getRules(), reloadMetaDataContexts.getMetaData().getProps(), - new DatabaseTypeRegistry(database.getProtocolType()).getDefaultSchemaName(databaseName)); - try { - Map<String, ShardingSphereSchema> schemas = GenericSchemaBuilder.build(needReloadTables, database.getProtocolType(), material); - for (Entry<String, ShardingSphereSchema> entry : schemas.entrySet()) { - Collection<ShardingSphereTable> tables = GenericSchemaManager.getToBeAddedTables(entry.getValue(), database.getSchema(entry.getKey())); - metaDataPersistFacade.getDatabaseMetaDataFacade().getTable().persist(databaseName, entry.getKey(), tables); - tables.forEach(each -> metaDataContextManager.getDatabaseMetaDataManager().alterTable(databaseName, entry.getKey(), each)); + private void alterTables(final ShardingSphereDatabase database, final Map<String, Collection<ShardingSphereTable>> schemaAndTablesMap) { + for (Entry<String, Collection<ShardingSphereTable>> entry : schemaAndTablesMap.entrySet()) { + for (ShardingSphereTable each : entry.getValue()) { + metaDataContextManager.getDatabaseMetaDataManager().alterTable(database.getName(), entry.getKey(), each); } - } catch (final SQLException ex) { - throw new LoadTableMetaDataFailedException(databaseName, needReloadTables, ex); } } diff --git a/mode/type/standalone/core/src/test/java/org/apache/shardingsphere/mode/manager/standalone/persist/service/StandaloneMetaDataManagerPersistServiceTest.java b/mode/type/standalone/core/src/test/java/org/apache/shardingsphere/mode/manager/standalone/persist/service/StandaloneMetaDataManagerPersistServiceTest.java index ec989e647bf..907b62ebaea 100644 --- a/mode/type/standalone/core/src/test/java/org/apache/shardingsphere/mode/manager/standalone/persist/service/StandaloneMetaDataManagerPersistServiceTest.java +++ b/mode/type/standalone/core/src/test/java/org/apache/shardingsphere/mode/manager/standalone/persist/service/StandaloneMetaDataManagerPersistServiceTest.java @@ -28,8 +28,6 @@ import org.apache.shardingsphere.infra.metadata.database.rule.RuleMetaData; import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSchema; import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereTable; import org.apache.shardingsphere.infra.rule.ShardingSphereRule; -import org.apache.shardingsphere.infra.rule.attribute.RuleAttributes; -import org.apache.shardingsphere.infra.rule.attribute.table.TableMapperRuleAttribute; import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader; import org.apache.shardingsphere.mode.metadata.changed.RuleItemChangedNodePathBuilder; import org.apache.shardingsphere.mode.metadata.manager.MetaDataContextManager; @@ -171,7 +169,6 @@ class StandaloneMetaDataManagerPersistServiceTest { when(database.getName()).thenReturn("foo_db"); when(database.getProtocolType()).thenReturn(TypedSPILoader.getService(DatabaseType.class, "FIXTURE")); ShardingSphereRule rule = mock(ShardingSphereRule.class); - when(rule.getAttributes()).thenReturn(new RuleAttributes(mock(TableMapperRuleAttribute.class))); when(database.getRuleMetaData().getRules()).thenReturn(Collections.singleton(rule)); ShardingSphereMetaData metaData = new ShardingSphereMetaData(Collections.singleton(database), mock(), mock(), new ConfigurationProperties(new Properties())); when(metaDataContextManager.getMetaDataContexts().getMetaData()).thenReturn(metaData); @@ -200,7 +197,6 @@ class StandaloneMetaDataManagerPersistServiceTest { when(database.getName()).thenReturn("foo_db"); when(database.getProtocolType()).thenReturn(TypedSPILoader.getService(DatabaseType.class, "FIXTURE")); ShardingSphereRule rule = mock(ShardingSphereRule.class); - when(rule.getAttributes()).thenReturn(new RuleAttributes(mock(TableMapperRuleAttribute.class))); when(database.getRuleMetaData().getRules()).thenReturn(Collections.singleton(rule)); ShardingSphereMetaData metaData = new ShardingSphereMetaData(Collections.singleton(database), mock(), mock(), new ConfigurationProperties(new Properties())); when(metaDataContextManager.getMetaDataContexts().getMetaData()).thenReturn(metaData);