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