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());
         }