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 c9c7b9606b3 Add DatabaseMetaDataPersistFacade.unregisterStorageUnits() (#35010) c9c7b9606b3 is described below commit c9c7b9606b3f42bc2266a54b2fe60e38a477a1df Author: Liang Zhang <zhangli...@apache.org> AuthorDate: Sun Mar 16 14:20:09 2025 +0800 Add DatabaseMetaDataPersistFacade.unregisterStorageUnits() (#35010) * Add DatabaseMetaDataPersistFacade.unregisterStorageUnits() * Add DatabaseMetaDataPersistFacade.unregisterStorageUnits() * Add DatabaseMetaDataPersistFacade.unregisterStorageUnits() --- .../metadata/persist/MetaDataPersistFacade.java | 4 +- .../metadata/DatabaseMetaDataPersistFacade.java | 27 ++++++++++++ .../ClusterMetaDataManagerPersistService.java | 49 +++++++++------------- .../StandaloneMetaDataManagerPersistService.java | 21 +--------- 4 files changed, 50 insertions(+), 51 deletions(-) diff --git a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/persist/MetaDataPersistFacade.java b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/persist/MetaDataPersistFacade.java index be5d99b68d0..b405aeed567 100644 --- a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/persist/MetaDataPersistFacade.java +++ b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/persist/MetaDataPersistFacade.java @@ -103,12 +103,12 @@ public final class MetaDataPersistFacade { databaseMetaDataFacade.getDatabase().add(databaseName); } else { dataSourceUnitService.persist(databaseName, propsMap); - databaseRuleService.persist(databaseName, decorateRuleConfigs(databaseName, dataSources, rules)); + databaseRuleService.persist(databaseName, decorateRuleConfigurations(databaseName, dataSources, rules)); } } @SuppressWarnings({"unchecked", "rawtypes"}) - private Collection<RuleConfiguration> decorateRuleConfigs(final String databaseName, final Map<String, DataSource> dataSources, final Collection<ShardingSphereRule> rules) { + private Collection<RuleConfiguration> decorateRuleConfigurations(final String databaseName, final Map<String, DataSource> dataSources, final Collection<ShardingSphereRule> rules) { Collection<RuleConfiguration> result = new LinkedList<>(); for (ShardingSphereRule each : rules) { RuleConfiguration ruleConfig = each.getConfiguration(); 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 a33bf618c67..66f7d398636 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 @@ -18,12 +18,17 @@ package org.apache.shardingsphere.mode.metadata.persist.metadata; import lombok.Getter; +import org.apache.shardingsphere.infra.database.core.type.DatabaseTypeRegistry; import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData; import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase; +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.mode.exception.LoadTableMetaDataFailedException; +import org.apache.shardingsphere.mode.metadata.MetaDataContexts; import org.apache.shardingsphere.mode.metadata.persist.metadata.service.DatabaseMetaDataPersistService; import org.apache.shardingsphere.mode.metadata.persist.metadata.service.SchemaMetaDataPersistService; import org.apache.shardingsphere.mode.metadata.persist.metadata.service.TableMetaDataPersistService; @@ -31,7 +36,9 @@ import org.apache.shardingsphere.mode.metadata.persist.metadata.service.ViewMeta import org.apache.shardingsphere.mode.metadata.persist.version.VersionPersistService; import org.apache.shardingsphere.mode.spi.repository.PersistRepository; +import java.sql.SQLException; import java.util.Collection; +import java.util.Map.Entry; /** * Database meta data persist facade. @@ -119,4 +126,24 @@ public final class DatabaseMetaDataPersistFacade { } this.schema.drop(database.getName(), schemaName); } + + /** + * Register storage units. + * + * @param databaseName database name + * @param reloadMetaDataContexts reload meta data contexts + * @throws LoadTableMetaDataFailedException if an error occurs while loading table metadata + */ + public void unregisterStorageUnits(final String databaseName, final MetaDataContexts reloadMetaDataContexts) { + 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 { + for (Entry<String, ShardingSphereSchema> entry : GenericSchemaBuilder.build(database.getProtocolType(), material).entrySet()) { + GenericSchemaManager.getToBeDroppedTables(entry.getValue(), database.getSchema(entry.getKey())).forEach(each -> table.drop(databaseName, entry.getKey(), each.getName())); + } + } catch (final SQLException ex) { + throw new LoadTableMetaDataFailedException(databaseName, 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 7a7d7b4d6ac..9de8f21d0b6 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 @@ -30,6 +30,8 @@ import org.apache.shardingsphere.infra.metadata.database.schema.manager.GenericS 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; @@ -142,20 +144,6 @@ public final class ClusterMetaDataManagerPersistService implements MetaDataManag afterStorageUnitsAltered(database.getName(), originalMetaDataContexts); } - @Override - public void unregisterStorageUnits(final ShardingSphereDatabase database, final Collection<String> toBeDroppedStorageUnitNames) { - for (String each : getToBeDroppedResourceNames(database.getName(), toBeDroppedStorageUnitNames)) { - MetaDataContexts originalMetaDataContexts = new MetaDataContexts(metaDataContextManager.getMetaDataContexts().getMetaData(), metaDataContextManager.getMetaDataContexts().getStatistics()); - metaDataPersistFacade.getDataSourceUnitService().delete(database.getName(), each); - afterStorageUnitsDropped(database.getName(), originalMetaDataContexts); - } - } - - private Collection<String> getToBeDroppedResourceNames(final String databaseName, final Collection<String> toBeDroppedResourceNames) { - Map<String, DataSourcePoolProperties> propsMap = metaDataPersistFacade.getDataSourceUnitService().load(databaseName); - return toBeDroppedResourceNames.stream().filter(propsMap::containsKey).collect(Collectors.toList()); - } - private void afterStorageUnitsAltered(final String databaseName, final MetaDataContexts originalMetaDataContexts) { MetaDataContexts reloadMetaDataContexts = getReloadedMetaDataContexts(originalMetaDataContexts); Optional.ofNullable(reloadMetaDataContexts.getStatistics().getDatabaseStatistics(databaseName)) @@ -165,24 +153,25 @@ public final class ClusterMetaDataManagerPersistService implements MetaDataManag originalMetaDataContexts.getMetaData().getDatabase(databaseName)); } - private void afterStorageUnitsDropped(final String databaseName, final MetaDataContexts originalMetaDataContexts) { - 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(database.getProtocolType(), material); - for (Entry<String, ShardingSphereSchema> entry : schemas.entrySet()) { - Collection<ShardingSphereTable> tables = GenericSchemaManager.getToBeDroppedTables(entry.getValue(), database.getSchema(entry.getKey())); - tables.forEach(each -> metaDataPersistFacade.getDatabaseMetaDataFacade().getTable().drop(databaseName, entry.getKey(), each.getName())); + @Override + public void unregisterStorageUnits(final ShardingSphereDatabase database, final Collection<String> toBeDroppedStorageUnitNames) { + for (String each : getToBeDroppedResourceNames(database.getName(), toBeDroppedStorageUnitNames)) { + MetaDataContexts originalMetaDataContexts = new MetaDataContexts(metaDataContextManager.getMetaDataContexts().getMetaData(), metaDataContextManager.getMetaDataContexts().getStatistics()); + metaDataPersistFacade.getDataSourceUnitService().delete(database.getName(), each); + MetaDataContexts reloadMetaDataContexts = getReloadedMetaDataContexts(originalMetaDataContexts); + metaDataPersistFacade.getDatabaseMetaDataFacade().unregisterStorageUnits(database.getName(), reloadMetaDataContexts); + DatabaseStatistics databaseStatistics = reloadMetaDataContexts.getStatistics().getDatabaseStatistics(database.getName()); + if (null != databaseStatistics) { + for (Entry<String, SchemaStatistics> entry : databaseStatistics.getSchemaStatisticsMap().entrySet()) { + metaDataPersistFacade.getStatisticsService().persist(originalMetaDataContexts.getMetaData().getDatabase(database.getName()), entry.getKey(), entry.getValue()); + } } - } catch (final SQLException ex) { - throw new LoadTableMetaDataFailedException(databaseName, ex); } - Optional.ofNullable(reloadMetaDataContexts.getStatistics().getDatabaseStatistics(databaseName)) - .ifPresent(optional -> optional.getSchemaStatisticsMap().forEach((schemaName, schemaStatistics) -> metaDataPersistFacade.getStatisticsService() - .persist(originalMetaDataContexts.getMetaData().getDatabase(databaseName), schemaName, schemaStatistics))); + } + + private Collection<String> getToBeDroppedResourceNames(final String databaseName, final Collection<String> toBeDroppedResourceNames) { + Map<String, DataSourcePoolProperties> propsMap = metaDataPersistFacade.getDataSourceUnitService().load(databaseName); + return toBeDroppedResourceNames.stream().filter(propsMap::containsKey).collect(Collectors.toList()); } @Override 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 b0ce77d5eae..fe71b99d162 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 @@ -188,29 +188,12 @@ public final class StandaloneMetaDataManagerPersistService implements MetaDataMa public void unregisterStorageUnits(final ShardingSphereDatabase database, final Collection<String> toBeDroppedStorageUnitNames) { for (String each : getToBeDroppedResourceNames(database.getName(), toBeDroppedStorageUnitNames)) { metaDataPersistFacade.getDataSourceUnitService().delete(database.getName(), each); - afterStorageUnitsUnregistered(database.getName(), each); + metaDataContextManager.getStorageUnitManager().unregister(database.getName(), each); + metaDataPersistFacade.getDatabaseMetaDataFacade().unregisterStorageUnits(database.getName(), metaDataContextManager.getMetaDataContexts()); } OrderedServicesCache.clearCache(); } - private void afterStorageUnitsUnregistered(final String databaseName, final String storageUnitName) { - metaDataContextManager.getStorageUnitManager().unregister(databaseName, storageUnitName); - 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(database.getProtocolType(), material); - for (Entry<String, ShardingSphereSchema> entry : schemas.entrySet()) { - Collection<ShardingSphereTable> tables = GenericSchemaManager.getToBeDroppedTables(entry.getValue(), database.getSchema(entry.getKey())); - tables.forEach(each -> metaDataPersistFacade.getDatabaseMetaDataFacade().getTable().drop(databaseName, entry.getKey(), each.getName())); - } - } catch (final SQLException ex) { - throw new LoadTableMetaDataFailedException(databaseName, ex); - } - } - private Collection<String> getToBeDroppedResourceNames(final String databaseName, final Collection<String> toBeDroppedResourceNames) { Map<String, DataSourcePoolProperties> propsMap = metaDataPersistFacade.getDataSourceUnitService().load(databaseName); return toBeDroppedResourceNames.stream().filter(propsMap::containsKey).collect(Collectors.toList());