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/03 08:15:53 UTC

[shardingsphere] branch master updated: fix schema metadata lost when execute alter schema rename to statement (#17292)

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 62d21a1331c fix schema metadata lost when execute alter schema rename to statement (#17292)
62d21a1331c is described below

commit 62d21a1331ce5c05b691b0d5fed0d2a3af4ec8bb
Author: Zhengqiang Duan <du...@apache.org>
AuthorDate: Tue May 3 16:15:38 2022 +0800

    fix schema metadata lost when execute alter schema rename to statement (#17292)
---
 ...va => AlterSchemaStatementSchemaRefresher.java} | 43 ++++++++++++----------
 ...phere.infra.context.refresher.MetaDataRefresher |  2 +-
 .../SchemaMetaDataRegistrySubscriber.java          | 12 ++++--
 .../SchemaMetaDataRegistrySubscriberTest.java      | 14 ++++++-
 4 files changed, 45 insertions(+), 26 deletions(-)

diff --git a/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/refresher/type/RenameSchemaStatementSchemaRefresher.java b/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/refresher/type/AlterSchemaStatementSchemaRefresher.java
similarity index 55%
rename from shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/refresher/type/RenameSchemaStatementSchemaRefresher.java
rename to shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/refresher/type/AlterSchemaStatementSchemaRefresher.java
index 295d07e7679..1ddfb0a6dd6 100644
--- a/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/refresher/type/RenameSchemaStatementSchemaRefresher.java
+++ b/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/refresher/type/AlterSchemaStatementSchemaRefresher.java
@@ -23,13 +23,10 @@ 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.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 org.apache.shardingsphere.sql.parser.sql.dialect.handler.ddl.AlterSchemaStatementHandler;
 
 import java.sql.SQLException;
 import java.util.Collection;
@@ -37,31 +34,39 @@ import java.util.Map;
 import java.util.Optional;
 
 /**
- * Schema refresher for rename schema statement.
+ * Schema refresher for alter schema statement.
  */
-public final class RenameSchemaStatementSchemaRefresher implements MetaDataRefresher<AlterSchemaStatement> {
+public final class AlterSchemaStatementSchemaRefresher implements MetaDataRefresher<AlterSchemaStatement> {
     
     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 AlterSchemaStatement sqlStatement, final ConfigurationProperties props) throws SQLException {
-        Optional<String> renameSchemaName = sqlStatement instanceof PostgreSQLAlterSchemaStatement ? ((PostgreSQLAlterSchemaStatement) sqlStatement).getRenameSchema()
-                : ((OpenGaussAlterSchemaStatement) sqlStatement).getRenameSchema();
+        Optional<String> renameSchemaName = AlterSchemaStatementHandler.getRenameSchema(sqlStatement);
         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));
-            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
-        }
+        String actualSchemaName = sqlStatement.getSchemaName();
+        putSchemaMetaData(metaData, database, optimizerPlanners, actualSchemaName, renameSchemaName.get());
+        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);
+        optimizerPlanners.put(database.getName(), OptimizerPlannerContextFactory.create(database));
+    }
+    
+    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));
+        optimizerPlanners.put(database.getName(), OptimizerPlannerContextFactory.create(database));
     }
     
     @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 a69262599f6..388eef060dd 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,5 +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.AlterSchemaStatementSchemaRefresher
 org.apache.shardingsphere.infra.context.refresher.type.RenameTableStatementSchemaRefresher
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 976d52b3e5c..2474b651f65 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
@@ -18,13 +18,13 @@
 package org.apache.shardingsphere.mode.manager.cluster.coordinator.registry.metadata.subscriber;
 
 import com.google.common.eventbus.Subscribe;
+import org.apache.shardingsphere.infra.eventbus.ShardingSphereEventBus;
 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;
-import org.apache.shardingsphere.infra.eventbus.ShardingSphereEventBus;
 import org.apache.shardingsphere.infra.metadata.schema.event.SchemaAlteredEvent;
+import org.apache.shardingsphere.mode.metadata.persist.service.SchemaMetaDataPersistService;
+import org.apache.shardingsphere.mode.repository.cluster.ClusterPersistRepository;
 
 /**
  * Schema meta data registry subscriber.
@@ -66,7 +66,11 @@ public final class SchemaMetaDataRegistrySubscriber {
      */
     @Subscribe
     public void alterSchema(final AlterSchemaEvent event) {
-        persistService.persistTables(event.getDatabaseName(), event.getRenameSchemaName(), event.getSchema());
+        if (event.getSchema().getTables().isEmpty()) {
+            persistService.persistSchema(event.getDatabaseName(), event.getRenameSchemaName());
+        } else {
+            persistService.persistTables(event.getDatabaseName(), event.getRenameSchemaName(), event.getSchema());
+        }
         persistService.deleteSchema(event.getDatabaseName(), event.getSchemaName());
     }
     
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 794b0802585..0e3cc19a039 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
@@ -33,6 +33,7 @@ import org.mockito.junit.MockitoJUnitRunner;
 
 import java.lang.reflect.Field;
 import java.util.Arrays;
+import java.util.Collections;
 
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.verify;
@@ -79,11 +80,20 @@ public final class SchemaMetaDataRegistrySubscriberTest {
     }
     
     @Test
-    public void assertAlterSchemaEvent() {
-        ShardingSphereSchema schema = new ShardingSphereSchema();
+    public void assertAlterSchemaEventWhenContainsTable() {
+        ShardingSphereSchema schema = new ShardingSphereSchema(Collections.singletonMap("t_order", new TableMetaData()));
         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);
     }
+    
+    @Test
+    public void assertAlterSchemaEventWhenNotContainsTable() {
+        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).persistSchema("foo_db", "new_foo_schema");
+    }
 }