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 f15ef6a4f8f Create temporary metadata contexts when alter storage 
units (#32284)
f15ef6a4f8f is described below

commit f15ef6a4f8f6672adb445dbc8712eb95d4ffeb3e
Author: Haoran Meng <[email protected]>
AuthorDate: Mon Jul 29 10:25:11 2024 +0800

    Create temporary metadata contexts when alter storage units (#32284)
    
    * Create temporary metadata contexts when alter storage units
    
    * Create temporary metadata contexts when alter storage units
    
    * Create temporary metadata contexts when alter storage units
    
    * Create temporary metadata contexts when alter storage units
    
    * Add persist schema by alter and drop configuration
---
 .../schema/manager/GenericSchemaManager.java       |  1 +
 .../metadata/persist/MetaDataPersistService.java   | 13 ++-----
 .../database/DatabaseMetaDataPersistService.java   | 25 +++++++++++++
 .../mode/metadata/manager/StorageUnitManager.java  |  2 +-
 .../ClusterMetaDataManagerPersistService.java      | 43 ++++++++++++++++------
 5 files changed, 63 insertions(+), 21 deletions(-)

diff --git 
a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/manager/GenericSchemaManager.java
 
b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/manager/GenericSchemaManager.java
index c0830117752..4429f0d4087 100644
--- 
a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/manager/GenericSchemaManager.java
+++ 
b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/manager/GenericSchemaManager.java
@@ -42,6 +42,7 @@ public final class GenericSchemaManager {
      */
     public static Map<String, ShardingSphereSchema> 
getToBeAddedTablesBySchemas(final Map<String, ShardingSphereSchema> 
reloadSchemas, final Map<String, ShardingSphereSchema> currentSchemas) {
         Map<String, ShardingSphereSchema> result = new 
LinkedHashMap<>(currentSchemas.size(), 1F);
+        reloadSchemas.entrySet().stream().filter(entry -> 
!currentSchemas.containsKey(entry.getKey())).forEach(entry -> 
result.put(entry.getKey(), entry.getValue()));
         reloadSchemas.entrySet().stream().filter(entry -> 
currentSchemas.containsKey(entry.getKey())).collect(Collectors.toMap(Entry::getKey,
 Entry::getValue))
                 .forEach((key, value) -> result.put(key, 
getToBeAddedTablesBySchema(value, currentSchemas.get(key))));
         return result;
diff --git 
a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/MetaDataPersistService.java
 
b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/MetaDataPersistService.java
index acb5da8c3f5..1ddb919b8ca 100644
--- 
a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/MetaDataPersistService.java
+++ 
b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/MetaDataPersistService.java
@@ -149,15 +149,10 @@ public final class MetaDataPersistService {
      * @param currentDatabase current database
      */
     public void persistReloadDatabaseByAlter(final String databaseName, final 
ShardingSphereDatabase reloadDatabase, final ShardingSphereDatabase 
currentDatabase) {
-        Map<String, ShardingSphereSchema> toBeAlterSchemas = 
GenericSchemaManager.getToBeDeletedTablesBySchemas(reloadDatabase.getSchemas(), 
currentDatabase.getSchemas());
+        Map<String, ShardingSphereSchema> toBeDeletedSchemas = 
GenericSchemaManager.getToBeDeletedTablesBySchemas(reloadDatabase.getSchemas(), 
currentDatabase.getSchemas());
         Map<String, ShardingSphereSchema> toBeAddedSchemas = 
GenericSchemaManager.getToBeAddedTablesBySchemas(reloadDatabase.getSchemas(), 
currentDatabase.getSchemas());
-        toBeAddedSchemas.forEach((schemaName, schema) -> {
-            if (schema.isEmpty()) {
-                databaseMetaDataService.addSchema(databaseName, schemaName);
-            }
-            
databaseMetaDataService.getTableMetaDataPersistService().persist(databaseName, 
schemaName, schema.getTables());
-        });
-        toBeAlterSchemas.forEach((key, value) -> 
databaseMetaDataService.delete(databaseName, key, value));
+        toBeAddedSchemas.forEach((key, value) -> 
databaseMetaDataService.persistByAlterConfiguration(databaseName, key, value));
+        toBeDeletedSchemas.forEach((key, value) -> 
databaseMetaDataService.delete(databaseName, key, value));
     }
     
     /**
@@ -170,7 +165,7 @@ public final class MetaDataPersistService {
     public void persistReloadDatabaseByDrop(final String databaseName, final 
ShardingSphereDatabase reloadDatabase, final ShardingSphereDatabase 
currentDatabase) {
         Map<String, ShardingSphereSchema> toBeAlterSchemas = 
GenericSchemaManager.getToBeDeletedTablesBySchemas(reloadDatabase.getSchemas(), 
currentDatabase.getSchemas());
         Map<String, ShardingSphereSchema> toBeAddedSchemas = 
GenericSchemaManager.getToBeAddedTablesBySchemas(reloadDatabase.getSchemas(), 
currentDatabase.getSchemas());
-        toBeAddedSchemas.forEach((key, value) -> 
databaseMetaDataService.getTableMetaDataPersistService().persist(databaseName, 
key, value.getTables()));
+        toBeAddedSchemas.forEach((key, value) -> 
databaseMetaDataService.persistByDropConfiguration(databaseName, key, value));
         toBeAlterSchemas.forEach((key, value) -> 
databaseMetaDataService.delete(databaseName, key, value));
     }
 }
diff --git 
a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/database/DatabaseMetaDataPersistService.java
 
b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/database/DatabaseMetaDataPersistService.java
index c7247f7f2a5..ce39647d3bf 100644
--- 
a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/database/DatabaseMetaDataPersistService.java
+++ 
b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/database/DatabaseMetaDataPersistService.java
@@ -143,4 +143,29 @@ public final class DatabaseMetaDataPersistService {
     private Collection<String> loadAllSchemaNames(final String databaseName) {
         return 
repository.getChildrenKeys(DatabaseMetaDataNode.getMetaDataSchemasPath(databaseName));
     }
+    
+    /**
+     * Persist by alter configuration.
+     *
+     * @param databaseName database name
+     * @param schemaName schema name
+     * @param schema schema meta data
+     */
+    public void persistByAlterConfiguration(final String databaseName, final 
String schemaName, final ShardingSphereSchema schema) {
+        if (schema.getTables().isEmpty() && schema.getViews().isEmpty()) {
+            addSchema(databaseName, schemaName);
+        }
+        tableMetaDataPersistService.persist(databaseName, schemaName, 
schema.getTables());
+    }
+    
+    /**
+     * Persist by drop configuration.
+     *
+     * @param databaseName database name
+     * @param schemaName schema name
+     * @param schema schema meta data
+     */
+    public void persistByDropConfiguration(final String databaseName, final 
String schemaName, final ShardingSphereSchema schema) {
+        tableMetaDataPersistService.persist(databaseName, schemaName, 
schema.getTables());
+    }
 }
diff --git 
a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/manager/StorageUnitManager.java
 
b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/manager/StorageUnitManager.java
index 9b2ec0017e1..1caf0699e07 100644
--- 
a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/manager/StorageUnitManager.java
+++ 
b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/manager/StorageUnitManager.java
@@ -123,7 +123,7 @@ public final class StorageUnitManager {
     }
     
     private void buildNewMetaDataContext(final String databaseName, final 
SwitchingResource switchingResource) throws SQLException {
-        MetaDataContexts reloadMetaDataContexts = 
createMetaDataContexts(databaseName, false, switchingResource, null);
+        MetaDataContexts reloadMetaDataContexts = 
createMetaDataContexts(databaseName, true, switchingResource, null);
         metaDataContexts.set(reloadMetaDataContexts);
         
metaDataContexts.get().getMetaData().getDatabases().putAll(buildShardingSphereDatabase(reloadMetaDataContexts.getMetaData().getDatabase(databaseName)));
         switchingResource.closeStaleDataSources();
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 c7c7a7810a8..6ab399681c1 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
@@ -30,6 +30,8 @@ import 
org.apache.shardingsphere.metadata.persist.service.config.database.DataSo
 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.metadata.MetaDataContextsFactory;
+import org.apache.shardingsphere.mode.metadata.manager.SwitchingResource;
 import org.apache.shardingsphere.mode.persist.pojo.ListenerAssisted;
 import org.apache.shardingsphere.mode.persist.pojo.ListenerAssistedType;
 import 
org.apache.shardingsphere.mode.persist.service.ListenerAssistedPersistService;
@@ -37,6 +39,7 @@ import 
org.apache.shardingsphere.mode.persist.service.MetaDataManagerPersistServ
 import org.apache.shardingsphere.mode.spi.PersistRepository;
 import org.apache.shardingsphere.single.config.SingleRuleConfiguration;
 
+import java.sql.SQLException;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.Map;
@@ -113,28 +116,43 @@ public final class ClusterMetaDataManagerPersistService 
implements MetaDataManag
     }
     
     @Override
-    public void registerStorageUnits(final String databaseName, final 
Map<String, DataSourcePoolProperties> toBeRegisteredProps) {
+    public void registerStorageUnits(final String databaseName, final 
Map<String, DataSourcePoolProperties> toBeRegisteredProps) throws SQLException {
         MetaDataContexts originalMetaDataContexts = 
metaDataContextManager.getMetaDataContexts().get();
+        SwitchingResource switchingResource = 
metaDataContextManager.getResourceSwitchManager()
+                
.switchByRegisterStorageUnit(originalMetaDataContexts.getMetaData().getDatabase(databaseName).getResourceMetaData(),
 toBeRegisteredProps);
+        MetaDataContexts reloadMetaDataContexts = 
MetaDataContextsFactory.createBySwitchResource(databaseName, false,
+                switchingResource, originalMetaDataContexts, 
metaDataPersistService, metaDataContextManager.getComputeNodeInstanceContext());
         
metaDataPersistService.getDataSourceUnitService().persistConfigurations(databaseName,
 toBeRegisteredProps);
-        afterStorageUnitsAltered(databaseName, originalMetaDataContexts);
+        afterStorageUnitsAltered(databaseName, originalMetaDataContexts, 
reloadMetaDataContexts);
+        reloadMetaDataContexts.close();
     }
     
     @Override
-    public void alterStorageUnits(final String databaseName, final Map<String, 
DataSourcePoolProperties> toBeUpdatedProps) {
+    public void alterStorageUnits(final String databaseName, final Map<String, 
DataSourcePoolProperties> toBeUpdatedProps) throws SQLException {
         MetaDataContexts originalMetaDataContexts = 
metaDataContextManager.getMetaDataContexts().get();
+        SwitchingResource switchingResource = 
metaDataContextManager.getResourceSwitchManager()
+                
.switchByAlterStorageUnit(originalMetaDataContexts.getMetaData().getDatabase(databaseName).getResourceMetaData(),
 toBeUpdatedProps);
+        MetaDataContexts reloadMetaDataContexts = 
MetaDataContextsFactory.createBySwitchResource(databaseName, false,
+                switchingResource, originalMetaDataContexts, 
metaDataPersistService, metaDataContextManager.getComputeNodeInstanceContext());
         DataSourceUnitPersistService dataSourceService = 
metaDataPersistService.getDataSourceUnitService();
         metaDataPersistService.getMetaDataVersionPersistService()
                 
.switchActiveVersion(dataSourceService.persistConfigurations(databaseName, 
toBeUpdatedProps));
-        afterStorageUnitsAltered(databaseName, originalMetaDataContexts);
+        afterStorageUnitsAltered(databaseName, originalMetaDataContexts, 
reloadMetaDataContexts);
+        reloadMetaDataContexts.close();
     }
     
     @Override
-    public void unregisterStorageUnits(final String databaseName, final 
Collection<String> toBeDroppedStorageUnitNames) {
-        MetaDataContexts originalMetaDataContexts = 
metaDataContextManager.getMetaDataContexts().get();
+    public void unregisterStorageUnits(final String databaseName, final 
Collection<String> toBeDroppedStorageUnitNames) throws SQLException {
         for (String each : getToBeDroppedResourceNames(databaseName, 
toBeDroppedStorageUnitNames)) {
+            MetaDataContexts originalMetaDataContexts = 
metaDataContextManager.getMetaDataContexts().get();
+            SwitchingResource switchingResource = 
metaDataContextManager.getResourceSwitchManager()
+                    
.switchByUnregisterStorageUnit(originalMetaDataContexts.getMetaData().getDatabase(databaseName).getResourceMetaData(),
 Collections.singletonList(each));
+            MetaDataContexts reloadMetaDataContexts = 
MetaDataContextsFactory.createBySwitchResource(databaseName, false,
+                    switchingResource, originalMetaDataContexts, 
metaDataPersistService, metaDataContextManager.getComputeNodeInstanceContext());
             
metaDataPersistService.getDataSourceUnitService().delete(databaseName, each);
+            afterStorageUnitsDropped(databaseName, originalMetaDataContexts, 
reloadMetaDataContexts);
+            reloadMetaDataContexts.close();
         }
-        afterStorageUnitsDropped(databaseName, originalMetaDataContexts);
     }
     
     private Collection<String> getToBeDroppedResourceNames(final String 
databaseName, final Collection<String> toBeDroppedResourceNames) {
@@ -185,8 +203,10 @@ public final class ClusterMetaDataManagerPersistService 
implements MetaDataManag
         metaDataPersistService.getPropsService().persist(props);
     }
     
-    private void afterStorageUnitsAltered(final String databaseName, final 
MetaDataContexts originalMetaDataContexts) {
-        MetaDataContexts reloadMetaDataContexts = 
metaDataContextManager.getMetaDataContexts().get();
+    private void afterStorageUnitsAltered(final String databaseName, final 
MetaDataContexts originalMetaDataContexts, final MetaDataContexts 
reloadMetaDataContexts) {
+        
reloadMetaDataContexts.getMetaData().getDatabase(databaseName).getSchemas().forEach((schemaName,
 schema) -> metaDataPersistService.getDatabaseMetaDataService()
+                
.persistByAlterConfiguration(reloadMetaDataContexts.getMetaData().getDatabase(databaseName).getName(),
 schemaName, schema));
+        // TODO confirm
         
Optional.ofNullable(reloadMetaDataContexts.getStatistics().getDatabaseData().get(databaseName))
                 .ifPresent(optional -> 
optional.getSchemaData().forEach((schemaName, schemaData) -> 
metaDataPersistService.getShardingSphereDataPersistService()
                         .persist(databaseName, schemaName, schemaData, 
originalMetaDataContexts.getMetaData().getDatabases())));
@@ -194,8 +214,9 @@ public final class ClusterMetaDataManagerPersistService 
implements MetaDataManag
                 
originalMetaDataContexts.getMetaData().getDatabase(databaseName));
     }
     
-    private void afterStorageUnitsDropped(final String databaseName, final 
MetaDataContexts originalMetaDataContexts) {
-        MetaDataContexts reloadMetaDataContexts = 
metaDataContextManager.getMetaDataContexts().get();
+    private void afterStorageUnitsDropped(final String databaseName, final 
MetaDataContexts originalMetaDataContexts, final MetaDataContexts 
reloadMetaDataContexts) {
+        
reloadMetaDataContexts.getMetaData().getDatabase(databaseName).getSchemas().forEach((schemaName,
 schema) -> metaDataPersistService.getDatabaseMetaDataService()
+                
.persistByDropConfiguration(reloadMetaDataContexts.getMetaData().getDatabase(databaseName).getName(),
 schemaName, schema));
         
Optional.ofNullable(reloadMetaDataContexts.getStatistics().getDatabaseData().get(databaseName))
                 .ifPresent(optional -> 
optional.getSchemaData().forEach((schemaName, schemaData) -> 
metaDataPersistService.getShardingSphereDataPersistService()
                         .persist(databaseName, schemaName, schemaData, 
originalMetaDataContexts.getMetaData().getDatabases())));

Reply via email to