You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by zh...@apache.org on 2022/06/21 22:15:33 UTC

[shardingsphere] branch master updated: Add CopyOnWriteArrayList for metadata thread safe (#18500)

This is an automated email from the ASF dual-hosted git repository.

zhaojinchao 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 9987bcc4899 Add CopyOnWriteArrayList for metadata thread safe (#18500)
9987bcc4899 is described below

commit 9987bcc4899d1a1063ca0f46b733357073abfefa
Author: Liang Zhang <zh...@apache.org>
AuthorDate: Wed Jun 22 06:15:20 2022 +0800

    Add CopyOnWriteArrayList for metadata thread safe (#18500)
    
    * Add ConcurrentHashMap and CopyOnWriteArrayList for metadata concurrency
    
    * Fix test case
    
    * Fix test case
    
    * Fix test case
    
    * Fix test case
    
    * Fix test case
    
    * Revert ConcurrentHashMap with ShardingSphereMetaData.databases
    
    * Refactor ShadowAlgorithmQueryResultSet
---
 .../query/ShadowAlgorithmQueryResultSet.java       |  4 ++--
 .../database/rule/ShardingSphereRuleMetaData.java  |  3 ++-
 .../mode/metadata/MetaDataContextsBuilderTest.java |  9 ++++-----
 .../mysql/executor/ShowDatabasesExecutorTest.java  | 22 +++++++++++-----------
 4 files changed, 19 insertions(+), 19 deletions(-)

diff --git a/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-distsql/shardingsphere-shadow-distsql-handler/src/main/java/org/apache/shardingsphere/shadow/distsql/handler/query/ShadowAlgorithmQueryResultSet.java b/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-distsql/shardingsphere-shadow-distsql-handler/src/main/java/org/apache/shardingsphere/shadow/distsql/handler/query/ShadowAlgorithmQueryResultSet.java
index 5eaca506fad..0b5bbdf2fd8 100644
--- a/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-distsql/shardingsphere-shadow-distsql-handler/src/main/java/org/apache/shardingsphere/shadow/distsql/handler/query/ShadowAlgorithmQueryResultSet.java
+++ b/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-distsql/shardingsphere-shadow-distsql-handler/src/main/java/org/apache/shardingsphere/shadow/distsql/handler/query/ShadowAlgorithmQueryResultSet.java
@@ -53,9 +53,9 @@ public final class ShadowAlgorithmQueryResultSet implements DistSQLResultSet {
     
     @Override
     public void init(final ShardingSphereDatabase database, final SQLStatement sqlStatement) {
-        Optional<ShadowRuleConfiguration> rule = database.getRuleMetaData().getConfigurations()
+        Optional<ShadowRuleConfiguration> config = database.getRuleMetaData().getConfigurations()
                 .stream().filter(each -> each instanceof ShadowRuleConfiguration).map(each -> (ShadowRuleConfiguration) each).findAny();
-        rule.ifPresent(optional -> {
+        config.ifPresent(optional -> {
             data = optional.getShadowAlgorithms().entrySet().iterator();
             defaultAlgorithm = optional.getDefaultShadowAlgorithmName();
         });
diff --git a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/rule/ShardingSphereRuleMetaData.java b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/rule/ShardingSphereRuleMetaData.java
index 645aab24a5f..22be8a0af1e 100644
--- a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/rule/ShardingSphereRuleMetaData.java
+++ b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/rule/ShardingSphereRuleMetaData.java
@@ -26,6 +26,7 @@ import java.util.Collection;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Optional;
+import java.util.concurrent.CopyOnWriteArrayList;
 import java.util.stream.Collectors;
 
 /**
@@ -39,7 +40,7 @@ public final class ShardingSphereRuleMetaData {
     private final Collection<RuleConfiguration> configurations;
     
     public ShardingSphereRuleMetaData(final Collection<ShardingSphereRule> rules) {
-        this.rules = rules;
+        this.rules = new CopyOnWriteArrayList<>(rules);
         configurations = rules.stream().map(ShardingSphereRule::getConfiguration).collect(Collectors.toList());
     }
     
diff --git a/shardingsphere-mode/shardingsphere-mode-core/src/test/java/org/apache/shardingsphere/mode/metadata/MetaDataContextsBuilderTest.java b/shardingsphere-mode/shardingsphere-mode-core/src/test/java/org/apache/shardingsphere/mode/metadata/MetaDataContextsBuilderTest.java
index c971f2b7c7e..88217cea2c3 100644
--- a/shardingsphere-mode/shardingsphere-mode-core/src/test/java/org/apache/shardingsphere/mode/metadata/MetaDataContextsBuilderTest.java
+++ b/shardingsphere-mode/shardingsphere-mode-core/src/test/java/org/apache/shardingsphere/mode/metadata/MetaDataContextsBuilderTest.java
@@ -37,7 +37,6 @@ import org.junit.Test;
 import java.sql.SQLException;
 import java.util.Collection;
 import java.util.Collections;
-import java.util.LinkedList;
 import java.util.Properties;
 
 import static org.hamcrest.CoreMatchers.instanceOf;
@@ -90,9 +89,9 @@ public final class MetaDataContextsBuilderTest {
         assertTrue(actual.getMetaData().getDatabases().containsKey("performance_schema"));
         assertTrue(actual.getMetaData().getDatabases().containsKey("mysql"));
         assertTrue(actual.getMetaData().getDatabases().containsKey("sys"));
-        assertThat(actual.getMetaData().getDatabases().get("information_schema").getRuleMetaData().getRules(), instanceOf(LinkedList.class));
-        assertThat(actual.getMetaData().getDatabases().get("performance_schema").getRuleMetaData().getRules(), instanceOf(LinkedList.class));
-        assertThat(actual.getMetaData().getDatabases().get("mysql").getRuleMetaData().getRules(), instanceOf(LinkedList.class));
-        assertThat(actual.getMetaData().getDatabases().get("sys").getRuleMetaData().getRules(), instanceOf(LinkedList.class));
+        assertTrue(actual.getMetaData().getDatabases().get("information_schema").getRuleMetaData().getRules().isEmpty());
+        assertTrue(actual.getMetaData().getDatabases().get("performance_schema").getRuleMetaData().getRules().isEmpty());
+        assertTrue(actual.getMetaData().getDatabases().get("mysql").getRuleMetaData().getRules().isEmpty());
+        assertTrue(actual.getMetaData().getDatabases().get("sys").getRuleMetaData().getRules().isEmpty());
     }
 }
diff --git a/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/executor/ShowDatabasesExecutorTest.java b/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/executor/ShowDatabasesExecutorTest.java
index 5af857f7c20..d931f1eda1e 100644
--- a/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/executor/ShowDatabasesExecutorTest.java
+++ b/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/executor/ShowDatabasesExecutorTest.java
@@ -50,7 +50,7 @@ import static org.mockito.Mockito.when;
 
 public final class ShowDatabasesExecutorTest extends ProxyContextRestorer {
     
-    private static final String SCHEMA_PATTERN = "schema_%s";
+    private static final String DATABASE_PATTERN = "database_%s";
     
     private ShowDatabasesExecutor showDatabasesExecutor;
     
@@ -70,7 +70,7 @@ public final class ShowDatabasesExecutorTest extends ProxyContextRestorer {
             ShardingSphereDatabase database = mock(ShardingSphereDatabase.class, RETURNS_DEEP_STUBS);
             when(database.getResource().getDatabaseType()).thenReturn(new MySQLDatabaseType());
             when(database.getRuleMetaData().getRules()).thenReturn(Collections.emptyList());
-            result.put(String.format(SCHEMA_PATTERN, i), database);
+            result.put(String.format(DATABASE_PATTERN, i), database);
         }
         return result;
     }
@@ -81,24 +81,24 @@ public final class ShowDatabasesExecutorTest extends ProxyContextRestorer {
         assertThat(showDatabasesExecutor.getQueryResultMetaData().getColumnCount(), is(1));
         int count = 0;
         while (showDatabasesExecutor.getMergedResult().next()) {
-            assertThat(showDatabasesExecutor.getMergedResult().getValue(1, Object.class), is(String.format(SCHEMA_PATTERN, count)));
+            assertThat(showDatabasesExecutor.getMergedResult().getValue(1, Object.class), is(String.format(DATABASE_PATTERN, count)));
             count++;
         }
+        assertThat(count, is(10));
     }
     
     @Test
     public void assertExecuteWithPrefixLike() throws SQLException {
         MySQLShowDatabasesStatement showDatabasesStatement = new MySQLShowDatabasesStatement();
         ShowFilterSegment showFilterSegment = new ShowFilterSegment(0, 0);
-        ShowLikeSegment showLikeSegment = new ShowLikeSegment(0, 0, "schema%");
+        ShowLikeSegment showLikeSegment = new ShowLikeSegment(0, 0, "database%");
         showFilterSegment.setLike(showLikeSegment);
         showDatabasesStatement.setFilter(showFilterSegment);
         showDatabasesExecutor = new ShowDatabasesExecutor(showDatabasesStatement);
         showDatabasesExecutor.execute(mockConnectionSession());
-        assertThat(showDatabasesExecutor.getQueryResultMetaData().getColumnCount(), is(1));
         int count = 0;
         while (showDatabasesExecutor.getMergedResult().next()) {
-            assertThat(showDatabasesExecutor.getMergedResult().getValue(1, Object.class), is(String.format(SCHEMA_PATTERN, count)));
+            assertThat(showDatabasesExecutor.getMergedResult().getValue(1, Object.class), is(String.format(DATABASE_PATTERN, count)));
             count++;
         }
         assertThat(count, is(10));
@@ -116,7 +116,7 @@ public final class ShowDatabasesExecutorTest extends ProxyContextRestorer {
         assertThat(showDatabasesExecutor.getQueryResultMetaData().getColumnCount(), is(1));
         int count = 0;
         while (showDatabasesExecutor.getMergedResult().next()) {
-            assertThat(showDatabasesExecutor.getMergedResult().getValue(1, Object.class), is("schema_1"));
+            assertThat(showDatabasesExecutor.getMergedResult().getValue(1, Object.class), is("database_1"));
             count++;
         }
         assertThat(count, is(1));
@@ -126,7 +126,7 @@ public final class ShowDatabasesExecutorTest extends ProxyContextRestorer {
     public void assertExecuteWithPreciseLike() throws SQLException {
         MySQLShowDatabasesStatement showDatabasesStatement = new MySQLShowDatabasesStatement();
         ShowFilterSegment showFilterSegment = new ShowFilterSegment(0, 0);
-        ShowLikeSegment showLikeSegment = new ShowLikeSegment(0, 0, "schema_9");
+        ShowLikeSegment showLikeSegment = new ShowLikeSegment(0, 0, "database_9");
         showFilterSegment.setLike(showLikeSegment);
         showDatabasesStatement.setFilter(showFilterSegment);
         showDatabasesExecutor = new ShowDatabasesExecutor(showDatabasesStatement);
@@ -134,7 +134,7 @@ public final class ShowDatabasesExecutorTest extends ProxyContextRestorer {
         assertThat(showDatabasesExecutor.getQueryResultMetaData().getColumnCount(), is(1));
         int count = 0;
         while (showDatabasesExecutor.getMergedResult().next()) {
-            assertThat(showDatabasesExecutor.getMergedResult().getValue(1, Object.class), is("schema_9"));
+            assertThat(showDatabasesExecutor.getMergedResult().getValue(1, Object.class), is("database_9"));
             count++;
         }
         assertThat(count, is(1));
@@ -144,7 +144,7 @@ public final class ShowDatabasesExecutorTest extends ProxyContextRestorer {
     public void assertExecuteWithLikeMatchNone() throws SQLException {
         MySQLShowDatabasesStatement showDatabasesStatement = new MySQLShowDatabasesStatement();
         ShowFilterSegment showFilterSegment = new ShowFilterSegment(0, 0);
-        ShowLikeSegment showLikeSegment = new ShowLikeSegment(0, 0, "schema_not_exist");
+        ShowLikeSegment showLikeSegment = new ShowLikeSegment(0, 0, "not_exist_database");
         showFilterSegment.setLike(showLikeSegment);
         showDatabasesStatement.setFilter(showFilterSegment);
         showDatabasesExecutor = new ShowDatabasesExecutor(showDatabasesStatement);
@@ -152,7 +152,7 @@ public final class ShowDatabasesExecutorTest extends ProxyContextRestorer {
         assertThat(showDatabasesExecutor.getQueryResultMetaData().getColumnCount(), is(1));
         int count = 0;
         while (showDatabasesExecutor.getMergedResult().next()) {
-            assertThat(showDatabasesExecutor.getMergedResult().getValue(1, Object.class), is("schema_not_exist"));
+            assertThat(showDatabasesExecutor.getMergedResult().getValue(1, Object.class), is("not_exist_database"));
             count++;
         }
         assertThat(count, is(0));