This is an automated email from the ASF dual-hosted git repository.
zhangliang 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 b9999f545a1 Refactor UnicastDatabaseProxyBackendHandler (#36844)
b9999f545a1 is described below
commit b9999f545a11bb2e728da8fff7a2209fc2e189af
Author: Liang Zhang <[email protected]>
AuthorDate: Fri Oct 10 19:06:03 2025 +0800
Refactor UnicastDatabaseProxyBackendHandler (#36844)
---
.../data/DatabaseProxyBackendHandlerFactory.java | 3 +-
.../type/UnicastDatabaseProxyBackendHandler.java | 11 +++---
.../UnicastDatabaseProxyBackendHandlerTest.java | 43 ++++++----------------
3 files changed, 20 insertions(+), 37 deletions(-)
diff --git
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/data/DatabaseProxyBackendHandlerFactory.java
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/data/DatabaseProxyBackendHandlerFactory.java
index 57073cb7feb..067958504f3 100644
---
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/data/DatabaseProxyBackendHandlerFactory.java
+++
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/data/DatabaseProxyBackendHandlerFactory.java
@@ -21,6 +21,7 @@ import lombok.AccessLevel;
import lombok.NoArgsConstructor;
import org.apache.shardingsphere.infra.session.query.QueryContext;
import
org.apache.shardingsphere.proxy.backend.connector.DatabaseProxyConnectorFactory;
+import org.apache.shardingsphere.proxy.backend.context.ProxyContext;
import
org.apache.shardingsphere.proxy.backend.handler.data.type.UnicastDatabaseProxyBackendHandler;
import
org.apache.shardingsphere.proxy.backend.response.header.update.UpdateResponseHeader;
import org.apache.shardingsphere.proxy.backend.session.ConnectionSession;
@@ -51,7 +52,7 @@ public final class DatabaseProxyBackendHandlerFactory {
return () -> new UpdateResponseHeader(sqlStatement);
}
if (sqlStatement instanceof DoStatement ||
isNotDatabaseSelectRequiredDALStatement(sqlStatement) ||
isNotContainFromSelectStatement(sqlStatement)) {
- return new UnicastDatabaseProxyBackendHandler(queryContext,
connectionSession);
+ return new UnicastDatabaseProxyBackendHandler(queryContext,
ProxyContext.getInstance().getContextManager(), connectionSession);
}
return DatabaseProxyConnectorFactory.newInstance(queryContext,
connectionSession.getDatabaseConnectionManager(), preferPreparedStatement);
}
diff --git
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/data/type/UnicastDatabaseProxyBackendHandler.java
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/data/type/UnicastDatabaseProxyBackendHandler.java
index edbd5870603..d8cdfc9aaf4 100644
---
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/data/type/UnicastDatabaseProxyBackendHandler.java
+++
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/data/type/UnicastDatabaseProxyBackendHandler.java
@@ -24,9 +24,9 @@ import
org.apache.shardingsphere.database.exception.core.exception.syntax.databa
import org.apache.shardingsphere.infra.exception.ShardingSpherePreconditions;
import
org.apache.shardingsphere.infra.exception.kernel.metadata.resource.storageunit.EmptyStorageUnitException;
import org.apache.shardingsphere.infra.session.query.QueryContext;
+import org.apache.shardingsphere.mode.manager.ContextManager;
import
org.apache.shardingsphere.proxy.backend.connector.DatabaseProxyConnector;
import
org.apache.shardingsphere.proxy.backend.connector.DatabaseProxyConnectorFactory;
-import org.apache.shardingsphere.proxy.backend.context.ProxyContext;
import
org.apache.shardingsphere.proxy.backend.handler.data.DatabaseProxyBackendHandler;
import org.apache.shardingsphere.proxy.backend.response.data.QueryResponseRow;
import org.apache.shardingsphere.proxy.backend.response.header.ResponseHeader;
@@ -45,6 +45,8 @@ public final class UnicastDatabaseProxyBackendHandler
implements DatabaseProxyBa
private final QueryContext queryContext;
+ private final ContextManager contextManager;
+
private final ConnectionSession connectionSession;
private DatabaseProxyConnector databaseProxyConnector;
@@ -53,8 +55,7 @@ public final class UnicastDatabaseProxyBackendHandler
implements DatabaseProxyBa
public ResponseHeader execute() throws SQLException {
String originalDatabaseName =
connectionSession.getCurrentDatabaseName();
String unicastDatabaseName = null == originalDatabaseName ?
getFirstDatabaseName() : originalDatabaseName;
-
ShardingSpherePreconditions.checkState(ProxyContext.getInstance().getContextManager().getDatabase(unicastDatabaseName).containsDataSource(),
- () -> new EmptyStorageUnitException(unicastDatabaseName));
+
ShardingSpherePreconditions.checkState(contextManager.getDatabase(unicastDatabaseName).containsDataSource(),
() -> new EmptyStorageUnitException(unicastDatabaseName));
try {
connectionSession.setCurrentDatabaseName(unicastDatabaseName);
databaseProxyConnector =
DatabaseProxyConnectorFactory.newInstance(queryContext,
connectionSession.getDatabaseConnectionManager(), false);
@@ -65,11 +66,11 @@ public final class UnicastDatabaseProxyBackendHandler
implements DatabaseProxyBa
}
private String getFirstDatabaseName() {
- Collection<String> databaseNames =
ProxyContext.getInstance().getContextManager().getAllDatabaseNames();
+ Collection<String> databaseNames =
contextManager.getAllDatabaseNames();
ShardingSpherePreconditions.checkNotEmpty(databaseNames,
NoDatabaseSelectedException::new);
AuthorityRule authorityRule =
queryContext.getMetaData().getGlobalRuleMetaData().getSingleRule(AuthorityRule.class);
Optional<ShardingSpherePrivileges> privileges =
authorityRule.findPrivileges(connectionSession.getConnectionContext().getGrantee());
- Stream<String> storageUnitContainedDatabaseNames =
databaseNames.stream().filter(each ->
ProxyContext.getInstance().getContextManager().getDatabase(each).containsDataSource());
+ Stream<String> storageUnitContainedDatabaseNames =
databaseNames.stream().filter(each ->
contextManager.getDatabase(each).containsDataSource());
Optional<String> result = privileges.map(optional ->
storageUnitContainedDatabaseNames.filter(optional::hasPrivileges).findFirst()).orElseGet(storageUnitContainedDatabaseNames::findFirst);
ShardingSpherePreconditions.checkState(result.isPresent(),
EmptyStorageUnitException::new);
return result.get();
diff --git
a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/data/type/UnicastDatabaseProxyBackendHandlerTest.java
b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/data/type/UnicastDatabaseProxyBackendHandlerTest.java
index 25a7f2917aa..8df8f5e3fc7 100644
---
a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/data/type/UnicastDatabaseProxyBackendHandlerTest.java
+++
b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/data/type/UnicastDatabaseProxyBackendHandlerTest.java
@@ -46,11 +46,8 @@ import org.mockito.Answers;
import org.mockito.Mock;
import java.sql.SQLException;
-import java.util.Collection;
import java.util.Collections;
import java.util.Optional;
-import java.util.stream.Collectors;
-import java.util.stream.IntStream;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.MatcherAssert.assertThat;
@@ -67,8 +64,6 @@ class UnicastDatabaseProxyBackendHandlerTest {
private static final String EXECUTE_SQL = "SELECT 1 FROM user WHERE id =
1";
- private static final String DATABASE_PATTERN = "db_%s";
-
private final DatabaseType databaseType =
TypedSPILoader.getService(DatabaseType.class, "FIXTURE");
private UnicastDatabaseProxyBackendHandler
unicastDatabaseProxyBackendHandler;
@@ -76,17 +71,23 @@ class UnicastDatabaseProxyBackendHandlerTest {
@Mock(answer = Answers.RETURNS_DEEP_STUBS)
private ConnectionSession connectionSession;
- @Mock
- private DatabaseProxyConnector databaseProxyConnector;
-
@BeforeEach
void setUp() throws SQLException {
-
when(connectionSession.getCurrentDatabaseName()).thenReturn(String.format(DATABASE_PATTERN,
0));
+ when(connectionSession.getCurrentDatabaseName()).thenReturn("foo_db");
mockDatabaseProxyConnector(new UpdateResponseHeader(mock()));
SQLStatementContext sqlStatementContext =
mock(SQLStatementContext.class, RETURNS_DEEP_STUBS);
when(sqlStatementContext.getTablesContext().getDatabaseNames()).thenReturn(Collections.emptyList());
unicastDatabaseProxyBackendHandler = new
UnicastDatabaseProxyBackendHandler(
- new QueryContext(sqlStatementContext, EXECUTE_SQL,
Collections.emptyList(), new HintValueContext(), mockConnectionContext(),
mock()), connectionSession);
+ new QueryContext(sqlStatementContext, EXECUTE_SQL,
Collections.emptyList(), new HintValueContext(), mockConnectionContext(),
mock()), mockContextManager(), connectionSession);
+ }
+
+ private ContextManager mockContextManager() {
+ ContextManager result = mock(ContextManager.class, RETURNS_DEEP_STUBS);
+ ShardingSphereDatabase database = new ShardingSphereDatabase("foo_db",
databaseType, mock(ResourceMetaData.class, RETURNS_DEEP_STUBS), mock(),
Collections.emptyList());
+ ShardingSphereMetaData metaData = new
ShardingSphereMetaData(Collections.singleton(database), mock(), mock(), mock());
+ when(result.getMetaDataContexts()).thenReturn(new
MetaDataContexts(metaData, ShardingSphereStatisticsFactory.create(metaData, new
ShardingSphereStatistics())));
+
when(result.getDatabase("foo_db")).thenReturn(Collections.singleton(database).iterator().next());
+ return result;
}
private ConnectionContext mockConnectionContext() {
@@ -96,42 +97,22 @@ class UnicastDatabaseProxyBackendHandlerTest {
}
private void mockDatabaseProxyConnector(final ResponseHeader
responseHeader) throws SQLException {
+ DatabaseProxyConnector databaseProxyConnector =
mock(DatabaseProxyConnector.class);
when(databaseProxyConnector.execute()).thenReturn(responseHeader);
when(DatabaseProxyConnectorFactory.newInstance(any(QueryContext.class),
any(ProxyDatabaseConnectionManager.class),
eq(false))).thenReturn(databaseProxyConnector);
}
@Test
void assertExecuteDatabaseProxyBackendHandler() throws SQLException {
- ContextManager contextManager = mockContextManager();
-
when(ProxyContext.getInstance().getContextManager()).thenReturn(contextManager);
- ShardingSphereDatabase database = createDatabases().iterator().next();
- when(contextManager.getDatabase("db_0")).thenReturn(database);
ResponseHeader actual = unicastDatabaseProxyBackendHandler.execute();
assertThat(actual, isA(UpdateResponseHeader.class));
}
@Test
void assertDatabaseUsingStream() throws SQLException {
- ContextManager contextManager = mockContextManager();
-
when(ProxyContext.getInstance().getContextManager()).thenReturn(contextManager);
- ShardingSphereDatabase database = createDatabases().iterator().next();
- when(contextManager.getDatabase("db_0")).thenReturn(database);
unicastDatabaseProxyBackendHandler.execute();
while (unicastDatabaseProxyBackendHandler.next()) {
assertThat(unicastDatabaseProxyBackendHandler.getRowData().getData().size(),
is(1));
}
}
-
- private ContextManager mockContextManager() {
- ContextManager result = mock(ContextManager.class, RETURNS_DEEP_STUBS);
- ShardingSphereMetaData metaData = new
ShardingSphereMetaData(createDatabases(), mock(), mock(), mock());
- MetaDataContexts metaDataContexts = new MetaDataContexts(metaData,
ShardingSphereStatisticsFactory.create(metaData, new
ShardingSphereStatistics()));
- when(result.getMetaDataContexts()).thenReturn(metaDataContexts);
- return result;
- }
-
- private Collection<ShardingSphereDatabase> createDatabases() {
- return IntStream.range(0, 10).mapToObj(each -> new
ShardingSphereDatabase(
- String.format(DATABASE_PATTERN, each), databaseType,
mock(ResourceMetaData.class, RETURNS_DEEP_STUBS), mock(),
Collections.emptyList())).collect(Collectors.toList());
- }
}