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

duanzhengqiang 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 6548959e7e0 Refactor ConfigurationContextManager (#30802)
6548959e7e0 is described below

commit 6548959e7e08c7dd4d9edf2f38800e030bf5cc56
Author: zhaojinchao <[email protected]>
AuthorDate: Mon Apr 8 15:22:54 2024 +0800

    Refactor ConfigurationContextManager (#30802)
---
 .../schema/TableMetaDataPersistService.java        |  8 -----
 .../service/schema/ViewMetaDataPersistService.java |  8 -----
 .../context/ConfigurationContextManager.java       | 38 +++++++++++++++-------
 .../standalone/StandaloneModeContextManager.java   |  2 +-
 4 files changed, 27 insertions(+), 29 deletions(-)

diff --git 
a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/schema/TableMetaDataPersistService.java
 
b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/schema/TableMetaDataPersistService.java
index 8d51718b4a5..caa12fd28a0 100644
--- 
a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/schema/TableMetaDataPersistService.java
+++ 
b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/schema/TableMetaDataPersistService.java
@@ -47,7 +47,6 @@ public final class TableMetaDataPersistService implements 
SchemaMetaDataPersistS
     
     @Override
     public void persist(final String databaseName, final String schemaName, 
final Map<String, ShardingSphereTable> tables) {
-        persistSchemaName(databaseName, schemaName);
         for (Entry<String, ShardingSphereTable> entry : tables.entrySet()) {
             String tableName = entry.getKey().toLowerCase();
             List<String> versions = 
repository.getChildrenKeys(TableMetaDataNode.getTableVersionsNode(databaseName, 
schemaName, tableName));
@@ -62,7 +61,6 @@ public final class TableMetaDataPersistService implements 
SchemaMetaDataPersistS
     
     @Override
     public Collection<MetaDataVersion> persistSchemaMetaData(final String 
databaseName, final String schemaName, final Map<String, ShardingSphereTable> 
tables) {
-        persistSchemaName(databaseName, schemaName);
         Collection<MetaDataVersion> result = new LinkedList<>();
         for (Entry<String, ShardingSphereTable> entry : tables.entrySet()) {
             String tableName = entry.getKey().toLowerCase();
@@ -78,12 +76,6 @@ public final class TableMetaDataPersistService implements 
SchemaMetaDataPersistS
         return result;
     }
     
-    private void persistSchemaName(final String databaseName, final String 
schemaName) {
-        if 
(!repository.isExisted(TableMetaDataNode.getMetaDataTablesNode(databaseName, 
schemaName))) {
-            
repository.persist(TableMetaDataNode.getMetaDataTablesNode(databaseName, 
schemaName), "");
-        }
-    }
-    
     private String getActiveVersion(final String databaseName, final String 
schemaName, final String tableName) {
         return 
repository.getDirectly(TableMetaDataNode.getTableActiveVersionNode(databaseName,
 schemaName, tableName));
     }
diff --git 
a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/schema/ViewMetaDataPersistService.java
 
b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/schema/ViewMetaDataPersistService.java
index 4414d6afa1d..65eb5fb9717 100644
--- 
a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/schema/ViewMetaDataPersistService.java
+++ 
b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/schema/ViewMetaDataPersistService.java
@@ -47,7 +47,6 @@ public final class ViewMetaDataPersistService implements 
SchemaMetaDataPersistSe
     
     @Override
     public void persist(final String databaseName, final String schemaName, 
final Map<String, ShardingSphereView> views) {
-        persistSchemaName(databaseName, schemaName);
         for (Entry<String, ShardingSphereView> entry : views.entrySet()) {
             String viewName = entry.getKey().toLowerCase();
             List<String> versions = 
repository.getChildrenKeys(ViewMetaDataNode.getViewVersionsNode(databaseName, 
schemaName, viewName));
@@ -62,7 +61,6 @@ public final class ViewMetaDataPersistService implements 
SchemaMetaDataPersistSe
     
     @Override
     public Collection<MetaDataVersion> persistSchemaMetaData(final String 
databaseName, final String schemaName, final Map<String, ShardingSphereView> 
views) {
-        persistSchemaName(databaseName, schemaName);
         Collection<MetaDataVersion> result = new LinkedList<>();
         for (Entry<String, ShardingSphereView> entry : views.entrySet()) {
             String viewName = entry.getKey().toLowerCase();
@@ -78,12 +76,6 @@ public final class ViewMetaDataPersistService implements 
SchemaMetaDataPersistSe
         return result;
     }
     
-    private void persistSchemaName(final String databaseName, final String 
schemaName) {
-        if 
(!repository.isExisted(ViewMetaDataNode.getMetaDataViewsNode(databaseName, 
schemaName))) {
-            
repository.persist(ViewMetaDataNode.getMetaDataViewsNode(databaseName, 
schemaName), "");
-        }
-    }
-    
     private String getActiveVersion(final String databaseName, final String 
schemaName, final String viewName) {
         return 
repository.getDirectly(ViewMetaDataNode.getViewActiveVersionNode(databaseName, 
schemaName, viewName));
     }
diff --git 
a/mode/core/src/main/java/org/apache/shardingsphere/mode/manager/context/ConfigurationContextManager.java
 
b/mode/core/src/main/java/org/apache/shardingsphere/mode/manager/context/ConfigurationContextManager.java
index 4d308dd881e..4ce36aed639 100644
--- 
a/mode/core/src/main/java/org/apache/shardingsphere/mode/manager/context/ConfigurationContextManager.java
+++ 
b/mode/core/src/main/java/org/apache/shardingsphere/mode/manager/context/ConfigurationContextManager.java
@@ -80,7 +80,7 @@ public final class ConfigurationContextManager {
             closeStaleRules(databaseName);
             SwitchingResource switchingResource =
                     new 
ResourceSwitchManager().registerStorageUnit(metaDataContexts.get().getMetaData().getDatabase(databaseName).getResourceMetaData(),
 propsMap);
-            buildNewMetaDataContext(databaseName, switchingResource);
+            buildNewMetaDataContext(databaseName, switchingResource, false);
         } catch (final SQLException ex) {
             log.error("Alter database: {} register storage unit failed", 
databaseName, ex);
         }
@@ -97,7 +97,7 @@ public final class ConfigurationContextManager {
             closeStaleRules(databaseName);
             SwitchingResource switchingResource =
                     new 
ResourceSwitchManager().alterStorageUnit(metaDataContexts.get().getMetaData().getDatabase(databaseName).getResourceMetaData(),
 propsMap);
-            buildNewMetaDataContext(databaseName, switchingResource);
+            buildNewMetaDataContext(databaseName, switchingResource, false);
         } catch (final SQLException ex) {
             log.error("Alter database: {} register storage unit failed", 
databaseName, ex);
         }
@@ -114,13 +114,13 @@ public final class ConfigurationContextManager {
             closeStaleRules(databaseName);
             SwitchingResource switchingResource = new 
ResourceSwitchManager().unregisterStorageUnit(metaDataContexts.get().getMetaData().getDatabase(databaseName).getResourceMetaData(),
                     Collections.singletonList(storageUnitName));
-            buildNewMetaDataContext(databaseName, switchingResource);
+            buildNewMetaDataContext(databaseName, switchingResource, true);
         } catch (final SQLException ex) {
             log.error("Alter database: {} register storage unit failed", 
databaseName, ex);
         }
     }
     
-    private void buildNewMetaDataContext(final String databaseName, final 
SwitchingResource switchingResource) throws SQLException {
+    private void buildNewMetaDataContext(final String databaseName, final 
SwitchingResource switchingResource, final boolean isDropConfig) throws 
SQLException {
         
metaDataContexts.get().getMetaData().getDatabases().putAll(renewDatabase(metaDataContexts.get().getMetaData().getDatabase(databaseName),
 switchingResource));
         MetaDataContexts reloadMetaDataContexts = 
createMetaDataContexts(databaseName, false, switchingResource, null);
         
reloadMetaDataContexts.getMetaData().getDatabase(databaseName).getSchemas().forEach((schemaName,
 schema) -> 
reloadMetaDataContexts.getPersistService().getDatabaseMetaDataService()
@@ -128,7 +128,7 @@ public final class ConfigurationContextManager {
         
Optional.ofNullable(reloadMetaDataContexts.getStatistics().getDatabaseData().get(databaseName))
                 .ifPresent(optional -> 
optional.getSchemaData().forEach((schemaName, schemaData) -> 
reloadMetaDataContexts.getPersistService().getShardingSphereDataPersistService()
                         .persist(databaseName, schemaName, schemaData, 
metaDataContexts.get().getMetaData().getDatabases())));
-        alterSchemaMetaData(databaseName, 
reloadMetaDataContexts.getMetaData().getDatabase(databaseName), 
metaDataContexts.get().getMetaData().getDatabase(databaseName));
+        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)));
         switchingResource.closeStaleDataSources();
@@ -145,7 +145,7 @@ public final class ConfigurationContextManager {
             // TODO consider rename this method to 
alterDatabaseRuleConfiguration
             closeStaleRules(databaseName);
             MetaDataContexts reloadMetaDataContexts = 
createMetaDataContextsWhenRuleChanged(databaseName, false, null, ruleConfigs);
-            alterSchemaMetaData(databaseName, 
reloadMetaDataContexts.getMetaData().getDatabase(databaseName), 
metaDataContexts.get().getMetaData().getDatabase(databaseName));
+            alterSchemaMetaData(databaseName, 
reloadMetaDataContexts.getMetaData().getDatabase(databaseName), 
metaDataContexts.get().getMetaData().getDatabase(databaseName), false);
             metaDataContexts.set(reloadMetaDataContexts);
             
metaDataContexts.get().getMetaData().getDatabase(databaseName).getSchemas().putAll(newShardingSphereSchemas(metaDataContexts.get().getMetaData().getDatabase(databaseName)));
         } catch (final SQLException ex) {
@@ -168,7 +168,7 @@ public final class ConfigurationContextManager {
                     
database.getResourceMetaData().getStorageUnits().entrySet().stream()
                             .collect(Collectors.toMap(Entry::getKey, entry -> 
entry.getValue().getDataSource(), (oldValue, currentValue) -> oldValue, 
LinkedHashMap::new)),
                     database.getRuleMetaData().getRules(), ruleConfig, 
instanceContext));
-            refreshMetadata(databaseName, database, rules);
+            refreshMetadata(databaseName, database, rules, false);
         } catch (final SQLException ex) {
             log.error("Alter database: {} rule configurations failed", 
databaseName, ex);
         }
@@ -191,7 +191,7 @@ public final class ConfigurationContextManager {
                                 .collect(Collectors.toMap(Entry::getKey, entry 
-> entry.getValue().getDataSource(), (oldValue, currentValue) -> oldValue, 
LinkedHashMap::new)),
                         database.getRuleMetaData().getRules(), ruleConfig, 
instanceContext));
             }
-            refreshMetadata(databaseName, database, rules);
+            refreshMetadata(databaseName, database, rules, true);
         } catch (final SQLException ex) {
             log.error("Drop database: {} rule configurations failed", 
databaseName, ex);
         }
@@ -201,11 +201,11 @@ public final class ConfigurationContextManager {
         return !((DatabaseRuleConfiguration) ruleConfig).isEmpty();
     }
     
-    private void refreshMetadata(final String databaseName, final 
ShardingSphereDatabase database, final Collection<ShardingSphereRule> rules) 
throws SQLException {
+    private void refreshMetadata(final String databaseName, final 
ShardingSphereDatabase database, final Collection<ShardingSphereRule> rules, 
final boolean isDropConfig) throws SQLException {
         database.getRuleMetaData().getRules().clear();
         database.getRuleMetaData().getRules().addAll(rules);
         MetaDataContexts reloadMetaDataContexts = 
createMetaDataContextsByAlterRule(databaseName, 
database.getRuleMetaData().getConfigurations());
-        alterSchemaMetaData(databaseName, 
reloadMetaDataContexts.getMetaData().getDatabase(databaseName), 
metaDataContexts.get().getMetaData().getDatabase(databaseName));
+        alterSchemaMetaData(databaseName, 
reloadMetaDataContexts.getMetaData().getDatabase(databaseName), 
metaDataContexts.get().getMetaData().getDatabase(databaseName), isDropConfig);
         metaDataContexts.set(reloadMetaDataContexts);
         
metaDataContexts.get().getMetaData().getDatabase(databaseName).getSchemas().putAll(newShardingSphereSchemas(metaDataContexts.get().getMetaData().getDatabase(databaseName)));
     }
@@ -222,14 +222,28 @@ public final class ConfigurationContextManager {
      * @param databaseName database name
      * @param reloadDatabase reload database
      * @param currentDatabase current database
+     * @param isDropConfig is drop configuration
      */
-    public void alterSchemaMetaData(final String databaseName, final 
ShardingSphereDatabase reloadDatabase, final ShardingSphereDatabase 
currentDatabase) {
+    public void alterSchemaMetaData(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());
-        toBeAddedSchemas.forEach((key, value) -> 
metaDataContexts.get().getPersistService().getDatabaseMetaDataService().persist(databaseName,
 key, value));
+        if (isDropConfig) {
+            toBeAddedSchemas.forEach((key, value) -> 
metaDataContexts.get().getPersistService().getDatabaseMetaDataService().persist(databaseName,
 key, value));
+        } else {
+            alterSchemaMetaData(databaseName, toBeAddedSchemas);
+        }
         toBeAlterSchemas.forEach((key, value) -> 
metaDataContexts.get().getPersistService().getDatabaseMetaDataService().delete(databaseName,
 key, value));
     }
     
+    private void alterSchemaMetaData(final String databaseName, final 
Map<String, ShardingSphereSchema> toBeAddedSchemas) {
+        for (Entry<String, ShardingSphereSchema> entry : 
toBeAddedSchemas.entrySet()) {
+            if (entry.getValue().getTables().isEmpty() && 
entry.getValue().getViews().isEmpty()) {
+                
metaDataContexts.get().getPersistService().getDatabaseMetaDataService().addSchema(databaseName,
 entry.getKey());
+            }
+            
metaDataContexts.get().getPersistService().getDatabaseMetaDataService().persist(databaseName,
 entry.getKey(), entry.getValue());
+        }
+    }
+    
     /**
      * Renew ShardingSphere databases.
      *
diff --git 
a/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/StandaloneModeContextManager.java
 
b/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/StandaloneModeContextManager.java
index e44a9b80da4..fbbd964bf8f 100644
--- 
a/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/StandaloneModeContextManager.java
+++ 
b/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/StandaloneModeContextManager.java
@@ -244,7 +244,7 @@ public final class StandaloneModeContextManager implements 
ModeContextManager, C
                 
.putAll(contextManager.getConfigurationContextManager().renewDatabase(contextManager.getMetaDataContexts().getMetaData().getDatabase(databaseName),
 switchingResource));
         MetaDataContexts reloadMetaDataContexts = 
contextManager.getConfigurationContextManager().createMetaDataContexts(databaseName,
 false, switchingResource, null);
         
contextManager.getConfigurationContextManager().alterSchemaMetaData(databaseName,
 reloadMetaDataContexts.getMetaData().getDatabase(databaseName),
-                
contextManager.getMetaDataContexts().getMetaData().getDatabase(databaseName));
+                
contextManager.getMetaDataContexts().getMetaData().getDatabase(databaseName), 
true);
         contextManager.deletedSchemaNames(databaseName, 
reloadMetaDataContexts.getMetaData().getDatabase(databaseName), 
contextManager.getMetaDataContexts().getMetaData().getDatabase(databaseName));
         contextManager.renewMetaDataContexts(reloadMetaDataContexts);
         switchingResource.closeStaleDataSources();

Reply via email to