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/05/06 07:45:04 UTC
[shardingsphere] branch master updated: Refresh single table data node when execute alter/drop schema statement (#17374)
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 5749adfbeec Refresh single table data node when execute alter/drop schema statement (#17374)
5749adfbeec is described below
commit 5749adfbeec3746e668c334cb003bbcde8a296ab
Author: Zhengqiang Duan <du...@apache.org>
AuthorDate: Fri May 6 15:44:54 2022 +0800
Refresh single table data node when execute alter/drop schema statement (#17374)
* Refresh single table data node when alter/drop schema
* refactor FederationDatabaseMetaData
---
.../rule/identifier/type/MutableDataNodeRule.java | 9 +++++
.../type/AlterSchemaStatementSchemaRefresher.java | 47 ++++++++++++++++++----
.../type/AlterTableStatementSchemaRefresher.java | 11 ++---
.../type/AlterViewStatementSchemaRefresher.java | 11 ++---
.../type/CreateSchemaStatementSchemaRefresher.java | 5 ++-
.../type/CreateTableStatementSchemaRefresher.java | 9 +++--
.../type/CreateViewStatementSchemaRefresher.java | 9 +++--
.../type/DropSchemaStatementSchemaRefresher.java | 22 ++++++++--
.../type/DropTableStatementSchemaRefresher.java | 6 +--
.../type/DropViewStatementSchemaRefresher.java | 4 +-
.../type/RenameTableStatementSchemaRefresher.java | 11 ++---
.../metadata/FederationDatabaseMetaData.java | 45 +++++++++------------
.../singletable/rule/SingleTableRule.java | 15 +++++--
.../mode/manager/ContextManager.java | 16 ++++----
14 files changed, 144 insertions(+), 76 deletions(-)
diff --git a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/rule/identifier/type/MutableDataNodeRule.java b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/rule/identifier/type/MutableDataNodeRule.java
index 97aec3a4511..d05741c60d0 100644
--- a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/rule/identifier/type/MutableDataNodeRule.java
+++ b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/rule/identifier/type/MutableDataNodeRule.java
@@ -20,6 +20,7 @@ package org.apache.shardingsphere.infra.rule.identifier.type;
import org.apache.shardingsphere.infra.datanode.DataNode;
import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
+import java.util.Collection;
import java.util.Optional;
/**
@@ -44,6 +45,14 @@ public interface MutableDataNodeRule extends ShardingSphereRule {
*/
void remove(String schemaName, String tableName);
+ /**
+ * Remove data node.
+ *
+ * @param schemaNames schema name collection
+ * @param tableName table name
+ */
+ void remove(Collection<String> schemaNames, String tableName);
+
/**
* Find single data node.
*
diff --git a/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/refresher/type/AlterSchemaStatementSchemaRefresher.java b/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/refresher/type/AlterSchemaStatementSchemaRefresher.java
index 34bb833e25f..ab270c9a29c 100644
--- a/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/refresher/type/AlterSchemaStatementSchemaRefresher.java
+++ b/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/refresher/type/AlterSchemaStatementSchemaRefresher.java
@@ -24,7 +24,10 @@ import org.apache.shardingsphere.infra.federation.optimizer.context.planner.Opti
import org.apache.shardingsphere.infra.federation.optimizer.context.planner.OptimizerPlannerContextFactory;
import org.apache.shardingsphere.infra.federation.optimizer.metadata.FederationDatabaseMetaData;
import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
+import org.apache.shardingsphere.infra.metadata.schema.ShardingSphereSchema;
import org.apache.shardingsphere.infra.metadata.schema.event.AlterSchemaEvent;
+import org.apache.shardingsphere.infra.rule.identifier.type.DataNodeContainedRule;
+import org.apache.shardingsphere.infra.rule.identifier.type.MutableDataNodeRule;
import org.apache.shardingsphere.sql.parser.sql.common.statement.ddl.AlterSchemaStatement;
import org.apache.shardingsphere.sql.parser.sql.dialect.handler.ddl.AlterSchemaStatementHandler;
@@ -48,25 +51,53 @@ public final class AlterSchemaStatementSchemaRefresher implements MetaDataRefres
return;
}
String actualSchemaName = sqlStatement.getSchemaName();
- putSchemaMetaData(metaData, database, optimizerPlanners, actualSchemaName, renameSchemaName.get());
+ putSchemaMetaData(metaData, database, optimizerPlanners, actualSchemaName, renameSchemaName.get(), logicDataSourceNames);
removeSchemaMetaData(metaData, database, optimizerPlanners, actualSchemaName);
AlterSchemaEvent event = new AlterSchemaEvent(metaData.getDatabaseName(), actualSchemaName, renameSchemaName.get(), metaData.getSchemaByName(renameSchemaName.get()));
ShardingSphereEventBus.getInstance().post(event);
- // TODO Maybe need to refresh tables for SingleTableRule
}
private void removeSchemaMetaData(final ShardingSphereMetaData metaData, final FederationDatabaseMetaData database,
final Map<String, OptimizerPlannerContext> optimizerPlanners, final String schemaName) {
- metaData.getSchemas().remove(schemaName);
- database.remove(schemaName);
+ ShardingSphereSchema schema = metaData.getSchemas().remove(schemaName);
+ database.removeSchemaMetadata(schemaName);
optimizerPlanners.put(database.getName(), OptimizerPlannerContextFactory.create(database));
+ Collection<MutableDataNodeRule> rules = metaData.getRuleMetaData().findRules(MutableDataNodeRule.class);
+ for (String each : schema.getAllTableNames()) {
+ removeDataNode(rules, schemaName, each);
+ }
}
- private void putSchemaMetaData(final ShardingSphereMetaData metaData, final FederationDatabaseMetaData database,
- final Map<String, OptimizerPlannerContext> optimizerPlanners, final String schemaName, final String renameSchemaName) {
- metaData.getSchemas().put(renameSchemaName, metaData.getSchemaByName(schemaName));
- database.getSchemaMetadata(schemaName).ifPresent(optional -> database.put(renameSchemaName, optional));
+ private void removeDataNode(final Collection<MutableDataNodeRule> rules, final String schemaName, final String tableName) {
+ for (MutableDataNodeRule each : rules) {
+ each.remove(schemaName, tableName);
+ }
+ }
+
+ private void putSchemaMetaData(final ShardingSphereMetaData metaData, final FederationDatabaseMetaData database, final Map<String, OptimizerPlannerContext> optimizerPlanners,
+ final String schemaName, final String renameSchemaName, final Collection<String> logicDataSourceNames) {
+ ShardingSphereSchema schema = metaData.getSchemaByName(schemaName);
+ metaData.getSchemas().put(renameSchemaName, schema);
+ database.getSchemaMetadata(schemaName).ifPresent(optional -> database.putSchemaMetadata(renameSchemaName, optional));
optimizerPlanners.put(database.getName(), OptimizerPlannerContextFactory.create(database));
+ Collection<MutableDataNodeRule> rules = metaData.getRuleMetaData().findRules(MutableDataNodeRule.class);
+ for (String each : schema.getAllTableNames()) {
+ if (containsInImmutableDataNodeContainedRule(each, metaData)) {
+ continue;
+ }
+ putDataNode(rules, logicDataSourceNames.iterator().next(), renameSchemaName, each);
+ }
+ }
+
+ private void putDataNode(final Collection<MutableDataNodeRule> rules, final String dataSourceName, final String schemaName, final String tableName) {
+ for (MutableDataNodeRule each : rules) {
+ each.put(dataSourceName, schemaName, tableName);
+ }
+ }
+
+ private boolean containsInImmutableDataNodeContainedRule(final String tableName, final ShardingSphereMetaData metaData) {
+ return metaData.getRuleMetaData().findRules(DataNodeContainedRule.class).stream()
+ .filter(each -> !(each instanceof MutableDataNodeRule)).anyMatch(each -> each.getAllTables().contains(tableName));
}
@Override
diff --git a/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/refresher/type/AlterTableStatementSchemaRefresher.java b/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/refresher/type/AlterTableStatementSchemaRefresher.java
index fca59029048..d03dd4e2a6f 100644
--- a/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/refresher/type/AlterTableStatementSchemaRefresher.java
+++ b/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/refresher/type/AlterTableStatementSchemaRefresher.java
@@ -68,13 +68,13 @@ public final class AlterTableStatementSchemaRefresher implements MetaDataRefresh
final Map<String, OptimizerPlannerContext> optimizerPlanners, final String schemaName, final String tableName) {
metaData.getSchemaByName(schemaName).remove(tableName);
metaData.getRuleMetaData().findRules(MutableDataNodeRule.class).forEach(each -> each.remove(schemaName, tableName));
- database.remove(schemaName, tableName);
+ database.removeTableMetadata(schemaName, tableName);
optimizerPlanners.put(database.getName(), OptimizerPlannerContextFactory.create(database));
}
private void putTableMetaData(final ShardingSphereMetaData metaData, final FederationDatabaseMetaData database, final Map<String, OptimizerPlannerContext> optimizerPlanners,
final Collection<String> logicDataSourceNames, final String schemaName, final String tableName, final ConfigurationProperties props) throws SQLException {
- if (!containsInDataNodeContainedRule(tableName, metaData)) {
+ if (!containsInImmutableDataNodeContainedRule(tableName, metaData)) {
metaData.getRuleMetaData().findRules(MutableDataNodeRule.class).forEach(each -> each.put(logicDataSourceNames.iterator().next(), schemaName, tableName));
}
SchemaBuilderMaterials materials = new SchemaBuilderMaterials(
@@ -83,13 +83,14 @@ public final class AlterTableStatementSchemaRefresher implements MetaDataRefresh
Optional<TableMetaData> actualTableMetaData = Optional.ofNullable(metaDataMap.get(schemaName)).map(optional -> optional.getTables().get(tableName));
actualTableMetaData.ifPresent(optional -> {
metaData.getSchemaByName(schemaName).put(tableName, optional);
- database.put(schemaName, optional);
+ database.putTableMetadata(schemaName, optional);
optimizerPlanners.put(database.getName(), OptimizerPlannerContextFactory.create(database));
});
}
- private boolean containsInDataNodeContainedRule(final String tableName, final ShardingSphereMetaData metaData) {
- return metaData.getRuleMetaData().findRules(DataNodeContainedRule.class).stream().anyMatch(each -> each.getAllTables().contains(tableName));
+ private boolean containsInImmutableDataNodeContainedRule(final String tableName, final ShardingSphereMetaData metaData) {
+ return metaData.getRuleMetaData().findRules(DataNodeContainedRule.class).stream()
+ .filter(each -> !(each instanceof MutableDataNodeRule)).anyMatch(each -> each.getAllTables().contains(tableName));
}
@Override
diff --git a/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/refresher/type/AlterViewStatementSchemaRefresher.java b/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/refresher/type/AlterViewStatementSchemaRefresher.java
index 06b9242b3cf..95491abbd8e 100644
--- a/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/refresher/type/AlterViewStatementSchemaRefresher.java
+++ b/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/refresher/type/AlterViewStatementSchemaRefresher.java
@@ -71,13 +71,13 @@ public final class AlterViewStatementSchemaRefresher implements MetaDataRefreshe
final Map<String, OptimizerPlannerContext> optimizerPlanners, final String schemaName, final String viewName) {
metaData.getSchemaByName(schemaName).remove(viewName);
metaData.getRuleMetaData().findRules(MutableDataNodeRule.class).forEach(each -> each.remove(schemaName, viewName));
- database.remove(schemaName, viewName);
+ database.removeTableMetadata(schemaName, viewName);
optimizerPlanners.put(database.getName(), OptimizerPlannerContextFactory.create(database));
}
private void putTableMetaData(final ShardingSphereMetaData metaData, final FederationDatabaseMetaData database, final Map<String, OptimizerPlannerContext> optimizerPlanners,
final Collection<String> logicDataSourceNames, final String schemaName, final String viewName, final ConfigurationProperties props) throws SQLException {
- if (!containsInDataNodeContainedRule(viewName, metaData)) {
+ if (!containsInImmutableDataNodeContainedRule(viewName, metaData)) {
metaData.getRuleMetaData().findRules(MutableDataNodeRule.class).forEach(each -> each.put(logicDataSourceNames.iterator().next(), schemaName, viewName));
}
SchemaBuilderMaterials materials = new SchemaBuilderMaterials(
@@ -86,13 +86,14 @@ public final class AlterViewStatementSchemaRefresher implements MetaDataRefreshe
Optional<TableMetaData> actualViewMetaData = Optional.ofNullable(metaDataMap.get(schemaName)).map(optional -> optional.getTables().get(viewName));
actualViewMetaData.ifPresent(optional -> {
metaData.getSchemaByName(schemaName).put(viewName, optional);
- database.put(schemaName, optional);
+ database.putTableMetadata(schemaName, optional);
optimizerPlanners.put(database.getName(), OptimizerPlannerContextFactory.create(database));
});
}
- private boolean containsInDataNodeContainedRule(final String viewName, final ShardingSphereMetaData metaData) {
- return metaData.getRuleMetaData().findRules(DataNodeContainedRule.class).stream().anyMatch(each -> each.getAllTables().contains(viewName));
+ private boolean containsInImmutableDataNodeContainedRule(final String viewName, final ShardingSphereMetaData metaData) {
+ return metaData.getRuleMetaData().findRules(DataNodeContainedRule.class).stream()
+ .filter(each -> !(each instanceof MutableDataNodeRule)).anyMatch(each -> each.getAllTables().contains(viewName));
}
@Override
diff --git a/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/refresher/type/CreateSchemaStatementSchemaRefresher.java b/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/refresher/type/CreateSchemaStatementSchemaRefresher.java
index 7d1502c7b5b..eb395d58a12 100644
--- a/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/refresher/type/CreateSchemaStatementSchemaRefresher.java
+++ b/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/refresher/type/CreateSchemaStatementSchemaRefresher.java
@@ -23,15 +23,16 @@ import org.apache.shardingsphere.infra.eventbus.ShardingSphereEventBus;
import org.apache.shardingsphere.infra.federation.optimizer.context.planner.OptimizerPlannerContext;
import org.apache.shardingsphere.infra.federation.optimizer.context.planner.OptimizerPlannerContextFactory;
import org.apache.shardingsphere.infra.federation.optimizer.metadata.FederationDatabaseMetaData;
+import org.apache.shardingsphere.infra.federation.optimizer.metadata.FederationSchemaMetaData;
import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
import org.apache.shardingsphere.infra.metadata.schema.ShardingSphereSchema;
import org.apache.shardingsphere.infra.metadata.schema.event.AddSchemaEvent;
-import org.apache.shardingsphere.infra.metadata.schema.model.TableMetaData;
import org.apache.shardingsphere.sql.parser.sql.common.statement.ddl.CreateSchemaStatement;
import org.apache.shardingsphere.sql.parser.sql.dialect.handler.ddl.CreateSchemaStatementHandler;
import java.sql.SQLException;
import java.util.Collection;
+import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Optional;
@@ -50,7 +51,7 @@ public final class CreateSchemaStatementSchemaRefresher implements MetaDataRefre
return;
}
metaData.getSchemas().put(schema.get(), new ShardingSphereSchema());
- database.put(schema.get(), new TableMetaData());
+ database.putSchemaMetadata(schema.get(), new FederationSchemaMetaData(schema.get(), new LinkedHashMap<>()));
optimizerPlanners.put(database.getName(), OptimizerPlannerContextFactory.create(database));
AddSchemaEvent event = new AddSchemaEvent(metaData.getDatabaseName(), schema.get());
ShardingSphereEventBus.getInstance().post(event);
diff --git a/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/refresher/type/CreateTableStatementSchemaRefresher.java b/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/refresher/type/CreateTableStatementSchemaRefresher.java
index 704323ddd07..e73d1f24209 100644
--- a/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/refresher/type/CreateTableStatementSchemaRefresher.java
+++ b/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/refresher/type/CreateTableStatementSchemaRefresher.java
@@ -50,7 +50,7 @@ public final class CreateTableStatementSchemaRefresher implements MetaDataRefres
public void refresh(final ShardingSphereMetaData metaData, final FederationDatabaseMetaData database, final Map<String, OptimizerPlannerContext> optimizerPlanners,
final Collection<String> logicDataSourceNames, final String schemaName, final CreateTableStatement sqlStatement, final ConfigurationProperties props) throws SQLException {
String tableName = sqlStatement.getTable().getTableName().getIdentifier().getValue();
- if (!containsInDataNodeContainedRule(tableName, metaData)) {
+ if (!containsInImmutableDataNodeContainedRule(tableName, metaData)) {
metaData.getRuleMetaData().findRules(MutableDataNodeRule.class).forEach(each -> each.put(logicDataSourceNames.iterator().next(), schemaName, tableName));
}
SchemaBuilderMaterials materials = new SchemaBuilderMaterials(
@@ -59,7 +59,7 @@ public final class CreateTableStatementSchemaRefresher implements MetaDataRefres
Optional<TableMetaData> actualTableMetaData = Optional.ofNullable(metaDataMap.get(schemaName)).map(optional -> optional.getTables().get(tableName));
actualTableMetaData.ifPresent(optional -> {
metaData.getSchemaByName(schemaName).put(tableName, optional);
- database.put(schemaName, optional);
+ database.putTableMetadata(schemaName, optional);
optimizerPlanners.put(database.getName(), OptimizerPlannerContextFactory.create(database));
SchemaAlteredEvent event = new SchemaAlteredEvent(metaData.getDatabaseName(), schemaName);
event.getAlteredTables().add(optional);
@@ -67,8 +67,9 @@ public final class CreateTableStatementSchemaRefresher implements MetaDataRefres
});
}
- private boolean containsInDataNodeContainedRule(final String tableName, final ShardingSphereMetaData metaData) {
- return metaData.getRuleMetaData().findRules(DataNodeContainedRule.class).stream().anyMatch(each -> each.getAllTables().contains(tableName));
+ private boolean containsInImmutableDataNodeContainedRule(final String tableName, final ShardingSphereMetaData metaData) {
+ return metaData.getRuleMetaData().findRules(DataNodeContainedRule.class).stream()
+ .filter(each -> !(each instanceof MutableDataNodeRule)).anyMatch(each -> each.getAllTables().contains(tableName));
}
@Override
diff --git a/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/refresher/type/CreateViewStatementSchemaRefresher.java b/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/refresher/type/CreateViewStatementSchemaRefresher.java
index 59fb1fb52d0..493c10fd4ee 100644
--- a/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/refresher/type/CreateViewStatementSchemaRefresher.java
+++ b/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/refresher/type/CreateViewStatementSchemaRefresher.java
@@ -50,7 +50,7 @@ public final class CreateViewStatementSchemaRefresher implements MetaDataRefresh
public void refresh(final ShardingSphereMetaData metaData, final FederationDatabaseMetaData database, final Map<String, OptimizerPlannerContext> optimizerPlanners,
final Collection<String> logicDataSourceNames, final String schemaName, final CreateViewStatement sqlStatement, final ConfigurationProperties props) throws SQLException {
String viewName = sqlStatement.getView().getTableName().getIdentifier().getValue();
- if (!containsInDataNodeContainedRule(viewName, metaData)) {
+ if (!containsInImmutableDataNodeContainedRule(viewName, metaData)) {
metaData.getRuleMetaData().findRules(MutableDataNodeRule.class).forEach(each -> each.put(logicDataSourceNames.iterator().next(), schemaName, viewName));
}
SchemaBuilderMaterials materials = new SchemaBuilderMaterials(
@@ -59,7 +59,7 @@ public final class CreateViewStatementSchemaRefresher implements MetaDataRefresh
Optional<TableMetaData> actualViewMetaData = Optional.ofNullable(metaDataMap.get(schemaName)).map(optional -> optional.getTables().get(viewName));
actualViewMetaData.ifPresent(optional -> {
metaData.getSchemaByName(schemaName).put(viewName, optional);
- database.put(schemaName, optional);
+ database.putTableMetadata(schemaName, optional);
optimizerPlanners.put(database.getName(), OptimizerPlannerContextFactory.create(database));
SchemaAlteredEvent event = new SchemaAlteredEvent(metaData.getDatabaseName(), schemaName);
event.getAlteredTables().add(optional);
@@ -67,8 +67,9 @@ public final class CreateViewStatementSchemaRefresher implements MetaDataRefresh
});
}
- private boolean containsInDataNodeContainedRule(final String tableName, final ShardingSphereMetaData metaData) {
- return metaData.getRuleMetaData().findRules(DataNodeContainedRule.class).stream().anyMatch(each -> each.getAllTables().contains(tableName));
+ private boolean containsInImmutableDataNodeContainedRule(final String tableName, final ShardingSphereMetaData metaData) {
+ return metaData.getRuleMetaData().findRules(DataNodeContainedRule.class).stream()
+ .filter(each -> !(each instanceof MutableDataNodeRule)).anyMatch(each -> each.getAllTables().contains(tableName));
}
@Override
diff --git a/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/refresher/type/DropSchemaStatementSchemaRefresher.java b/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/refresher/type/DropSchemaStatementSchemaRefresher.java
index d1466c50772..0decaad12c8 100644
--- a/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/refresher/type/DropSchemaStatementSchemaRefresher.java
+++ b/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/refresher/type/DropSchemaStatementSchemaRefresher.java
@@ -24,11 +24,14 @@ import org.apache.shardingsphere.infra.federation.optimizer.context.planner.Opti
import org.apache.shardingsphere.infra.federation.optimizer.context.planner.OptimizerPlannerContextFactory;
import org.apache.shardingsphere.infra.federation.optimizer.metadata.FederationDatabaseMetaData;
import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
+import org.apache.shardingsphere.infra.metadata.schema.ShardingSphereSchema;
import org.apache.shardingsphere.infra.metadata.schema.event.DropSchemaEvent;
+import org.apache.shardingsphere.infra.rule.identifier.type.MutableDataNodeRule;
import org.apache.shardingsphere.sql.parser.sql.common.statement.ddl.DropSchemaStatement;
import java.sql.SQLException;
import java.util.Collection;
+import java.util.LinkedHashSet;
import java.util.Map;
/**
@@ -41,15 +44,28 @@ public final class DropSchemaStatementSchemaRefresher implements MetaDataRefresh
@Override
public void refresh(final ShardingSphereMetaData metaData, final FederationDatabaseMetaData database, final Map<String, OptimizerPlannerContext> optimizerPlanners,
final Collection<String> logicDataSourceNames, final String schemaName, final DropSchemaStatement sqlStatement, final ConfigurationProperties props) throws SQLException {
+ Collection<String> tobeRemovedTables = new LinkedHashSet<>();
+ Collection<String> tobeRemovedSchemas = new LinkedHashSet<>();
sqlStatement.getSchemaNames().forEach(each -> {
- metaData.getSchemas().remove(each);
- database.remove(each);
+ ShardingSphereSchema schema = metaData.getSchemas().remove(each);
+ tobeRemovedTables.addAll(schema.getAllTableNames());
+ tobeRemovedSchemas.add(each.toLowerCase());
+ database.removeSchemaMetadata(each);
optimizerPlanners.put(database.getName(), OptimizerPlannerContextFactory.create(database));
});
- // TODO remove tables for SingleTableRule
+ Collection<MutableDataNodeRule> rules = metaData.getRuleMetaData().findRules(MutableDataNodeRule.class);
+ for (String each : tobeRemovedTables) {
+ removeDataNode(rules, each, tobeRemovedSchemas);
+ }
ShardingSphereEventBus.getInstance().post(new DropSchemaEvent(metaData.getDatabaseName(), sqlStatement.getSchemaNames()));
}
+ private void removeDataNode(final Collection<MutableDataNodeRule> rules, final String tobeRemovedTable, final Collection<String> schemaNames) {
+ for (MutableDataNodeRule each : rules) {
+ each.remove(schemaNames, tobeRemovedTable);
+ }
+ }
+
@Override
public String getType() {
return TYPE;
diff --git a/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/refresher/type/DropTableStatementSchemaRefresher.java b/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/refresher/type/DropTableStatementSchemaRefresher.java
index f9c67d4287e..2bf673cff9a 100644
--- a/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/refresher/type/DropTableStatementSchemaRefresher.java
+++ b/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/refresher/type/DropTableStatementSchemaRefresher.java
@@ -46,18 +46,18 @@ public final class DropTableStatementSchemaRefresher implements MetaDataRefreshe
SchemaAlteredEvent event = new SchemaAlteredEvent(metaData.getDatabaseName(), schemaName);
sqlStatement.getTables().forEach(each -> {
metaData.getSchemaByName(schemaName).remove(each.getTableName().getIdentifier().getValue());
- database.remove(schemaName, each.getTableName().getIdentifier().getValue());
+ database.removeTableMetadata(schemaName, each.getTableName().getIdentifier().getValue());
optimizerPlanners.put(database.getName(), OptimizerPlannerContextFactory.create(database));
event.getDroppedTables().add(each.getTableName().getIdentifier().getValue());
});
Collection<MutableDataNodeRule> rules = metaData.getRuleMetaData().findRules(MutableDataNodeRule.class);
for (SimpleTableSegment each : sqlStatement.getTables()) {
- removeSegment(rules, each, schemaName);
+ removeDataNode(rules, each, schemaName);
}
ShardingSphereEventBus.getInstance().post(event);
}
- private void removeSegment(final Collection<MutableDataNodeRule> rules, final SimpleTableSegment tobeRemovedSegment, final String schemaName) {
+ private void removeDataNode(final Collection<MutableDataNodeRule> rules, final SimpleTableSegment tobeRemovedSegment, final String schemaName) {
for (MutableDataNodeRule each : rules) {
each.remove(schemaName, tobeRemovedSegment.getTableName().getIdentifier().getValue());
}
diff --git a/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/refresher/type/DropViewStatementSchemaRefresher.java b/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/refresher/type/DropViewStatementSchemaRefresher.java
index b276a381e5f..916b5ea4da9 100644
--- a/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/refresher/type/DropViewStatementSchemaRefresher.java
+++ b/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/refresher/type/DropViewStatementSchemaRefresher.java
@@ -49,12 +49,12 @@ public final class DropViewStatementSchemaRefresher implements MetaDataRefresher
});
Collection<MutableDataNodeRule> rules = metaData.getRuleMetaData().findRules(MutableDataNodeRule.class);
for (SimpleTableSegment each : sqlStatement.getViews()) {
- removeSegment(rules, each, schemaName);
+ removeDataNode(rules, each, schemaName);
}
ShardingSphereEventBus.getInstance().post(event);
}
- private void removeSegment(final Collection<MutableDataNodeRule> rules, final SimpleTableSegment tobeRemovedSegment, final String schemaName) {
+ private void removeDataNode(final Collection<MutableDataNodeRule> rules, final SimpleTableSegment tobeRemovedSegment, final String schemaName) {
for (MutableDataNodeRule each : rules) {
each.remove(schemaName, tobeRemovedSegment.getTableName().getIdentifier().getValue());
}
diff --git a/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/refresher/type/RenameTableStatementSchemaRefresher.java b/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/refresher/type/RenameTableStatementSchemaRefresher.java
index 457205802ec..8e483961cd7 100644
--- a/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/refresher/type/RenameTableStatementSchemaRefresher.java
+++ b/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/refresher/type/RenameTableStatementSchemaRefresher.java
@@ -66,13 +66,13 @@ public final class RenameTableStatementSchemaRefresher implements MetaDataRefres
final Map<String, OptimizerPlannerContext> optimizerPlanners, final String schemaName, final String tableName) {
metaData.getSchemaByName(schemaName).remove(tableName);
metaData.getRuleMetaData().findRules(MutableDataNodeRule.class).forEach(each -> each.remove(schemaName, tableName));
- database.remove(schemaName, tableName);
+ database.removeTableMetadata(schemaName, tableName);
optimizerPlanners.put(database.getName(), OptimizerPlannerContextFactory.create(database));
}
private void putTableMetaData(final ShardingSphereMetaData metaData, final FederationDatabaseMetaData database, final Map<String, OptimizerPlannerContext> optimizerPlanners,
final Collection<String> logicDataSourceNames, final String schemaName, final String tableName, final ConfigurationProperties props) throws SQLException {
- if (!containsInDataNodeContainedRule(tableName, metaData)) {
+ if (!containsInImmutableDataNodeContainedRule(tableName, metaData)) {
metaData.getRuleMetaData().findRules(MutableDataNodeRule.class).forEach(each -> each.put(logicDataSourceNames.iterator().next(), schemaName, tableName));
}
SchemaBuilderMaterials materials = new SchemaBuilderMaterials(
@@ -81,13 +81,14 @@ public final class RenameTableStatementSchemaRefresher implements MetaDataRefres
Optional<TableMetaData> actualTableMetaData = Optional.ofNullable(metaDataMap.get(schemaName)).map(optional -> optional.getTables().get(tableName));
actualTableMetaData.ifPresent(optional -> {
metaData.getSchemaByName(schemaName).put(tableName, optional);
- database.put(schemaName, optional);
+ database.putTableMetadata(schemaName, optional);
optimizerPlanners.put(database.getName(), OptimizerPlannerContextFactory.create(database));
});
}
- private boolean containsInDataNodeContainedRule(final String tableName, final ShardingSphereMetaData metaData) {
- return metaData.getRuleMetaData().findRules(DataNodeContainedRule.class).stream().anyMatch(each -> each.getAllTables().contains(tableName));
+ private boolean containsInImmutableDataNodeContainedRule(final String tableName, final ShardingSphereMetaData metaData) {
+ return metaData.getRuleMetaData().findRules(DataNodeContainedRule.class).stream()
+ .filter(each -> !(each instanceof MutableDataNodeRule)).anyMatch(each -> each.getAllTables().contains(tableName));
}
@Override
diff --git a/shardingsphere-infra/shardingsphere-infra-federation/shardingsphere-infra-federation-optimizer/src/main/java/org/apache/shardingsphere/infra/federation/optimizer/metadata/FederationDatabaseMetaData.java b/shardingsphere-infra/shardingsphere-infra-federation/shardingsphere-infra-federation-optimizer/src/main/java/org/apache/shardingsphere/infra/federation/optimizer/metadata/FederationDatabaseMetaData.java
index 6c9d4760351..d701a24219b 100644
--- a/shardingsphere-infra/shardingsphere-infra-federation/shardingsphere-infra-federation-optimizer/src/main/java/org/apache/shardingsphere/infra/federation/optimizer/metadata/FederationDatabaseMetaData.java
+++ b/shardingsphere-infra/shardingsphere-infra-federation/shardingsphere-infra-federation-optimizer/src/main/java/org/apache/shardingsphere/infra/federation/optimizer/metadata/FederationDatabaseMetaData.java
@@ -51,55 +51,50 @@ public final class FederationDatabaseMetaData {
* @param schemaName schema name
* @param schemaMetaData schema metadata
*/
- public void put(final String schemaName, final FederationSchemaMetaData schemaMetaData) {
- schemas.put(schemaName, schemaMetaData);
+ public void putSchemaMetadata(final String schemaName, final FederationSchemaMetaData schemaMetaData) {
+ schemas.put(schemaName.toLowerCase(), schemaMetaData);
}
/**
- * Add table meta data.
+ * Put table meta data.
*
* @param schemaName schema name
- * @param metaData table meta data to be updated
+ * @param tableMetaData table meta data
*/
- public void put(final String schemaName, final TableMetaData metaData) {
- if (schemas.containsKey(schemaName)) {
- schemas.get(schemaName).put(metaData);
- } else {
- Map<String, TableMetaData> tableMetaData = new LinkedHashMap<>();
- tableMetaData.put(schemaName, metaData);
- schemas.put(schemaName, new FederationSchemaMetaData(schemaName, tableMetaData));
- }
+ public void putTableMetadata(final String schemaName, final TableMetaData tableMetaData) {
+ FederationSchemaMetaData schemaMetaData = schemas.computeIfAbsent(schemaName.toLowerCase(), key -> new FederationSchemaMetaData(schemaName, new LinkedHashMap<>()));
+ schemaMetaData.put(tableMetaData);
}
/**
- * Get table meta data.
+ * Remove schema meta data.
*
* @param schemaName schema name
- *
- * @return FederationSchemaMetaData schema meta data
*/
- public Optional<FederationSchemaMetaData> getSchemaMetadata(final String schemaName) {
- return Optional.of(schemas.get(schemaName));
+ public void removeSchemaMetadata(final String schemaName) {
+ schemas.remove(schemaName.toLowerCase());
}
/**
* Remove table meta data.
*
* @param schemaName schema name
+ * @param tableName table name
*/
- public void remove(final String schemaName) {
- schemas.remove(schemaName);
+ public void removeTableMetadata(final String schemaName, final String tableName) {
+ if (schemas.containsKey(schemaName.toLowerCase())) {
+ schemas.get(schemaName.toLowerCase()).remove(tableName.toLowerCase());
+ }
}
/**
- * Remove table meta data.
+ * Get table meta data.
*
* @param schemaName schema name
- * @param tableName table name to be removed
+ *
+ * @return FederationSchemaMetaData schema meta data
*/
- public void remove(final String schemaName, final String tableName) {
- if (schemas.containsKey(schemaName)) {
- schemas.get(schemaName).remove(tableName);
- }
+ public Optional<FederationSchemaMetaData> getSchemaMetadata(final String schemaName) {
+ return Optional.of(schemas.get(schemaName));
}
}
diff --git a/shardingsphere-kernel/shardingsphere-single-table/shardingsphere-single-table-core/src/main/java/org/apache/shardingsphere/singletable/rule/SingleTableRule.java b/shardingsphere-kernel/shardingsphere-single-table/shardingsphere-single-table-core/src/main/java/org/apache/shardingsphere/singletable/rule/SingleTableRule.java
index 519e50eea00..347d1bb8da2 100644
--- a/shardingsphere-kernel/shardingsphere-single-table/shardingsphere-single-table-core/src/main/java/org/apache/shardingsphere/singletable/rule/SingleTableRule.java
+++ b/shardingsphere-kernel/shardingsphere-single-table/shardingsphere-single-table-core/src/main/java/org/apache/shardingsphere/singletable/rule/SingleTableRule.java
@@ -181,7 +181,7 @@ public final class SingleTableRule implements SchemaRule, DataNodeContainedRule,
@Override
public void put(final String dataSourceName, final String schemaName, final String tableName) {
if (dataSourceNames.contains(dataSourceName)) {
- Collection<DataNode> dataNodes = singleTableDataNodes.computeIfAbsent(tableName, key -> new LinkedHashSet<>());
+ Collection<DataNode> dataNodes = singleTableDataNodes.computeIfAbsent(tableName.toLowerCase(), key -> new LinkedHashSet<>());
DataNode dataNode = new DataNode(dataSourceName, tableName);
dataNode.setSchemaName(schemaName);
dataNodes.add(dataNode);
@@ -191,9 +191,18 @@ public final class SingleTableRule implements SchemaRule, DataNodeContainedRule,
@Override
public void remove(final String schemaName, final String tableName) {
- Collection<DataNode> dataNodes = singleTableDataNodes.getOrDefault(tableName, new LinkedHashSet<>());
- dataNodes.removeIf(each -> schemaName.equalsIgnoreCase(each.getSchemaName()));
+ remove(Collections.singleton(schemaName.toLowerCase()), tableName);
+ }
+
+ @Override
+ public void remove(final Collection<String> schemaNames, final String tableName) {
+ if (!singleTableDataNodes.containsKey(tableName.toLowerCase())) {
+ return;
+ }
+ Collection<DataNode> dataNodes = singleTableDataNodes.get(tableName.toLowerCase());
+ dataNodes.removeIf(each -> schemaNames.contains(each.getSchemaName().toLowerCase()));
if (dataNodes.isEmpty()) {
+ singleTableDataNodes.remove(tableName.toLowerCase());
tableNames.remove(tableName.toLowerCase());
}
}
diff --git a/shardingsphere-mode/shardingsphere-mode-core/src/main/java/org/apache/shardingsphere/mode/manager/ContextManager.java b/shardingsphere-mode/shardingsphere-mode-core/src/main/java/org/apache/shardingsphere/mode/manager/ContextManager.java
index 24fbf5f570d..d9b2a5cc172 100644
--- a/shardingsphere-mode/shardingsphere-mode-core/src/main/java/org/apache/shardingsphere/mode/manager/ContextManager.java
+++ b/shardingsphere-mode/shardingsphere-mode-core/src/main/java/org/apache/shardingsphere/mode/manager/ContextManager.java
@@ -48,6 +48,7 @@ import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
import org.apache.shardingsphere.infra.rule.builder.global.GlobalRulesBuilder;
import org.apache.shardingsphere.infra.rule.builder.schema.SchemaRulesBuilder;
import org.apache.shardingsphere.infra.rule.identifier.type.DataNodeContainedRule;
+import org.apache.shardingsphere.infra.rule.identifier.type.MutableDataNodeRule;
import org.apache.shardingsphere.mode.metadata.MetaDataContexts;
import org.apache.shardingsphere.mode.metadata.MetaDataContextsBuilder;
import org.apache.shardingsphere.mode.metadata.persist.MetaDataPersistService;
@@ -156,7 +157,7 @@ public final class ContextManager implements AutoCloseable {
return;
}
FederationDatabaseMetaData databaseMetaData = metaDataContexts.getOptimizerContext().getFederationMetaData().getDatabases().get(databaseName);
- databaseMetaData.put(schemaName, new TableMetaData());
+ databaseMetaData.putTableMetadata(schemaName, new TableMetaData());
metaDataContexts.getOptimizerContext().getPlannerContexts().put(databaseName, OptimizerPlannerContextFactory.create(databaseMetaData));
metaDataContexts.getMetaDataMap().get(databaseName).getSchemas().put(schemaName, new ShardingSphereSchema());
}
@@ -208,12 +209,12 @@ public final class ContextManager implements AutoCloseable {
alterSingleTableDataNodes(databaseName, metaData, changedTableMetaData);
FederationDatabaseMetaData databaseMetaData = metaDataContexts.getOptimizerContext().getFederationMetaData().getDatabases().get(databaseName);
metaData.getSchemaByName(schemaName).put(changedTableMetaData.getName(), changedTableMetaData);
- databaseMetaData.put(schemaName, changedTableMetaData);
+ databaseMetaData.putTableMetadata(schemaName, changedTableMetaData);
metaDataContexts.getOptimizerContext().getPlannerContexts().put(databaseName, OptimizerPlannerContextFactory.create(databaseMetaData));
}
private void alterSingleTableDataNodes(final String databaseName, final ShardingSphereMetaData metaData, final TableMetaData changedTableMetaData) {
- if (!containsInDataNodeContainedRule(changedTableMetaData.getName(), metaData)) {
+ if (!containsInImmutableDataNodeContainedRule(changedTableMetaData.getName(), metaData)) {
refreshRules(databaseName, metaData);
}
}
@@ -229,13 +230,14 @@ public final class ContextManager implements AutoCloseable {
if (null != metaDataContexts.getMetaData(databaseName).getSchemaByName(schemaName)) {
metaDataContexts.getMetaData(databaseName).getSchemaByName(schemaName).remove(deletedTable);
FederationDatabaseMetaData databaseMetaData = metaDataContexts.getOptimizerContext().getFederationMetaData().getDatabases().get(databaseName);
- databaseMetaData.remove(schemaName, deletedTable);
+ databaseMetaData.removeTableMetadata(schemaName, deletedTable);
metaDataContexts.getOptimizerContext().getPlannerContexts().put(databaseName, OptimizerPlannerContextFactory.create(databaseMetaData));
}
}
- private boolean containsInDataNodeContainedRule(final String tableName, final ShardingSphereMetaData schemaMetaData) {
- return schemaMetaData.getRuleMetaData().findRules(DataNodeContainedRule.class).stream().anyMatch(each -> each.getAllTables().contains(tableName));
+ private boolean containsInImmutableDataNodeContainedRule(final String tableName, final ShardingSphereMetaData schemaMetaData) {
+ return schemaMetaData.getRuleMetaData().findRules(DataNodeContainedRule.class).stream()
+ .filter(each -> !(each instanceof MutableDataNodeRule)).anyMatch(each -> each.getAllTables().contains(tableName));
}
/**
@@ -267,7 +269,7 @@ public final class ContextManager implements AutoCloseable {
return;
}
FederationDatabaseMetaData databaseMetaData = metaDataContexts.getOptimizerContext().getFederationMetaData().getDatabases().get(databaseName);
- databaseMetaData.remove(schemaName);
+ databaseMetaData.removeSchemaMetadata(schemaName);
metaData.getSchemas().remove(schemaName);
}