You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by du...@apache.org on 2022/04/26 12:15:02 UTC
[shardingsphere] branch master updated: Add rename schema refresher (#17120)
This is an automated email from the ASF dual-hosted git repository.
duanzhengqiang 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 7b1190021ed Add rename schema refresher (#17120)
7b1190021ed is described below
commit 7b1190021edebb2f6ff917ee71c4cf911b4f12e0
Author: zhaojinchao <zh...@apache.org>
AuthorDate: Tue Apr 26 20:14:57 2022 +0800
Add rename schema refresher (#17120)
* Add rename schema refresher
* Fix checkstyle.
---
.../metadata/schema/event/AlterSchemaEvent.java | 38 ++++++++++++++++++++++
.../type/CreateViewStatementSchemaRefresher.java | 1 -
.../type/DropSchemaStatementSchemaRefresher.java | 2 ++
...a => RenameSchemaStatementSchemaRefresher.java} | 36 ++++++++++++++------
...phere.infra.context.refresher.MetaDataRefresher | 1 +
.../metadata/FederationDatabaseMetaData.java | 22 +++++++++++++
.../SchemaMetaDataRegistrySubscriber.java | 12 +++++++
.../SchemaMetaDataRegistrySubscriberTest.java | 11 +++++++
8 files changed, 112 insertions(+), 11 deletions(-)
diff --git a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/schema/event/AlterSchemaEvent.java b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/schema/event/AlterSchemaEvent.java
new file mode 100644
index 00000000000..f2b5599ccc1
--- /dev/null
+++ b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/schema/event/AlterSchemaEvent.java
@@ -0,0 +1,38 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.shardingsphere.infra.metadata.schema.event;
+
+import lombok.Getter;
+import lombok.RequiredArgsConstructor;
+import org.apache.shardingsphere.infra.metadata.schema.ShardingSphereSchema;
+
+/**
+ * Alter schema event.
+ */
+@RequiredArgsConstructor
+@Getter
+public final class AlterSchemaEvent {
+
+ private final String databaseName;
+
+ private final String schemaName;
+
+ private final String renameSchemaName;
+
+ private final ShardingSphereSchema schema;
+}
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 69b73039733..e7a0d96b315 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
@@ -61,7 +61,6 @@ public final class CreateViewStatementSchemaRefresher implements MetaDataRefresh
metaData.getSchemaByName(schemaName).put(viewName, viewMetaData);
database.put(schemaName, viewMetaData);
optimizerPlanners.put(database.getName(), OptimizerPlannerContextFactory.create(database));
- // TODO Get real schema name
SchemaAlteredEvent event = new SchemaAlteredEvent(metaData.getDatabaseName(), schemaName);
event.getAlteredTables().add(viewMetaData);
ShardingSphereEventBus.getInstance().post(event);
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 d8cd577b23a..d1466c50772 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
@@ -42,9 +42,11 @@ public final class DropSchemaStatementSchemaRefresher implements MetaDataRefresh
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 {
sqlStatement.getSchemaNames().forEach(each -> {
+ metaData.getSchemas().remove(each);
database.remove(each);
optimizerPlanners.put(database.getName(), OptimizerPlannerContextFactory.create(database));
});
+ // TODO remove tables for SingleTableRule
ShardingSphereEventBus.getInstance().post(new DropSchemaEvent(metaData.getDatabaseName(), sqlStatement.getSchemaNames()));
}
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/RenameSchemaStatementSchemaRefresher.java
similarity index 51%
copy from shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/refresher/type/DropSchemaStatementSchemaRefresher.java
copy to shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/refresher/type/RenameSchemaStatementSchemaRefresher.java
index d8cd577b23a..295d07e7679 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/RenameSchemaStatementSchemaRefresher.java
@@ -23,29 +23,45 @@ 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.event.DropSchemaEvent;
-import org.apache.shardingsphere.sql.parser.sql.common.statement.ddl.DropSchemaStatement;
+import org.apache.shardingsphere.infra.metadata.schema.ShardingSphereSchema;
+import org.apache.shardingsphere.infra.metadata.schema.event.AlterSchemaEvent;
+import org.apache.shardingsphere.sql.parser.sql.common.statement.ddl.AlterSchemaStatement;
+import org.apache.shardingsphere.sql.parser.sql.dialect.statement.opengauss.ddl.OpenGaussAlterSchemaStatement;
+import org.apache.shardingsphere.sql.parser.sql.dialect.statement.postgresql.ddl.PostgreSQLAlterSchemaStatement;
import java.sql.SQLException;
import java.util.Collection;
import java.util.Map;
+import java.util.Optional;
/**
- * Schema refresher for drop schema statement.
+ * Schema refresher for rename schema statement.
*/
-public final class DropSchemaStatementSchemaRefresher implements MetaDataRefresher<DropSchemaStatement> {
+public final class RenameSchemaStatementSchemaRefresher implements MetaDataRefresher<AlterSchemaStatement> {
- private static final String TYPE = DropSchemaStatement.class.getName();
+ private static final String TYPE = AlterSchemaStatement.class.getName();
@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 {
- sqlStatement.getSchemaNames().forEach(each -> {
- database.remove(each);
+ final Collection<String> logicDataSourceNames, final String schemaName, final AlterSchemaStatement sqlStatement, final ConfigurationProperties props) throws SQLException {
+ Optional<String> renameSchemaName = sqlStatement instanceof PostgreSQLAlterSchemaStatement ? ((PostgreSQLAlterSchemaStatement) sqlStatement).getRenameSchema()
+ : ((OpenGaussAlterSchemaStatement) sqlStatement).getRenameSchema();
+ if (!renameSchemaName.isPresent()) {
+ return;
+ }
+ Optional<FederationSchemaMetaData> schemaMetadata = database.getSchemaMetadata(sqlStatement.getSchemaName());
+ if (schemaMetadata.isPresent()) {
+ database.remove(sqlStatement.getSchemaName());
+ database.put(renameSchemaName.get(), schemaMetadata.get());
optimizerPlanners.put(database.getName(), OptimizerPlannerContextFactory.create(database));
- });
- ShardingSphereEventBus.getInstance().post(new DropSchemaEvent(metaData.getDatabaseName(), sqlStatement.getSchemaNames()));
+ AlterSchemaEvent event = new AlterSchemaEvent(metaData.getDatabaseName(), sqlStatement.getSchemaName(), renameSchemaName.get(),
+ new ShardingSphereSchema(metaData.getSchemaByName(sqlStatement.getSchemaName()).getTables()));
+ metaData.getSchemas().remove(sqlStatement.getSchemaName());
+ ShardingSphereEventBus.getInstance().post(event);
+ // TODO Maybe need to refresh tables for SingleTableRule
+ }
}
@Override
diff --git a/shardingsphere-infra/shardingsphere-infra-context/src/main/resources/META-INF/services/org.apache.shardingsphere.infra.context.refresher.MetaDataRefresher b/shardingsphere-infra/shardingsphere-infra-context/src/main/resources/META-INF/services/org.apache.shardingsphere.infra.context.refresher.MetaDataRefresher
index a7c60315c22..a69262599f6 100644
--- a/shardingsphere-infra/shardingsphere-infra-context/src/main/resources/META-INF/services/org.apache.shardingsphere.infra.context.refresher.MetaDataRefresher
+++ b/shardingsphere-infra/shardingsphere-infra-context/src/main/resources/META-INF/services/org.apache.shardingsphere.infra.context.refresher.MetaDataRefresher
@@ -26,4 +26,5 @@ org.apache.shardingsphere.infra.context.refresher.type.DropIndexStatementSchemaR
org.apache.shardingsphere.infra.context.refresher.type.DropSchemaStatementSchemaRefresher
org.apache.shardingsphere.infra.context.refresher.type.DropTableStatementSchemaRefresher
org.apache.shardingsphere.infra.context.refresher.type.DropViewStatementSchemaRefresher
+org.apache.shardingsphere.infra.context.refresher.type.RenameSchemaStatementSchemaRefresher
org.apache.shardingsphere.infra.context.refresher.type.RenameTableStatementSchemaRefresher
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 d6802657640..6c9d4760351 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
@@ -24,6 +24,7 @@ import org.apache.shardingsphere.infra.metadata.schema.model.TableMetaData;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Map.Entry;
+import java.util.Optional;
import java.util.concurrent.ConcurrentHashMap;
/**
@@ -44,6 +45,16 @@ public final class FederationDatabaseMetaData {
}
}
+ /**
+ * Put schema meta data.
+ *
+ * @param schemaName schema name
+ * @param schemaMetaData schema metadata
+ */
+ public void put(final String schemaName, final FederationSchemaMetaData schemaMetaData) {
+ schemas.put(schemaName, schemaMetaData);
+ }
+
/**
* Add table meta data.
*
@@ -60,6 +71,17 @@ public final class FederationDatabaseMetaData {
}
}
+ /**
+ * Get table meta data.
+ *
+ * @param schemaName schema name
+ *
+ * @return FederationSchemaMetaData schema meta data
+ */
+ public Optional<FederationSchemaMetaData> getSchemaMetadata(final String schemaName) {
+ return Optional.of(schemas.get(schemaName));
+ }
+
/**
* Remove table meta data.
*
diff --git a/shardingsphere-mode/shardingsphere-mode-type/shardingsphere-cluster-mode/shardingsphere-cluster-mode-core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/registry/metadata/subscriber/SchemaMetaDataRegistrySubscriber.java b/shardingsphere-mode/shardingsphere-mode-type/shardingsphere-cluster-mode/shardingsphere-cluster-mode-core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/registry/metadata/subscriber/SchemaMetaDataRegistrySu [...]
index c5001be189c..1ae74ad8deb 100644
--- a/shardingsphere-mode/shardingsphere-mode-type/shardingsphere-cluster-mode/shardingsphere-cluster-mode-core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/registry/metadata/subscriber/SchemaMetaDataRegistrySubscriber.java
+++ b/shardingsphere-mode/shardingsphere-mode-type/shardingsphere-cluster-mode/shardingsphere-cluster-mode-core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/registry/metadata/subscriber/SchemaMetaDataRegistrySubscriber.java
@@ -19,6 +19,7 @@ package org.apache.shardingsphere.mode.manager.cluster.coordinator.registry.meta
import com.google.common.eventbus.Subscribe;
import org.apache.shardingsphere.infra.metadata.schema.event.AddSchemaEvent;
+import org.apache.shardingsphere.infra.metadata.schema.event.AlterSchemaEvent;
import org.apache.shardingsphere.infra.metadata.schema.event.DropSchemaEvent;
import org.apache.shardingsphere.mode.repository.cluster.ClusterPersistRepository;
import org.apache.shardingsphere.mode.metadata.persist.service.SchemaMetaDataPersistService;
@@ -58,6 +59,17 @@ public final class SchemaMetaDataRegistrySubscriber {
persistService.persistSchema(event.getDatabaseName(), event.getSchemaName());
}
+ /**
+ * Alter schema.
+ *
+ * @param event schema alter event
+ */
+ @Subscribe
+ public void alterSchema(final AlterSchemaEvent event) {
+ persistService.deleteSchema(event.getDatabaseName(), event.getSchemaName());
+ persistService.persistTables(event.getDatabaseName(), event.getRenameSchemaName(), event.getSchema());
+ }
+
/**
* Drop schema.
*
diff --git a/shardingsphere-mode/shardingsphere-mode-type/shardingsphere-cluster-mode/shardingsphere-cluster-mode-core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/registry/metadata/subscriber/SchemaMetaDataRegistrySubscriberTest.java b/shardingsphere-mode/shardingsphere-mode-type/shardingsphere-cluster-mode/shardingsphere-cluster-mode-core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/registry/metadata/subscriber/SchemaMetaDataRegist [...]
index d8055c9a22f..794b0802585 100644
--- a/shardingsphere-mode/shardingsphere-mode-type/shardingsphere-cluster-mode/shardingsphere-cluster-mode-core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/registry/metadata/subscriber/SchemaMetaDataRegistrySubscriberTest.java
+++ b/shardingsphere-mode/shardingsphere-mode-type/shardingsphere-cluster-mode/shardingsphere-cluster-mode-core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/registry/metadata/subscriber/SchemaMetaDataRegistrySubscriberTest.java
@@ -17,7 +17,9 @@
package org.apache.shardingsphere.mode.manager.cluster.coordinator.registry.metadata.subscriber;
+import org.apache.shardingsphere.infra.metadata.schema.ShardingSphereSchema;
import org.apache.shardingsphere.infra.metadata.schema.event.AddSchemaEvent;
+import org.apache.shardingsphere.infra.metadata.schema.event.AlterSchemaEvent;
import org.apache.shardingsphere.infra.metadata.schema.event.DropSchemaEvent;
import org.apache.shardingsphere.infra.metadata.schema.event.SchemaAlteredEvent;
import org.apache.shardingsphere.infra.metadata.schema.model.TableMetaData;
@@ -75,4 +77,13 @@ public final class SchemaMetaDataRegistrySubscriberTest {
schemaMetaDataRegistrySubscriber.dropSchema(event);
verify(persistService).deleteSchema("foo_db", "foo_schema");
}
+
+ @Test
+ public void assertAlterSchemaEvent() {
+ ShardingSphereSchema schema = new ShardingSphereSchema();
+ AlterSchemaEvent event = new AlterSchemaEvent("foo_db", "foo_schema", "new_foo_schema", schema);
+ schemaMetaDataRegistrySubscriber.alterSchema(event);
+ verify(persistService).deleteSchema("foo_db", "foo_schema");
+ verify(persistService).persistTables("foo_db", "new_foo_schema", schema);
+ }
}