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

panjuan 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 41089f3fdab refresh transaction rule resource after rule changed with 
standalone mode (#18409)
41089f3fdab is described below

commit 41089f3fdabfd7b783d527721fb74b0f8d2e37f6
Author: Haoran Meng <[email protected]>
AuthorDate: Fri Jun 17 15:19:55 2022 +0800

    refresh transaction rule resource after rule changed with standalone mode 
(#18409)
---
 .../mode/manager/ContextManager.java               | 12 +++++++++++
 .../ClusterContextManagerCoordinator.java          | 23 +++++++++-------------
 .../memory/MemoryContextManagerBuilder.java        |  8 --------
 .../StandaloneContextManagerBuilder.java           |  8 --------
 4 files changed, 21 insertions(+), 30 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 057aae39307..aedb51e12ca 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
@@ -47,6 +47,7 @@ import 
org.apache.shardingsphere.infra.rule.ShardingSphereRule;
 import org.apache.shardingsphere.infra.rule.builder.global.GlobalRulesBuilder;
 import 
org.apache.shardingsphere.infra.rule.builder.schema.DatabaseRulesBuilder;
 import 
org.apache.shardingsphere.infra.rule.identifier.type.DataNodeContainedRule;
+import org.apache.shardingsphere.infra.rule.identifier.type.InstanceAwareRule;
 import 
org.apache.shardingsphere.infra.rule.identifier.type.MutableDataNodeRule;
 import org.apache.shardingsphere.infra.rule.identifier.type.ResourceHeldRule;
 import org.apache.shardingsphere.mode.metadata.MetaDataContexts;
@@ -87,6 +88,7 @@ public final class ContextManager implements AutoCloseable {
         this.metaDataContexts = metaDataContexts;
         this.instanceContext = instanceContext;
         executorEngine = 
ExecutorEngine.createExecutorEngineWithSize(metaDataContexts.getMetaData().getProps().<Integer>getValue(ConfigurationPropertyKey.KERNEL_EXECUTOR_SIZE));
+        setInstanceContext();
     }
     
     /**
@@ -308,6 +310,7 @@ public final class ContextManager implements AutoCloseable {
             MetaDataContexts newMetaDataContexts = 
rebuildMetaDataContexts(changedMetaDataContexts.getMetaData());
             
metaDataContexts.getMetaData().getDatabases().get(databaseName).getRuleMetaData().findRules(ResourceHeldRule.class).forEach(ResourceHeldRule::closeStaleResources);
             renewMetaDataContexts(newMetaDataContexts);
+            setInstanceContext();
         } catch (final SQLException ex) {
             log.error("Alter database:{} rule configuration failed", 
databaseName, ex);
         }
@@ -323,6 +326,7 @@ public final class ContextManager implements AutoCloseable {
         try {
             MetaDataContexts changedMetaDataContext = 
buildChangedMetaDataContextWithChangedDataSource(metaDataContexts.getMetaData().getDatabases().get(databaseName),
 dataSourcePropsMap);
             refreshMetaDataContext(databaseName, changedMetaDataContext, 
dataSourcePropsMap);
+            setInstanceContext();
         } catch (final SQLException ex) {
             log.error("Alter database:{} data source configuration failed", 
databaseName, ex);
         }
@@ -340,6 +344,7 @@ public final class ContextManager implements AutoCloseable {
             MetaDataContexts changedMetaDataContext = 
buildChangedMetaDataContextWithChangedDataSourceAndRule(
                     
metaDataContexts.getMetaData().getDatabases().get(databaseName), 
dataSourcePropsMap, ruleConfigs);
             refreshMetaDataContext(databaseName, changedMetaDataContext, 
dataSourcePropsMap);
+            setInstanceContext();
         } catch (SQLException ex) {
             log.error("Alter database:{} data source and rule configuration 
failed", databaseName, ex);
         }
@@ -358,6 +363,7 @@ public final class ContextManager implements AutoCloseable {
                 new 
ShardingSphereRuleMetaData(GlobalRulesBuilder.buildRules(ruleConfigs, 
metaDataContexts.getMetaData().getDatabases())));
         
metaDataContexts.getMetaData().getGlobalRuleMetaData().findRules(ResourceHeldRule.class).forEach(ResourceHeldRule::closeStaleResources);
         renewMetaDataContexts(newMetaDataContexts);
+        setInstanceContext();
     }
     
     /**
@@ -649,6 +655,12 @@ public final class ContextManager implements AutoCloseable 
{
                 .filter(each -> each instanceof ResourceHeldRule).map(each -> 
(ResourceHeldRule<?>) each).forEach(each -> 
each.closeStaleResource(databaseName));
     }
     
+    private void setInstanceContext() {
+        
metaDataContexts.getMetaData().getGlobalRuleMetaData().findRules(InstanceAwareRule.class).forEach(each
 -> each.setInstanceContext(instanceContext));
+        metaDataContexts.getMetaData().getDatabases()
+                .forEach((key, value) -> 
value.getRuleMetaData().findRules(InstanceAwareRule.class).forEach(each -> 
each.setInstanceContext(instanceContext)));
+    }
+    
     @Override
     public void close() throws Exception {
         executorEngine.close();
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 df60228c8fd..7b4593ba063 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
@@ -26,10 +26,10 @@ import 
org.apache.shardingsphere.infra.executor.sql.process.model.yaml.BatchYaml
 import 
org.apache.shardingsphere.infra.executor.sql.process.model.yaml.YamlExecuteProcessContext;
 import org.apache.shardingsphere.infra.instance.ComputeNodeInstance;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.QualifiedDatabase;
-import org.apache.shardingsphere.infra.rule.identifier.type.InstanceAwareRule;
 import 
org.apache.shardingsphere.infra.rule.identifier.type.StatusContainedRule;
 import org.apache.shardingsphere.infra.yaml.engine.YamlEngine;
 import org.apache.shardingsphere.mode.manager.ContextManager;
+import 
org.apache.shardingsphere.mode.manager.cluster.coordinator.registry.config.event.datasource.DataSourceChangedEvent;
 import 
org.apache.shardingsphere.mode.manager.cluster.coordinator.registry.config.event.props.PropertiesChangedEvent;
 import 
org.apache.shardingsphere.mode.manager.cluster.coordinator.registry.config.event.rule.GlobalRuleConfigurationsChangedEvent;
 import 
org.apache.shardingsphere.mode.manager.cluster.coordinator.registry.config.event.rule.RuleConfigurationsChangedEvent;
@@ -37,7 +37,6 @@ import 
org.apache.shardingsphere.mode.manager.cluster.coordinator.registry.confi
 import 
org.apache.shardingsphere.mode.manager.cluster.coordinator.registry.config.event.version.DatabaseVersionChangedEvent;
 import 
org.apache.shardingsphere.mode.manager.cluster.coordinator.registry.metadata.event.DatabaseAddedEvent;
 import 
org.apache.shardingsphere.mode.manager.cluster.coordinator.registry.metadata.event.DatabaseDeletedEvent;
-import 
org.apache.shardingsphere.mode.manager.cluster.coordinator.registry.config.event.datasource.DataSourceChangedEvent;
 import 
org.apache.shardingsphere.mode.manager.cluster.coordinator.registry.metadata.event.SchemaAddedEvent;
 import 
org.apache.shardingsphere.mode.manager.cluster.coordinator.registry.metadata.event.SchemaDeletedEvent;
 import 
org.apache.shardingsphere.mode.manager.cluster.coordinator.registry.process.ShowProcessListManager;
@@ -52,14 +51,14 @@ import 
org.apache.shardingsphere.mode.manager.cluster.coordinator.registry.statu
 import 
org.apache.shardingsphere.mode.manager.cluster.coordinator.registry.status.compute.event.WorkerIdEvent;
 import 
org.apache.shardingsphere.mode.manager.cluster.coordinator.registry.status.compute.event.XaRecoveryIdAddedEvent;
 import 
org.apache.shardingsphere.mode.manager.cluster.coordinator.registry.status.compute.event.XaRecoveryIdDeletedEvent;
-import 
org.apache.shardingsphere.mode.manager.cluster.coordinator.registry.status.storage.event.StorageNodeChangedEvent;
 import 
org.apache.shardingsphere.mode.manager.cluster.coordinator.registry.status.storage.event.PrimaryStateChangedEvent;
+import 
org.apache.shardingsphere.mode.manager.cluster.coordinator.registry.status.storage.event.StorageNodeChangedEvent;
 import org.apache.shardingsphere.mode.metadata.persist.MetaDataPersistService;
 import org.apache.shardingsphere.mode.metadata.persist.node.ComputeNode;
 import org.apache.shardingsphere.mode.metadata.storage.StorageNodeDataSource;
 import org.apache.shardingsphere.mode.metadata.storage.StorageNodeStatus;
-import 
org.apache.shardingsphere.mode.metadata.storage.event.StorageNodeDataSourceChangedEvent;
 import 
org.apache.shardingsphere.mode.metadata.storage.event.PrimaryDataSourceChangedEvent;
+import 
org.apache.shardingsphere.mode.metadata.storage.event.StorageNodeDataSourceChangedEvent;
 import org.apache.shardingsphere.transaction.rule.TransactionRule;
 
 import java.sql.SQLException;
@@ -85,7 +84,7 @@ public final class ClusterContextManagerCoordinator {
         this.contextManager = contextManager;
         this.registryCenter = registryCenter;
         ShardingSphereEventBus.getInstance().register(this);
-        buildSpecialRules();
+        disableDataSources();
     }
     
     /**
@@ -158,7 +157,7 @@ public final class ClusterContextManagerCoordinator {
     public synchronized void renew(final RuleConfigurationsChangedEvent event) 
{
         if 
(metaDataPersistService.getDatabaseVersionPersistService().isActiveVersion(event.getDatabaseName(),
 event.getDatabaseVersion())) {
             contextManager.alterRuleConfiguration(event.getDatabaseName(), 
event.getRuleConfigurations());
-            buildSpecialRules();
+            disableDataSources();
         }
     }
     
@@ -171,7 +170,7 @@ public final class ClusterContextManagerCoordinator {
     public synchronized void renew(final DataSourceChangedEvent event) {
         if 
(metaDataPersistService.getDatabaseVersionPersistService().isActiveVersion(event.getDatabaseName(),
 event.getDatabaseVersion())) {
             
contextManager.alterDataSourceConfiguration(event.getDatabaseName(), 
event.getDataSourcePropertiesMap());
-            buildSpecialRules();
+            disableDataSources();
         }
     }
     
@@ -211,7 +210,7 @@ public final class ClusterContextManagerCoordinator {
     @Subscribe
     public synchronized void renew(final GlobalRuleConfigurationsChangedEvent 
event) {
         
contextManager.alterGlobalRuleConfiguration(event.getRuleConfigurations());
-        buildSpecialRules();
+        disableDataSources();
     }
     
     /**
@@ -309,7 +308,7 @@ public final class ClusterContextManagerCoordinator {
         Map<String, DataSourceProperties> dataSourcePropertiesMap = 
metaDataPersistService.getDataSourceService().load(event.getDatabaseName(), 
event.getActiveVersion());
         Collection<RuleConfiguration> ruleConfigs = 
metaDataPersistService.getDatabaseRulePersistService().load(event.getDatabaseName(),
 event.getActiveVersion());
         
contextManager.alterDataSourceAndRuleConfiguration(event.getDatabaseName(), 
dataSourcePropertiesMap, ruleConfigs);
-        buildSpecialRules();
+        disableDataSources();
     }
     
     /**
@@ -343,15 +342,11 @@ public final class ClusterContextManagerCoordinator {
         }
     }
     
-    private void buildSpecialRules() {
-        
contextManager.getMetaDataContexts().getMetaData().getGlobalRuleMetaData().findRules(InstanceAwareRule.class).forEach(each
 -> each.setInstanceContext(contextManager.getInstanceContext()));
+    private void disableDataSources() {
         
contextManager.getMetaDataContexts().getMetaData().getDatabases().forEach((key, 
value) -> value.getRuleMetaData().getRules().forEach(each -> {
             if (each instanceof StatusContainedRule) {
                 disableDataSources((StatusContainedRule) each);
             }
-            if (each instanceof InstanceAwareRule) {
-                ((InstanceAwareRule) 
each).setInstanceContext(contextManager.getInstanceContext());
-            }
         }));
     }
     
diff --git 
a/shardingsphere-mode/shardingsphere-mode-type/shardingsphere-memory-mode/shardingsphere-memory-mode-core/src/main/java/org/apache/shardingsphere/mode/manager/memory/MemoryContextManagerBuilder.java
 
b/shardingsphere-mode/shardingsphere-mode-type/shardingsphere-memory-mode/shardingsphere-memory-mode-core/src/main/java/org/apache/shardingsphere/mode/manager/memory/MemoryContextManagerBuilder.java
index dddddea1f59..a77afd0abc7 100644
--- 
a/shardingsphere-mode/shardingsphere-mode-type/shardingsphere-memory-mode/shardingsphere-memory-mode-core/src/main/java/org/apache/shardingsphere/mode/manager/memory/MemoryContextManagerBuilder.java
+++ 
b/shardingsphere-mode/shardingsphere-mode-type/shardingsphere-memory-mode/shardingsphere-memory-mode-core/src/main/java/org/apache/shardingsphere/mode/manager/memory/MemoryContextManagerBuilder.java
@@ -21,7 +21,6 @@ import 
org.apache.shardingsphere.infra.config.mode.ModeConfiguration;
 import org.apache.shardingsphere.infra.config.props.ConfigurationProperties;
 import org.apache.shardingsphere.infra.instance.ComputeNodeInstance;
 import org.apache.shardingsphere.infra.instance.InstanceContext;
-import org.apache.shardingsphere.infra.rule.identifier.type.InstanceAwareRule;
 import org.apache.shardingsphere.mode.manager.ContextManager;
 import org.apache.shardingsphere.mode.manager.ContextManagerBuilder;
 import org.apache.shardingsphere.mode.manager.ContextManagerBuilderParameter;
@@ -48,7 +47,6 @@ public final class MemoryContextManagerBuilder implements 
ContextManagerBuilder
         InstanceContext instanceContext = buildInstanceContext(parameter);
         generateTransactionConfigurationFile(instanceContext, 
metaDataContexts);
         ContextManager result = new ContextManager(metaDataContexts, 
instanceContext);
-        setInstanceContext(result);
         return result;
     }
     
@@ -67,12 +65,6 @@ public final class MemoryContextManagerBuilder implements 
ContextManagerBuilder
         }
     }
     
-    private void setInstanceContext(final ContextManager contextManager) {
-        
contextManager.getMetaDataContexts().getMetaData().getGlobalRuleMetaData().findRules(InstanceAwareRule.class).forEach(each
 -> each.setInstanceContext(contextManager.getInstanceContext()));
-        contextManager.getMetaDataContexts().getMetaData().getDatabases()
-                .forEach((key, value) -> 
value.getRuleMetaData().findRules(InstanceAwareRule.class).forEach(each -> 
each.setInstanceContext(contextManager.getInstanceContext())));
-    }
-    
     private ModeConfiguration buildMemoryModeConfiguration(final 
ModeConfiguration modeConfiguration) {
         return Optional.ofNullable(modeConfiguration).orElseGet(() -> new 
ModeConfiguration(getType(), null, false));
     }
diff --git 
a/shardingsphere-mode/shardingsphere-mode-type/shardingsphere-standalone-mode/shardingsphere-standalone-mode-core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/StandaloneContextManagerBuilder.java
 
b/shardingsphere-mode/shardingsphere-mode-type/shardingsphere-standalone-mode/shardingsphere-standalone-mode-core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/StandaloneContextManagerBuilder.java
index a35d567c7a7..d1f3db7dc0f 100644
--- 
a/shardingsphere-mode/shardingsphere-mode-type/shardingsphere-standalone-mode/shardingsphere-standalone-mode-core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/StandaloneContextManagerBuilder.java
+++ 
b/shardingsphere-mode/shardingsphere-mode-type/shardingsphere-standalone-mode/shardingsphere-standalone-mode-core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/StandaloneContextManagerBuilder.java
@@ -24,7 +24,6 @@ import 
org.apache.shardingsphere.infra.config.props.ConfigurationProperties;
 import org.apache.shardingsphere.infra.instance.ComputeNodeInstance;
 import org.apache.shardingsphere.infra.instance.InstanceContext;
 import org.apache.shardingsphere.infra.instance.definition.InstanceType;
-import org.apache.shardingsphere.infra.rule.identifier.type.InstanceAwareRule;
 import org.apache.shardingsphere.mode.manager.ContextManager;
 import org.apache.shardingsphere.mode.manager.ContextManagerBuilder;
 import org.apache.shardingsphere.mode.manager.ContextManagerBuilderParameter;
@@ -93,7 +92,6 @@ public final class StandaloneContextManagerBuilder implements 
ContextManagerBuil
                 new StandaloneLockContext());
         generateTransactionConfigurationFile(instanceContext, 
metaDataContexts);
         ContextManager result = new ContextManager(metaDataContexts, 
instanceContext);
-        setInstanceContext(result);
         return result;
     }
     
@@ -106,12 +104,6 @@ public final class StandaloneContextManagerBuilder 
implements ContextManagerBuil
         }
     }
     
-    private void setInstanceContext(final ContextManager contextManager) {
-        
contextManager.getMetaDataContexts().getMetaData().getGlobalRuleMetaData().findRules(InstanceAwareRule.class).forEach(each
 -> each.setInstanceContext(contextManager.getInstanceContext()));
-        contextManager.getMetaDataContexts().getMetaData().getDatabases()
-                .forEach((key, value) -> 
value.getRuleMetaData().findRules(InstanceAwareRule.class).forEach(each -> 
each.setInstanceContext(contextManager.getInstanceContext())));
-    }
-    
     @Override
     public String getType() {
         return "Standalone";

Reply via email to