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

menghaoran 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 cbb49e97cb7 Refactor load data source unit from repository (#38065)
cbb49e97cb7 is described below

commit cbb49e97cb7e744da730d2747dae4baae7b8a622
Author: Haoran Meng <[email protected]>
AuthorDate: Tue Feb 17 07:58:17 2026 +0800

    Refactor load data source unit from repository (#38065)
---
 .../database/DataSourceUnitPersistService.java     | 24 +++++++++++++++-------
 .../database/DataSourceUnitPersistServiceTest.java | 13 ++++++++++++
 .../datasource/StorageUnitChangedHandler.java      | 11 ++++++----
 .../datasource/StorageUnitChangedHandlerTest.java  |  6 ++++--
 4 files changed, 41 insertions(+), 13 deletions(-)

diff --git 
a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/persist/config/database/DataSourceUnitPersistService.java
 
b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/persist/config/database/DataSourceUnitPersistService.java
index fe8a14f985d..2926cad0cda 100644
--- 
a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/persist/config/database/DataSourceUnitPersistService.java
+++ 
b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/persist/config/database/DataSourceUnitPersistService.java
@@ -17,6 +17,7 @@
 
 package org.apache.shardingsphere.mode.metadata.persist.config.database;
 
+import com.google.common.base.Strings;
 import 
org.apache.shardingsphere.infra.datasource.pool.props.domain.DataSourcePoolProperties;
 import org.apache.shardingsphere.infra.util.yaml.YamlEngine;
 import 
org.apache.shardingsphere.infra.yaml.config.swapper.resource.YamlDataSourceConfigurationSwapper;
@@ -30,7 +31,7 @@ import java.util.Collection;
 import java.util.LinkedHashMap;
 import java.util.Map;
 import java.util.Map.Entry;
-import java.util.stream.Collectors;
+import java.util.Optional;
 
 /**
  * Data source unit persist service.
@@ -57,8 +58,11 @@ public final class DataSourceUnitPersistService {
      */
     public Map<String, DataSourcePoolProperties> load(final String 
databaseName) {
         Collection<String> childrenKeys = 
repository.getChildrenKeys(NodePathGenerator.toPath(new 
StorageUnitNodePath(databaseName, null)));
-        return childrenKeys.stream()
-                .collect(Collectors.toMap(each -> each, each -> 
load(databaseName, each), (oldValue, currentValue) -> currentValue, () -> new 
LinkedHashMap<>(childrenKeys.size(), 1F)));
+        Map<String, DataSourcePoolProperties> result = new 
LinkedHashMap<>(childrenKeys.size(), 1F);
+        for (String each : childrenKeys) {
+            load(databaseName, each).ifPresent(dataSourcePoolProps -> 
result.put(each, dataSourcePoolProps));
+        }
+        return result;
     }
     
     /**
@@ -69,11 +73,17 @@ public final class DataSourceUnitPersistService {
      * @return data source pool properties
      */
     @SuppressWarnings("unchecked")
-    public DataSourcePoolProperties load(final String databaseName, final 
String dataSourceName) {
+    public Optional<DataSourcePoolProperties> load(final String databaseName, 
final String dataSourceName) {
         VersionNodePath versionNodePath = new VersionNodePath(new 
StorageUnitNodePath(databaseName, dataSourceName));
-        int activeVersion = 
Integer.parseInt(repository.query(versionNodePath.getActiveVersionPath()));
-        String dataSourceContent = 
repository.query(versionNodePath.getVersionPath(activeVersion));
-        return 
yamlDataSourceConfigurationSwapper.swapToDataSourcePoolProperties(YamlEngine.unmarshal(dataSourceContent,
 Map.class));
+        String activeVersion = 
repository.query(versionNodePath.getActiveVersionPath());
+        if (Strings.isNullOrEmpty(activeVersion)) {
+            return Optional.empty();
+        }
+        String dataSourceContent = 
repository.query(versionNodePath.getVersionPath(Integer.parseInt(activeVersion)));
+        if (Strings.isNullOrEmpty(dataSourceContent)) {
+            return Optional.empty();
+        }
+        return 
Optional.of(yamlDataSourceConfigurationSwapper.swapToDataSourcePoolProperties(YamlEngine.unmarshal(dataSourceContent,
 Map.class)));
     }
     
     /**
diff --git 
a/mode/core/src/test/java/org/apache/shardingsphere/mode/metadata/persist/config/database/DataSourceUnitPersistServiceTest.java
 
b/mode/core/src/test/java/org/apache/shardingsphere/mode/metadata/persist/config/database/DataSourceUnitPersistServiceTest.java
index dff65f0dde2..9c0030ef332 100644
--- 
a/mode/core/src/test/java/org/apache/shardingsphere/mode/metadata/persist/config/database/DataSourceUnitPersistServiceTest.java
+++ 
b/mode/core/src/test/java/org/apache/shardingsphere/mode/metadata/persist/config/database/DataSourceUnitPersistServiceTest.java
@@ -25,12 +25,14 @@ import org.junit.jupiter.api.extension.ExtendWith;
 import org.mockito.Mock;
 import org.mockito.junit.jupiter.MockitoExtension;
 
+import java.util.Arrays;
 import java.util.Collections;
 import java.util.LinkedHashMap;
 import java.util.Map;
 
 import static org.hamcrest.Matchers.is;
 import static org.hamcrest.MatcherAssert.assertThat;
+import static org.junit.jupiter.api.Assertions.assertFalse;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
@@ -58,6 +60,17 @@ class DataSourceUnitPersistServiceTest {
         assertThat(actual.get("foo_ds").getPoolClassName(), 
is("org.apache.shardingsphere.test.infra.fixture.jdbc.MockedDataSource"));
     }
     
+    @Test
+    void assertLoadWithInvalidDataSource() {
+        
when(repository.getChildrenKeys("/metadata/foo_db/data_sources/units")).thenReturn(Arrays.asList("foo_ds",
 "bar_ds"));
+        
when(repository.query("/metadata/foo_db/data_sources/units/foo_ds/active_version")).thenReturn("10");
+        
when(repository.query("/metadata/foo_db/data_sources/units/foo_ds/versions/10")).thenReturn("{dataSourceClassName:
 org.apache.shardingsphere.test.infra.fixture.jdbc.MockedDataSource}");
+        Map<String, DataSourcePoolProperties> actual = 
persistService.load("foo_db");
+        assertThat(actual.size(), is(1));
+        assertThat(actual.get("foo_ds").getPoolClassName(), 
is("org.apache.shardingsphere.test.infra.fixture.jdbc.MockedDataSource"));
+        assertFalse(actual.containsKey("bar_ds"));
+    }
+    
     @Test
     void assertPersist() {
         Map<String, DataSourcePoolProperties> dataSourcePropsMap = new 
LinkedHashMap<>(1, 1F);
diff --git 
a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/dispatch/handler/database/datasource/StorageUnitChangedHandler.java
 
b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/dispatch/handler/database/datasource/StorageUnitChangedHandler.java
index 443f8599048..663e7471e75 100644
--- 
a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/dispatch/handler/database/datasource/StorageUnitChangedHandler.java
+++ 
b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/dispatch/handler/database/datasource/StorageUnitChangedHandler.java
@@ -29,6 +29,7 @@ import 
org.apache.shardingsphere.mode.node.path.engine.searcher.NodePathSearcher
 import 
org.apache.shardingsphere.mode.node.path.type.database.metadata.datasource.StorageUnitNodePath;
 
 import java.util.Collections;
+import java.util.Optional;
 
 /**
  * Storage unit changed handler.
@@ -62,13 +63,15 @@ public final class StorageUnitChangedHandler implements 
DatabaseLeafValueChanged
     }
     
     private void handleRegistered(final String databaseName, final String 
storageUnitName) {
-        DataSourcePoolProperties dataSourcePoolProps = 
contextManager.getPersistServiceFacade().getMetaDataFacade().getDataSourceUnitService().load(databaseName,
 storageUnitName);
-        
contextManager.getMetaDataContextManager().getStorageUnitManager().register(databaseName,
 Collections.singletonMap(storageUnitName, dataSourcePoolProps));
+        Optional<DataSourcePoolProperties> dataSourcePoolProps = 
contextManager.getPersistServiceFacade().getMetaDataFacade().getDataSourceUnitService().load(databaseName,
 storageUnitName);
+        dataSourcePoolProps.ifPresent(dataSourcePoolProperties -> 
contextManager.getMetaDataContextManager().getStorageUnitManager().register(databaseName,
+                Collections.singletonMap(storageUnitName, 
dataSourcePoolProperties)));
     }
     
     private void handleAltered(final String databaseName, final String 
storageUnitName) {
-        DataSourcePoolProperties dataSourcePoolProps = 
contextManager.getPersistServiceFacade().getMetaDataFacade().getDataSourceUnitService().load(databaseName,
 storageUnitName);
-        
contextManager.getMetaDataContextManager().getStorageUnitManager().alter(databaseName,
 Collections.singletonMap(storageUnitName, dataSourcePoolProps));
+        Optional<DataSourcePoolProperties> dataSourcePoolProps = 
contextManager.getPersistServiceFacade().getMetaDataFacade().getDataSourceUnitService().load(databaseName,
 storageUnitName);
+        dataSourcePoolProps.ifPresent(dataSourcePoolProperties -> 
contextManager.getMetaDataContextManager().getStorageUnitManager().alter(databaseName,
+                Collections.singletonMap(storageUnitName, 
dataSourcePoolProperties)));
     }
     
     private void handleUnregistered(final String databaseName, final String 
storageUnitName) {
diff --git 
a/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/dispatch/handler/database/datasource/StorageUnitChangedHandlerTest.java
 
b/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/dispatch/handler/database/datasource/StorageUnitChangedHandlerTest.java
index 868e5b97480..b3bbef4f82c 100644
--- 
a/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/dispatch/handler/database/datasource/StorageUnitChangedHandlerTest.java
+++ 
b/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/dispatch/handler/database/datasource/StorageUnitChangedHandlerTest.java
@@ -30,6 +30,8 @@ import org.mockito.junit.jupiter.MockitoExtension;
 import org.mockito.junit.jupiter.MockitoSettings;
 import org.mockito.quality.Strictness;
 
+import java.util.Optional;
+
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.ArgumentMatchers.eq;
 import static org.mockito.Mockito.mock;
@@ -53,14 +55,14 @@ class StorageUnitChangedHandlerTest {
     
     @Test
     void assertHandleStorageUnitRegistered() {
-        
when(contextManager.getPersistServiceFacade().getMetaDataFacade().getDataSourceUnitService().load("foo_db",
 "foo_unit")).thenReturn(mock(DataSourcePoolProperties.class));
+        
when(contextManager.getPersistServiceFacade().getMetaDataFacade().getDataSourceUnitService().load("foo_db",
 "foo_unit")).thenReturn(Optional.of(mock(DataSourcePoolProperties.class)));
         handler.handle("foo_db", new 
DataChangedEvent("/metadata/foo_db/data_sources/units/foo_unit/active_version", 
"0", Type.ADDED));
         
verify(contextManager.getMetaDataContextManager().getStorageUnitManager()).register(eq("foo_db"),
 any());
     }
     
     @Test
     void assertHandleStorageUnitAltered() {
-        
when(contextManager.getPersistServiceFacade().getMetaDataFacade().getDataSourceUnitService().load("foo_db",
 "foo_unit")).thenReturn(mock(DataSourcePoolProperties.class));
+        
when(contextManager.getPersistServiceFacade().getMetaDataFacade().getDataSourceUnitService().load("foo_db",
 "foo_unit")).thenReturn(Optional.of(mock(DataSourcePoolProperties.class)));
         handler.handle("foo_db", new 
DataChangedEvent("/metadata/foo_db/data_sources/units/foo_unit/active_version", 
"0", Type.UPDATED));
         
verify(contextManager.getMetaDataContextManager().getStorageUnitManager()).alter(eq("foo_db"),
 any());
     }

Reply via email to