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

jiangmaolin pushed a commit to branch dev-5.5.1
in repository https://gitbox.apache.org/repos/asf/shardingsphere.git

commit 47440f329166b3c7404d8cdfd785dcdf5ff7104b
Author: Haoran Meng <[email protected]>
AuthorDate: Fri Nov 1 22:32:20 2024 +0800

    Support change in runtime for alter storage unit
---
 .../ClusterMetaDataManagerPersistService.java      | 26 +++++++++++++++++++++-
 1 file changed, 25 insertions(+), 1 deletion(-)

diff --git 
a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/persist/ClusterMetaDataManagerPersistService.java
 
b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/persist/ClusterMetaDataManagerPersistService.java
index de9a0566fa3..a2e915c4b84 100644
--- 
a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/persist/ClusterMetaDataManagerPersistService.java
+++ 
b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/persist/ClusterMetaDataManagerPersistService.java
@@ -24,6 +24,8 @@ import 
org.apache.shardingsphere.infra.config.props.temporary.TemporaryConfigura
 import org.apache.shardingsphere.infra.config.rule.RuleConfiguration;
 import 
org.apache.shardingsphere.infra.datasource.pool.destroyer.DataSourcePoolDestroyer;
 import 
org.apache.shardingsphere.infra.datasource.pool.props.domain.DataSourcePoolProperties;
+import 
org.apache.shardingsphere.infra.datasource.pool.props.domain.synonym.ConnectionPropertySynonyms;
+import 
org.apache.shardingsphere.infra.metadata.database.resource.ResourceMetaData;
 import 
org.apache.shardingsphere.infra.metadata.database.resource.node.StorageNode;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSchema;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereTable;
@@ -141,6 +143,11 @@ public final class ClusterMetaDataManagerPersistService 
implements MetaDataManag
     @Override
     public void alterStorageUnits(final String databaseName, final Map<String, 
DataSourcePoolProperties> toBeUpdatedProps) throws SQLException {
         MetaDataContexts originalMetaDataContexts = 
metaDataContextManager.getMetaDataContexts().get();
+        DataSourceUnitPersistService dataSourceService = 
metaDataPersistService.getDataSourceUnitService();
+        if 
(canBeChangedInRuntime(originalMetaDataContexts.getMetaData().getDatabase(databaseName).getResourceMetaData(),
 toBeUpdatedProps)) {
+            
metaDataPersistService.getMetaDataVersionPersistService().switchActiveVersion(dataSourceService.persist(databaseName,
 toBeUpdatedProps));
+            return;
+        }
         @SphereEx(Type.MODIFY)
         boolean isInstanceConnectionEnabled = 
originalMetaDataContexts.getMetaData().getTemporaryProps().<Boolean>getValue(TemporaryConfigurationPropertyKey.INSTANCE_CONNECTION_ENABLED);
         Map<StorageNode, DataSource> newDataSources = new 
HashMap<>(toBeUpdatedProps.size());
@@ -151,7 +158,6 @@ public final class ClusterMetaDataManagerPersistService 
implements MetaDataManag
             newDataSources.putAll(switchingResource.getNewDataSources());
             MetaDataContexts reloadMetaDataContexts = 
MetaDataContextsFactory.createBySwitchResource(databaseName, false,
                     switchingResource, originalMetaDataContexts, 
metaDataPersistService, metaDataContextManager.getComputeNodeInstanceContext());
-            DataSourceUnitPersistService dataSourceService = 
metaDataPersistService.getDataSourceUnitService();
             metaDataPersistService.getMetaDataVersionPersistService()
                     
.switchActiveVersion(dataSourceService.persist(databaseName, toBeUpdatedProps));
             afterStorageUnitsAltered(databaseName, originalMetaDataContexts, 
reloadMetaDataContexts);
@@ -175,6 +181,24 @@ public final class ClusterMetaDataManagerPersistService 
implements MetaDataManag
         }
     }
 
+    @SphereEx
+    private boolean canBeChangedInRuntime(final ResourceMetaData 
resourceMetaData, final Map<String, DataSourcePoolProperties> propsMap) {
+        for (Map.Entry<String, DataSourcePoolProperties> entry : 
propsMap.entrySet()) {
+            if 
(!resourceMetaData.getStorageUnits().containsKey(entry.getKey())) {
+                continue;
+            }
+            if 
(!entry.getValue().getCustomProperties().getProperties().containsKey("alterInRuntime"))
 {
+                return false;
+            }
+            ConnectionPropertySynonyms currentConnectionProps = 
resourceMetaData.getStorageUnits().get(entry.getKey()).getDataSourcePoolProperties().getConnectionPropertySynonyms();
+            ConnectionPropertySynonyms newConnectionProps = 
entry.getValue().getConnectionPropertySynonyms();
+            if 
(!currentConnectionProps.getStandardProperties().get("url").equals(newConnectionProps.getStandardProperties().get("url")))
 {
+                return false;
+            }
+        }
+        return true;
+    }
+
     @SphereEx
     private void closeNewDataSources(final Map<StorageNode, DataSource> 
newDataSources) {
         for (Map.Entry<StorageNode, DataSource> entry : 
newDataSources.entrySet()) {

Reply via email to