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 001a5a3ea28 Refactor UnicastDatabaseProxyBackendHandler (#36845)
001a5a3ea28 is described below
commit 001a5a3ea28e2fbc5297ab122cdb974b044f0693
Author: Liang Zhang <[email protected]>
AuthorDate: Fri Oct 10 22:07:57 2025 +0800
Refactor UnicastDatabaseProxyBackendHandler (#36845)
* Refactor UnicastDatabaseProxyBackendHandler
* Refactor DatabaseAdminQueryProxyBackendHandler
---
.../DatabaseAdminProxyBackendHandlerFactory.java | 3 ++-
.../DatabaseAdminQueryProxyBackendHandler.java | 6 +++--
.../executor/AbstractDatabaseMetaDataExecutor.java | 28 +++++++++----------
.../DatabaseAdminQueryProxyBackendHandlerTest.java | 31 +++++++---------------
.../SelectInformationSchemataExecutor.java | 14 ++++++----
5 files changed, 39 insertions(+), 43 deletions(-)
diff --git
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/admin/DatabaseAdminProxyBackendHandlerFactory.java
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/admin/DatabaseAdminProxyBackendHandlerFactory.java
index 0ddc41c6f20..c6232f922f3 100644
---
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/admin/DatabaseAdminProxyBackendHandlerFactory.java
+++
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/admin/DatabaseAdminProxyBackendHandlerFactory.java
@@ -22,6 +22,7 @@ import lombok.NoArgsConstructor;
import
org.apache.shardingsphere.database.connector.core.spi.DatabaseTypedSPILoader;
import org.apache.shardingsphere.database.connector.core.type.DatabaseType;
import
org.apache.shardingsphere.infra.binder.context.statement.SQLStatementContext;
+import org.apache.shardingsphere.proxy.backend.context.ProxyContext;
import org.apache.shardingsphere.proxy.backend.handler.ProxyBackendHandler;
import
org.apache.shardingsphere.proxy.backend.handler.admin.executor.DatabaseAdminExecutor;
import
org.apache.shardingsphere.proxy.backend.handler.admin.executor.DatabaseAdminExecutorCreator;
@@ -76,7 +77,7 @@ public final class DatabaseAdminProxyBackendHandlerFactory {
private static ProxyBackendHandler createProxyBackendHandler(final
SQLStatementContext sqlStatementContext, final ConnectionSession
connectionSession, final DatabaseAdminExecutor executor) {
return executor instanceof DatabaseAdminQueryExecutor
- ? new DatabaseAdminQueryProxyBackendHandler(connectionSession,
(DatabaseAdminQueryExecutor) executor)
+ ? new
DatabaseAdminQueryProxyBackendHandler(ProxyContext.getInstance().getContextManager(),
connectionSession, (DatabaseAdminQueryExecutor) executor)
: new
DatabaseAdminUpdateProxyBackendHandler(connectionSession,
sqlStatementContext.getSqlStatement(), executor);
}
}
diff --git
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/admin/DatabaseAdminQueryProxyBackendHandler.java
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/admin/DatabaseAdminQueryProxyBackendHandler.java
index 76e2d6c2a8f..491df2bf00b 100644
---
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/admin/DatabaseAdminQueryProxyBackendHandler.java
+++
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/admin/DatabaseAdminQueryProxyBackendHandler.java
@@ -22,7 +22,7 @@ import
org.apache.shardingsphere.database.connector.core.type.DatabaseType;
import
org.apache.shardingsphere.infra.executor.sql.execute.result.query.QueryResultMetaData;
import org.apache.shardingsphere.infra.merge.result.MergedResult;
import
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
-import org.apache.shardingsphere.proxy.backend.context.ProxyContext;
+import org.apache.shardingsphere.mode.manager.ContextManager;
import org.apache.shardingsphere.proxy.backend.handler.ProxyBackendHandler;
import
org.apache.shardingsphere.proxy.backend.handler.admin.executor.DatabaseAdminQueryExecutor;
import org.apache.shardingsphere.proxy.backend.response.data.QueryResponseCell;
@@ -43,6 +43,8 @@ import java.util.List;
@RequiredArgsConstructor
public final class DatabaseAdminQueryProxyBackendHandler implements
ProxyBackendHandler {
+ private final ContextManager contextManager;
+
private final ConnectionSession connectionSession;
private final DatabaseAdminQueryExecutor executor;
@@ -61,7 +63,7 @@ public final class DatabaseAdminQueryProxyBackendHandler
implements ProxyBackend
private List<QueryHeader> createResponseHeader() throws SQLException {
List<QueryHeader> result = new
ArrayList<>(queryResultMetaData.getColumnCount());
- ShardingSphereDatabase database = null ==
connectionSession.getUsedDatabaseName() ? null :
ProxyContext.getInstance().getContextManager().getDatabase(connectionSession.getUsedDatabaseName());
+ ShardingSphereDatabase database = null ==
connectionSession.getUsedDatabaseName() ? null :
contextManager.getDatabase(connectionSession.getUsedDatabaseName());
DatabaseType databaseType = null == database ?
connectionSession.getProtocolType() : database.getProtocolType();
QueryHeaderBuilderEngine queryHeaderBuilderEngine = new
QueryHeaderBuilderEngine(databaseType);
for (int columnIndex = 1; columnIndex <=
queryResultMetaData.getColumnCount(); columnIndex++) {
diff --git
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/admin/executor/AbstractDatabaseMetaDataExecutor.java
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/admin/executor/AbstractDatabaseMetaDataExecutor.java
index e4f49aa1bd7..96f498d391b 100644
---
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/admin/executor/AbstractDatabaseMetaDataExecutor.java
+++
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/admin/executor/AbstractDatabaseMetaDataExecutor.java
@@ -33,6 +33,7 @@ import
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
import
org.apache.shardingsphere.infra.metadata.database.resource.ResourceMetaData;
import
org.apache.shardingsphere.infra.metadata.database.resource.unit.StorageUnit;
import org.apache.shardingsphere.infra.metadata.user.Grantee;
+import org.apache.shardingsphere.mode.manager.ContextManager;
import org.apache.shardingsphere.proxy.backend.context.ProxyContext;
import org.apache.shardingsphere.proxy.backend.session.ConnectionSession;
@@ -63,6 +64,8 @@ public abstract class AbstractDatabaseMetaDataExecutor
implements DatabaseAdminQ
private MergedResult mergedResult;
+ private final ContextManager contextManager =
ProxyContext.getInstance().getContextManager();
+
private final List<Map<String, Object>> rows = new LinkedList<>();
private final Collection<String> labels = new LinkedList<>();
@@ -124,15 +127,6 @@ public abstract class AbstractDatabaseMetaDataExecutor
implements DatabaseAdminQ
return new RawQueryResultMetaData(columns);
}
- protected static Boolean hasDataSource(final String databaseName) {
- return
ProxyContext.getInstance().getContextManager().getDatabase(databaseName).containsDataSource();
- }
-
- protected static boolean isAuthorized(final String databaseName, final
Grantee grantee) {
- AuthorityRule authorityRule =
ProxyContext.getInstance().getContextManager().getMetaDataContexts().getMetaData().getGlobalRuleMetaData().getSingleRule(AuthorityRule.class);
- return new AuthorityChecker(authorityRule,
grantee).isAuthorized(databaseName);
- }
-
/**
* Default database meta data executor, execute sql directly in the
database to obtain the result source data.
*/
@@ -145,18 +139,24 @@ public abstract class AbstractDatabaseMetaDataExecutor
implements DatabaseAdminQ
@Override
protected Collection<String> getDatabaseNames(final ConnectionSession
connectionSession) {
- ShardingSphereDatabase database =
ProxyContext.getInstance().getContextManager().getMetaDataContexts().getMetaData().getDatabase(connectionSession.getCurrentDatabaseName());
- if (null != database && isAuthorized(database.getName(),
connectionSession.getConnectionContext().getGrantee()) &&
hasDataSource(database.getName())) {
+ ShardingSphereDatabase database =
getContextManager().getMetaDataContexts().getMetaData().getDatabase(connectionSession.getCurrentDatabaseName());
+ if (null != database && isAuthorized(database.getName(),
connectionSession.getConnectionContext().getGrantee())
+ &&
getContextManager().getDatabase(database.getName()).containsDataSource()) {
return Collections.singleton(database.getName());
}
- Collection<String> databaseNames =
ProxyContext.getInstance().getContextManager().getAllDatabaseNames().stream()
- .filter(each -> isAuthorized(each,
connectionSession.getConnectionContext().getGrantee())).filter(AbstractDatabaseMetaDataExecutor::hasDataSource).collect(Collectors.toList());
+ Collection<String> databaseNames =
getContextManager().getAllDatabaseNames().stream()
+ .filter(each -> isAuthorized(each,
connectionSession.getConnectionContext().getGrantee()))
+ .filter(each ->
getContextManager().getDatabase(each).containsDataSource()).collect(Collectors.toList());
return databaseNames.isEmpty() ? Collections.emptyList() :
Collections.singletonList(databaseNames.iterator().next());
}
+ private boolean isAuthorized(final String databaseName, final Grantee
grantee) {
+ return new
AuthorityChecker(getContextManager().getMetaDataContexts().getMetaData().getGlobalRuleMetaData().getSingleRule(AuthorityRule.class),
grantee).isAuthorized(databaseName);
+ }
+
@Override
protected void processMetaData(final String databaseName, final
Consumer<ResultSet> callback) throws SQLException {
- ResourceMetaData resourceMetaData =
ProxyContext.getInstance().getContextManager().getMetaDataContexts().getMetaData().getDatabase(databaseName).getResourceMetaData();
+ ResourceMetaData resourceMetaData =
getContextManager().getMetaDataContexts().getMetaData().getDatabase(databaseName).getResourceMetaData();
Optional<StorageUnit> storageUnit =
resourceMetaData.getStorageUnits().values().stream().findFirst();
if (!storageUnit.isPresent()) {
return;
diff --git
a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/admin/DatabaseAdminQueryProxyBackendHandlerTest.java
b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/admin/DatabaseAdminQueryProxyBackendHandlerTest.java
index a96dd65ff9c..459e405c94a 100644
---
a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/admin/DatabaseAdminQueryProxyBackendHandlerTest.java
+++
b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/admin/DatabaseAdminQueryProxyBackendHandlerTest.java
@@ -30,17 +30,15 @@ import
org.apache.shardingsphere.infra.metadata.statistics.builder.ShardingSpher
import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader;
import org.apache.shardingsphere.mode.manager.ContextManager;
import org.apache.shardingsphere.mode.metadata.MetaDataContexts;
-import org.apache.shardingsphere.proxy.backend.context.ProxyContext;
import
org.apache.shardingsphere.proxy.backend.handler.admin.executor.DatabaseAdminQueryExecutor;
import
org.apache.shardingsphere.proxy.backend.response.header.query.QueryHeaderBuilder;
import
org.apache.shardingsphere.proxy.backend.response.header.query.QueryResponseHeader;
import org.apache.shardingsphere.proxy.backend.session.ConnectionSession;
-import org.apache.shardingsphere.test.infra.framework.mock.AutoMockExtension;
-import org.apache.shardingsphere.test.infra.framework.mock.StaticMockSettings;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.MockedStatic;
+import org.mockito.junit.jupiter.MockitoExtension;
import java.sql.SQLException;
import java.util.Collections;
@@ -55,8 +53,7 @@ import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.mockStatic;
import static org.mockito.Mockito.when;
-@ExtendWith(AutoMockExtension.class)
-@StaticMockSettings(ProxyContext.class)
+@ExtendWith(MockitoExtension.class)
class DatabaseAdminQueryProxyBackendHandlerTest {
private final DatabaseType databaseType =
TypedSPILoader.getService(DatabaseType.class, "FIXTURE");
@@ -70,13 +67,18 @@ class DatabaseAdminQueryProxyBackendHandlerTest {
DatabaseAdminQueryExecutor executor =
mock(DatabaseAdminQueryExecutor.class, RETURNS_DEEP_STUBS);
when(executor.getMergedResult()).thenReturn(new
LocalDataMergedResult(Collections.singleton(new LocalDataQueryResultRow("ds_0",
"ds_1"))));
when(executor.getQueryResultMetaData().getColumnCount()).thenReturn(1);
- handler = new DatabaseAdminQueryProxyBackendHandler(connectionSession,
executor);
+ handler = new
DatabaseAdminQueryProxyBackendHandler(mockContextManager(), connectionSession,
executor);
+ }
+
+ private ContextManager mockContextManager() {
+ ShardingSphereDatabase database = new ShardingSphereDatabase("foo_db",
databaseType, mock(), mock(), Collections.emptyList());
+ ShardingSphereMetaData metaData = new
ShardingSphereMetaData(Collections.singleton(database), mock(), mock(), new
ConfigurationProperties(new Properties()));
+ ComputeNodeInstanceContext computeNodeInstanceContext =
mock(ComputeNodeInstanceContext.class, RETURNS_DEEP_STUBS);
+ return new ContextManager(new MetaDataContexts(metaData,
ShardingSphereStatisticsFactory.create(metaData, new
ShardingSphereStatistics())), computeNodeInstanceContext, mock(), mock());
}
@Test
void assertExecute() throws SQLException {
- ContextManager contextManager = mockContextManager();
-
when(ProxyContext.getInstance().getContextManager()).thenReturn(contextManager);
try (MockedStatic<DatabaseTypedSPILoader> spiLoader =
mockStatic(DatabaseTypedSPILoader.class)) {
spiLoader.when(() ->
DatabaseTypedSPILoader.getService(QueryHeaderBuilder.class,
databaseType)).thenReturn(mock(QueryHeaderBuilder.class));
assertThat(((QueryResponseHeader)
handler.execute()).getQueryHeaders().size(), is(1));
@@ -85,8 +87,6 @@ class DatabaseAdminQueryProxyBackendHandlerTest {
@Test
void assertNext() throws SQLException {
- ContextManager contextManager = mockContextManager();
-
when(ProxyContext.getInstance().getContextManager()).thenReturn(contextManager);
try (MockedStatic<DatabaseTypedSPILoader> spiLoader =
mockStatic(DatabaseTypedSPILoader.class)) {
spiLoader.when(() ->
DatabaseTypedSPILoader.getService(QueryHeaderBuilder.class,
databaseType)).thenReturn(mock(QueryHeaderBuilder.class));
handler.execute();
@@ -97,8 +97,6 @@ class DatabaseAdminQueryProxyBackendHandlerTest {
@Test
void assertGetRowData() throws SQLException {
- ContextManager contextManager = mockContextManager();
-
when(ProxyContext.getInstance().getContextManager()).thenReturn(contextManager);
try (MockedStatic<DatabaseTypedSPILoader> spiLoader =
mockStatic(DatabaseTypedSPILoader.class)) {
spiLoader.when(() ->
DatabaseTypedSPILoader.getService(QueryHeaderBuilder.class,
databaseType)).thenReturn(mock(QueryHeaderBuilder.class));
handler.execute();
@@ -106,13 +104,4 @@ class DatabaseAdminQueryProxyBackendHandlerTest {
assertThat(handler.getRowData().getData().size(), is(1));
}
}
-
- private ContextManager mockContextManager() {
- ShardingSphereDatabase database = new ShardingSphereDatabase("foo_db",
databaseType, mock(), mock(), Collections.emptyList());
-
when(ProxyContext.getInstance().getContextManager().getDatabase("foo_db")).thenReturn(database);
- ShardingSphereMetaData metaData = new
ShardingSphereMetaData(Collections.singleton(database), mock(), mock(), new
ConfigurationProperties(new Properties()));
- ComputeNodeInstanceContext computeNodeInstanceContext =
mock(ComputeNodeInstanceContext.class, RETURNS_DEEP_STUBS);
- return new ContextManager(
- new MetaDataContexts(metaData,
ShardingSphereStatisticsFactory.create(metaData, new
ShardingSphereStatistics())), computeNodeInstanceContext, mock(), mock());
- }
}
diff --git
a/proxy/backend/dialect/mysql/src/main/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/executor/information/SelectInformationSchemataExecutor.java
b/proxy/backend/dialect/mysql/src/main/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/executor/information/SelectInformationSchemataExecutor.java
index d992a6c79b5..83b9e5c3e9c 100644
---
a/proxy/backend/dialect/mysql/src/main/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/executor/information/SelectInformationSchemataExecutor.java
+++
b/proxy/backend/dialect/mysql/src/main/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/executor/information/SelectInformationSchemataExecutor.java
@@ -17,10 +17,12 @@
package
org.apache.shardingsphere.proxy.backend.mysql.handler.admin.executor.information;
+import org.apache.shardingsphere.authority.checker.AuthorityChecker;
+import org.apache.shardingsphere.authority.rule.AuthorityRule;
import
org.apache.shardingsphere.infra.metadata.database.resource.ResourceMetaData;
import
org.apache.shardingsphere.infra.metadata.database.resource.unit.StorageUnit;
+import org.apache.shardingsphere.mode.manager.ContextManager;
import org.apache.shardingsphere.proxy.backend.context.ProxyContext;
-import
org.apache.shardingsphere.proxy.backend.handler.admin.executor.AbstractDatabaseMetaDataExecutor;
import
org.apache.shardingsphere.proxy.backend.handler.admin.executor.AbstractDatabaseMetaDataExecutor.DefaultDatabaseMetaDataExecutor;
import org.apache.shardingsphere.proxy.backend.session.ConnectionSession;
import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.item.ColumnProjectionSegment;
@@ -87,10 +89,12 @@ public final class SelectInformationSchemataExecutor
extends DefaultDatabaseMeta
@Override
protected Collection<String> getDatabaseNames(final ConnectionSession
connectionSession) {
- Collection<String> databaseNames =
ProxyContext.getInstance().getContextManager().getAllDatabaseNames().stream()
- .filter(each -> isAuthorized(each,
connectionSession.getConnectionContext().getGrantee())).collect(Collectors.toList());
- SCHEMA_WITHOUT_DATA_SOURCE.addAll(databaseNames.stream().filter(each
-> !hasDataSource(each)).collect(Collectors.toSet()));
- Collection<String> result =
databaseNames.stream().filter(AbstractDatabaseMetaDataExecutor::hasDataSource).collect(Collectors.toList());
+ ContextManager contextManager =
ProxyContext.getInstance().getContextManager();
+ AuthorityChecker authorityChecker = new AuthorityChecker(
+
contextManager.getMetaDataContexts().getMetaData().getGlobalRuleMetaData().getSingleRule(AuthorityRule.class),
connectionSession.getConnectionContext().getGrantee());
+ Collection<String> databaseNames =
contextManager.getAllDatabaseNames().stream().filter(authorityChecker::isAuthorized).collect(Collectors.toList());
+ SCHEMA_WITHOUT_DATA_SOURCE.addAll(databaseNames.stream().filter(each
->
!contextManager.getDatabase(each).containsDataSource()).collect(Collectors.toSet()));
+ Collection<String> result = databaseNames.stream().filter(each ->
contextManager.getDatabase(each).containsDataSource()).collect(Collectors.toList());
if (!SCHEMA_WITHOUT_DATA_SOURCE.isEmpty()) {
fillSchemasWithoutDataSource();
}