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 972abd31e3c Decouple StorageUnit and Map<StorageNodeName, DataSource> 
(#28619)
972abd31e3c is described below

commit 972abd31e3c87bc8582d9c6c5d96f9382ba47075
Author: Liang Zhang <[email protected]>
AuthorDate: Fri Sep 29 00:07:50 2023 +0800

    Decouple StorageUnit and Map<StorageNodeName, DataSource> (#28619)
    
    * Refactor StorageUnit
    
    * Refactor StorageUnit
    
    * Decouple StorageUnit and Map<StorageNodeName, DataSource>
---
 .../database/resource/unit/StorageUnit.java        | 54 ++++++----------------
 .../resource/unit/StorageUnitMetaData.java         |  6 +--
 .../mode/manager/ContextManagerTest.java           |  2 +-
 3 files changed, 19 insertions(+), 43 deletions(-)

diff --git 
a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/resource/unit/StorageUnit.java
 
b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/resource/unit/StorageUnit.java
index a1f8dc7f373..fd59f0d651c 100644
--- 
a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/resource/unit/StorageUnit.java
+++ 
b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/resource/unit/StorageUnit.java
@@ -27,16 +27,11 @@ import 
org.apache.shardingsphere.infra.datasource.pool.CatalogSwitchableDataSour
 import 
org.apache.shardingsphere.infra.datasource.pool.props.creator.DataSourcePoolPropertiesCreator;
 import 
org.apache.shardingsphere.infra.datasource.pool.props.domain.DataSourcePoolProperties;
 import 
org.apache.shardingsphere.infra.metadata.database.resource.node.StorageNode;
-import 
org.apache.shardingsphere.infra.metadata.database.resource.node.StorageNodeName;
 import org.apache.shardingsphere.infra.state.datasource.DataSourceStateManager;
 
 import javax.sql.DataSource;
 import java.util.Collections;
-import java.util.LinkedHashMap;
 import java.util.Map;
-import java.util.Map.Entry;
-import java.util.Optional;
-import java.util.stream.Collectors;
 
 /**
  * Storage unit.
@@ -44,54 +39,35 @@ import java.util.stream.Collectors;
 @Getter
 public final class StorageUnit {
     
+    private final DataSource dataSource;
+    
     private final DataSourcePoolProperties dataSourcePoolProperties;
     
     private final StorageNode storageNode;
     
-    private final DataSource dataSource;
-    
     private final DatabaseType storageType;
     
     private final ConnectionProperties connectionProperties;
     
-    public StorageUnit(final String databaseName, final Map<StorageNodeName, 
DataSource> storageNodeDataSources,
-                       final DataSourcePoolProperties props, final StorageNode 
storageNode) {
-        this.dataSourcePoolProperties = props;
+    public StorageUnit(final String databaseName, final DataSource dataSource, 
final DataSourcePoolProperties dataSourcePoolProperties, final StorageNode 
storageNode) {
+        this.dataSource = new CatalogSwitchableDataSource(dataSource, 
storageNode.getCatalog(), storageNode.getUrl());
+        this.dataSourcePoolProperties = dataSourcePoolProperties;
         this.storageNode = storageNode;
-        dataSource = getStorageUnitDataSource(storageNodeDataSources);
-        Map<StorageNodeName, DataSource> enabledStorageNodeDataSources = 
getEnabledStorageNodeDataSources(databaseName, storageNodeDataSources);
-        storageType = createStorageType(enabledStorageNodeDataSources);
-        connectionProperties = 
createConnectionProperties(enabledStorageNodeDataSources).orElse(null);
-    }
-    
-    private DataSource getStorageUnitDataSource(final Map<StorageNodeName, 
DataSource> storageNodeDataSources) {
-        DataSource dataSource = 
storageNodeDataSources.get(storageNode.getName());
-        return new CatalogSwitchableDataSource(dataSource, 
storageNode.getCatalog(), storageNode.getUrl());
-    }
-    
-    private Map<StorageNodeName, DataSource> 
getEnabledStorageNodeDataSources(final String databaseName, final 
Map<StorageNodeName, DataSource> storageNodeDataSources) {
-        Map<String, DataSource> toBeCheckedDataSources = new 
LinkedHashMap<>(storageNodeDataSources.size(), 1F);
-        for (Entry<StorageNodeName, DataSource> entry : 
storageNodeDataSources.entrySet()) {
-            toBeCheckedDataSources.put(entry.getKey().getName(), 
entry.getValue());
-        }
-        Map<String, DataSource> enabledDataSources = 
DataSourceStateManager.getInstance().getEnabledDataSources(databaseName, 
toBeCheckedDataSources);
-        return storageNodeDataSources.entrySet().stream()
-                .filter(entry -> 
enabledDataSources.containsKey(entry.getKey().getName())).collect(Collectors.toMap(Entry::getKey,
 Entry::getValue));
+        boolean isDataSourceEnabled = 
!DataSourceStateManager.getInstance().getEnabledDataSources(databaseName, 
Collections.singletonMap(storageNode.getName().getName(), 
dataSource)).isEmpty();
+        storageType = createStorageType(isDataSourceEnabled);
+        connectionProperties = createConnectionProperties(isDataSourceEnabled);
     }
     
-    private DatabaseType createStorageType(final Map<StorageNodeName, 
DataSource> enabledStorageNodeDataSources) {
-        return 
DatabaseTypeEngine.getStorageType(enabledStorageNodeDataSources.containsKey(storageNode.getName())
-                ? 
Collections.singleton(enabledStorageNodeDataSources.get(storageNode.getName()))
-                : Collections.emptyList());
+    private DatabaseType createStorageType(final boolean isDataSourceEnabled) {
+        return DatabaseTypeEngine.getStorageType(isDataSourceEnabled ? 
Collections.singleton(dataSource) : Collections.emptyList());
     }
     
-    private Optional<ConnectionProperties> createConnectionProperties(final 
Map<StorageNodeName, DataSource> enabledStorageNodeDataSources) {
-        if (!enabledStorageNodeDataSources.containsKey(storageNode.getName())) 
{
-            return Optional.empty();
+    private ConnectionProperties createConnectionProperties(final boolean 
isDataSourceEnabled) {
+        if (!isDataSourceEnabled) {
+            return null;
         }
-        Map<String, Object> standardProps = 
DataSourcePoolPropertiesCreator.create(
-                
enabledStorageNodeDataSources.get(storageNode.getName())).getConnectionPropertySynonyms().getStandardProperties();
+        Map<String, Object> standardProps = 
DataSourcePoolPropertiesCreator.create(dataSource).getConnectionPropertySynonyms().getStandardProperties();
         ConnectionPropertiesParser parser = 
DatabaseTypedSPILoader.getService(ConnectionPropertiesParser.class, 
storageType);
-        return Optional.of(parser.parse(standardProps.get("url").toString(), 
standardProps.get("username").toString(), storageNode.getCatalog()));
+        return parser.parse(standardProps.get("url").toString(), 
standardProps.get("username").toString(), storageNode.getCatalog());
     }
 }
diff --git 
a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/resource/unit/StorageUnitMetaData.java
 
b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/resource/unit/StorageUnitMetaData.java
index 5981c1915f9..aabe73da490 100644
--- 
a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/resource/unit/StorageUnitMetaData.java
+++ 
b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/resource/unit/StorageUnitMetaData.java
@@ -45,13 +45,13 @@ public final class StorageUnitMetaData {
     private final Map<String, DataSource> dataSources;
     
     public StorageUnitMetaData(final String databaseName, final Map<String, 
StorageNode> storageNodes, final Map<String, DataSourcePoolProperties> 
dataSourcePoolPropertiesMap,
-                               final Map<StorageNodeName, DataSource> 
storageNodeDataSources) {
+                               final Map<StorageNodeName, DataSource> 
dataSources) {
         this.storageNodes = storageNodes;
         this.dataSourcePoolPropertiesMap = dataSourcePoolPropertiesMap;
         storageUnits = storageNodes.entrySet().stream().collect(
-                Collectors.toMap(Entry::getKey, entry -> new 
StorageUnit(databaseName, storageNodeDataSources, 
dataSourcePoolPropertiesMap.get(entry.getKey()), entry.getValue()),
+                Collectors.toMap(Entry::getKey, entry -> new 
StorageUnit(databaseName, dataSources.get(entry.getValue().getName()), 
dataSourcePoolPropertiesMap.get(entry.getKey()), entry.getValue()),
                         (oldValue, currentValue) -> currentValue, () -> new 
LinkedHashMap<>(this.storageNodes.size(), 1F)));
-        dataSources = storageUnits.entrySet().stream().collect(
+        this.dataSources = storageUnits.entrySet().stream().collect(
                 Collectors.toMap(Entry::getKey, entry -> 
entry.getValue().getDataSource(), (oldValue, currentValue) -> currentValue, () 
-> new LinkedHashMap<>(storageUnits.size(), 1F)));
     }
 }
diff --git 
a/mode/core/src/test/java/org/apache/shardingsphere/mode/manager/ContextManagerTest.java
 
b/mode/core/src/test/java/org/apache/shardingsphere/mode/manager/ContextManagerTest.java
index 1656a47c299..983f0c3a8f1 100644
--- 
a/mode/core/src/test/java/org/apache/shardingsphere/mode/manager/ContextManagerTest.java
+++ 
b/mode/core/src/test/java/org/apache/shardingsphere/mode/manager/ContextManagerTest.java
@@ -258,7 +258,7 @@ class ContextManagerTest {
         Map<String, StorageUnit> storageUnits = new LinkedHashMap<>(2, 1F);
         Map<String, StorageNode> storageUnitNodeMap = 
StorageUnitNodeMapUtils.fromDataSources(originalDataSources);
         for (Entry<String, StorageNode> entry : storageUnitNodeMap.entrySet()) 
{
-            storageUnits.put(entry.getKey(), new StorageUnit("foo_db", 
storageNodeDataSourceMap, mock(DataSourcePoolProperties.class), 
entry.getValue()));
+            storageUnits.put(entry.getKey(), new StorageUnit("foo_db", 
storageNodeDataSourceMap.get(entry.getValue().getName()), 
mock(DataSourcePoolProperties.class), entry.getValue()));
         }
         
when(result.getStorageUnitMetaData().getStorageUnits()).thenReturn(storageUnits);
         
when(result.getStorageUnitMetaData().getStorageNodes()).thenReturn(storageUnitNodeMap);

Reply via email to