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 2074e6bb207 Refactor ContextManager (#29786)
2074e6bb207 is described below

commit 2074e6bb2076ad11fa18ce6722dbe60526787294
Author: Liang Zhang <[email protected]>
AuthorDate: Sat Jan 20 16:09:09 2024 +0800

    Refactor ContextManager (#29786)
    
    * Refactor ContextManager
    
    * Refactor ContextManager
---
 .../scenario/migration/api/MigrationJobAPI.java    |  2 +-
 .../mode/manager/ContextManager.java               | 58 ++++++++++------------
 .../mode/manager/ContextManagerTest.java           |  7 ++-
 .../updatable/RefreshTableMetaDataExecutor.java    |  8 +--
 4 files changed, 36 insertions(+), 39 deletions(-)

diff --git 
a/kernel/data-pipeline/scenario/migration/src/main/java/org/apache/shardingsphere/data/pipeline/scenario/migration/api/MigrationJobAPI.java
 
b/kernel/data-pipeline/scenario/migration/src/main/java/org/apache/shardingsphere/data/pipeline/scenario/migration/api/MigrationJobAPI.java
index c8fb395d983..419bf9e5bc8 100644
--- 
a/kernel/data-pipeline/scenario/migration/src/main/java/org/apache/shardingsphere/data/pipeline/scenario/migration/api/MigrationJobAPI.java
+++ 
b/kernel/data-pipeline/scenario/migration/src/main/java/org/apache/shardingsphere/data/pipeline/scenario/migration/api/MigrationJobAPI.java
@@ -288,7 +288,7 @@ public final class MigrationJobAPI implements 
TransmissionJobAPI {
         // TODO use origin database name now, wait reloadDatabaseMetaData fix 
case-sensitive probelm
         ContextManager contextManager = 
PipelineContextManager.getContext(PipelineJobIdUtils.parseContextKey(jobId)).getContextManager();
         ShardingSphereDatabase database = 
contextManager.getMetaDataContexts().getMetaData().getDatabase(databaseName);
-        contextManager.refreshTableMetaData(database.getName());
+        contextManager.refreshTableMetaData(database);
     }
     
     @Override
diff --git 
a/mode/core/src/main/java/org/apache/shardingsphere/mode/manager/ContextManager.java
 
b/mode/core/src/main/java/org/apache/shardingsphere/mode/manager/ContextManager.java
index d706bfe2da6..b35f411a714 100644
--- 
a/mode/core/src/main/java/org/apache/shardingsphere/mode/manager/ContextManager.java
+++ 
b/mode/core/src/main/java/org/apache/shardingsphere/mode/manager/ContextManager.java
@@ -116,7 +116,7 @@ public final class ContextManager implements AutoCloseable {
     public void refreshDatabaseMetaData(final String databaseName, final 
boolean force) {
         try {
             ShardingSphereDatabase database = 
metaDataContexts.get().getMetaData().getDatabase(databaseName);
-            MetaDataContexts reloadedMetaDataContexts = 
createMetaDataContexts(databaseName);
+            MetaDataContexts reloadedMetaDataContexts = 
createMetaDataContexts(database);
             if (force) {
                 metaDataContexts.set(reloadedMetaDataContexts);
                 
metaDataContexts.get().getMetaData().getDatabase(databaseName).getSchemas()
@@ -135,29 +135,26 @@ public final class ContextManager implements 
AutoCloseable {
     /**
      * Reload table meta data.
      * 
-     * @param databaseName to be reloaded database name
+     * @param database to be reloaded database
      */
-    public void refreshTableMetaData(final String databaseName) {
+    public void refreshTableMetaData(final ShardingSphereDatabase database) {
         try {
-            ShardingSphereDatabase database = 
metaDataContexts.get().getMetaData().getDatabase(databaseName);
-            MetaDataContexts reloadedMetaDataContexts = 
createMetaDataContexts(databaseName);
-            deletedSchemaNames(databaseName, 
reloadedMetaDataContexts.getMetaData().getDatabase(databaseName), database);
+            MetaDataContexts reloadedMetaDataContexts = 
createMetaDataContexts(database);
+            deletedSchemaNames(database.getName(), database, database);
             metaDataContexts.set(reloadedMetaDataContexts);
-            
metaDataContexts.get().getMetaData().getDatabase(databaseName).getSchemas()
-                    .forEach((schemaName, schema) -> 
metaDataContexts.get().getPersistService().getDatabaseMetaDataService().compareAndPersist(database.getName(),
 schemaName, schema));
+            database.getSchemas().forEach((schemaName, schema) -> 
metaDataContexts.get().getPersistService().getDatabaseMetaDataService().compareAndPersist(database.getName(),
 schemaName, schema));
         } catch (final SQLException ex) {
-            log.error("Refresh table meta data: {} failed", databaseName, ex);
+            log.error("Refresh table meta data: {} failed", 
database.getName(), ex);
         }
     }
     
-    private MetaDataContexts createMetaDataContexts(final String databaseName) 
throws SQLException {
-        ShardingSphereDatabase database = 
metaDataContexts.get().getMetaData().getDatabase(databaseName);
-        Map<String, DataSourcePoolProperties> dataSourcePoolPropsFromRegCenter 
= 
metaDataContexts.get().getPersistService().getDataSourceUnitService().load(databaseName);
+    private MetaDataContexts createMetaDataContexts(final 
ShardingSphereDatabase database) throws SQLException {
+        Map<String, DataSourcePoolProperties> dataSourcePoolPropsFromRegCenter 
= 
metaDataContexts.get().getPersistService().getDataSourceUnitService().load(database.getName());
         SwitchingResource switchingResource = new 
ResourceSwitchManager().createByAlterDataSourcePoolProperties(database.getResourceMetaData(),
 dataSourcePoolPropsFromRegCenter);
         
metaDataContexts.get().getMetaData().getDatabases().putAll(configurationContextManager.renewDatabase(database,
 switchingResource));
         MetaDataBasedPersistService metaDataPersistService = 
metaDataContexts.get().getPersistService();
-        Map<String, ShardingSphereDatabase> changedDatabases = 
configurationContextManager.createChangedDatabases(databaseName, false,
-                switchingResource, 
metaDataPersistService.getDatabaseRulePersistService().load(databaseName));
+        Map<String, ShardingSphereDatabase> changedDatabases = 
configurationContextManager.createChangedDatabases(database.getName(), false,
+                switchingResource, 
metaDataPersistService.getDatabaseRulePersistService().load(database.getName()));
         ConfigurationProperties props = new 
ConfigurationProperties(metaDataPersistService.getPropsService().load());
         RuleMetaData changedGlobalMetaData = new RuleMetaData(
                 
GlobalRulesBuilder.buildRules(metaDataPersistService.getGlobalRuleService().load(),
 changedDatabases, props));
@@ -182,29 +179,28 @@ public final class ContextManager implements 
AutoCloseable {
     /**
      * Reload schema.
      * 
-     * @param databaseName database name
+     * @param database database
      * @param schemaName to be reloaded schema name
      * @param dataSourceName data source name
      */
-    public void reloadSchema(final String databaseName, final String 
schemaName, final String dataSourceName) {
+    public void reloadSchema(final ShardingSphereDatabase database, final 
String schemaName, final String dataSourceName) {
         try {
-            ShardingSphereSchema reloadedSchema = loadSchema(databaseName, 
schemaName, dataSourceName);
+            ShardingSphereSchema reloadedSchema = loadSchema(database, 
schemaName, dataSourceName);
             if (reloadedSchema.getTables().isEmpty()) {
-                
metaDataContexts.get().getMetaData().getDatabase(databaseName).dropSchema(schemaName);
-                
metaDataContexts.get().getPersistService().getDatabaseMetaDataService().dropSchema(metaDataContexts.get().getMetaData().getDatabase(databaseName).getName(),
+                database.dropSchema(schemaName);
+                
metaDataContexts.get().getPersistService().getDatabaseMetaDataService().dropSchema(database.getName(),
                         schemaName);
             } else {
-                
metaDataContexts.get().getMetaData().getDatabase(databaseName).addSchema(schemaName,
 reloadedSchema);
+                database.addSchema(schemaName, reloadedSchema);
                 
metaDataContexts.get().getPersistService().getDatabaseMetaDataService()
-                        
.compareAndPersist(metaDataContexts.get().getMetaData().getDatabase(databaseName).getName(),
 schemaName, reloadedSchema);
+                        .compareAndPersist(database.getName(), schemaName, 
reloadedSchema);
             }
         } catch (final SQLException ex) {
-            log.error("Reload meta data of database: {} schema: {} with data 
source: {} failed", databaseName, schemaName, dataSourceName, ex);
+            log.error("Reload meta data of database: {} schema: {} with data 
source: {} failed", database.getName(), schemaName, dataSourceName, ex);
         }
     }
     
-    private ShardingSphereSchema loadSchema(final String databaseName, final 
String schemaName, final String dataSourceName) throws SQLException {
-        ShardingSphereDatabase database = 
metaDataContexts.get().getMetaData().getDatabase(databaseName);
+    private ShardingSphereSchema loadSchema(final ShardingSphereDatabase 
database, final String schemaName, final String dataSourceName) throws 
SQLException {
         database.reloadRules(MutableDataNodeRule.class);
         GenericSchemaBuilderMaterial material = new 
GenericSchemaBuilderMaterial(database.getProtocolType(),
                 Collections.singletonMap(dataSourceName, 
database.getResourceMetaData().getStorageUnits().get(dataSourceName).getStorageType()),
@@ -218,38 +214,36 @@ public final class ContextManager implements 
AutoCloseable {
     /**
      * Reload table.
      * 
-     * @param databaseName database name
+     * @param database database
      * @param schemaName schema name
      * @param tableName to be reloaded table name
      */
-    public void reloadTable(final String databaseName, final String 
schemaName, final String tableName) {
-        ShardingSphereDatabase database = 
metaDataContexts.get().getMetaData().getDatabase(databaseName);
+    public void reloadTable(final ShardingSphereDatabase database, final 
String schemaName, final String tableName) {
         GenericSchemaBuilderMaterial material = new 
GenericSchemaBuilderMaterial(database.getProtocolType(),
                 database.getResourceMetaData().getStorageUnits(), 
database.getRuleMetaData().getRules(), 
metaDataContexts.get().getMetaData().getProps(), schemaName);
         try {
             persistTable(database, schemaName, tableName, material);
         } catch (final SQLException ex) {
-            log.error("Reload table: {} meta data of database: {} schema: {} 
failed", tableName, databaseName, schemaName, ex);
+            log.error("Reload table: {} meta data of database: {} schema: {} 
failed", tableName, database.getName(), schemaName, ex);
         }
     }
     
     /**
      * Reload table from single data source.
      * 
-     * @param databaseName database name
+     * @param database database
      * @param schemaName schema name
      * @param dataSourceName data source name
      * @param tableName to be reloaded table name
      */
-    public void reloadTable(final String databaseName, final String 
schemaName, final String dataSourceName, final String tableName) {
-        ShardingSphereDatabase database = 
metaDataContexts.get().getMetaData().getDatabase(databaseName);
+    public void reloadTable(final ShardingSphereDatabase database, final 
String schemaName, final String dataSourceName, final String tableName) {
         StorageUnit storageUnit = 
database.getResourceMetaData().getStorageUnits().get(dataSourceName);
         GenericSchemaBuilderMaterial material = new 
GenericSchemaBuilderMaterial(database.getProtocolType(), 
Collections.singletonMap(dataSourceName, storageUnit.getStorageType()),
                 Collections.singletonMap(dataSourceName, 
storageUnit.getDataSource()), database.getRuleMetaData().getRules(), 
metaDataContexts.get().getMetaData().getProps(), schemaName);
         try {
             persistTable(database, schemaName, tableName, material);
         } catch (final SQLException ex) {
-            log.error("Reload table: {} meta data of database: {} schema: {} 
with data source: {} failed", tableName, databaseName, schemaName, 
dataSourceName, ex);
+            log.error("Reload table: {} meta data of database: {} schema: {} 
with data source: {} failed", tableName, database.getName(), schemaName, 
dataSourceName, ex);
         }
     }
     
diff --git 
a/mode/core/src/test/java/org/apache/shardingsphere/mode/manager/ContextManagerTest.java
 
b/mode/core/src/test/java/org/apache/shardingsphere/mode/manager/ContextManagerTest.java
index 381362e62fc..8b907de9ea5 100644
--- 
a/mode/core/src/test/java/org/apache/shardingsphere/mode/manager/ContextManagerTest.java
+++ 
b/mode/core/src/test/java/org/apache/shardingsphere/mode/manager/ContextManagerTest.java
@@ -98,6 +98,7 @@ class ContextManagerTest {
     
     private ShardingSphereDatabase mockDatabase() {
         ShardingSphereDatabase result = mock(ShardingSphereDatabase.class, 
RETURNS_DEEP_STUBS);
+        when(result.getName()).thenReturn("foo_db");
         
when(result.getProtocolType()).thenReturn(TypedSPILoader.getService(DatabaseType.class,
 "FIXTURE"));
         MutableDataNodeRule mutableDataNodeRule = 
mock(MutableDataNodeRule.class, RETURNS_DEEP_STUBS);
         when(mutableDataNodeRule.findTableDataNode("foo_schema", 
"foo_tbl")).thenReturn(Optional.of(mock(DataNode.class)));
@@ -301,7 +302,8 @@ class ContextManagerTest {
         MetaDataPersistService persistService = 
mock(MetaDataPersistService.class);
         
when(persistService.getDatabaseMetaDataService()).thenReturn(databaseMetaDataPersistService);
         when(metaDataContexts.getPersistService()).thenReturn(persistService);
-        contextManager.reloadSchema("foo_db", "foo_schema", "foo_ds");
+        ShardingSphereDatabase database = mockDatabase();
+        contextManager.reloadSchema(database, "foo_schema", "foo_ds");
         verify(databaseMetaDataPersistService).dropSchema("foo_db", 
"foo_schema");
     }
     
@@ -311,7 +313,8 @@ class ContextManagerTest {
         MetaDataPersistService persistService = 
mock(MetaDataPersistService.class);
         
when(persistService.getDatabaseMetaDataService()).thenReturn(databaseMetaDataPersistService);
         when(metaDataContexts.getPersistService()).thenReturn(persistService);
-        contextManager.reloadTable("foo_db", "foo_schema", "foo_table");
+        ShardingSphereDatabase database = mockDatabase();
+        contextManager.reloadTable(database, "foo_schema", "foo_table");
         
assertTrue(contextManager.getMetaDataContexts().getMetaData().getDatabase("foo_db").getResourceMetaData().getStorageUnits().containsKey("foo_ds"));
     }
     
diff --git 
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/RefreshTableMetaDataExecutor.java
 
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/RefreshTableMetaDataExecutor.java
index 83eaab39235..434b727e48e 100644
--- 
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/RefreshTableMetaDataExecutor.java
+++ 
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/RefreshTableMetaDataExecutor.java
@@ -48,16 +48,16 @@ public final class RefreshTableMetaDataExecutor implements 
DatabaseAwareUpdatabl
         String schemaName = getSchemaName(sqlStatement);
         if (sqlStatement.getStorageUnitName().isPresent()) {
             if (sqlStatement.getTableName().isPresent()) {
-                contextManager.reloadTable(database.getName(), schemaName, 
sqlStatement.getStorageUnitName().get(), sqlStatement.getTableName().get());
+                contextManager.reloadTable(database, schemaName, 
sqlStatement.getStorageUnitName().get(), sqlStatement.getTableName().get());
             } else {
-                contextManager.reloadSchema(database.getName(), schemaName, 
sqlStatement.getStorageUnitName().get());
+                contextManager.reloadSchema(database, schemaName, 
sqlStatement.getStorageUnitName().get());
             }
             return;
         }
         if (sqlStatement.getTableName().isPresent()) {
-            contextManager.reloadTable(database.getName(), schemaName, 
sqlStatement.getTableName().get());
+            contextManager.reloadTable(database, schemaName, 
sqlStatement.getTableName().get());
         } else {
-            contextManager.refreshTableMetaData(database.getName());
+            contextManager.refreshTableMetaData(database);
         }
     }
     

Reply via email to