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 6c21b8d3af9 Refactor ContextManager.reloadDatabaseMetaData (#18887)
6c21b8d3af9 is described below

commit 6c21b8d3af91a0476db5f1a1e6e6d8ec3af48430
Author: Liang Zhang <[email protected]>
AuthorDate: Wed Jul 6 14:06:22 2022 +0800

    Refactor ContextManager.reloadDatabaseMetaData (#18887)
    
    * Refactor ContextManager.reloadDatabaseMetaData
    
    * Rename reloadDatabase
    
    * Rename reloadDatabase
    
    * Rename reloadDatabase
---
 .../mode/manager/ContextManager.java               | 49 +++++++---------------
 .../mode/manager/ContextManagerTest.java           |  4 +-
 .../updatable/RefreshTableMetadataHandler.java     |  2 +-
 3 files changed, 17 insertions(+), 38 deletions(-)

diff --git 
a/shardingsphere-mode/shardingsphere-mode-core/src/main/java/org/apache/shardingsphere/mode/manager/ContextManager.java
 
b/shardingsphere-mode/shardingsphere-mode-core/src/main/java/org/apache/shardingsphere/mode/manager/ContextManager.java
index 33580c3e208..29022149c1f 100644
--- 
a/shardingsphere-mode/shardingsphere-mode-core/src/main/java/org/apache/shardingsphere/mode/manager/ContextManager.java
+++ 
b/shardingsphere-mode/shardingsphere-mode-core/src/main/java/org/apache/shardingsphere/mode/manager/ContextManager.java
@@ -36,10 +36,10 @@ import 
org.apache.shardingsphere.infra.instance.InstanceContext;
 import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
 import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
 import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabasesFactory;
+import 
org.apache.shardingsphere.infra.metadata.database.resource.ShardingSphereResource;
 import 
org.apache.shardingsphere.infra.metadata.database.rule.ShardingSphereRuleMetaData;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.builder.GenericSchemaBuilder;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.builder.GenericSchemaBuilderMaterials;
-import 
org.apache.shardingsphere.infra.metadata.database.schema.builder.SystemSchemaBuilder;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.decorator.model.ShardingSphereSchema;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.decorator.model.ShardingSphereTable;
 import org.apache.shardingsphere.infra.rule.builder.global.GlobalRulesBuilder;
@@ -57,9 +57,9 @@ import java.util.HashMap;
 import java.util.LinkedHashMap;
 import java.util.LinkedList;
 import java.util.Map;
+import java.util.Map.Entry;
 import java.util.Optional;
 import java.util.Properties;
-import java.util.concurrent.ConcurrentHashMap;
 import java.util.stream.Collectors;
 
 /**
@@ -304,16 +304,6 @@ public final class ContextManager implements AutoCloseable 
{
         return result;
     }
     
-    private MetaDataContexts createMetaDataContexts(final String databaseName, 
final Map<String, ShardingSphereSchema> actualSchemas) {
-        ShardingSphereDatabase alteredMetaData = new 
ShardingSphereDatabase(databaseName, 
metaDataContexts.getMetaData().getDatabases().get(databaseName).getProtocolType(),
-                
metaDataContexts.getMetaData().getDatabases().get(databaseName).getResource(), 
metaDataContexts.getMetaData().getDatabases().get(databaseName).getRuleMetaData(),
 actualSchemas);
-        Map<String, ShardingSphereDatabase> alteredDatabases = new 
HashMap<>(metaDataContexts.getMetaData().getDatabases());
-        alteredDatabases.put(databaseName, alteredMetaData);
-        metaDataContexts.getOptimizerContext().alterDatabase(databaseName, 
actualSchemas);
-        return newMetaDataContexts(new 
ShardingSphereMetaData(alteredDatabases, 
metaDataContexts.getMetaData().getGlobalRuleMetaData(), 
metaDataContexts.getMetaData().getProps()),
-                metaDataContexts.getOptimizerContext());
-    }
-    
     private MetaDataContexts createMetaDataContexts(final String databaseName, 
final SwitchingResource switchingResource, final Collection<RuleConfiguration> 
ruleConfigs) throws SQLException {
         Map<String, ShardingSphereDatabase> changedDatabases = 
createChangedDatabases(databaseName, switchingResource, ruleConfigs);
         ShardingSphereRuleMetaData changedGlobalMetaData = new 
ShardingSphereRuleMetaData(
@@ -372,38 +362,27 @@ public final class ContextManager implements 
AutoCloseable {
     }
     
     /**
-     * Reload database meta data.
+     * Reload database.
      *
      * @param databaseName to be reloaded database name
      */
-    public synchronized void reloadDatabaseMetaData(final String databaseName) 
{
+    public synchronized void reloadDatabase(final String databaseName) {
         try {
-            Map<String, ShardingSphereSchema> actualSchemas = 
loadSchemas(databaseName);
-            Map<String, ShardingSphereSchema> pendingDeletedSchemas = 
getPendingDeletedSchemas(databaseName, actualSchemas);
-            metaDataContexts = createMetaDataContexts(databaseName, 
actualSchemas);
-            pendingDeletedSchemas.keySet().forEach(each -> 
metaDataContexts.getPersistService().ifPresent(optional -> 
optional.getDatabaseMetaDataService().deleteSchema(databaseName, each)));
-            persistMetaData(metaDataContexts);
+            ShardingSphereResource currentResource = 
metaDataContexts.getMetaData().getDatabases().get(databaseName).getResource();
+            SwitchingResource switchingResource = new 
SwitchingResource(currentResource, currentResource.getDataSources(), 
Collections.emptyMap());
+            MetaDataContexts reloadedMetaDataContexts = 
createMetaDataContexts(databaseName, switchingResource, null);
+            Map<String, ShardingSphereSchema> toBeDeletedSchemas = 
getToBeDeletedSchemas(reloadedMetaDataContexts.getMetaData().getDatabases().get(databaseName));
+            metaDataContexts = reloadedMetaDataContexts;
+            toBeDeletedSchemas.keySet().forEach(each -> 
reloadedMetaDataContexts.getPersistService().ifPresent(optional -> 
optional.getDatabaseMetaDataService().deleteSchema(databaseName, each)));
+            persistMetaData(reloadedMetaDataContexts);
         } catch (final SQLException ex) {
             log.error("Reload database:{} failed", databaseName, ex);
         }
     }
     
-    private Map<String, ShardingSphereSchema> loadSchemas(final String 
databaseName) throws SQLException {
-        ShardingSphereDatabase database = 
metaDataContexts.getMetaData().getDatabases().get(databaseName);
-        Map<String, DataSource> dataSourceMap = 
database.getResource().getDataSources();
-        database.reloadRules(instanceContext);
-        DatabaseType storageType = 
DatabaseTypeEngine.getDatabaseType(dataSourceMap.values());
-        Map<String, ShardingSphereSchema> result = new ConcurrentHashMap<>();
-        GenericSchemaBuilderMaterials materials = new 
GenericSchemaBuilderMaterials(database.getProtocolType(),
-                storageType, dataSourceMap, 
database.getRuleMetaData().getRules(), 
metaDataContexts.getMetaData().getProps(), databaseName);
-        result.putAll(GenericSchemaBuilder.build(materials));
-        result.putAll(SystemSchemaBuilder.build(databaseName, 
database.getProtocolType()));
-        return result;
-    }
-    
-    private Map<String, ShardingSphereSchema> getPendingDeletedSchemas(final 
String databaseName, final Map<String, ShardingSphereSchema> actualSchemas) {
-        Map<String, ShardingSphereSchema> originalSchemas = 
metaDataContexts.getMetaData().getDatabases().get(databaseName).getSchemas();
-        return originalSchemas.entrySet().stream().filter(entry -> 
!actualSchemas.containsKey(entry.getKey())).collect(Collectors.toMap(Map.Entry::getKey,
 Map.Entry::getValue));
+    private Map<String, ShardingSphereSchema> getToBeDeletedSchemas(final 
ShardingSphereDatabase reloadedDatabase) {
+        Map<String, ShardingSphereSchema> currentSchemas = 
metaDataContexts.getMetaData().getDatabases().get(reloadedDatabase.getName()).getSchemas();
+        return currentSchemas.entrySet().stream().filter(entry -> 
!reloadedDatabase.getSchemas().containsKey(entry.getKey())).collect(Collectors.toMap(Entry::getKey,
 Entry::getValue));
     }
     
     /**
diff --git 
a/shardingsphere-mode/shardingsphere-mode-core/src/test/java/org/apache/shardingsphere/mode/manager/ContextManagerTest.java
 
b/shardingsphere-mode/shardingsphere-mode-core/src/test/java/org/apache/shardingsphere/mode/manager/ContextManagerTest.java
index 654f472d4eb..a2be5b6631e 100644
--- 
a/shardingsphere-mode/shardingsphere-mode-core/src/test/java/org/apache/shardingsphere/mode/manager/ContextManagerTest.java
+++ 
b/shardingsphere-mode/shardingsphere-mode-core/src/test/java/org/apache/shardingsphere/mode/manager/ContextManagerTest.java
@@ -256,13 +256,13 @@ public final class ContextManagerTest {
     }
     
     @Test
-    public void assertReloadDatabaseMetaData() {
+    public void assertReloadDatabase() {
         
when(metaDataContexts.getMetaData().getDatabases().get("foo_db").getResource().getDataSources()).thenReturn(Collections.singletonMap("foo_ds",
 new MockedDataSource()));
         DatabaseMetaDataPersistService databaseMetaDataPersistService = 
mock(DatabaseMetaDataPersistService.class, RETURNS_DEEP_STUBS);
         MetaDataPersistService metaDataPersistService = 
mock(MetaDataPersistService.class);
         
when(metaDataPersistService.getDatabaseMetaDataService()).thenReturn(databaseMetaDataPersistService);
         
when(metaDataContexts.getPersistService()).thenReturn(Optional.of(metaDataPersistService));
-        contextManager.reloadDatabaseMetaData("foo_db");
+        contextManager.reloadDatabase("foo_db");
         verify(databaseMetaDataPersistService, 
times(1)).deleteSchema(eq("foo_db"), eq("foo_schema"));
         verify(databaseMetaDataPersistService, 
times(1)).persistMetaData(eq("foo_db"), eq("foo_db"), 
any(ShardingSphereSchema.class));
     }
diff --git 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/ral/common/updatable/RefreshTableMetadataHandler.java
 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/ral/common/updatable/RefreshTableMetadataHandler.java
index ef3939f1ddd..35b86149ef7 100644
--- 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/ral/common/updatable/RefreshTableMetadataHandler.java
+++ 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/ral/common/updatable/RefreshTableMetadataHandler.java
@@ -47,7 +47,7 @@ public final class RefreshTableMetadataHandler extends 
UpdatableRALBackendHandle
         if (getSqlStatement().getTableName().isPresent()) {
             contextManager.reloadTableMetaData(databaseName, schemaName, 
getSqlStatement().getTableName().get());
         } else {
-            contextManager.reloadDatabaseMetaData(databaseName);
+            contextManager.reloadDatabase(databaseName);
         }
     }
     

Reply via email to