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

zhaojinchao 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 864b2cdabbe Fixes #28726, optimize AlterStorageUnitBackendHandler 
(#28727)
864b2cdabbe is described below

commit 864b2cdabbeb4ae8c3a858952c47e6303d9177ed
Author: Raigor <raigor.ji...@gmail.com>
AuthorDate: Thu Oct 12 04:24:20 2023 -0500

    Fixes #28726, optimize AlterStorageUnitBackendHandler (#28727)
    
    * Fixes #28726, optimize AlterStorageUnitBackendHandler
    
    * Revert ResourceSwitchManager
---
 .../rdl/storage/unit/AlterStorageUnitBackendHandler.java | 14 ++++++--------
 .../storage/unit/AlterStorageUnitBackendHandlerTest.java | 16 ++++++++++------
 2 files changed, 16 insertions(+), 14 deletions(-)

diff --git 
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rdl/storage/unit/AlterStorageUnitBackendHandler.java
 
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rdl/storage/unit/AlterStorageUnitBackendHandler.java
index 33f9a1b3a30..565b81743cc 100644
--- 
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rdl/storage/unit/AlterStorageUnitBackendHandler.java
+++ 
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rdl/storage/unit/AlterStorageUnitBackendHandler.java
@@ -27,10 +27,10 @@ import 
org.apache.shardingsphere.distsql.segment.HostnameAndPortBasedDataSourceS
 import org.apache.shardingsphere.distsql.segment.URLBasedDataSourceSegment;
 import 
org.apache.shardingsphere.distsql.segment.converter.DataSourceSegmentsConverter;
 import 
org.apache.shardingsphere.distsql.statement.rdl.alter.AlterStorageUnitStatement;
+import 
org.apache.shardingsphere.infra.database.core.connector.ConnectionProperties;
 import org.apache.shardingsphere.infra.database.core.connector.url.JdbcUrl;
 import 
org.apache.shardingsphere.infra.database.core.connector.url.StandardJdbcUrlParser;
 import org.apache.shardingsphere.infra.database.core.type.DatabaseType;
-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.exception.core.ShardingSpherePreconditions;
 import 
org.apache.shardingsphere.infra.exception.core.external.ShardingSphereExternalException;
@@ -40,7 +40,6 @@ import 
org.apache.shardingsphere.proxy.backend.response.header.ResponseHeader;
 import 
org.apache.shardingsphere.proxy.backend.response.header.update.UpdateResponseHeader;
 import org.apache.shardingsphere.proxy.backend.session.ConnectionSession;
 
-import javax.sql.DataSource;
 import java.sql.SQLException;
 import java.util.Collection;
 import java.util.Collections;
@@ -109,12 +108,12 @@ public final class AlterStorageUnitBackendHandler extends 
StorageUnitDefinitionB
     private void checkDatabase(final String databaseName, final 
AlterStorageUnitStatement sqlStatement) {
         Map<String, StorageUnit> storageUnits = 
ProxyContext.getInstance().getDatabase(databaseName).getResourceMetaData().getStorageUnits();
         Collection<String> invalidStorageUnitNames = 
sqlStatement.getStorageUnits().stream().collect(Collectors.toMap(DataSourceSegment::getName,
 each -> each)).entrySet().stream()
-                .filter(each -> !isIdenticalDatabase(each.getValue(), 
storageUnits.get(each.getKey()).getDataSource())).map(Entry::getKey).collect(Collectors.toSet());
+                .filter(each -> !isIdenticalDatabase(each.getValue(), 
storageUnits.get(each.getKey()))).map(Entry::getKey).collect(Collectors.toSet());
         
ShardingSpherePreconditions.checkState(invalidStorageUnitNames.isEmpty(),
                 () -> new 
InvalidStorageUnitsException(Collections.singleton(String.format("Cannot alter 
the database of %s", invalidStorageUnitNames))));
     }
     
-    private boolean isIdenticalDatabase(final DataSourceSegment segment, final 
DataSource dataSource) {
+    private boolean isIdenticalDatabase(final DataSourceSegment segment, final 
StorageUnit storageUnit) {
         String hostName = null;
         String port = null;
         String database = null;
@@ -129,9 +128,8 @@ public final class AlterStorageUnitBackendHandler extends 
StorageUnitDefinitionB
             port = String.valueOf(segmentJdbcUrl.getPort());
             database = segmentJdbcUrl.getDatabase();
         }
-        String url = 
String.valueOf(DataSourcePoolPropertiesCreator.create(dataSource).getConnectionPropertySynonyms().getStandardProperties().get("url"));
-        JdbcUrl dataSourceJdbcUrl = new StandardJdbcUrlParser().parse(url);
-        return Objects.equals(hostName, dataSourceJdbcUrl.getHostname()) && 
Objects.equals(port, String.valueOf(dataSourceJdbcUrl.getPort()))
-                && Objects.equals(database, dataSourceJdbcUrl.getDatabase());
+        ConnectionProperties connectionProperties = 
storageUnit.getConnectionProperties();
+        return Objects.equals(hostName, connectionProperties.getHostname()) && 
Objects.equals(port, String.valueOf(connectionProperties.getPort()))
+                && Objects.equals(database, connectionProperties.getCatalog());
     }
 }
diff --git 
a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rdl/storage/unit/AlterStorageUnitBackendHandlerTest.java
 
b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rdl/storage/unit/AlterStorageUnitBackendHandlerTest.java
index f2b110cee24..ed9b7bd4504 100644
--- 
a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rdl/storage/unit/AlterStorageUnitBackendHandlerTest.java
+++ 
b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rdl/storage/unit/AlterStorageUnitBackendHandlerTest.java
@@ -17,7 +17,6 @@
 
 package 
org.apache.shardingsphere.proxy.backend.handler.distsql.rdl.storage.unit;
 
-import com.zaxxer.hikari.HikariDataSource;
 import 
org.apache.shardingsphere.distsql.handler.exception.storageunit.DuplicateStorageUnitException;
 import 
org.apache.shardingsphere.distsql.handler.exception.storageunit.InvalidStorageUnitsException;
 import 
org.apache.shardingsphere.distsql.handler.exception.storageunit.MissingRequiredStorageUnitsException;
@@ -26,6 +25,7 @@ import 
org.apache.shardingsphere.distsql.segment.DataSourceSegment;
 import 
org.apache.shardingsphere.distsql.segment.HostnameAndPortBasedDataSourceSegment;
 import org.apache.shardingsphere.distsql.segment.URLBasedDataSourceSegment;
 import 
org.apache.shardingsphere.distsql.statement.rdl.alter.AlterStorageUnitStatement;
+import 
org.apache.shardingsphere.infra.database.core.connector.ConnectionProperties;
 import org.apache.shardingsphere.infra.database.core.type.DatabaseType;
 import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
 import 
org.apache.shardingsphere.infra.metadata.database.resource.ResourceMetaData;
@@ -81,7 +81,8 @@ class AlterStorageUnitBackendHandlerTest {
         
when(ProxyContext.getInstance().getDatabase("foo_db")).thenReturn(database);
         ResourceMetaData resourceMetaData = mock(ResourceMetaData.class, 
RETURNS_DEEP_STUBS);
         StorageUnit storageUnit = mock(StorageUnit.class, RETURNS_DEEP_STUBS);
-        
when(storageUnit.getDataSource()).thenReturn(mockHikariDataSource("ds_0"));
+        ConnectionProperties connectionProperties = 
mockConnectionProperties("ds_0");
+        
when(storageUnit.getConnectionProperties()).thenReturn(connectionProperties);
         
when(resourceMetaData.getStorageUnits()).thenReturn(Collections.singletonMap("ds_0",
 storageUnit));
         when(database.getResourceMetaData()).thenReturn(resourceMetaData);
         assertThat(handler.execute("foo_db", 
createAlterStorageUnitStatement("ds_0")), 
instanceOf(UpdateResponseHeader.class));
@@ -108,7 +109,8 @@ class AlterStorageUnitBackendHandlerTest {
         
when(ProxyContext.getInstance().getDatabase("foo_db")).thenReturn(database);
         ResourceMetaData resourceMetaData = mock(ResourceMetaData.class, 
RETURNS_DEEP_STUBS);
         StorageUnit storageUnit = mock(StorageUnit.class, RETURNS_DEEP_STUBS);
-        
when(storageUnit.getDataSource()).thenReturn(mockHikariDataSource("ds_1"));
+        ConnectionProperties connectionProperties = 
mockConnectionProperties("ds_1");
+        
when(storageUnit.getConnectionProperties()).thenReturn(connectionProperties);
         
when(resourceMetaData.getStorageUnits()).thenReturn(Collections.singletonMap("ds_0",
 storageUnit));
         when(database.getResourceMetaData()).thenReturn(resourceMetaData);
         assertThrows(InvalidStorageUnitsException.class, () -> 
handler.execute("foo_db", createAlterStorageUnitStatement("ds_0")));
@@ -131,9 +133,11 @@ class AlterStorageUnitBackendHandlerTest {
         return new AlterStorageUnitStatement(result);
     }
     
-    private HikariDataSource mockHikariDataSource(final String database) {
-        HikariDataSource result = new HikariDataSource();
-        
result.setJdbcUrl(String.format("jdbc:mysql://127.0.0.1:3306/%s?serverTimezone=UTC&useSSL=false",
 database));
+    private ConnectionProperties mockConnectionProperties(final String 
catalog) {
+        ConnectionProperties result = mock(ConnectionProperties.class);
+        when(result.getHostname()).thenReturn("127.0.0.1");
+        when(result.getPort()).thenReturn(3306);
+        when(result.getCatalog()).thenReturn(catalog);
         return result;
     }
 }

Reply via email to