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);