You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by ji...@apache.org on 2023/02/03 10:47:16 UTC
[shardingsphere] branch master updated: Refactor `ShowStatusFromReadwriteSplittingRulesHandler` (#23969)
This is an automated email from the ASF dual-hosted git repository.
jianglongtao 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 b02c20894c1 Refactor `ShowStatusFromReadwriteSplittingRulesHandler` (#23969)
b02c20894c1 is described below
commit b02c20894c1fc3fd7636664b94d25a77303a1617
Author: Zichao <57...@users.noreply.github.com>
AuthorDate: Fri Feb 3 23:47:08 2023 +1300
Refactor `ShowStatusFromReadwriteSplittingRulesHandler` (#23969)
* Replace `ShowStatusFromReadwriteSplittingRulesHandler` with `ShowStatusFromReadwriteSplittingRulesExecutor`
* Replace `ShowStatusFromReadwriteSplittingRulesHandler` with `ShowStatusFromReadwriteSplittingRulesExecutor`
---
.../distsql/ral/RALBackendHandlerFactory.java | 3 -
...StatusFromReadwriteSplittingRulesExecutor.java} | 39 ++++----
....distsql.handler.ral.query.QueryableRALExecutor | 1 +
...tusFromReadwriteSplittingRulesExecutorTest.java | 103 +++++++++++++++++++++
4 files changed, 123 insertions(+), 23 deletions(-)
diff --git a/proxy/backend/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/RALBackendHandlerFactory.java b/proxy/backend/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/RALBackendHandlerFactory.java
index be45e07ef70..44b2eb3610b 100644
--- a/proxy/backend/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/RALBackendHandlerFactory.java
+++ b/proxy/backend/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/RALBackendHandlerFactory.java
@@ -47,7 +47,6 @@ import org.apache.shardingsphere.proxy.backend.handler.ProxyBackendHandler;
import org.apache.shardingsphere.proxy.backend.handler.distsql.ral.hint.HintRALBackendHandler;
import org.apache.shardingsphere.proxy.backend.handler.distsql.ral.migration.query.QueryableScalingRALBackendHandler;
import org.apache.shardingsphere.proxy.backend.handler.distsql.ral.migration.update.UpdatableScalingRALBackendHandler;
-import org.apache.shardingsphere.proxy.backend.handler.distsql.ral.queryable.ShowStatusFromReadwriteSplittingRulesHandler;
import org.apache.shardingsphere.proxy.backend.handler.distsql.ral.updatable.AlterReadwriteSplittingStorageUnitStatusStatementHandler;
import org.apache.shardingsphere.proxy.backend.handler.distsql.ral.updatable.ApplyDistSQLHandler;
import org.apache.shardingsphere.proxy.backend.handler.distsql.ral.updatable.DiscardDistSQLHandler;
@@ -60,7 +59,6 @@ import org.apache.shardingsphere.proxy.backend.handler.distsql.ral.updatable.Set
import org.apache.shardingsphere.proxy.backend.handler.distsql.ral.updatable.SetInstanceStatusHandler;
import org.apache.shardingsphere.proxy.backend.handler.distsql.ral.updatable.UnlabelComputeNodeHandler;
import org.apache.shardingsphere.proxy.backend.session.ConnectionSession;
-import org.apache.shardingsphere.readwritesplitting.distsql.parser.statement.ShowStatusFromReadwriteSplittingRulesStatement;
import org.apache.shardingsphere.readwritesplitting.distsql.parser.statement.status.AlterReadwriteSplittingStorageUnitStatusStatement;
import java.util.HashMap;
@@ -86,7 +84,6 @@ public final class RALBackendHandlerFactory {
HANDLERS.put(ApplyDistSQLStatement.class, ApplyDistSQLHandler.class);
HANDLERS.put(DiscardDistSQLStatement.class, DiscardDistSQLHandler.class);
HANDLERS.put(ImportDatabaseConfigurationStatement.class, ImportDatabaseConfigurationHandler.class);
- HANDLERS.put(ShowStatusFromReadwriteSplittingRulesStatement.class, ShowStatusFromReadwriteSplittingRulesHandler.class);
}
/**
diff --git a/proxy/backend/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/queryable/ShowStatusFromReadwriteSplittingRulesHandler.java b/proxy/backend/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/queryable/ShowStatusFromReadwriteSplittingRulesExecutor.java
similarity index 83%
rename from proxy/backend/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/queryable/ShowStatusFromReadwriteSplittingRulesHandler.java
rename to proxy/backend/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/queryable/ShowStatusFromReadwriteSplittingRulesExecutor.java
index 59bc0c70837..682efccc6e1 100644
--- a/proxy/backend/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/queryable/ShowStatusFromReadwriteSplittingRulesHandler.java
+++ b/proxy/backend/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/queryable/ShowStatusFromReadwriteSplittingRulesExecutor.java
@@ -22,21 +22,21 @@ import org.apache.shardingsphere.dialect.exception.syntax.database.NoDatabaseSel
import org.apache.shardingsphere.dialect.exception.syntax.database.UnknownDatabaseException;
import org.apache.shardingsphere.infra.datasource.state.DataSourceState;
import org.apache.shardingsphere.infra.merge.result.impl.local.LocalDataQueryResultRow;
+import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
import org.apache.shardingsphere.infra.metadata.database.schema.QualifiedDatabase;
import org.apache.shardingsphere.infra.rule.identifier.type.exportable.ExportableRule;
import org.apache.shardingsphere.infra.rule.identifier.type.exportable.RuleExportEngine;
import org.apache.shardingsphere.infra.rule.identifier.type.exportable.constant.ExportableConstants;
import org.apache.shardingsphere.infra.rule.identifier.type.exportable.constant.ExportableItemConstants;
-import org.apache.shardingsphere.mode.manager.ContextManager;
import org.apache.shardingsphere.mode.manager.cluster.coordinator.registry.status.storage.service.StorageNodeStatusService;
-import org.apache.shardingsphere.mode.metadata.MetaDataContexts;
import org.apache.shardingsphere.mode.metadata.persist.MetaDataPersistService;
import org.apache.shardingsphere.mode.metadata.storage.StorageNodeDataSource;
import org.apache.shardingsphere.mode.metadata.storage.StorageNodeRole;
import org.apache.shardingsphere.mode.repository.cluster.ClusterPersistRepository;
import org.apache.shardingsphere.proxy.backend.context.ProxyContext;
-import org.apache.shardingsphere.proxy.backend.handler.distsql.ral.AbstractQueryableRALBackendHandler;
+import org.apache.shardingsphere.proxy.backend.handler.distsql.ral.queryable.executor.ConnectionSessionRequiredQueryableRALExecutor;
+import org.apache.shardingsphere.proxy.backend.session.ConnectionSession;
import org.apache.shardingsphere.readwritesplitting.distsql.parser.statement.ShowStatusFromReadwriteSplittingRulesStatement;
import java.util.Arrays;
@@ -53,31 +53,25 @@ import java.util.stream.Collectors;
/**
* Show status from readwrite-splitting rules executor.
*/
-public final class ShowStatusFromReadwriteSplittingRulesHandler extends AbstractQueryableRALBackendHandler<ShowStatusFromReadwriteSplittingRulesStatement> {
-
- private static final String STORAGE_UNIT = "storage_unit";
-
- private static final String STATUS = "status";
-
- private static final String DELAY_TIME = "delay_time(ms)";
+public final class ShowStatusFromReadwriteSplittingRulesExecutor implements ConnectionSessionRequiredQueryableRALExecutor<ShowStatusFromReadwriteSplittingRulesStatement> {
@Override
- protected Collection<String> getColumnNames() {
- return Arrays.asList(STORAGE_UNIT, STATUS, DELAY_TIME);
+ public Collection<String> getColumnNames() {
+ return Arrays.asList("storage_unit", "status", "delay_time(ms)");
}
@Override
- protected Collection<LocalDataQueryResultRow> getRows(final ContextManager contextManager) {
- String databaseName = getDatabaseName();
- MetaDataContexts metaDataContexts = contextManager.getMetaDataContexts();
- ShardingSphereDatabase database = metaDataContexts.getMetaData().getDatabase(databaseName);
- Collection<String> allReadResources = getAllReadResources(database, getSqlStatement().getGroupName());
- Map<String, StorageNodeDataSource> persistentReadResources = getPersistentReadResources(databaseName, metaDataContexts.getPersistService());
+ public Collection<LocalDataQueryResultRow> getRows(final ShardingSphereMetaData metaData, final ConnectionSession connectionSession,
+ final ShowStatusFromReadwriteSplittingRulesStatement sqlStatement) {
+ String databaseName = getDatabaseName(connectionSession, sqlStatement);
+ ShardingSphereDatabase database = metaData.getDatabase(databaseName);
+ Collection<String> allReadResources = getAllReadResources(database, sqlStatement.getGroupName());
+ Map<String, StorageNodeDataSource> persistentReadResources = getPersistentReadResources(databaseName, ProxyContext.getInstance().getContextManager().getMetaDataContexts().getPersistService());
return buildRows(allReadResources, persistentReadResources);
}
- private String getDatabaseName() {
- String result = getSqlStatement().getDatabase().isPresent() ? getSqlStatement().getDatabase().get().getIdentifier().getValue() : getConnectionSession().getDatabaseName();
+ private String getDatabaseName(final ConnectionSession connectionSession, final ShowStatusFromReadwriteSplittingRulesStatement sqlStatement) {
+ String result = sqlStatement.getDatabase().isPresent() ? sqlStatement.getDatabase().get().getIdentifier().getValue() : connectionSession.getDatabaseName();
if (Strings.isNullOrEmpty(result)) {
throw new NoDatabaseSelectedException();
}
@@ -139,4 +133,9 @@ public final class ShowStatusFromReadwriteSplittingRulesHandler extends Abstract
String status = storageNodeDataSource.getStatus().name();
return new LocalDataQueryResultRow(resource, status, Long.toString(replicationDelayMilliseconds));
}
+
+ @Override
+ public String getType() {
+ return ShowStatusFromReadwriteSplittingRulesStatement.class.getName();
+ }
}
diff --git a/proxy/backend/src/main/resources/META-INF/services/org.apache.shardingsphere.distsql.handler.ral.query.QueryableRALExecutor b/proxy/backend/src/main/resources/META-INF/services/org.apache.shardingsphere.distsql.handler.ral.query.QueryableRALExecutor
index 822c1b2375b..abdde6ca7a6 100644
--- a/proxy/backend/src/main/resources/META-INF/services/org.apache.shardingsphere.distsql.handler.ral.query.QueryableRALExecutor
+++ b/proxy/backend/src/main/resources/META-INF/services/org.apache.shardingsphere.distsql.handler.ral.query.QueryableRALExecutor
@@ -22,4 +22,5 @@ org.apache.shardingsphere.proxy.backend.handler.distsql.ral.queryable.ExportData
org.apache.shardingsphere.proxy.backend.handler.distsql.ral.queryable.ConvertYamlConfigurationExecutor
org.apache.shardingsphere.proxy.backend.handler.distsql.ral.queryable.ShowDistVariableExecutor
org.apache.shardingsphere.proxy.backend.handler.distsql.ral.queryable.ShowDistVariablesExecutor
+org.apache.shardingsphere.proxy.backend.handler.distsql.ral.queryable.ShowStatusFromReadwriteSplittingRulesExecutor
org.apache.shardingsphere.proxy.backend.handler.distsql.ral.queryable.ShowTableMetaDataExecutor
diff --git a/proxy/backend/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/queryable/ShowStatusFromReadwriteSplittingRulesExecutorTest.java b/proxy/backend/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/queryable/ShowStatusFromReadwriteSplittingRulesExecutorTest.java
new file mode 100644
index 00000000000..3b69251dd12
--- /dev/null
+++ b/proxy/backend/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/queryable/ShowStatusFromReadwriteSplittingRulesExecutorTest.java
@@ -0,0 +1,103 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.shardingsphere.proxy.backend.handler.distsql.ral.queryable;
+
+import org.apache.shardingsphere.dbdiscovery.api.config.DatabaseDiscoveryRuleConfiguration;
+import org.apache.shardingsphere.dbdiscovery.rule.DatabaseDiscoveryRule;
+import org.apache.shardingsphere.infra.config.props.ConfigurationProperties;
+import org.apache.shardingsphere.infra.database.type.DatabaseType;
+import org.apache.shardingsphere.infra.instance.InstanceContext;
+import org.apache.shardingsphere.infra.merge.result.impl.local.LocalDataQueryResultRow;
+import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
+import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
+import org.apache.shardingsphere.infra.metadata.database.resource.ShardingSphereResourceMetaData;
+import org.apache.shardingsphere.infra.metadata.database.rule.ShardingSphereRuleMetaData;
+import org.apache.shardingsphere.mode.manager.ContextManager;
+import org.apache.shardingsphere.mode.metadata.MetaDataContexts;
+import org.apache.shardingsphere.mode.metadata.persist.MetaDataPersistService;
+import org.apache.shardingsphere.mode.repository.cluster.ClusterPersistRepository;
+import org.apache.shardingsphere.mode.repository.cluster.zookeeper.ZookeeperRepository;
+import org.apache.shardingsphere.proxy.backend.context.ProxyContext;
+import org.apache.shardingsphere.proxy.backend.session.ConnectionSession;
+import org.apache.shardingsphere.proxy.backend.util.ProxyContextRestorer;
+import org.apache.shardingsphere.readwritesplitting.distsql.parser.statement.ShowStatusFromReadwriteSplittingRulesStatement;
+import org.apache.shardingsphere.sql.parser.sql.common.segment.generic.DatabaseSegment;
+import org.apache.shardingsphere.sql.parser.sql.common.value.identifier.IdentifierValue;
+import org.apache.shardingsphere.test.fixture.jdbc.MockedDataSource;
+import org.junit.Test;
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.LinkedHashMap;
+import java.util.Map;
+import java.util.Properties;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.junit.Assert.assertFalse;
+import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+public final class ShowStatusFromReadwriteSplittingRulesExecutorTest extends ProxyContextRestorer {
+
+ private final ConnectionSession connectionSession = mock(ConnectionSession.class, RETURNS_DEEP_STUBS);
+
+ @Test
+ public void assertGetColumns() {
+ ShowStatusFromReadwriteSplittingRulesExecutor executor = new ShowStatusFromReadwriteSplittingRulesExecutor();
+ Collection<String> columns = executor.getColumnNames();
+ assertThat(columns.size(), is(3));
+ Iterator<String> iterator = columns.iterator();
+ assertThat(iterator.next(), is("storage_unit"));
+ assertThat(iterator.next(), is("status"));
+ assertThat(iterator.next(), is("delay_time(ms)"));
+ }
+
+ @Test
+ public void assertGetRowsWithEmptyResult() {
+ when(connectionSession.getDatabaseName()).thenReturn("readwrite_db");
+ ContextManager contextManager = mockContextManager();
+ ProxyContext.init(contextManager);
+ ShowStatusFromReadwriteSplittingRulesExecutor executor = new ShowStatusFromReadwriteSplittingRulesExecutor();
+ Collection<LocalDataQueryResultRow> actual = executor.getRows(mockMetaData(), connectionSession,
+ new ShowStatusFromReadwriteSplittingRulesStatement(new DatabaseSegment(1, 1, new IdentifierValue("readwrite_db")), null));
+ assertThat(actual.size(), is(0));
+ assertFalse(actual.iterator().hasNext());
+ }
+
+ private ShardingSphereMetaData mockMetaData() {
+ ShardingSphereDatabase database = new ShardingSphereDatabase("readwrite_db", mock(DatabaseType.class), mock(ShardingSphereResourceMetaData.class, RETURNS_DEEP_STUBS),
+ new ShardingSphereRuleMetaData(Collections.singletonList(new DatabaseDiscoveryRule("ds", Collections.singletonMap("primary", new MockedDataSource()),
+ mock(DatabaseDiscoveryRuleConfiguration.class), mock(InstanceContext.class, RETURNS_DEEP_STUBS)))),
+ Collections.emptyMap());
+ Map<String, ShardingSphereDatabase> databaseMap = new LinkedHashMap<>();
+ databaseMap.put("readwrite_db", database);
+ return new ShardingSphereMetaData(databaseMap, new ShardingSphereRuleMetaData(Collections.emptyList()), new ConfigurationProperties(new Properties()));
+ }
+
+ private ContextManager mockContextManager() {
+ ClusterPersistRepository clusterPersistRepository = mock(ZookeeperRepository.class);
+ MetaDataPersistService persistService = new MetaDataPersistService(clusterPersistRepository);
+ when(clusterPersistRepository.getChildrenKeys("/nodes/storage_nodes")).thenReturn(Collections.singletonList("ds"));
+ when(clusterPersistRepository.getDirectly("/nodes/storage_nodes/ds")).thenReturn("");
+ MetaDataContexts metaDataContexts = new MetaDataContexts(persistService, mockMetaData());
+ return new ContextManager(metaDataContexts, mock(InstanceContext.class, RETURNS_DEEP_STUBS));
+ }
+}