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