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 b6bc220  Refactor renew MetaDataContext when meta data changed (#12654)
b6bc220 is described below

commit b6bc2206e0c69ac8d22e1175fa18f06176a6d883
Author: Haoran Meng <[email protected]>
AuthorDate: Thu Sep 23 17:44:45 2021 +0800

    Refactor renew MetaDataContext when meta data changed (#12654)
    
    * Refactor renew MetaDataContext
    
    * Refactor renew MetaDataContext
---
 .../ClusterContextManagerCoordinator.java          | 31 ++++++++++------------
 .../ClusterContextManagerCoordinatorTest.java      |  6 ++---
 2 files changed, 17 insertions(+), 20 deletions(-)

diff --git 
a/shardingsphere-mode/shardingsphere-mode-type/shardingsphere-cluster-mode/shardingsphere-cluster-mode-core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/ClusterContextManagerCoordinator.java
 
b/shardingsphere-mode/shardingsphere-mode-type/shardingsphere-cluster-mode/shardingsphere-cluster-mode-core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/ClusterContextManagerCoordinator.java
index 57d9268..4642b52 100644
--- 
a/shardingsphere-mode/shardingsphere-mode-type/shardingsphere-cluster-mode/shardingsphere-cluster-mode-core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/ClusterContextManagerCoordinator.java
+++ 
b/shardingsphere-mode/shardingsphere-mode-type/shardingsphere-cluster-mode/shardingsphere-cluster-mode-core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/ClusterContextManagerCoordinator.java
@@ -27,13 +27,14 @@ import 
org.apache.shardingsphere.infra.config.datasource.DataSourceConverter;
 import 
org.apache.shardingsphere.infra.config.properties.ConfigurationProperties;
 import org.apache.shardingsphere.infra.database.type.DatabaseType;
 import org.apache.shardingsphere.infra.eventbus.ShardingSphereEventBus;
-import org.apache.shardingsphere.infra.lock.InnerLockReleasedEvent;
-import org.apache.shardingsphere.infra.lock.LockNameUtil;
 import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
 import 
org.apache.shardingsphere.infra.metadata.resource.ShardingSphereResource;
 import 
org.apache.shardingsphere.infra.metadata.rule.ShardingSphereRuleMetaData;
+import org.apache.shardingsphere.infra.metadata.schema.QualifiedSchema;
 import org.apache.shardingsphere.infra.metadata.schema.ShardingSphereSchema;
+import org.apache.shardingsphere.infra.metadata.schema.builder.SchemaBuilder;
 import org.apache.shardingsphere.infra.metadata.schema.loader.SchemaLoader;
+import org.apache.shardingsphere.infra.metadata.schema.model.TableMetaData;
 import 
org.apache.shardingsphere.infra.optimize.core.metadata.FederationSchemaMetaData;
 import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
 import org.apache.shardingsphere.infra.rule.builder.global.GlobalRulesBuilder;
@@ -53,7 +54,6 @@ import 
org.apache.shardingsphere.mode.manager.cluster.coordinator.registry.metad
 import 
org.apache.shardingsphere.mode.manager.cluster.coordinator.registry.metadata.event.SchemaDeletedEvent;
 import 
org.apache.shardingsphere.mode.manager.cluster.coordinator.registry.status.storage.event.DisabledStateChangedEvent;
 import 
org.apache.shardingsphere.mode.manager.cluster.coordinator.registry.status.storage.event.PrimaryStateChangedEvent;
-import org.apache.shardingsphere.infra.metadata.schema.QualifiedSchema;
 import org.apache.shardingsphere.mode.metadata.MetaDataContexts;
 import org.apache.shardingsphere.mode.metadata.MetaDataContextsBuilder;
 import org.apache.shardingsphere.mode.metadata.persist.MetaDataPersistService;
@@ -154,20 +154,17 @@ public final class ClusterContextManagerCoordinator {
      */
     @Subscribe
     public synchronized void renew(final SchemaChangedEvent event) {
-        try {
-            Map<String, ShardingSphereMetaData> schemaMetaData = new 
HashMap<>(contextManager.getMetaDataContexts().getMetaDataMap().size(), 1);
-            for (Entry<String, ShardingSphereMetaData> entry : 
contextManager.getMetaDataContexts().getMetaDataMap().entrySet()) {
-                String schemaName = entry.getKey();
-                ShardingSphereMetaData originalMetaData = entry.getValue();
-                ShardingSphereMetaData metaData = 
event.getSchemaName().equals(schemaName) ? getChangedMetaData(originalMetaData, 
event.getSchema(), schemaName) : originalMetaData;
-                schemaMetaData.put(schemaName, metaData);
-                
contextManager.getMetaDataContexts().getOptimizerContext().getMetaData().getSchemas().put(event.getSchemaName(),
-                        new FederationSchemaMetaData(event.getSchemaName(), 
metaData.getSchema().getTables()));
-            }
-            
contextManager.renewMetaDataContexts(rebuildMetaDataContexts(schemaMetaData));
-        } finally {
-            ShardingSphereEventBus.getInstance().post(new 
InnerLockReleasedEvent(LockNameUtil.getMetaDataRefreshLockName()));
-        }
+        String schemaName = event.getSchemaName();
+        Collection<TableMetaData> tableMetaDataList = 
event.getSchema().getTables().values();
+        ShardingSphereMetaData kernelMetaData = new 
ShardingSphereMetaData(schemaName, 
contextManager.getMetaDataContexts().getMetaData(schemaName).getResource(), 
+                
contextManager.getMetaDataContexts().getMetaData(schemaName).getRuleMetaData(), 
SchemaBuilder.buildKernelSchema(tableMetaDataList, 
+                
contextManager.getMetaDataContexts().getMetaData(schemaName).getRuleMetaData().getRules()));
+        Map<String, ShardingSphereMetaData> kernelMetaDataMap = new 
HashMap<>(contextManager.getMetaDataContexts().getMetaDataMap());
+        kernelMetaDataMap.put(schemaName, kernelMetaData);
+        
contextManager.getMetaDataContexts().getOptimizerContext().getMetaData().getSchemas().put(schemaName,
+                new FederationSchemaMetaData(schemaName, 
SchemaBuilder.buildFederateSchema(tableMetaDataList, 
+                        
contextManager.getMetaDataContexts().getMetaData(schemaName).getRuleMetaData().getRules()).getTables()));
+        
contextManager.renewMetaDataContexts(rebuildMetaDataContexts(kernelMetaDataMap));
     }
     
     /**
diff --git 
a/shardingsphere-mode/shardingsphere-mode-type/shardingsphere-cluster-mode/shardingsphere-cluster-mode-core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/ClusterContextManagerCoordinatorTest.java
 
b/shardingsphere-mode/shardingsphere-mode-type/shardingsphere-cluster-mode/shardingsphere-cluster-mode-core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/ClusterContextManagerCoordinatorTest.java
index bdd7abf..78ef4ec 100644
--- 
a/shardingsphere-mode/shardingsphere-mode-type/shardingsphere-cluster-mode/shardingsphere-cluster-mode-core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/ClusterContextManagerCoordinatorTest.java
+++ 
b/shardingsphere-mode/shardingsphere-mode-type/shardingsphere-cluster-mode/shardingsphere-cluster-mode-core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/ClusterContextManagerCoordinatorTest.java
@@ -77,7 +77,6 @@ import java.util.Properties;
 
 import static org.hamcrest.CoreMatchers.is;
 import static org.hamcrest.CoreMatchers.not;
-import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertThat;
@@ -161,10 +160,11 @@ public final class ClusterContextManagerCoordinatorTest {
     
     @Test
     public void assertSchemaChanged() {
-        SchemaChangedEvent event = new SchemaChangedEvent("schema_changed", 
mock(ShardingSphereSchema.class));
+        SchemaChangedEvent event = new SchemaChangedEvent("schema", 
mock(ShardingSphereSchema.class));
+        ShardingSphereMetaData metaData = 
contextManager.getMetaDataContexts().getMetaData("schema");
         coordinator.renew(event);
         
assertTrue(contextManager.getMetaDataContexts().getAllSchemaNames().contains("schema"));
-        
assertFalse(contextManager.getMetaDataContexts().getAllSchemaNames().contains("schema_changed"));
+        assertThat(contextManager.getMetaDataContexts().getMetaData("schema"), 
not(metaData));
     }
     
     @Test

Reply via email to