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

sunnianjun 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 f8f575655ca Move persist schema meta data to 
MetaDataManagerPersistService after storage unit altered (#32054)
f8f575655ca is described below

commit f8f575655cafc0fd15ab52a3288796fb2d408888
Author: Haoran Meng <[email protected]>
AuthorDate: Wed Jul 10 15:21:48 2024 +0800

    Move persist schema meta data to MetaDataManagerPersistService after 
storage unit altered (#32054)
---
 .../rdl/resource/AlterStorageUnitExecutor.java     |  3 ++
 .../rdl/resource/RegisterStorageUnitExecutor.java  |  3 ++
 .../resource/UnregisterStorageUnitExecutor.java    |  3 ++
 .../metadata/manager/ConfigurationManager.java     | 46 ++++++++--------------
 .../service/MetaDataManagerPersistService.java     | 11 ++++++
 .../ClusterMetaDataManagerPersistService.java      | 36 +++++++++++++++++
 6 files changed, 72 insertions(+), 30 deletions(-)

diff --git 
a/infra/distsql-handler/src/main/java/org/apache/shardingsphere/distsql/handler/executor/rdl/resource/AlterStorageUnitExecutor.java
 
b/infra/distsql-handler/src/main/java/org/apache/shardingsphere/distsql/handler/executor/rdl/resource/AlterStorageUnitExecutor.java
index 3a6938b4b0f..82791ab55c8 100644
--- 
a/infra/distsql-handler/src/main/java/org/apache/shardingsphere/distsql/handler/executor/rdl/resource/AlterStorageUnitExecutor.java
+++ 
b/infra/distsql-handler/src/main/java/org/apache/shardingsphere/distsql/handler/executor/rdl/resource/AlterStorageUnitExecutor.java
@@ -40,6 +40,7 @@ import 
org.apache.shardingsphere.infra.exception.kernel.metadata.resource.storag
 import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
 import 
org.apache.shardingsphere.infra.metadata.database.resource.unit.StorageUnit;
 import org.apache.shardingsphere.mode.manager.ContextManager;
+import org.apache.shardingsphere.mode.metadata.MetaDataContexts;
 
 import java.sql.SQLException;
 import java.util.Collection;
@@ -65,7 +66,9 @@ public final class AlterStorageUnitExecutor implements 
DistSQLUpdateExecutor<Alt
         Map<String, DataSourcePoolProperties> propsMap = 
DataSourceSegmentsConverter.convert(database.getProtocolType(), 
sqlStatement.getStorageUnits());
         validateHandler.validate(propsMap);
         try {
+            MetaDataContexts originalMetaDataContexts = 
contextManager.getMetaDataContexts();
             
contextManager.getPersistServiceFacade().getMetaDataManagerPersistService().alterStorageUnits(database.getName(),
 propsMap);
+            
contextManager.getPersistServiceFacade().getMetaDataManagerPersistService().afterStorageUnitsAltered(database.getName(),
 originalMetaDataContexts, false);
         } catch (final SQLException | ShardingSphereExternalException ex) {
             throw new StorageUnitsOperateException("alter", propsMap.keySet(), 
ex);
         }
diff --git 
a/infra/distsql-handler/src/main/java/org/apache/shardingsphere/distsql/handler/executor/rdl/resource/RegisterStorageUnitExecutor.java
 
b/infra/distsql-handler/src/main/java/org/apache/shardingsphere/distsql/handler/executor/rdl/resource/RegisterStorageUnitExecutor.java
index 3af15c74b69..a0e15507fa1 100644
--- 
a/infra/distsql-handler/src/main/java/org/apache/shardingsphere/distsql/handler/executor/rdl/resource/RegisterStorageUnitExecutor.java
+++ 
b/infra/distsql-handler/src/main/java/org/apache/shardingsphere/distsql/handler/executor/rdl/resource/RegisterStorageUnitExecutor.java
@@ -33,6 +33,7 @@ import 
org.apache.shardingsphere.infra.exception.kernel.metadata.resource.storag
 import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
 import 
org.apache.shardingsphere.infra.rule.attribute.datasource.DataSourceMapperRuleAttribute;
 import org.apache.shardingsphere.mode.manager.ContextManager;
+import org.apache.shardingsphere.mode.metadata.MetaDataContexts;
 
 import java.sql.SQLException;
 import java.util.ArrayList;
@@ -67,7 +68,9 @@ public final class RegisterStorageUnitExecutor implements 
DistSQLUpdateExecutor<
         }
         validateHandler.validate(propsMap);
         try {
+            MetaDataContexts originalMetaDataContexts = 
contextManager.getMetaDataContexts();
             
contextManager.getPersistServiceFacade().getMetaDataManagerPersistService().registerStorageUnits(database.getName(),
 propsMap);
+            
contextManager.getPersistServiceFacade().getMetaDataManagerPersistService().afterStorageUnitsAltered(database.getName(),
 originalMetaDataContexts, false);
         } catch (final SQLException | ShardingSphereExternalException ex) {
             throw new StorageUnitsOperateException("register", 
propsMap.keySet(), ex);
         }
diff --git 
a/infra/distsql-handler/src/main/java/org/apache/shardingsphere/distsql/handler/executor/rdl/resource/UnregisterStorageUnitExecutor.java
 
b/infra/distsql-handler/src/main/java/org/apache/shardingsphere/distsql/handler/executor/rdl/resource/UnregisterStorageUnitExecutor.java
index a01b50de523..7bdcfc73669 100644
--- 
a/infra/distsql-handler/src/main/java/org/apache/shardingsphere/distsql/handler/executor/rdl/resource/UnregisterStorageUnitExecutor.java
+++ 
b/infra/distsql-handler/src/main/java/org/apache/shardingsphere/distsql/handler/executor/rdl/resource/UnregisterStorageUnitExecutor.java
@@ -33,6 +33,7 @@ import 
org.apache.shardingsphere.infra.metadata.database.resource.unit.StorageUn
 import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
 import org.apache.shardingsphere.infra.spi.ShardingSphereServiceLoader;
 import org.apache.shardingsphere.mode.manager.ContextManager;
+import org.apache.shardingsphere.mode.metadata.MetaDataContexts;
 
 import java.sql.SQLException;
 import java.util.Collection;
@@ -57,7 +58,9 @@ public final class UnregisterStorageUnitExecutor implements 
DistSQLUpdateExecuto
         }
         checkInUsed(sqlStatement);
         try {
+            MetaDataContexts originalMetaDataContexts = 
contextManager.getMetaDataContexts();
             
contextManager.getPersistServiceFacade().getMetaDataManagerPersistService().unregisterStorageUnits(database.getName(),
 sqlStatement.getStorageUnitNames());
+            
contextManager.getPersistServiceFacade().getMetaDataManagerPersistService().afterStorageUnitsAltered(database.getName(),
 originalMetaDataContexts, true);
         } catch (final SQLException | ShardingSphereServerException ex) {
             throw new StorageUnitsOperateException("unregister", 
sqlStatement.getStorageUnitNames(), ex);
         }
diff --git 
a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/manager/ConfigurationManager.java
 
b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/manager/ConfigurationManager.java
index f12b63963a9..f18e143a36f 100644
--- 
a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/manager/ConfigurationManager.java
+++ 
b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/manager/ConfigurationManager.java
@@ -95,7 +95,7 @@ public final class ConfigurationManager {
         try {
             closeStaleRules(databaseName);
             SwitchingResource switchingResource = 
resourceSwitchManager.registerStorageUnit(metaDataContexts.get().getMetaData().getDatabase(databaseName).getResourceMetaData(),
 propsMap);
-            buildNewMetaDataContext(databaseName, switchingResource, false);
+            buildNewMetaDataContext(databaseName, switchingResource);
         } catch (final SQLException ex) {
             log.error("Alter database: {} register storage unit failed", 
databaseName, ex);
         }
@@ -111,7 +111,7 @@ public final class ConfigurationManager {
         try {
             closeStaleRules(databaseName);
             SwitchingResource switchingResource = 
resourceSwitchManager.alterStorageUnit(metaDataContexts.get().getMetaData().getDatabase(databaseName).getResourceMetaData(),
 propsMap);
-            buildNewMetaDataContext(databaseName, switchingResource, false);
+            buildNewMetaDataContext(databaseName, switchingResource);
         } catch (final SQLException ex) {
             log.error("Alter database: {} register storage unit failed", 
databaseName, ex);
         }
@@ -128,32 +128,30 @@ public final class ConfigurationManager {
             closeStaleRules(databaseName);
             SwitchingResource switchingResource = 
resourceSwitchManager.unregisterStorageUnit(metaDataContexts.get().getMetaData().getDatabase(databaseName).getResourceMetaData(),
                     Collections.singletonList(storageUnitName));
-            buildNewMetaDataContext(databaseName, switchingResource, true);
+            buildNewMetaDataContext(databaseName, switchingResource);
         } catch (final SQLException ex) {
             log.error("Alter database: {} register storage unit failed", 
databaseName, ex);
         }
     }
     
-    private void buildNewMetaDataContext(final String databaseName, final 
SwitchingResource switchingResource, final boolean isDropConfig) throws 
SQLException {
+    private void buildNewMetaDataContext(final String databaseName, final 
SwitchingResource switchingResource) throws SQLException {
         MetaDataContexts reloadMetaDataContexts = 
createMetaDataContexts(databaseName, false, switchingResource, null);
-        persistSchemaMetaData(databaseName, reloadMetaDataContexts, 
isDropConfig);
-        
Optional.ofNullable(reloadMetaDataContexts.getStatistics().getDatabaseData().get(databaseName))
-                .ifPresent(optional -> 
optional.getSchemaData().forEach((schemaName, schemaData) -> 
metaDataPersistService.getShardingSphereDataPersistService()
-                        .persist(databaseName, schemaName, schemaData, 
metaDataContexts.get().getMetaData().getDatabases())));
-        alterSchemaMetaData(databaseName, 
reloadMetaDataContexts.getMetaData().getDatabase(databaseName), 
metaDataContexts.get().getMetaData().getDatabase(databaseName), isDropConfig);
         metaDataContexts.set(reloadMetaDataContexts);
-        
metaDataContexts.get().getMetaData().getDatabases().putAll(newShardingSphereDatabase(metaDataContexts.get().getMetaData().getDatabase(databaseName)));
+        
metaDataContexts.get().getMetaData().getDatabases().putAll(buildShardingSphereDatabase(reloadMetaDataContexts.getMetaData().getDatabase(databaseName)));
         switchingResource.closeStaleDataSources();
     }
     
-    private void persistSchemaMetaData(final String databaseName, final 
MetaDataContexts reloadMetaDataContexts, final boolean isDropConfig) {
-        if (isDropConfig) {
-            
reloadMetaDataContexts.getMetaData().getDatabase(databaseName).getSchemas().forEach((schemaName,
 schema) -> metaDataPersistService.getDatabaseMetaDataService()
-                    
.persistByDropConfiguration(reloadMetaDataContexts.getMetaData().getDatabase(databaseName).getName(),
 schemaName, schema));
-        } else {
-            
reloadMetaDataContexts.getMetaData().getDatabase(databaseName).getSchemas().forEach((schemaName,
 schema) -> metaDataPersistService.getDatabaseMetaDataService()
-                    
.persistByAlterConfiguration(reloadMetaDataContexts.getMetaData().getDatabase(databaseName).getName(),
 schemaName, schema));
-        }
+    private Map<String, ShardingSphereDatabase> 
buildShardingSphereDatabase(final ShardingSphereDatabase originalDatabase) {
+        return 
Collections.singletonMap(originalDatabase.getName().toLowerCase(), new 
ShardingSphereDatabase(originalDatabase.getName(),
+                originalDatabase.getProtocolType(), 
originalDatabase.getResourceMetaData(), originalDatabase.getRuleMetaData(), 
buildSchemas(originalDatabase)));
+    }
+    
+    private Map<String, ShardingSphereSchema> buildSchemas(final 
ShardingSphereDatabase originalDatabase) {
+        Map<String, ShardingSphereSchema> result = new 
LinkedHashMap<>(originalDatabase.getSchemas().size(), 1F);
+        originalDatabase.getSchemas().keySet().forEach(schemaName -> 
result.put(schemaName.toLowerCase(),
+                new 
ShardingSphereSchema(originalDatabase.getSchema(schemaName).getTables(),
+                        
metaDataPersistService.getDatabaseMetaDataService().getViewMetaDataPersistService().load(originalDatabase.getName(),
 schemaName))));
+        return result;
     }
     
     /**
@@ -358,18 +356,6 @@ public final class ConfigurationManager {
         return result;
     }
     
-    /**
-     * Create new ShardingSphere database.
-     *
-     * @param originalDatabase original database
-     * @return ShardingSphere databases
-     */
-    public Map<String, ShardingSphereDatabase> newShardingSphereDatabase(final 
ShardingSphereDatabase originalDatabase) {
-        return 
Collections.singletonMap(originalDatabase.getName().toLowerCase(), new 
ShardingSphereDatabase(originalDatabase.getName(),
-                originalDatabase.getProtocolType(), 
originalDatabase.getResourceMetaData(), originalDatabase.getRuleMetaData(),
-                
metaDataPersistService.getDatabaseMetaDataService().loadSchemas(originalDatabase.getName())));
-    }
-    
     /**
      * Alter global rule configuration.
      *
diff --git 
a/mode/core/src/main/java/org/apache/shardingsphere/mode/persist/service/MetaDataManagerPersistService.java
 
b/mode/core/src/main/java/org/apache/shardingsphere/mode/persist/service/MetaDataManagerPersistService.java
index 873947101ac..07ca42177a3 100644
--- 
a/mode/core/src/main/java/org/apache/shardingsphere/mode/persist/service/MetaDataManagerPersistService.java
+++ 
b/mode/core/src/main/java/org/apache/shardingsphere/mode/persist/service/MetaDataManagerPersistService.java
@@ -22,6 +22,7 @@ import 
org.apache.shardingsphere.infra.datasource.pool.props.domain.DataSourcePo
 import 
org.apache.shardingsphere.infra.metadata.database.schema.pojo.AlterSchemaMetaDataPOJO;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.pojo.AlterSchemaPOJO;
 import org.apache.shardingsphere.infra.metadata.version.MetaDataVersion;
+import org.apache.shardingsphere.mode.metadata.MetaDataContexts;
 
 import java.sql.SQLException;
 import java.util.Collection;
@@ -149,4 +150,14 @@ public interface MetaDataManagerPersistService {
      * @param props pros
      */
     void alterProperties(Properties props);
+    
+    /**
+     * After storage units altered.
+     *
+     * @param databaseName database name
+     * @param originalMetaDataContexts original meta data contexts
+     * @param isDropConfig is drop config
+     */
+    default void afterStorageUnitsAltered(String databaseName, 
MetaDataContexts originalMetaDataContexts, boolean isDropConfig) {
+    }
 }
diff --git 
a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/persist/ClusterMetaDataManagerPersistService.java
 
b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/persist/ClusterMetaDataManagerPersistService.java
index ab5b3bef573..d31ec44d26e 100644
--- 
a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/persist/ClusterMetaDataManagerPersistService.java
+++ 
b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/persist/ClusterMetaDataManagerPersistService.java
@@ -19,6 +19,8 @@ package 
org.apache.shardingsphere.mode.manager.cluster.persist;
 
 import org.apache.shardingsphere.infra.config.rule.RuleConfiguration;
 import 
org.apache.shardingsphere.infra.datasource.pool.props.domain.DataSourcePoolProperties;
+import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
+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;
@@ -29,6 +31,7 @@ import 
org.apache.shardingsphere.metadata.persist.MetaDataPersistService;
 import 
org.apache.shardingsphere.metadata.persist.service.config.database.DataSourceUnitPersistService;
 import 
org.apache.shardingsphere.metadata.persist.service.database.DatabaseMetaDataPersistService;
 import org.apache.shardingsphere.mode.metadata.MetaDataContextManager;
+import org.apache.shardingsphere.mode.metadata.MetaDataContexts;
 import org.apache.shardingsphere.mode.persist.pojo.ListenerAssistedType;
 import 
org.apache.shardingsphere.mode.persist.service.ListenerAssistedPersistService;
 import 
org.apache.shardingsphere.mode.persist.service.MetaDataManagerPersistService;
@@ -39,6 +42,7 @@ import 
org.apache.shardingsphere.single.config.SingleRuleConfiguration;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.Map;
+import java.util.Optional;
 import java.util.Properties;
 import java.util.stream.Collectors;
 
@@ -168,4 +172,36 @@ public final class ClusterMetaDataManagerPersistService 
implements MetaDataManag
     public void alterProperties(final Properties props) {
         metaDataPersistService.getPropsService().persist(props);
     }
+    
+    @Override
+    public void afterStorageUnitsAltered(final String databaseName, final 
MetaDataContexts originalMetaDataContexts, final boolean isDropConfig) {
+        MetaDataContexts reloadMetaDataContexts = 
metaDataContextManager.getMetaDataContexts().get();
+        // TODO Confirm if it should be persisted twice
+        persistSchemaMetaData(databaseName, reloadMetaDataContexts, 
isDropConfig);
+        
Optional.ofNullable(reloadMetaDataContexts.getStatistics().getDatabaseData().get(databaseName))
+                .ifPresent(optional -> 
optional.getSchemaData().forEach((schemaName, schemaData) -> 
metaDataPersistService.getShardingSphereDataPersistService()
+                        .persist(databaseName, schemaName, schemaData, 
originalMetaDataContexts.getMetaData().getDatabases())));
+        alter(databaseName, 
reloadMetaDataContexts.getMetaData().getDatabase(databaseName), 
originalMetaDataContexts.getMetaData().getDatabase(databaseName), isDropConfig);
+    }
+    
+    private void persistSchemaMetaData(final String databaseName, final 
MetaDataContexts reloadMetaDataContexts, final boolean isDropConfig) {
+        if (isDropConfig) {
+            
reloadMetaDataContexts.getMetaData().getDatabase(databaseName).getSchemas().forEach((schemaName,
 schema) -> metaDataPersistService.getDatabaseMetaDataService()
+                    
.persistByDropConfiguration(reloadMetaDataContexts.getMetaData().getDatabase(databaseName).getName(),
 schemaName, schema));
+        } else {
+            
reloadMetaDataContexts.getMetaData().getDatabase(databaseName).getSchemas().forEach((schemaName,
 schema) -> metaDataPersistService.getDatabaseMetaDataService()
+                    
.persistByAlterConfiguration(reloadMetaDataContexts.getMetaData().getDatabase(databaseName).getName(),
 schemaName, schema));
+        }
+    }
+    
+    private void alter(final String databaseName, final ShardingSphereDatabase 
reloadDatabase, final ShardingSphereDatabase currentDatabase, final boolean 
isDropConfig) {
+        Map<String, ShardingSphereSchema> toBeAlterSchemas = 
GenericSchemaManager.getToBeDeletedTablesBySchemas(reloadDatabase.getSchemas(), 
currentDatabase.getSchemas());
+        Map<String, ShardingSphereSchema> toBeAddedSchemas = 
GenericSchemaManager.getToBeAddedTablesBySchemas(reloadDatabase.getSchemas(), 
currentDatabase.getSchemas());
+        if (isDropConfig) {
+            toBeAddedSchemas.forEach((key, value) -> 
metaDataPersistService.getDatabaseMetaDataService().persistByDropConfiguration(databaseName,
 key, value));
+        } else {
+            toBeAddedSchemas.forEach((key, value) -> 
metaDataPersistService.getDatabaseMetaDataService().persistByAlterConfiguration(databaseName,
 key, value));
+        }
+        toBeAlterSchemas.forEach((key, value) -> 
metaDataPersistService.getDatabaseMetaDataService().delete(databaseName, key, 
value));
+    }
 }

Reply via email to