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

chengzhang 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 c99d91e41f3 Fix loss storage unit when register storage unit (#29281)
c99d91e41f3 is described below

commit c99d91e41f314205320aba9536b082eca21055a7
Author: zhaojinchao <[email protected]>
AuthorDate: Wed Dec 6 13:35:08 2023 +0800

    Fix loss storage unit when register storage unit (#29281)
    
    * Refactor register storage unit loss storage unit problem
    
    * Fix checkstyle
---
 .../context/ConfigurationContextManager.java       |  2 +-
 .../manager/switcher/NewResourceSwitchManager.java | 34 +++++++++++++++-------
 .../NewStandaloneModeContextManager.java           | 22 +++-----------
 3 files changed, 28 insertions(+), 30 deletions(-)

diff --git 
a/mode/core/src/main/java/org/apache/shardingsphere/mode/manager/context/ConfigurationContextManager.java
 
b/mode/core/src/main/java/org/apache/shardingsphere/mode/manager/context/ConfigurationContextManager.java
index d6db3fc9536..7a625e1dede 100644
--- 
a/mode/core/src/main/java/org/apache/shardingsphere/mode/manager/context/ConfigurationContextManager.java
+++ 
b/mode/core/src/main/java/org/apache/shardingsphere/mode/manager/context/ConfigurationContextManager.java
@@ -120,7 +120,7 @@ public final class ConfigurationContextManager {
             Collection<ResourceHeldRule> staleResourceHeldRules = 
getStaleResourceHeldRules(databaseName);
             
staleResourceHeldRules.forEach(ResourceHeldRule::closeStaleResource);
             SwitchingResource switchingResource = new 
NewResourceSwitchManager().unregisterStorageUnit(metaDataContexts.get().getMetaData().getDatabase(databaseName).getResourceMetaData(),
-                    storageUnitName);
+                    Collections.singletonList(storageUnitName));
             buildNewMetaDataContext(databaseName, switchingResource);
         } catch (final SQLException ex) {
             log.error("Alter database: {} register storage unit failed", 
databaseName, ex);
diff --git 
a/mode/core/src/main/java/org/apache/shardingsphere/mode/manager/switcher/NewResourceSwitchManager.java
 
b/mode/core/src/main/java/org/apache/shardingsphere/mode/manager/switcher/NewResourceSwitchManager.java
index 218842573f1..991629f7506 100644
--- 
a/mode/core/src/main/java/org/apache/shardingsphere/mode/manager/switcher/NewResourceSwitchManager.java
+++ 
b/mode/core/src/main/java/org/apache/shardingsphere/mode/manager/switcher/NewResourceSwitchManager.java
@@ -105,23 +105,35 @@ public final class NewResourceSwitchManager {
      * Unregister storage unit.
      *
      * @param resourceMetaData resource meta data
-     * @param storageUnitName storage unit name
+     * @param storageUnitNames storage unit names
      * @return created switching resource
      */
-    public SwitchingResource unregisterStorageUnit(final ResourceMetaData 
resourceMetaData, final String storageUnitName) {
+    public SwitchingResource unregisterStorageUnit(final ResourceMetaData 
resourceMetaData, final Collection<String> storageUnitNames) {
         Map<String, DataSourcePoolProperties> 
mergedDataSourcePoolPropertiesMap = new 
LinkedHashMap<>(resourceMetaData.getStorageUnits().entrySet().stream()
                 .collect(Collectors.toMap(Entry::getKey, entry -> 
entry.getValue().getDataSourcePoolProperties(), (oldValue, currentValue) -> 
oldValue, LinkedHashMap::new)));
-        mergedDataSourcePoolPropertiesMap.keySet().removeIf(each -> 
each.equals(storageUnitName));
-        resourceMetaData.getStorageUnits().remove(storageUnitName);
-        return new SwitchingResource(Collections.emptyMap(),
-                getToBeRemovedStaleDataSource(resourceMetaData, 
storageUnitName), Collections.singleton(storageUnitName), 
mergedDataSourcePoolPropertiesMap);
+        SwitchingResource result = new 
SwitchingResource(Collections.emptyMap(),
+                getToBeRemovedStaleDataSource(resourceMetaData, 
storageUnitNames), storageUnitNames, mergedDataSourcePoolPropertiesMap);
+        removeToBeRemovedStorageUnitNames(resourceMetaData, 
mergedDataSourcePoolPropertiesMap, storageUnitNames);
+        return result;
+    }
+    
+    private Map<StorageNode, DataSource> getToBeRemovedStaleDataSource(final 
ResourceMetaData resourceMetaData, final Collection<String> storageUnitNames) {
+        Map<StorageNode, DataSource> result = new LinkedHashMap<>();
+        for (String each : storageUnitNames) {
+            if (!resourceMetaData.getStorageUnits().containsKey(each)) {
+                return Collections.emptyMap();
+            }
+            StorageNode storageNode = 
resourceMetaData.getStorageUnits().get(each).getStorageNode();
+            result.put(storageNode, 
resourceMetaData.getDataSources().get(storageNode));
+        }
+        return result;
     }
     
-    private Map<StorageNode, DataSource> getToBeRemovedStaleDataSource(final 
ResourceMetaData resourceMetaData, final String storageUnitName) {
-        if (!resourceMetaData.getStorageUnits().containsKey(storageUnitName)) {
-            return Collections.emptyMap();
+    private void removeToBeRemovedStorageUnitNames(final ResourceMetaData 
resourceMetaData, final Map<String, DataSourcePoolProperties> 
dataSourcePoolPropsMap,
+                                                   final Collection<String> 
storageUnitNames) {
+        for (String each : storageUnitNames) {
+            dataSourcePoolPropsMap.remove(each);
+            resourceMetaData.getStorageUnits().remove(each);
         }
-        StorageNode storageNode = 
resourceMetaData.getStorageUnits().get(storageUnitName).getStorageNode();
-        return Collections.singletonMap(storageNode, 
resourceMetaData.getDataSources().get(storageNode));
     }
 }
diff --git 
a/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/NewStandaloneModeContextManager.java
 
b/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/NewStandaloneModeContextManager.java
index 2c5c8666086..cdd94a83b68 100644
--- 
a/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/NewStandaloneModeContextManager.java
+++ 
b/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/NewStandaloneModeContextManager.java
@@ -37,7 +37,7 @@ import 
org.apache.shardingsphere.metadata.persist.service.config.global.GlobalPe
 import 
org.apache.shardingsphere.metadata.persist.service.database.DatabaseMetaDataBasedPersistService;
 import org.apache.shardingsphere.mode.manager.ContextManager;
 import org.apache.shardingsphere.mode.manager.ContextManagerAware;
-import org.apache.shardingsphere.mode.manager.switcher.ResourceSwitchManager;
+import 
org.apache.shardingsphere.mode.manager.switcher.NewResourceSwitchManager;
 import org.apache.shardingsphere.mode.manager.switcher.SwitchingResource;
 import org.apache.shardingsphere.mode.metadata.MetaDataContexts;
 
@@ -209,7 +209,7 @@ public final class NewStandaloneModeContextManager 
implements ModeContextManager
     @Override
     public void registerStorageUnits(final String databaseName, final 
Map<String, DataSourcePoolProperties> toBeRegisteredProps) throws SQLException {
         SwitchingResource switchingResource =
-                new 
ResourceSwitchManager().create(contextManager.getMetaDataContexts().getMetaData().getDatabase(databaseName).getResourceMetaData(),
 toBeRegisteredProps);
+                new 
NewResourceSwitchManager().registerStorageUnit(contextManager.getMetaDataContexts().getMetaData().getDatabase(databaseName).getResourceMetaData(),
 toBeRegisteredProps);
         
contextManager.getMetaDataContexts().getMetaData().getDatabases().putAll(contextManager.getConfigurationContextManager().createChangedDatabases(databaseName,
 false, switchingResource, null));
         
contextManager.getMetaDataContexts().getMetaData().getGlobalRuleMetaData().findRules(ResourceHeldRule.class)
                 .forEach(each -> 
each.addResource(contextManager.getMetaDataContexts().getMetaData().getDatabase(databaseName)));
@@ -224,7 +224,7 @@ public final class NewStandaloneModeContextManager 
implements ModeContextManager
     @Override
     public void alterStorageUnits(final String databaseName, final Map<String, 
DataSourcePoolProperties> toBeUpdatedProps) throws SQLException {
         SwitchingResource switchingResource =
-                new 
ResourceSwitchManager().create(contextManager.getMetaDataContexts().getMetaData().getDatabase(databaseName).getResourceMetaData(),
 toBeUpdatedProps);
+                new 
NewResourceSwitchManager().alterStorageUnit(contextManager.getMetaDataContexts().getMetaData().getDatabase(databaseName).getResourceMetaData(),
 toBeUpdatedProps);
         
contextManager.getMetaDataContexts().getMetaData().getDatabases().putAll(contextManager.getConfigurationContextManager().createChangedDatabases(databaseName,
 true, switchingResource, null));
         
contextManager.getMetaDataContexts().getMetaData().getGlobalRuleMetaData().findRules(ResourceHeldRule.class)
                 .forEach(each -> 
each.addResource(contextManager.getMetaDataContexts().getMetaData().getDatabase(databaseName)));
@@ -236,11 +236,8 @@ public final class NewStandaloneModeContextManager 
implements ModeContextManager
     
     @Override
     public void unregisterStorageUnits(final String databaseName, final 
Collection<String> toBeDroppedStorageUnitNames) throws SQLException {
-        Map<String, DataSourcePoolProperties> propsMap = 
contextManager.getMetaDataContexts().getPersistService().getDataSourceUnitService()
-                
.load(contextManager.getMetaDataContexts().getMetaData().getDatabase(databaseName).getName());
-        Map<String, DataSourcePoolProperties> toBeDeletedPropsMap = 
getToBeDeletedPropertiesMap(propsMap, toBeDroppedStorageUnitNames);
         SwitchingResource switchingResource =
-                new 
ResourceSwitchManager().createByDropResource(contextManager.getMetaDataContexts().getMetaData().getDatabase(databaseName).getResourceMetaData(),
 toBeDeletedPropsMap);
+                new 
NewResourceSwitchManager().unregisterStorageUnit(contextManager.getMetaDataContexts().getMetaData().getDatabase(databaseName).getResourceMetaData(),
 toBeDroppedStorageUnitNames);
         contextManager.getMetaDataContexts().getMetaData().getDatabases()
                 
.putAll(contextManager.getConfigurationContextManager().renewDatabase(contextManager.getMetaDataContexts().getMetaData().getDatabase(databaseName),
 switchingResource));
         MetaDataContexts reloadMetaDataContexts = 
contextManager.getConfigurationContextManager().createMetaDataContexts(databaseName,
 false, switchingResource, null);
@@ -248,21 +245,10 @@ public final class NewStandaloneModeContextManager 
implements ModeContextManager
                 
contextManager.getMetaDataContexts().getMetaData().getDatabase(databaseName));
         contextManager.deletedSchemaNames(databaseName, 
reloadMetaDataContexts.getMetaData().getDatabase(databaseName), 
contextManager.getMetaDataContexts().getMetaData().getDatabase(databaseName));
         contextManager.renewMetaDataContexts(reloadMetaDataContexts);
-        Map<String, DataSourcePoolProperties> toBeReversedPropsMap = 
getToBeReversedDataSourcePoolPropertiesMap(propsMap, 
toBeDroppedStorageUnitNames);
-        
contextManager.getMetaDataContexts().getPersistService().getDataSourceUnitService().persist(
-                
contextManager.getMetaDataContexts().getMetaData().getDatabase(databaseName).getName(),
 toBeReversedPropsMap);
         switchingResource.closeStaleDataSources();
         clearServiceCache();
     }
     
-    private Map<String, DataSourcePoolProperties> 
getToBeDeletedPropertiesMap(final Map<String, DataSourcePoolProperties> 
propsMap, final Collection<String> toBeDroppedResourceNames) {
-        return propsMap.entrySet().stream().filter(entry -> 
toBeDroppedResourceNames.contains(entry.getKey())).collect(Collectors.toMap(Entry::getKey,
 Entry::getValue));
-    }
-    
-    private Map<String, DataSourcePoolProperties> 
getToBeReversedDataSourcePoolPropertiesMap(final Map<String, 
DataSourcePoolProperties> propsMap, final Collection<String> 
toBeDroppedResourceNames) {
-        return propsMap.entrySet().stream().filter(entry -> 
!toBeDroppedResourceNames.contains(entry.getKey())).collect(Collectors.toMap(Entry::getKey,
 Entry::getValue));
-    }
-    
     @Override
     public void alterRuleConfiguration(final String databaseName, final 
Collection<RuleConfiguration> ruleConfigs) {
         
contextManager.getConfigurationContextManager().alterRuleConfiguration(databaseName,
 ruleConfigs);

Reply via email to