You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by pa...@apache.org on 2022/06/16 09:08:34 UTC
[shardingsphere] branch master updated: Refactor MetaDataRefreshEngine (#18391)
This is an automated email from the ASF dual-hosted git repository.
panjuan 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 a1a8373caec Refactor MetaDataRefreshEngine (#18391)
a1a8373caec is described below
commit a1a8373caecd4467f579f4445e691bcdcab6d8d5
Author: Liang Zhang <zh...@apache.org>
AuthorDate: Thu Jun 16 17:08:27 2022 +0800
Refactor MetaDataRefreshEngine (#18391)
* Refactor MetaDataRefreshEngineTest
* Refactor MetaDataRefreshEngine
---
.../infra/context/refresher/MetaDataRefreshEngine.java | 15 ++++++++-------
.../context/refresher/MetaDataRefreshEngineTest.java | 15 ++++++++++-----
.../type/DummyDropDatabaseMetaDataRefresher.java | 6 +++++-
.../driver/executor/DriverJDBCExecutor.java | 5 +----
.../communication/DatabaseCommunicationEngine.java | 4 +---
5 files changed, 25 insertions(+), 20 deletions(-)
diff --git a/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/refresher/MetaDataRefreshEngine.java b/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/refresher/MetaDataRefreshEngine.java
index 01ed9b71c66..e287b8ca6a7 100644
--- a/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/refresher/MetaDataRefreshEngine.java
+++ b/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/refresher/MetaDataRefreshEngine.java
@@ -25,6 +25,7 @@ import org.apache.shardingsphere.infra.federation.optimizer.context.planner.Opti
import org.apache.shardingsphere.infra.federation.optimizer.metadata.FederationDatabaseMetaData;
import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
import org.apache.shardingsphere.infra.metadata.database.schema.event.MetaDataRefreshedEvent;
+import org.apache.shardingsphere.infra.route.context.RouteUnit;
import org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatement;
import java.sql.SQLException;
@@ -34,7 +35,7 @@ import java.util.Map;
import java.util.Optional;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
-import java.util.function.Supplier;
+import java.util.stream.Collectors;
/**
* Meta data refresh engine.
@@ -53,15 +54,15 @@ public final class MetaDataRefreshEngine {
private final ConfigurationProperties props;
/**
- * Refresh.
+ * Refresh meta data.
*
* @param sqlStatementContext SQL statement context
- * @param logicDataSourceNamesSupplier logic data source names supplier
+ * @param routeUnits route units
* @throws SQLException SQL exception
* @return meta data refreshed event
*/
@SuppressWarnings({"unchecked", "rawtypes"})
- public Optional<MetaDataRefreshedEvent> refresh(final SQLStatementContext<?> sqlStatementContext, final Supplier<Collection<String>> logicDataSourceNamesSupplier) throws SQLException {
+ public Optional<MetaDataRefreshedEvent> refresh(final SQLStatementContext<?> sqlStatementContext, final Collection<RouteUnit> routeUnits) throws SQLException {
Class<? extends SQLStatement> sqlStatementClass = sqlStatementContext.getSqlStatement().getClass();
if (IGNORABLE_SQL_STATEMENT_CLASSES.contains(sqlStatementClass)) {
return Optional.empty();
@@ -70,10 +71,10 @@ public final class MetaDataRefreshEngine {
if (schemaRefresher.isPresent()) {
String schemaName = sqlStatementContext.getTablesContext().getSchemaName()
.orElseGet(() -> DatabaseTypeEngine.getDefaultSchemaName(sqlStatementContext.getDatabaseType(), database.getName()));
- return schemaRefresher.get().refresh(database, federationMetaData, optimizerPlanners, logicDataSourceNamesSupplier.get(), schemaName, sqlStatementContext.getSqlStatement(), props);
- } else {
- IGNORABLE_SQL_STATEMENT_CLASSES.add(sqlStatementClass);
+ Collection<String> logicDataSourceNames = routeUnits.stream().map(each -> each.getDataSourceMapper().getLogicName()).collect(Collectors.toList());
+ return schemaRefresher.get().refresh(database, federationMetaData, optimizerPlanners, logicDataSourceNames, schemaName, sqlStatementContext.getSqlStatement(), props);
}
+ IGNORABLE_SQL_STATEMENT_CLASSES.add(sqlStatementClass);
return Optional.empty();
}
}
diff --git a/shardingsphere-infra/shardingsphere-infra-context/src/test/java/org/apache/shardingsphere/infra/context/refresher/MetaDataRefreshEngineTest.java b/shardingsphere-infra/shardingsphere-infra-context/src/test/java/org/apache/shardingsphere/infra/context/refresher/MetaDataRefreshEngineTest.java
index fa19903d80c..f39963ac114 100644
--- a/shardingsphere-infra/shardingsphere-infra-context/src/test/java/org/apache/shardingsphere/infra/context/refresher/MetaDataRefreshEngineTest.java
+++ b/shardingsphere-infra/shardingsphere-infra-context/src/test/java/org/apache/shardingsphere/infra/context/refresher/MetaDataRefreshEngineTest.java
@@ -20,6 +20,7 @@ package org.apache.shardingsphere.infra.context.refresher;
import lombok.SneakyThrows;
import org.apache.shardingsphere.infra.binder.segment.table.TablesContext;
import org.apache.shardingsphere.infra.binder.statement.SQLStatementContext;
+import org.apache.shardingsphere.infra.context.refresher.type.DummyDropDatabaseMetaDataRefresher;
import org.apache.shardingsphere.infra.database.type.dialect.MySQLDatabaseType;
import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
import org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatement;
@@ -33,13 +34,14 @@ import org.mockito.junit.MockitoJUnitRunner;
import java.lang.reflect.Field;
import java.sql.SQLException;
import java.util.Collections;
+import java.util.Optional;
import java.util.Set;
+import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.assertThat;
import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.times;
-import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@RunWith(MockitoJUnitRunner.class)
@@ -48,6 +50,7 @@ public final class MetaDataRefreshEngineTest {
@InjectMocks
private MetaDataRefreshEngine metaDataRefreshEngine;
+ @SuppressWarnings("rawtypes")
@Test
public void assertRefreshNonIgnorableSQLStatement() throws Exception {
SQLStatementContext<DropDatabaseStatement> sqlStatementContext = mock(SQLStatementContext.class);
@@ -61,9 +64,11 @@ public final class MetaDataRefreshEngineTest {
field.set(metaDataRefreshEngine, database);
int dropTimes = 10;
for (int i = 0; i < dropTimes; i++) {
- metaDataRefreshEngine.refresh(sqlStatementContext, Collections::emptyList);
+ metaDataRefreshEngine.refresh(sqlStatementContext, Collections.emptyList());
}
- verify(sqlStatementContext.getSqlStatement(), times(dropTimes)).getDatabaseName();
+ Optional<MetaDataRefresher> refresher = MetaDataRefresherFactory.findInstance(mock(DropDatabaseStatement.class).getClass());
+ assertTrue(refresher.isPresent());
+ assertThat(((DummyDropDatabaseMetaDataRefresher) refresher.get()).getCount(), is(dropTimes));
}
@SuppressWarnings("unchecked")
@@ -71,7 +76,7 @@ public final class MetaDataRefreshEngineTest {
public void assertRefreshIgnorableSQLStatement() throws SQLException {
SQLStatementContext<SelectStatement> sqlStatementContext = mock(SQLStatementContext.class);
when(sqlStatementContext.getSqlStatement()).thenReturn(mock(SelectStatement.class));
- metaDataRefreshEngine.refresh(sqlStatementContext, Collections::emptyList);
+ metaDataRefreshEngine.refresh(sqlStatementContext, Collections.emptyList());
assertTrue(getIgnorableSQLStatementClasses().contains(sqlStatementContext.getSqlStatement().getClass()));
}
diff --git a/shardingsphere-infra/shardingsphere-infra-context/src/test/java/org/apache/shardingsphere/infra/context/refresher/type/DummyDropDatabaseMetaDataRefresher.java b/shardingsphere-infra/shardingsphere-infra-context/src/test/java/org/apache/shardingsphere/infra/context/refresher/type/DummyDropDatabaseMetaDataRefresher.java
index 14e8e236397..79708343983 100644
--- a/shardingsphere-infra/shardingsphere-infra-context/src/test/java/org/apache/shardingsphere/infra/context/refresher/type/DummyDropDatabaseMetaDataRefresher.java
+++ b/shardingsphere-infra/shardingsphere-infra-context/src/test/java/org/apache/shardingsphere/infra/context/refresher/type/DummyDropDatabaseMetaDataRefresher.java
@@ -17,6 +17,7 @@
package org.apache.shardingsphere.infra.context.refresher.type;
+import lombok.Getter;
import org.apache.shardingsphere.infra.config.props.ConfigurationProperties;
import org.apache.shardingsphere.infra.context.refresher.MetaDataRefresher;
import org.apache.shardingsphere.infra.federation.optimizer.context.planner.OptimizerPlannerContext;
@@ -29,14 +30,17 @@ import java.util.Collection;
import java.util.Map;
import java.util.Optional;
+@Getter
public final class DummyDropDatabaseMetaDataRefresher implements MetaDataRefresher<DropDatabaseStatement> {
+ private int count;
+
@Override
public Optional<MetaDataRefreshedEvent> refresh(final ShardingSphereDatabase database, final FederationDatabaseMetaData federationDatabaseMetaData,
final Map<String, OptimizerPlannerContext> optimizerPlanners,
final Collection<String> logicDataSourceNames, final String schemaName, final DropDatabaseStatement sqlStatement,
final ConfigurationProperties props) {
- sqlStatement.getDatabaseName();
+ count++;
return Optional.empty();
}
diff --git a/shardingsphere-jdbc/shardingsphere-jdbc-core/src/main/java/org/apache/shardingsphere/driver/executor/DriverJDBCExecutor.java b/shardingsphere-jdbc/shardingsphere-jdbc-core/src/main/java/org/apache/shardingsphere/driver/executor/DriverJDBCExecutor.java
index eea7f4e617a..ef92b8f714c 100644
--- a/shardingsphere-jdbc/shardingsphere-jdbc-core/src/main/java/org/apache/shardingsphere/driver/executor/DriverJDBCExecutor.java
+++ b/shardingsphere-jdbc/shardingsphere-jdbc-core/src/main/java/org/apache/shardingsphere/driver/executor/DriverJDBCExecutor.java
@@ -37,11 +37,9 @@ import org.apache.shardingsphere.mode.manager.ContextManager;
import org.apache.shardingsphere.mode.metadata.MetaDataContexts;
import java.sql.SQLException;
-import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Optional;
-import java.util.stream.Collectors;
/**
* Driver JDBC executor.
@@ -162,8 +160,7 @@ public final class DriverJDBCExecutor {
}
private void refreshMetaData(final SQLStatementContext<?> sqlStatementContext, final Collection<RouteUnit> routeUnits) throws SQLException {
- Optional<MetaDataRefreshedEvent> event = metadataRefreshEngine.refresh(sqlStatementContext, () -> routeUnits.stream()
- .map(each -> each.getDataSourceMapper().getLogicName()).collect(Collectors.toCollection(() -> new ArrayList<>(routeUnits.size()))));
+ Optional<MetaDataRefreshedEvent> event = metadataRefreshEngine.refresh(sqlStatementContext, routeUnits);
if (contextManager.getInstanceContext().isCluster() && event.isPresent()) {
ShardingSphereEventBus.getInstance().post(event.get());
}
diff --git a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/communication/DatabaseCommunicationEngine.java b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/communication/DatabaseCommunicationEngine.java
index 70feea1c4b8..eff0d08e2a9 100644
--- a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/communication/DatabaseCommunicationEngine.java
+++ b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/communication/DatabaseCommunicationEngine.java
@@ -55,7 +55,6 @@ import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Optional;
-import java.util.stream.Collectors;
/**
* Database communication engine.
@@ -106,8 +105,7 @@ public abstract class DatabaseCommunicationEngine<T> {
public abstract T execute();
protected void refreshMetaData(final ExecutionContext executionContext) throws SQLException {
- Optional<MetaDataRefreshedEvent> event = metadataRefreshEngine.refresh(executionContext.getSqlStatementContext(), () -> executionContext.getRouteContext().getRouteUnits().stream()
- .map(each -> each.getDataSourceMapper().getLogicName()).collect(Collectors.toList()));
+ Optional<MetaDataRefreshedEvent> event = metadataRefreshEngine.refresh(executionContext.getSqlStatementContext(), executionContext.getRouteContext().getRouteUnits());
if (ProxyContext.getInstance().getContextManager().getInstanceContext().isCluster() && event.isPresent()) {
ShardingSphereEventBus.getInstance().post(event.get());
}