This is an automated email from the ASF dual-hosted git repository.

menghaoranss 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 629aa18e9f4 Refactor metadata reload flow and fix related tests 
(#38690)
629aa18e9f4 is described below

commit 629aa18e9f4b97ff3bed14fcc035f367436233e0
Author: Haoran Meng <[email protected]>
AuthorDate: Thu May 14 09:34:09 2026 +0800

    Refactor metadata reload flow and fix related tests (#38690)
---
 .../mode/manager/ContextManager.java               |  2 +-
 .../metadata/factory/MetaDataContextsFactory.java  | 74 +++++++++++-----------
 .../manager/resource/StorageUnitManager.java       | 10 +--
 .../rule/DatabaseRuleConfigurationManager.java     |  2 +-
 .../mode/manager/ContextManagerTest.java           |  4 +-
 .../factory/MetaDataContextsFactoryTest.java       |  9 +--
 .../manager/resource/StorageUnitManagerTest.java   |  6 +-
 .../rule/DatabaseRuleConfigurationManagerTest.java | 43 ++++++++-----
 .../ClusterMetaDataManagerPersistService.java      | 27 ++++++--
 .../ClusterMetaDataManagerPersistServiceTest.java  | 14 +++-
 .../StandaloneMetaDataManagerPersistService.java   | 41 ++++++++++--
 ...tandaloneMetaDataManagerPersistServiceTest.java | 30 +++++++--
 12 files changed, 175 insertions(+), 87 deletions(-)

diff --git 
a/mode/core/src/main/java/org/apache/shardingsphere/mode/manager/ContextManager.java
 
b/mode/core/src/main/java/org/apache/shardingsphere/mode/manager/ContextManager.java
index a0c59c67756..ea8ab8f2cd3 100644
--- 
a/mode/core/src/main/java/org/apache/shardingsphere/mode/manager/ContextManager.java
+++ 
b/mode/core/src/main/java/org/apache/shardingsphere/mode/manager/ContextManager.java
@@ -159,7 +159,7 @@ public final class ContextManager implements AutoCloseable {
                 
metaDataContextManager.getResourceSwitchManager().switchByAlterStorageUnit(database.getResourceMetaData(),
 dataSourcePoolProps, isInstanceConnectionEnabled);
         Collection<RuleConfiguration> ruleConfigs = 
persistServiceFacade.getMetaDataFacade().getDatabaseRuleService().load(database.getName());
         ShardingSphereDatabase changedDatabase = new 
MetaDataContextsFactory(persistServiceFacade.getMetaDataFacade(), 
computeNodeInstanceContext)
-                .createChangedDatabase(database.getName(), false, 
switchingResource, ruleConfigs, metaDataContexts);
+                .createChangedDatabaseByRebuild(database.getName(), 
switchingResource, ruleConfigs, metaDataContexts);
         metaDataContexts.getMetaData().putDatabase(changedDatabase);
         ConfigurationProperties props = new 
ConfigurationProperties(persistServiceFacade.getMetaDataFacade().getPropsService().load());
         Collection<RuleConfiguration> globalRuleConfigs = 
persistServiceFacade.getMetaDataFacade().getGlobalRuleService().load();
diff --git 
a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/factory/MetaDataContextsFactory.java
 
b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/factory/MetaDataContextsFactory.java
index 7e9cae3b908..f5e7b8671fd 100644
--- 
a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/factory/MetaDataContextsFactory.java
+++ 
b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/factory/MetaDataContextsFactory.java
@@ -88,15 +88,13 @@ public final class MetaDataContextsFactory {
      * Create meta data contexts by switch resource.
      *
      * @param databaseName database name
-     * @param isLoadSchemasFromRegisterCenter is load schemas from register 
center or not
      * @param switchingResource switching resource
      * @param originalMetaDataContexts original meta data contexts
      * @return meta data contexts
-     * @throws SQLException SQL exception
      */
-    public MetaDataContexts createBySwitchResource(final String databaseName, 
final boolean isLoadSchemasFromRegisterCenter,
-                                                   final SwitchingResource 
switchingResource, final MetaDataContexts originalMetaDataContexts) throws 
SQLException {
-        ShardingSphereDatabase changedDatabase = 
createChangedDatabase(databaseName, isLoadSchemasFromRegisterCenter, 
switchingResource, null, originalMetaDataContexts);
+    public MetaDataContexts createBySwitchResource(final String databaseName, 
final SwitchingResource switchingResource,
+                                                   final MetaDataContexts 
originalMetaDataContexts) {
+        ShardingSphereDatabase changedDatabase = 
createChangedDatabase(databaseName, switchingResource, null, 
originalMetaDataContexts);
         ConfigurationProperties props = 
originalMetaDataContexts.getMetaData().getProps();
         ShardingSphereMetaData clonedMetaData = 
cloneMetaData(originalMetaDataContexts.getMetaData(), changedDatabase);
         RuleMetaData changedGlobalMetaData = new RuleMetaData(
@@ -111,15 +109,13 @@ public final class MetaDataContextsFactory {
      * Create meta data contexts by alter rule.
      *
      * @param databaseName database name
-     * @param isLoadSchemasFromRegisterCenter is load schemas from register 
center or not
      * @param ruleConfigs rule configs
      * @param originalMetaDataContexts original meta data contexts
      * @return meta data contexts
-     * @throws SQLException SQL exception
      */
-    public MetaDataContexts createByAlterRule(final String databaseName, final 
boolean isLoadSchemasFromRegisterCenter,
-                                              final 
Collection<RuleConfiguration> ruleConfigs, final MetaDataContexts 
originalMetaDataContexts) throws SQLException {
-        ShardingSphereDatabase changedDatabase = 
createChangedDatabase(databaseName, isLoadSchemasFromRegisterCenter, null, 
ruleConfigs, originalMetaDataContexts);
+    public MetaDataContexts createByAlterRule(final String databaseName, final 
Collection<RuleConfiguration> ruleConfigs,
+                                              final MetaDataContexts 
originalMetaDataContexts) {
+        ShardingSphereDatabase changedDatabase = 
createChangedDatabase(databaseName, null, ruleConfigs, 
originalMetaDataContexts);
         ShardingSphereMetaData clonedMetaData = 
cloneMetaData(originalMetaDataContexts.getMetaData(), changedDatabase);
         ConfigurationProperties props = 
originalMetaDataContexts.getMetaData().getProps();
         RuleMetaData changedGlobalMetaData = new RuleMetaData(
@@ -138,40 +134,20 @@ public final class MetaDataContextsFactory {
         return result;
     }
     
-    /**
-     * Create changed database.
-     *
-     * @param databaseName database name
-     * @param isLoadSchemasFromRegisterCenter is load schemas from register 
center or not
-     * @param switchingResource switching resource
-     * @param ruleConfigs rule configurations
-     * @param originalMetaDataContext original meta data contexts
-     * @return changed database
-     * @throws SQLException SQL exception
-     */
-    public ShardingSphereDatabase createChangedDatabase(final String 
databaseName, final boolean isLoadSchemasFromRegisterCenter,
-                                                        final 
SwitchingResource switchingResource, final Collection<RuleConfiguration> 
ruleConfigs,
-                                                        final MetaDataContexts 
originalMetaDataContext) throws SQLException {
+    private ShardingSphereDatabase createChangedDatabase(final String 
databaseName, final SwitchingResource switchingResource, final 
Collection<RuleConfiguration> ruleConfigs,
+                                                         final 
MetaDataContexts originalMetaDataContext) {
         ShardingSphereDatabase database = 
originalMetaDataContext.getMetaData().getDatabase(databaseName);
         ResourceMetaData effectiveResourceMetaData = 
getEffectiveResourceMetaData(database, switchingResource);
         Collection<RuleConfiguration> toBeCreatedRuleConfigs = null == 
ruleConfigs ? database.getRuleMetaData().getConfigurations() : ruleConfigs;
         DatabaseConfiguration toBeCreatedDatabaseConfig = 
getDatabaseConfiguration(effectiveResourceMetaData, switchingResource, 
toBeCreatedRuleConfigs, originalMetaDataContext);
-        return createChangedDatabase(database.getName(), 
isLoadSchemasFromRegisterCenter, toBeCreatedDatabaseConfig, 
originalMetaDataContext);
+        return createChangedDatabaseByLoad(database.getName(), 
toBeCreatedDatabaseConfig, originalMetaDataContext);
     }
     
-    private ShardingSphereDatabase createChangedDatabase(final String 
databaseName, final boolean isLoadSchemasFromRegisterCenter, final 
DatabaseConfiguration databaseConfig,
-                                                         final 
MetaDataContexts originalMetaDataContext) throws SQLException {
+    private ShardingSphereDatabase createChangedDatabaseByLoad(final String 
databaseName, final DatabaseConfiguration databaseConfig, final 
MetaDataContexts originalMetaDataContext) {
         ConfigurationProperties props = 
originalMetaDataContext.getMetaData().getProps();
         DatabaseType protocolType = 
DatabaseTypeEngine.getProtocolType(databaseConfig, props);
-        return isLoadSchemasFromRegisterCenter
-                ? createFromRegisterCenter(databaseName, protocolType, 
databaseConfig, originalMetaDataContext)
-                : ShardingSphereDatabaseFactory.create(databaseName, 
protocolType, databaseConfig, props, instanceContext);
-    }
-    
-    private ShardingSphereDatabase createFromRegisterCenter(final String 
databaseName, final DatabaseType protocolType, final DatabaseConfiguration 
databaseConfig,
-                                                            final 
MetaDataContexts originalMetaDataContext) {
         Collection<ShardingSphereSchema> schemas = 
persistFacade.getDatabaseMetaDataFacade().getSchema().load(databaseName, 
protocolType);
-        boolean persistSchemasEnabled = 
originalMetaDataContext.getMetaData().getProps().getValue(ConfigurationPropertyKey.PERSIST_SCHEMAS_TO_REPOSITORY_ENABLED);
+        boolean persistSchemasEnabled = 
props.getValue(ConfigurationPropertyKey.PERSIST_SCHEMAS_TO_REPOSITORY_ENABLED);
         if (!persistSchemasEnabled) {
             for (ShardingSphereSchema schema : schemas) {
                 if 
(originalMetaDataContext.getMetaData().getDatabase(databaseName).containsSchema(schema.getName()))
 {
@@ -180,7 +156,33 @@ public final class MetaDataContextsFactory {
                 }
             }
         }
-        return ShardingSphereDatabaseFactory.create(databaseName, 
protocolType, databaseConfig, originalMetaDataContext.getMetaData().getProps(), 
instanceContext, schemas);
+        return ShardingSphereDatabaseFactory.create(databaseName, 
protocolType, databaseConfig, props, instanceContext, schemas);
+    }
+    
+    /**
+     * Create changed database by reloading schema from data sources.
+     *
+     * @param databaseName database name
+     * @param switchingResource switching resource
+     * @param ruleConfigs rule configurations
+     * @param originalMetaDataContext original meta data contexts
+     * @return changed database
+     * @throws SQLException SQL exception
+     */
+    public ShardingSphereDatabase createChangedDatabaseByRebuild(final String 
databaseName, final SwitchingResource switchingResource, final 
Collection<RuleConfiguration> ruleConfigs,
+                                                                 final 
MetaDataContexts originalMetaDataContext) throws SQLException {
+        ShardingSphereDatabase database = 
originalMetaDataContext.getMetaData().getDatabase(databaseName);
+        ResourceMetaData effectiveResourceMetaData = 
getEffectiveResourceMetaData(database, switchingResource);
+        Collection<RuleConfiguration> toBeCreatedRuleConfigs = null == 
ruleConfigs ? database.getRuleMetaData().getConfigurations() : ruleConfigs;
+        DatabaseConfiguration toBeCreatedDatabaseConfig = 
getDatabaseConfiguration(effectiveResourceMetaData, switchingResource, 
toBeCreatedRuleConfigs, originalMetaDataContext);
+        return createChangedDatabaseByRebuild(databaseName, 
toBeCreatedDatabaseConfig, originalMetaDataContext);
+    }
+    
+    private ShardingSphereDatabase createChangedDatabaseByRebuild(final String 
databaseName, final DatabaseConfiguration databaseConfig,
+                                                                  final 
MetaDataContexts originalMetaDataContext) throws SQLException {
+        ConfigurationProperties props = 
originalMetaDataContext.getMetaData().getProps();
+        DatabaseType protocolType = 
DatabaseTypeEngine.getProtocolType(databaseConfig, props);
+        return ShardingSphereDatabaseFactory.create(databaseName, 
protocolType, databaseConfig, props, instanceContext);
     }
     
     private ResourceMetaData getEffectiveResourceMetaData(final 
ShardingSphereDatabase database, final SwitchingResource switchingResource) {
diff --git 
a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/manager/resource/StorageUnitManager.java
 
b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/manager/resource/StorageUnitManager.java
index d2f1b21c3d7..77960a37d30 100644
--- 
a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/manager/resource/StorageUnitManager.java
+++ 
b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/manager/resource/StorageUnitManager.java
@@ -64,7 +64,7 @@ public final class StorageUnitManager {
             closeStaleRules(database);
             boolean isInstanceConnectionEnabled = 
metaDataContexts.getMetaData().getTemporaryProps().<Boolean>getValue(TemporaryConfigurationPropertyKey.INSTANCE_CONNECTION_ENABLED);
             SwitchingResource switchingResource = 
resourceSwitchManager.switchByRegisterStorageUnit(database.getResourceMetaData(),
 propsMap, isInstanceConnectionEnabled);
-            buildNewMetaDataContext(databaseName, switchingResource, true);
+            buildNewMetaDataContext(databaseName, switchingResource);
         } catch (final SQLException ex) {
             log.error("Alter database: {} register storage unit failed.", 
databaseName, ex);
         }
@@ -82,7 +82,7 @@ public final class StorageUnitManager {
             closeStaleRules(database);
             boolean isInstanceConnectionEnabled = 
metaDataContexts.getMetaData().getTemporaryProps().<Boolean>getValue(TemporaryConfigurationPropertyKey.INSTANCE_CONNECTION_ENABLED);
             SwitchingResource switchingResource = 
resourceSwitchManager.switchByAlterStorageUnit(database.getResourceMetaData(), 
propsMap, isInstanceConnectionEnabled);
-            buildNewMetaDataContext(databaseName, switchingResource, true);
+            buildNewMetaDataContext(databaseName, switchingResource);
         } catch (final SQLException ex) {
             log.error("Alter database: {} alter storage unit failed.", 
databaseName, ex);
         }
@@ -99,15 +99,15 @@ public final class StorageUnitManager {
         try {
             closeStaleRules(database);
             SwitchingResource switchingResource = 
resourceSwitchManager.switchByUnregisterStorageUnit(database.getResourceMetaData(),
 Collections.singleton(storageUnitName));
-            buildNewMetaDataContext(databaseName, switchingResource, false);
+            buildNewMetaDataContext(databaseName, switchingResource);
         } catch (final SQLException ex) {
             log.error("Alter database: {} register storage unit failed.", 
databaseName, ex);
         }
     }
     
-    private void buildNewMetaDataContext(final String databaseName, final 
SwitchingResource switchingResource, final boolean 
isLoadSchemasFromRegisterCenter) throws SQLException {
+    private void buildNewMetaDataContext(final String databaseName, final 
SwitchingResource switchingResource) throws SQLException {
         MetaDataContexts reloadMetaDataContexts = new 
MetaDataContextsFactory(metaDataPersistFacade, 
computeNodeInstanceContext).createBySwitchResource(
-                databaseName, isLoadSchemasFromRegisterCenter, 
switchingResource, metaDataContexts);
+                databaseName, switchingResource, metaDataContexts);
         metaDataContexts.update(reloadMetaDataContexts);
         
metaDataContexts.getMetaData().putDatabase(buildDatabase(reloadMetaDataContexts.getMetaData().getDatabase(databaseName),
 reloadMetaDataContexts.getMetaData().getProps()));
         switchingResource.closeStaleDataSources();
diff --git 
a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/manager/rule/DatabaseRuleConfigurationManager.java
 
b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/manager/rule/DatabaseRuleConfigurationManager.java
index b02dad93211..a591d870b6f 100644
--- 
a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/manager/rule/DatabaseRuleConfigurationManager.java
+++ 
b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/manager/rule/DatabaseRuleConfigurationManager.java
@@ -93,7 +93,7 @@ public final class DatabaseRuleConfigurationManager {
     }
     
     private void refreshMetadata(final String databaseName, final 
Collection<RuleConfiguration> ruleConfigs, final Collection<ShardingSphereRule> 
toBeRemovedRules) throws SQLException {
-        metaDataContexts.update(new 
MetaDataContextsFactory(metaDataPersistFacade, 
computeNodeInstanceContext).createByAlterRule(databaseName, false, ruleConfigs, 
metaDataContexts));
+        metaDataContexts.update(new 
MetaDataContextsFactory(metaDataPersistFacade, 
computeNodeInstanceContext).createByAlterRule(databaseName, ruleConfigs, 
metaDataContexts));
         closeOriginalRules(toBeRemovedRules);
     }
     
diff --git 
a/mode/core/src/test/java/org/apache/shardingsphere/mode/manager/ContextManagerTest.java
 
b/mode/core/src/test/java/org/apache/shardingsphere/mode/manager/ContextManagerTest.java
index 8aa4128c616..7a32dd8f910 100644
--- 
a/mode/core/src/test/java/org/apache/shardingsphere/mode/manager/ContextManagerTest.java
+++ 
b/mode/core/src/test/java/org/apache/shardingsphere/mode/manager/ContextManagerTest.java
@@ -200,7 +200,7 @@ class ContextManagerTest {
                 MockedStatic<GlobalRulesBuilder> globalRulesBuilder = 
mockStatic(GlobalRulesBuilder.class);
                 MockedStatic<ShardingSphereStatisticsFactory> 
statisticsFactory = mockStatic(ShardingSphereStatisticsFactory.class);
                 MockedConstruction<MetaDataContextsFactory> ignored = 
mockConstruction(MetaDataContextsFactory.class,
-                        (mock, context) -> 
when(mock.createChangedDatabase("foo_db", false, switchingResource, 
Collections.emptyList(), metaDataContexts)).thenReturn(database))) {
+                        (mock, context) -> 
when(mock.createChangedDatabaseByRebuild("foo_db", switchingResource, 
Collections.emptyList(), metaDataContexts)).thenReturn(database))) {
             genericSchemaManager.when(() -> 
GenericSchemaManager.getToBeDroppedSchemaNames(any(ShardingSphereDatabase.class),
 any(ShardingSphereDatabase.class)))
                     .thenReturn(Collections.singleton("foo_schema"));
             globalRulesBuilder.when(() -> 
GlobalRulesBuilder.buildRules(anyCollection(), anyCollection(), 
any(ConfigurationProperties.class))).thenReturn(Collections.emptyList());
@@ -220,7 +220,7 @@ class ContextManagerTest {
         setMetaDataContextManager(metaDataContextManager);
         try (
                 MockedConstruction<MetaDataContextsFactory> ignored = 
mockConstruction(MetaDataContextsFactory.class,
-                        (mock, context) -> 
when(mock.createChangedDatabase("foo_db", false, switchingResource, 
Collections.emptyList(), metaDataContexts)).thenThrow(SQLException.class))) {
+                        (mock, context) -> 
when(mock.createChangedDatabaseByRebuild("foo_db", switchingResource, 
Collections.emptyList(), metaDataContexts)).thenThrow(SQLException.class))) {
             contextManager.reloadDatabase(database);
             verify(metaDataContexts, never()).update(any());
         }
diff --git 
a/mode/core/src/test/java/org/apache/shardingsphere/mode/metadata/factory/MetaDataContextsFactoryTest.java
 
b/mode/core/src/test/java/org/apache/shardingsphere/mode/metadata/factory/MetaDataContextsFactoryTest.java
index 59096a73e53..f4bfc1847b2 100644
--- 
a/mode/core/src/test/java/org/apache/shardingsphere/mode/metadata/factory/MetaDataContextsFactoryTest.java
+++ 
b/mode/core/src/test/java/org/apache/shardingsphere/mode/metadata/factory/MetaDataContextsFactoryTest.java
@@ -118,6 +118,7 @@ class MetaDataContextsFactoryTest {
         
when(DatabaseTypeEngine.getProtocolType(any(DatabaseConfiguration.class), 
any(ConfigurationProperties.class))).thenReturn(databaseType);
         when(DatabaseTypeFactory.get(anyString())).thenReturn(databaseType);
         when(metaDataPersistFacade.getRepository()).thenReturn(repository);
+        
when(metaDataPersistFacade.getDatabaseMetaDataFacade().getSchema().load(anyString(),
 any(DatabaseType.class))).thenReturn(Collections.emptyList());
     }
     
     private ShardingSphereDatabase createDatabaseFromConfiguration(final 
String databaseName, final DatabaseType protocolType,
@@ -170,7 +171,7 @@ class MetaDataContextsFactoryTest {
         Map<StorageNode, DataSource> newDataSources = 
Collections.singletonMap(new StorageNode("new_ds"), new MockedDataSource());
         SwitchingResource switchingResource = new 
SwitchingResource(newDataSources, Collections.singletonMap(staleNode, new 
MockedDataSource()),
                 Collections.singleton("stale_ds"), 
createDataSourcePoolPropertiesMap("active_ds", "new_ds"));
-        MetaDataContexts actual = new 
MetaDataContextsFactory(metaDataPersistFacade, 
mock()).createBySwitchResource("foo_db", false, switchingResource, 
originalMetaDataContexts);
+        MetaDataContexts actual = new 
MetaDataContextsFactory(metaDataPersistFacade, 
mock()).createBySwitchResource("foo_db", switchingResource, 
originalMetaDataContexts);
         ResourceMetaData actualResourceMetaData = 
actual.getMetaData().getDatabase("foo_db").getResourceMetaData();
         
assertFalse(actualResourceMetaData.getDataSources().containsKey(staleNode));
         
assertTrue(actualResourceMetaData.getDataSources().containsKey(activeNode));
@@ -189,7 +190,7 @@ class MetaDataContextsFactoryTest {
                 new ResourceMetaData(Collections.emptyMap(), 
Collections.emptyMap()), new RuleMetaData(Collections.emptyList()), new 
ConfigurationProperties(new Properties()));
         MetaDataContexts originalMetaDataContexts = new 
MetaDataContexts(metaData, new ShardingSphereStatistics());
         SwitchingResource switchingResource = new 
SwitchingResource(Collections.emptyMap(), Collections.emptyMap(), 
Collections.emptyList(), createDataSourcePoolPropertiesMap("foo_ds"));
-        MetaDataContexts actual = new 
MetaDataContextsFactory(metaDataPersistFacade, 
mock()).createBySwitchResource("foo_db", false, switchingResource, 
originalMetaDataContexts);
+        MetaDataContexts actual = new 
MetaDataContextsFactory(metaDataPersistFacade, 
mock()).createBySwitchResource("foo_db", switchingResource, 
originalMetaDataContexts);
         ResourceMetaData actualResourceMetaData = 
actual.getMetaData().getDatabase("foo_db").getResourceMetaData();
         assertTrue(actualResourceMetaData.getDataSources().containsKey(new 
StorageNode("foo_ds")));
         
assertTrue(actualResourceMetaData.getStorageUnits().containsKey("foo_ds"));
@@ -207,7 +208,7 @@ class MetaDataContextsFactoryTest {
                 new ConfigurationProperties(PropertiesBuilder.build(new 
Property(ConfigurationPropertyKey.PERSIST_SCHEMAS_TO_REPOSITORY_ENABLED.getKey(),
 Boolean.FALSE.toString()))));
         MetaDataContexts originalMetaDataContexts = new 
MetaDataContexts(metaData, new ShardingSphereStatistics());
         MetaDataContexts actual = new 
MetaDataContextsFactory(metaDataPersistFacade, mock())
-                .createByAlterRule("foo_db", true, Collections.singleton(new 
MockedRuleConfiguration("alter_rule")), originalMetaDataContexts);
+                .createByAlterRule("foo_db", Collections.singleton(new 
MockedRuleConfiguration("alter_rule")), originalMetaDataContexts);
         ShardingSphereSchema mergedSchema = loadedSchemas.stream().filter(each 
-> 
"foo_schema".equals(each.getName())).findFirst().orElseThrow(IllegalStateException::new);
         assertThat(mergedSchema.getAllTables().size(), is(2));
         ShardingSphereSchema untouchedSchema = 
loadedSchemas.stream().filter(each -> 
"new_schema".equals(each.getName())).findFirst().orElseThrow(IllegalStateException::new);
@@ -226,7 +227,7 @@ class MetaDataContextsFactoryTest {
         Collection<ShardingSphereSchema> loadedSchemas = 
Collections.singleton(createSchemaWithTable("persisted_schema", 
"persisted_table"));
         
when(metaDataPersistFacade.getDatabaseMetaDataFacade().getSchema().load("foo_db",
 databaseType)).thenReturn(loadedSchemas);
         MetaDataContexts actual = new 
MetaDataContextsFactory(metaDataPersistFacade, mock())
-                .createByAlterRule("foo_db", true, Collections.singleton(new 
MockedRuleConfiguration("persist_rule")), originalMetaDataContexts);
+                .createByAlterRule("foo_db", Collections.singleton(new 
MockedRuleConfiguration("persist_rule")), originalMetaDataContexts);
         ShardingSphereSchema persistedSchema = loadedSchemas.iterator().next();
         assertThat(persistedSchema.getAllTables().size(), is(1));
         assertTrue(actual.getMetaData().containsDatabase("foo_db"));
diff --git 
a/mode/core/src/test/java/org/apache/shardingsphere/mode/metadata/manager/resource/StorageUnitManagerTest.java
 
b/mode/core/src/test/java/org/apache/shardingsphere/mode/metadata/manager/resource/StorageUnitManagerTest.java
index 115cd9839bb..3752909aa5a 100644
--- 
a/mode/core/src/test/java/org/apache/shardingsphere/mode/metadata/manager/resource/StorageUnitManagerTest.java
+++ 
b/mode/core/src/test/java/org/apache/shardingsphere/mode/metadata/manager/resource/StorageUnitManagerTest.java
@@ -74,7 +74,7 @@ class StorageUnitManagerTest {
         
when(reloadMetaDataContexts.getMetaData().getDatabase(DATABASE_NAME)).thenReturn(reloadDatabase);
         try (
                 MockedConstruction<MetaDataContextsFactory> ignored = 
mockConstruction(MetaDataContextsFactory.class,
-                        (mock, context) -> 
when(mock.createBySwitchResource(DATABASE_NAME, true, switchingResource, 
metaDataContexts)).thenReturn(reloadMetaDataContexts))) {
+                        (mock, context) -> 
when(mock.createBySwitchResource(DATABASE_NAME, switchingResource, 
metaDataContexts)).thenReturn(reloadMetaDataContexts))) {
             createManager(metaDataContexts, 
resourceSwitchManager).register(DATABASE_NAME, Collections.emptyMap());
         }
         verify(metaDataContexts).update(any(MetaDataContexts.class));
@@ -106,7 +106,7 @@ class StorageUnitManagerTest {
         
when(reloadDatabase.getAllSchemas()).thenReturn(Collections.singleton(new 
ShardingSphereSchema("foo_schema", mock(DatabaseType.class))));
         try (
                 MockedConstruction<MetaDataContextsFactory> ignored = 
mockConstruction(MetaDataContextsFactory.class,
-                        (mock, context) -> 
when(mock.createBySwitchResource(DATABASE_NAME, true, switchingResource, 
metaDataContexts)).thenReturn(reloadMetaDataContexts))) {
+                        (mock, context) -> 
when(mock.createBySwitchResource(DATABASE_NAME, switchingResource, 
metaDataContexts)).thenReturn(reloadMetaDataContexts))) {
             createManager(metaDataContexts, 
resourceSwitchManager).alter(DATABASE_NAME, Collections.emptyMap());
         }
         verify(metaDataContexts).update(any(MetaDataContexts.class));
@@ -137,7 +137,7 @@ class StorageUnitManagerTest {
         
when(reloadDatabase.getAllSchemas()).thenReturn(Collections.singleton(new 
ShardingSphereSchema("foo_schema", mock(DatabaseType.class))));
         try (
                 MockedConstruction<MetaDataContextsFactory> ignored = 
mockConstruction(MetaDataContextsFactory.class,
-                        (mock, context) -> 
when(mock.createBySwitchResource(DATABASE_NAME, false, switchingResource, 
metaDataContexts)).thenReturn(reloadMetaDataContexts))) {
+                        (mock, context) -> 
when(mock.createBySwitchResource(DATABASE_NAME, switchingResource, 
metaDataContexts)).thenReturn(reloadMetaDataContexts))) {
             createManager(metaDataContexts, 
resourceSwitchManager).unregister(DATABASE_NAME, "ds_0");
         }
         verify(metaDataContexts).update(any(MetaDataContexts.class));
diff --git 
a/mode/core/src/test/java/org/apache/shardingsphere/mode/metadata/manager/rule/DatabaseRuleConfigurationManagerTest.java
 
b/mode/core/src/test/java/org/apache/shardingsphere/mode/metadata/manager/rule/DatabaseRuleConfigurationManagerTest.java
index e33d3a43042..a8a40bfa1d6 100644
--- 
a/mode/core/src/test/java/org/apache/shardingsphere/mode/metadata/manager/rule/DatabaseRuleConfigurationManagerTest.java
+++ 
b/mode/core/src/test/java/org/apache/shardingsphere/mode/metadata/manager/rule/DatabaseRuleConfigurationManagerTest.java
@@ -76,10 +76,13 @@ class DatabaseRuleConfigurationManagerTest {
         
when(metaDataContexts.getMetaData().getDatabase(DATABASE_NAME).getRuleMetaData()).thenReturn(ruleMetaData);
         try (
                 MockedConstruction<MetaDataContextsFactory> ignored = 
mockConstruction(MetaDataContextsFactory.class,
-                        (mock, context) -> 
when(mock.createByAlterRule(eq(DATABASE_NAME), eq(false), 
any(Collection.class), 
eq(metaDataContexts))).thenReturn(mock(MetaDataContexts.class)))) {
+                        (mock, context) -> 
when(mock.createByAlterRule(eq(DATABASE_NAME),
+                                any(Collection.class), 
eq(metaDataContexts))).thenReturn(mock(MetaDataContexts.class)))) {
             new DatabaseRuleConfigurationManager(metaDataContexts, mock(), 
mock()).refresh(DATABASE_NAME, ruleConfig);
-            
verify(ignored.constructed().iterator().next()).createByAlterRule(eq(DATABASE_NAME),
 eq(false),
-                    argThat(actual -> 2 == actual.size() && 
actual.contains(ruleConfig) && actual.contains(otherRuleConfig)), 
eq(metaDataContexts));
+            verify(ignored.constructed().iterator().next()).createByAlterRule(
+                    eq(DATABASE_NAME),
+                    argThat(actual -> 2 == actual.size() && 
actual.contains(ruleConfig) && actual.contains(otherRuleConfig)),
+                    eq(metaDataContexts));
             verify((PartialRuleUpdateSupported) 
closableRule).updateConfiguration(ruleConfig);
             verify(metaDataContexts).update(any(MetaDataContexts.class));
             assertDoesNotThrow(() -> verify((AutoCloseable) 
closableRule).close());
@@ -108,9 +111,9 @@ class DatabaseRuleConfigurationManagerTest {
         
when(metaDataContexts.getMetaData().getDatabase(DATABASE_NAME).getRuleMetaData()).thenReturn(ruleMetaData);
         try (
                 MockedConstruction<MetaDataContextsFactory> ignored = 
mockConstruction(MetaDataContextsFactory.class,
-                        (mock, context) -> 
when(mock.createByAlterRule(eq(DATABASE_NAME), eq(false), 
any(Collection.class), 
eq(metaDataContexts))).thenReturn(mock(MetaDataContexts.class)))) {
+                        (mock, context) -> 
when(mock.createByAlterRule(eq(DATABASE_NAME), any(Collection.class), 
eq(metaDataContexts))).thenReturn(mock(MetaDataContexts.class)))) {
             new DatabaseRuleConfigurationManager(metaDataContexts, mock(), 
mock()).refresh(DATABASE_NAME, ruleConfig);
-            
verify(ignored.constructed().iterator().next()).createByAlterRule(eq(DATABASE_NAME),
 eq(false), argThat(Collection::isEmpty), eq(metaDataContexts));
+            
verify(ignored.constructed().iterator().next()).createByAlterRule(eq(DATABASE_NAME),
 argThat(Collection::isEmpty), eq(metaDataContexts));
             verify((PartialRuleUpdateSupported) partialRule, 
never()).partialUpdate(ruleConfig);
             verify((PartialRuleUpdateSupported) partialRule, 
never()).updateConfiguration(ruleConfig);
             verify(metaDataContexts).update(any(MetaDataContexts.class));
@@ -129,10 +132,12 @@ class DatabaseRuleConfigurationManagerTest {
         
when(metaDataContexts.getMetaData().getDatabase(DATABASE_NAME).getRuleMetaData()).thenReturn(ruleMetaData);
         try (
                 MockedConstruction<MetaDataContextsFactory> ignored = 
mockConstruction(MetaDataContextsFactory.class,
-                        (mock, context) -> 
when(mock.createByAlterRule(eq(DATABASE_NAME), eq(false), 
any(Collection.class), 
eq(metaDataContexts))).thenReturn(mock(MetaDataContexts.class)))) {
+                        (mock, context) -> 
when(mock.createByAlterRule(eq(DATABASE_NAME), any(Collection.class), 
eq(metaDataContexts))).thenReturn(mock(MetaDataContexts.class)))) {
             new DatabaseRuleConfigurationManager(metaDataContexts, mock(), 
mock()).refresh(DATABASE_NAME, ruleConfig);
-            
verify(ignored.constructed().iterator().next()).createByAlterRule(eq(DATABASE_NAME),
 eq(false),
-                    argThat(actual -> 1 == actual.size() && 
actual.contains(ruleConfig)), eq(metaDataContexts));
+            verify(ignored.constructed().iterator().next()).createByAlterRule(
+                    eq(DATABASE_NAME),
+                    argThat(actual -> 1 == actual.size() && 
actual.contains(ruleConfig)),
+                    eq(metaDataContexts));
             verify(metaDataContexts).update(any(MetaDataContexts.class));
             verify(updater).updateConfiguration(ruleConfig);
         }
@@ -149,10 +154,12 @@ class DatabaseRuleConfigurationManagerTest {
         
when(metaDataContexts.getMetaData().getDatabase(DATABASE_NAME).getRuleMetaData()).thenReturn(ruleMetaData);
         try (
                 MockedConstruction<MetaDataContextsFactory> ignored = 
mockConstruction(MetaDataContextsFactory.class,
-                        (mock, context) -> 
when(mock.createByAlterRule(eq(DATABASE_NAME), eq(false), 
any(Collection.class), 
eq(metaDataContexts))).thenReturn(mock(MetaDataContexts.class)))) {
+                        (mock, context) -> 
when(mock.createByAlterRule(eq(DATABASE_NAME), any(Collection.class), 
eq(metaDataContexts))).thenReturn(mock(MetaDataContexts.class)))) {
             new DatabaseRuleConfigurationManager(metaDataContexts, mock(), 
mock()).refresh(DATABASE_NAME, ruleConfig);
-            
verify(ignored.constructed().iterator().next()).createByAlterRule(eq(DATABASE_NAME),
 eq(false),
-                    argThat(actual -> 2 == actual.size() && 
actual.contains(ruleConfig) && actual.contains(otherRuleConfig)), 
eq(metaDataContexts));
+            verify(ignored.constructed().iterator().next()).createByAlterRule(
+                    eq(DATABASE_NAME),
+                    argThat(actual -> 2 == actual.size() && 
actual.contains(ruleConfig) && actual.contains(otherRuleConfig)),
+                    eq(metaDataContexts));
             verify(metaDataContexts).update(any(MetaDataContexts.class));
         }
     }
@@ -167,10 +174,12 @@ class DatabaseRuleConfigurationManagerTest {
         
when(metaDataContexts.getMetaData().getDatabase(DATABASE_NAME).getRuleMetaData()).thenReturn(ruleMetaData);
         try (
                 MockedConstruction<MetaDataContextsFactory> ignored = 
mockConstruction(MetaDataContextsFactory.class,
-                        (mock, context) -> 
when(mock.createByAlterRule(eq(DATABASE_NAME), eq(false), 
any(Collection.class), 
eq(metaDataContexts))).thenReturn(mock(MetaDataContexts.class)))) {
+                        (mock, context) -> 
when(mock.createByAlterRule(eq(DATABASE_NAME), any(Collection.class), 
eq(metaDataContexts))).thenReturn(mock(MetaDataContexts.class)))) {
             new DatabaseRuleConfigurationManager(metaDataContexts, mock(), 
mock()).refresh(DATABASE_NAME, ruleConfig);
-            
verify(ignored.constructed().iterator().next()).createByAlterRule(eq(DATABASE_NAME),
 eq(false),
-                    argThat(actual -> 1 == actual.size() && 
actual.contains(ruleConfig)), eq(metaDataContexts));
+            verify(ignored.constructed().iterator().next()).createByAlterRule(
+                    eq(DATABASE_NAME),
+                    argThat(actual -> 1 == actual.size() && 
actual.contains(ruleConfig)),
+                    eq(metaDataContexts));
             verify(metaDataContexts).update(any(MetaDataContexts.class));
         }
     }
@@ -185,8 +194,8 @@ class DatabaseRuleConfigurationManagerTest {
         
when(metaDataContexts.getMetaData().getDatabase(DATABASE_NAME).getRuleMetaData()).thenReturn(ruleMetaData);
         try (
                 MockedConstruction<MetaDataContextsFactory> ignored = 
mockConstruction(MetaDataContextsFactory.class,
-                        (mock, context) -> 
when(mock.createByAlterRule(eq(DATABASE_NAME), eq(false), 
any(Collection.class), eq(metaDataContexts))).thenThrow(SQLException.class))) {
-            assertThrows(SQLException.class, () -> new 
DatabaseRuleConfigurationManager(metaDataContexts, mock(), 
mock()).refresh(DATABASE_NAME, ruleConfig));
+                        (mock, context) -> 
when(mock.createByAlterRule(eq(DATABASE_NAME), any(Collection.class), 
eq(metaDataContexts))).thenThrow(new RuntimeException("mocked")))) {
+            assertThrows(RuntimeException.class, () -> new 
DatabaseRuleConfigurationManager(metaDataContexts, mock(), 
mock()).refresh(DATABASE_NAME, ruleConfig));
         }
     }
     
@@ -203,7 +212,7 @@ class DatabaseRuleConfigurationManagerTest {
         
when(metaDataContexts.getMetaData().getDatabase(DATABASE_NAME).getRuleMetaData()).thenReturn(ruleMetaData);
         try (
                 MockedConstruction<MetaDataContextsFactory> ignored = 
mockConstruction(MetaDataContextsFactory.class,
-                        (mock, context) -> 
when(mock.createByAlterRule(eq(DATABASE_NAME), eq(false), 
any(Collection.class), 
eq(metaDataContexts))).thenReturn(mock(MetaDataContexts.class)))) {
+                        (mock, context) -> 
when(mock.createByAlterRule(eq(DATABASE_NAME), any(Collection.class), 
eq(metaDataContexts))).thenReturn(mock(MetaDataContexts.class)))) {
             assertThrows(Exception.class, () -> new 
DatabaseRuleConfigurationManager(metaDataContexts, mock(), 
mock()).refresh(DATABASE_NAME, ruleConfig));
         }
     }
diff --git 
a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/persist/service/ClusterMetaDataManagerPersistService.java
 
b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/persist/service/ClusterMetaDataManagerPersistService.java
index e1308aff5ac..32c1af09ec0 100644
--- 
a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/persist/service/ClusterMetaDataManagerPersistService.java
+++ 
b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/persist/service/ClusterMetaDataManagerPersistService.java
@@ -21,8 +21,12 @@ import lombok.SneakyThrows;
 import org.apache.shardingsphere.infra.config.rule.RuleConfiguration;
 import 
org.apache.shardingsphere.infra.datasource.pool.props.domain.DataSourcePoolProperties;
 import org.apache.shardingsphere.infra.exception.ShardingSpherePreconditions;
+import 
org.apache.shardingsphere.infra.metadata.database.schema.builder.GenericSchemaBuilder;
+import 
org.apache.shardingsphere.infra.metadata.database.schema.builder.GenericSchemaBuilderMaterial;
+import 
org.apache.shardingsphere.database.connector.core.type.DatabaseTypeRegistry;
 import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
 import org.apache.shardingsphere.infra.metadata.database.rule.RuleMetaData;
+import 
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSchema;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereTable;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereView;
 import org.apache.shardingsphere.infra.metadata.statistics.DatabaseStatistics;
@@ -42,6 +46,7 @@ import org.apache.shardingsphere.single.rule.SingleRule;
 
 import java.util.Collection;
 import java.util.Collections;
+import java.util.LinkedList;
 import java.util.Map;
 import java.util.Map.Entry;
 import java.util.Optional;
@@ -155,11 +160,11 @@ public final class ClusterMetaDataManagerPersistService 
implements MetaDataManag
     
     private void afterStorageUnitsAltered(final String databaseName, final 
MetaDataContexts originalMetaDataContexts) {
         MetaDataContexts reloadMetaDataContexts = 
getReloadedMetaDataContexts(originalMetaDataContexts);
+        ShardingSphereDatabase reloadedDatabase = 
rebuildDatabaseSchemaIndex(databaseName, reloadMetaDataContexts);
         
Optional.ofNullable(reloadMetaDataContexts.getStatistics().getDatabaseStatistics(databaseName))
                 .ifPresent(optional -> 
optional.getSchemaStatisticsMap().forEach((schemaName, schemaStatistics) -> 
metaDataPersistFacade.getStatisticsService()
                         
.persist(originalMetaDataContexts.getMetaData().getDatabase(databaseName), 
schemaName, schemaStatistics)));
-        
metaDataPersistFacade.getDatabaseMetaDataFacade().persistReloadDatabase(databaseName,
 reloadMetaDataContexts.getMetaData().getDatabase(databaseName),
-                
originalMetaDataContexts.getMetaData().getDatabase(databaseName));
+        
metaDataPersistFacade.getDatabaseMetaDataFacade().persistReloadDatabase(databaseName,
 reloadedDatabase, 
originalMetaDataContexts.getMetaData().getDatabase(databaseName));
     }
     
     @Override
@@ -169,8 +174,8 @@ public final class ClusterMetaDataManagerPersistService 
implements MetaDataManag
             MetaDataContexts originalMetaDataContexts = new 
MetaDataContexts(metaDataContextManager.getMetaDataContexts().getMetaData(), 
metaDataContextManager.getMetaDataContexts().getStatistics());
             
metaDataPersistFacade.getDataSourceUnitService().delete(database.getName(), 
each);
             MetaDataContexts reloadMetaDataContexts = 
getReloadedMetaDataContexts(originalMetaDataContexts);
-            
metaDataPersistFacade.getDatabaseMetaDataFacade().persistReloadDatabase(databaseName,
 reloadMetaDataContexts.getMetaData().getDatabase(databaseName),
-                    
originalMetaDataContexts.getMetaData().getDatabase(databaseName));
+            ShardingSphereDatabase reloadedDatabase = 
rebuildDatabaseSchemaIndex(databaseName, reloadMetaDataContexts);
+            
metaDataPersistFacade.getDatabaseMetaDataFacade().persistReloadDatabase(databaseName,
 reloadedDatabase, 
originalMetaDataContexts.getMetaData().getDatabase(databaseName));
             DatabaseStatistics databaseStatistics = 
reloadMetaDataContexts.getStatistics().getDatabaseStatistics(database.getName());
             if (null != databaseStatistics) {
                 for (Entry<String, SchemaStatistics> entry : 
databaseStatistics.getSchemaStatisticsMap().entrySet()) {
@@ -199,8 +204,8 @@ public final class ClusterMetaDataManagerPersistService 
implements MetaDataManag
         MetaDataContexts originalMetaDataContexts = new 
MetaDataContexts(metaDataContextManager.getMetaDataContexts().getMetaData(), 
metaDataContextManager.getMetaDataContexts().getStatistics());
         
metaDataPersistFacade.getDatabaseRuleService().persist(database.getName(), 
Collections.singleton(toBeAlteredRuleConfig));
         MetaDataContexts reloadMetaDataContexts = 
getReloadedMetaDataContexts(originalMetaDataContexts);
-        
metaDataPersistFacade.getDatabaseMetaDataFacade().persistReloadDatabase(
-                database.getName(), 
reloadMetaDataContexts.getMetaData().getDatabase(database.getName()), 
originalMetaDataContexts.getMetaData().getDatabase(database.getName()));
+        
metaDataPersistFacade.getDatabaseMetaDataFacade().persistReloadDatabase(database.getName(),
 rebuildDatabaseSchemaIndex(database.getName(), reloadMetaDataContexts),
+                
originalMetaDataContexts.getMetaData().getDatabase(database.getName()));
     }
     
     @Override
@@ -258,4 +263,14 @@ public final class ClusterMetaDataManagerPersistService 
implements MetaDataManag
         ShardingSpherePreconditions.checkState(retryExecutor.execute(arg -> 
metaDataContextManager.getMetaDataContexts() != arg, originalMetaDataContexts), 
ReloadMetaDataContextFailedException::new);
         return metaDataContextManager.getMetaDataContexts();
     }
+    
+    @SneakyThrows
+    private ShardingSphereDatabase rebuildDatabaseSchemaIndex(final String 
databaseName, final MetaDataContexts reloadMetaDataContexts) {
+        ShardingSphereDatabase database = 
reloadMetaDataContexts.getMetaData().getDatabase(databaseName);
+        GenericSchemaBuilderMaterial material = new 
GenericSchemaBuilderMaterial(database.getResourceMetaData().getStorageUnits(), 
database.getRuleMetaData().getRules(),
+                reloadMetaDataContexts.getMetaData().getProps(), new 
DatabaseTypeRegistry(database.getProtocolType()).getDefaultSchemaName(databaseName),
 database.getIdentifierContext());
+        Collection<ShardingSphereSchema> schemas = new 
LinkedList<>(GenericSchemaBuilder.build(database.getProtocolType(), 
material).values());
+        return new ShardingSphereDatabase(database.getName(), 
database.getProtocolType(), database.getResourceMetaData(),
+                database.getRuleMetaData(), schemas, 
reloadMetaDataContexts.getMetaData().getProps());
+    }
 }
diff --git 
a/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/persist/service/ClusterMetaDataManagerPersistServiceTest.java
 
b/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/persist/service/ClusterMetaDataManagerPersistServiceTest.java
index e53bf3369dd..a358e03c8f8 100644
--- 
a/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/persist/service/ClusterMetaDataManagerPersistServiceTest.java
+++ 
b/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/persist/service/ClusterMetaDataManagerPersistServiceTest.java
@@ -20,11 +20,16 @@ package 
org.apache.shardingsphere.mode.manager.cluster.persist.service;
 import org.apache.shardingsphere.infra.config.props.ConfigurationProperties;
 
 import lombok.SneakyThrows;
+import org.apache.shardingsphere.database.connector.core.type.DatabaseType;
 import org.apache.shardingsphere.infra.config.rule.RuleConfiguration;
+import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
 import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
 import org.apache.shardingsphere.infra.metadata.database.rule.RuleMetaData;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSchema;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereTable;
+import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
+import org.apache.shardingsphere.infra.rule.attribute.RuleAttributes;
+import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader;
 import 
org.apache.shardingsphere.mode.manager.cluster.persist.coordinator.database.ClusterDatabaseListenerCoordinatorType;
 import 
org.apache.shardingsphere.mode.manager.cluster.persist.coordinator.database.ClusterDatabaseListenerPersistCoordinator;
 import org.apache.shardingsphere.mode.metadata.manager.MetaDataContextManager;
@@ -156,10 +161,15 @@ class ClusterMetaDataManagerPersistServiceTest {
     
     @Test
     void assertAlterRuleConfiguration() {
-        RuleConfiguration ruleConfig = new SingleRuleConfiguration();
         ShardingSphereDatabase database = mock(ShardingSphereDatabase.class, 
Answers.RETURNS_DEEP_STUBS);
         when(database.getName()).thenReturn("foo_db");
-        
when(metaDataContextManager.getMetaDataContexts().getMetaData().getDatabase("foo_db")).thenReturn(database);
+        
when(database.getProtocolType()).thenReturn(TypedSPILoader.getService(DatabaseType.class,
 "MySQL"));
+        ShardingSphereRule rule = mock(ShardingSphereRule.class);
+        when(rule.getAttributes()).thenReturn(new RuleAttributes());
+        
when(database.getRuleMetaData().getRules()).thenReturn(Collections.singleton(rule));
+        ShardingSphereMetaData metaData = new 
ShardingSphereMetaData(Collections.singleton(database), mock(), mock(), new 
ConfigurationProperties(new Properties()));
+        
when(metaDataContextManager.getMetaDataContexts().getMetaData()).thenReturn(metaData);
+        RuleConfiguration ruleConfig = new SingleRuleConfiguration();
         metaDataManagerPersistService.alterRuleConfiguration(database, 
ruleConfig);
         
verify(metaDataPersistFacade.getDatabaseRuleService()).persist("foo_db", 
Collections.singleton(ruleConfig));
         
verify(metaDataPersistFacade.getDatabaseMetaDataFacade()).persistReloadDatabase(eq("foo_db"),
 any(), any());
diff --git 
a/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/persist/service/StandaloneMetaDataManagerPersistService.java
 
b/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/persist/service/StandaloneMetaDataManagerPersistService.java
index f2698431d66..514f7cc1251 100644
--- 
a/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/persist/service/StandaloneMetaDataManagerPersistService.java
+++ 
b/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/persist/service/StandaloneMetaDataManagerPersistService.java
@@ -17,12 +17,17 @@
 
 package org.apache.shardingsphere.mode.manager.standalone.persist.service;
 
+import lombok.SneakyThrows;
+import 
org.apache.shardingsphere.database.connector.core.type.DatabaseTypeRegistry;
 import org.apache.shardingsphere.infra.config.rule.RuleConfiguration;
 import 
org.apache.shardingsphere.infra.datasource.pool.props.domain.DataSourcePoolProperties;
 import 
org.apache.shardingsphere.infra.exception.external.sql.type.wrapper.SQLWrapperException;
 import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
 import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
 import org.apache.shardingsphere.infra.metadata.database.rule.RuleMetaData;
+import 
org.apache.shardingsphere.infra.metadata.database.schema.builder.GenericSchemaBuilder;
+import 
org.apache.shardingsphere.infra.metadata.database.schema.builder.GenericSchemaBuilderMaterial;
+import 
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSchema;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereTable;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereView;
 import org.apache.shardingsphere.infra.rule.scope.GlobalRule;
@@ -46,6 +51,7 @@ import org.apache.shardingsphere.single.rule.SingleRule;
 import java.sql.SQLException;
 import java.util.Collection;
 import java.util.Collections;
+import java.util.LinkedList;
 import java.util.Map;
 import java.util.Map.Entry;
 import java.util.Optional;
@@ -158,7 +164,7 @@ public final class StandaloneMetaDataManagerPersistService 
implements MetaDataMa
     private void afterStorageUnitsRegistered(final String databaseName, final 
MetaDataContexts originalMetaDataContexts,
                                              final Map<String, 
DataSourcePoolProperties> toBeRegisteredProps) {
         metaDataContextManager.getStorageUnitManager().register(databaseName, 
toBeRegisteredProps);
-        
metaDataPersistFacade.getDatabaseMetaDataFacade().persistReloadDatabase(databaseName,
 
metaDataContextManager.getMetaDataContexts().getMetaData().getDatabase(databaseName),
+        
metaDataPersistFacade.getDatabaseMetaDataFacade().persistReloadDatabase(databaseName,
 rebuildDatabaseSchemaIndex(databaseName, 
metaDataContextManager.getMetaDataContexts()),
                 
originalMetaDataContexts.getMetaData().getDatabase(databaseName));
         refreshGlobalRules(GlobalRuleChangedType.DATABASE_CHANGED);
     }
@@ -173,7 +179,7 @@ public final class StandaloneMetaDataManagerPersistService 
implements MetaDataMa
     
     private void afterStorageUnitsAltered(final String databaseName, final 
MetaDataContexts originalMetaDataContexts, final Map<String, 
DataSourcePoolProperties> toBeRegisteredProps) {
         metaDataContextManager.getStorageUnitManager().alter(databaseName, 
toBeRegisteredProps);
-        
metaDataPersistFacade.getDatabaseMetaDataFacade().persistReloadDatabase(databaseName,
 
metaDataContextManager.getMetaDataContexts().getMetaData().getDatabase(databaseName),
+        
metaDataPersistFacade.getDatabaseMetaDataFacade().persistReloadDatabase(databaseName,
 rebuildDatabaseSchemaIndex(databaseName, 
metaDataContextManager.getMetaDataContexts()),
                 
originalMetaDataContexts.getMetaData().getDatabase(databaseName));
         refreshGlobalRules(GlobalRuleChangedType.DATABASE_CHANGED);
     }
@@ -181,10 +187,12 @@ public final class 
StandaloneMetaDataManagerPersistService implements MetaDataMa
     @Override
     public void unregisterStorageUnits(final ShardingSphereDatabase database, 
final Collection<String> toBeDroppedStorageUnitNames) {
         for (String each : getToBeDroppedResourceNames(database.getName(), 
toBeDroppedStorageUnitNames)) {
+            MetaDataContexts originalMetaDataContexts = new 
MetaDataContexts(metaDataContextManager.getMetaDataContexts().getMetaData(), 
metaDataContextManager.getMetaDataContexts().getStatistics());
             
metaDataPersistFacade.getDataSourceUnitService().delete(database.getName(), 
each);
             
metaDataContextManager.getStorageUnitManager().unregister(database.getName(), 
each);
             MetaDataContexts reloadMetaDataContexts = 
metaDataContextManager.getMetaDataContexts();
-            
metaDataPersistFacade.getDatabaseMetaDataFacade().unregisterStorageUnits(database.getName(),
 reloadMetaDataContexts);
+            
metaDataPersistFacade.getDatabaseMetaDataFacade().persistReloadDatabase(database.getName(),
 rebuildDatabaseSchemaIndex(database.getName(), reloadMetaDataContexts),
+                    
originalMetaDataContexts.getMetaData().getDatabase(database.getName()));
         }
         clearServicesCache();
     }
@@ -237,8 +245,9 @@ public final class StandaloneMetaDataManagerPersistService 
implements MetaDataMa
         if (toBeRemovedRuleItemConfig instanceof SingleRuleConfiguration) {
             Collection<MetaDataVersion> metaDataVersions = 
metaDataPersistFacade.getDatabaseRuleService().delete(database.getName(), 
Collections.singleton(toBeRemovedRuleItemConfig));
             removeRuleItem(database.getName(), metaDataVersions);
+            ShardingSphereDatabase reloadedDatabase = 
rebuildDatabaseSchemaIndex(database.getName(), 
metaDataContextManager.getMetaDataContexts());
             
metaDataPersistFacade.getDatabaseMetaDataFacade().persistReloadDatabaseByUnloadSingleTable(
-                    database.getName(), 
metaDataContextManager.getMetaDataContexts().getMetaData().getDatabase(database.getName()),
 database);
+                    database.getName(), reloadedDatabase, database);
             clearServicesCache();
             return;
         }
@@ -278,8 +287,9 @@ public final class StandaloneMetaDataManagerPersistService 
implements MetaDataMa
         if (toBeRemovedRuleConfig instanceof SingleRuleConfiguration) {
             
metaDataPersistFacade.getDatabaseRuleService().delete(database.getName(), 
ruleType);
             metaDataContextManager.getDatabaseRuleItemManager().drop(new 
DatabaseRuleNodePath(database.getName(), ruleType, null));
+            ShardingSphereDatabase reloadedDatabase = 
rebuildDatabaseSchemaIndex(database.getName(), 
metaDataContextManager.getMetaDataContexts());
             
metaDataPersistFacade.getDatabaseMetaDataFacade().persistReloadDatabaseByUnloadSingleTable(
-                    database.getName(), 
metaDataContextManager.getMetaDataContexts().getMetaData().getDatabase(database.getName()),
 database);
+                    database.getName(), reloadedDatabase, database);
             clearServicesCache();
             return;
         }
@@ -314,8 +324,27 @@ public final class StandaloneMetaDataManagerPersistService 
implements MetaDataMa
     }
     
     private void persistAndAlterSchemaTables(final ShardingSphereDatabase 
database, final Collection<String> needReloadTables) {
+        MetaDataContexts reloadedMetaDataContexts = 
createMetaDataContextsWithRebuiltDatabase(database.getName(), 
metaDataContextManager.getMetaDataContexts());
         Map<String, Collection<ShardingSphereTable>> schemaAndTablesMap = 
metaDataPersistFacade.getDatabaseMetaDataFacade().persistAlteredTables(
-                database.getName(), 
metaDataContextManager.getMetaDataContexts(), needReloadTables);
+                database.getName(), reloadedMetaDataContexts, 
needReloadTables);
         alterSchemaTables(database, schemaAndTablesMap);
     }
+    
+    @SneakyThrows(SQLException.class)
+    private ShardingSphereDatabase rebuildDatabaseSchemaIndex(final String 
databaseName, final MetaDataContexts metaDataContexts) {
+        ShardingSphereDatabase database = 
metaDataContexts.getMetaData().getDatabase(databaseName);
+        GenericSchemaBuilderMaterial material = new 
GenericSchemaBuilderMaterial(database.getResourceMetaData().getStorageUnits(), 
database.getRuleMetaData().getRules(),
+                metaDataContexts.getMetaData().getProps(), new 
DatabaseTypeRegistry(database.getProtocolType()).getDefaultSchemaName(databaseName),
 database.getIdentifierContext());
+        Collection<ShardingSphereSchema> schemas = new 
LinkedList<>(GenericSchemaBuilder.build(database.getProtocolType(), 
material).values());
+        return new ShardingSphereDatabase(database.getName(), 
database.getProtocolType(), database.getResourceMetaData(), 
database.getRuleMetaData(), schemas,
+                metaDataContexts.getMetaData().getProps());
+    }
+    
+    private MetaDataContexts createMetaDataContextsWithRebuiltDatabase(final 
String databaseName, final MetaDataContexts metaDataContexts) {
+        ShardingSphereMetaData metaData = metaDataContexts.getMetaData();
+        ShardingSphereMetaData clonedMetaData = new ShardingSphereMetaData(
+                metaData.getAllDatabases(), 
metaData.getGlobalResourceMetaData(), metaData.getGlobalRuleMetaData(), 
metaData.getProps(), metaData.getProtocolType());
+        clonedMetaData.putDatabase(rebuildDatabaseSchemaIndex(databaseName, 
metaDataContexts));
+        return new MetaDataContexts(clonedMetaData, 
metaDataContexts.getStatistics());
+    }
 }
diff --git 
a/mode/type/standalone/core/src/test/java/org/apache/shardingsphere/mode/manager/standalone/persist/service/StandaloneMetaDataManagerPersistServiceTest.java
 
b/mode/type/standalone/core/src/test/java/org/apache/shardingsphere/mode/manager/standalone/persist/service/StandaloneMetaDataManagerPersistServiceTest.java
index ff755da0b24..910bcc9057d 100644
--- 
a/mode/type/standalone/core/src/test/java/org/apache/shardingsphere/mode/manager/standalone/persist/service/StandaloneMetaDataManagerPersistServiceTest.java
+++ 
b/mode/type/standalone/core/src/test/java/org/apache/shardingsphere/mode/manager/standalone/persist/service/StandaloneMetaDataManagerPersistServiceTest.java
@@ -28,6 +28,7 @@ import 
org.apache.shardingsphere.infra.metadata.database.rule.RuleMetaData;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSchema;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereTable;
 import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
+import org.apache.shardingsphere.infra.rule.attribute.RuleAttributes;
 import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader;
 import org.apache.shardingsphere.mode.metadata.manager.MetaDataContextManager;
 import org.apache.shardingsphere.mode.metadata.persist.MetaDataPersistFacade;
@@ -161,8 +162,9 @@ class StandaloneMetaDataManagerPersistServiceTest {
     void assertAlterRuleConfiguration() {
         ShardingSphereDatabase database = mock(ShardingSphereDatabase.class, 
RETURNS_DEEP_STUBS);
         when(database.getName()).thenReturn("foo_db");
-        
when(database.getProtocolType()).thenReturn(TypedSPILoader.getService(DatabaseType.class,
 "FIXTURE"));
+        
when(database.getProtocolType()).thenReturn(TypedSPILoader.getService(DatabaseType.class,
 "MySQL"));
         ShardingSphereRule rule = mock(ShardingSphereRule.class);
+        when(rule.getAttributes()).thenReturn(new RuleAttributes());
         
when(database.getRuleMetaData().getRules()).thenReturn(Collections.singleton(rule));
         ShardingSphereMetaData metaData = new 
ShardingSphereMetaData(Collections.singleton(database), mock(), mock(), new 
ConfigurationProperties(new Properties()));
         
when(metaDataContextManager.getMetaDataContexts().getMetaData()).thenReturn(metaData);
@@ -185,8 +187,9 @@ class StandaloneMetaDataManagerPersistServiceTest {
     void assertRemoveRuleConfigurationItem() {
         ShardingSphereDatabase database = mock(ShardingSphereDatabase.class, 
RETURNS_DEEP_STUBS);
         when(database.getName()).thenReturn("foo_db");
-        
when(database.getProtocolType()).thenReturn(TypedSPILoader.getService(DatabaseType.class,
 "FIXTURE"));
+        
when(database.getProtocolType()).thenReturn(TypedSPILoader.getService(DatabaseType.class,
 "MySQL"));
         ShardingSphereRule rule = mock(ShardingSphereRule.class);
+        when(rule.getAttributes()).thenReturn(new RuleAttributes());
         
when(database.getRuleMetaData().getRules()).thenReturn(Collections.singleton(rule));
         ShardingSphereMetaData metaData = new 
ShardingSphereMetaData(Collections.singleton(database), mock(), mock(), new 
ConfigurationProperties(new Properties()));
         
when(metaDataContextManager.getMetaDataContexts().getMetaData()).thenReturn(metaData);
@@ -201,6 +204,12 @@ class StandaloneMetaDataManagerPersistServiceTest {
     void assertRemoveSingleRuleConfigurationItem() {
         ShardingSphereDatabase database = mock(ShardingSphereDatabase.class, 
RETURNS_DEEP_STUBS);
         when(database.getName()).thenReturn("foo_db");
+        
when(database.getProtocolType()).thenReturn(TypedSPILoader.getService(DatabaseType.class,
 "MySQL"));
+        ShardingSphereRule rule = mock(ShardingSphereRule.class);
+        when(rule.getAttributes()).thenReturn(new RuleAttributes());
+        
when(database.getRuleMetaData().getRules()).thenReturn(Collections.singleton(rule));
+        ShardingSphereMetaData metaData = new 
ShardingSphereMetaData(Collections.singleton(database), mock(), mock(), new 
ConfigurationProperties(new Properties()));
+        
when(metaDataContextManager.getMetaDataContexts().getMetaData()).thenReturn(metaData);
         SingleRuleConfiguration ruleConfig = new SingleRuleConfiguration();
         ruleConfig.setTables(Collections.singleton("ds_0.t_order"));
         DatabaseRuleNodePath databaseRuleNodePath = new 
DatabaseRuleNodePath("foo_db", "single", new DatabaseRuleItem("unique"));
@@ -213,8 +222,15 @@ class StandaloneMetaDataManagerPersistServiceTest {
     
     @Test
     void assertRemoveRuleConfiguration() {
-        metaDataManagerPersistService.removeRuleConfiguration(new 
ShardingSphereDatabase("foo_db", mock(), mock(), mock(), 
Collections.emptyList(), new ConfigurationProperties(new Properties())),
-                mock(RuleConfiguration.class), "foo_rule");
+        ShardingSphereDatabase database = mock(ShardingSphereDatabase.class, 
RETURNS_DEEP_STUBS);
+        when(database.getName()).thenReturn("foo_db");
+        
when(database.getProtocolType()).thenReturn(TypedSPILoader.getService(DatabaseType.class,
 "MySQL"));
+        ShardingSphereRule rule = mock(ShardingSphereRule.class);
+        when(rule.getAttributes()).thenReturn(new RuleAttributes());
+        
when(database.getRuleMetaData().getRules()).thenReturn(Collections.singleton(rule));
+        ShardingSphereMetaData metaData = new 
ShardingSphereMetaData(Collections.singleton(database), mock(), mock(), new 
ConfigurationProperties(new Properties()));
+        
when(metaDataContextManager.getMetaDataContexts().getMetaData()).thenReturn(metaData);
+        metaDataManagerPersistService.removeRuleConfiguration(database, 
mock(RuleConfiguration.class), "foo_rule");
         
verify(metaDataPersistFacade.getDatabaseRuleService()).delete("foo_db", 
"foo_rule");
     }
     
@@ -222,6 +238,12 @@ class StandaloneMetaDataManagerPersistServiceTest {
     void assertRemoveSingleRuleConfiguration() {
         ShardingSphereDatabase database = mock(ShardingSphereDatabase.class, 
RETURNS_DEEP_STUBS);
         when(database.getName()).thenReturn("foo_db");
+        
when(database.getProtocolType()).thenReturn(TypedSPILoader.getService(DatabaseType.class,
 "MySQL"));
+        ShardingSphereRule rule = mock(ShardingSphereRule.class);
+        when(rule.getAttributes()).thenReturn(new RuleAttributes());
+        
when(database.getRuleMetaData().getRules()).thenReturn(Collections.singleton(rule));
+        ShardingSphereMetaData metaData = new 
ShardingSphereMetaData(Collections.singleton(database), mock(), mock(), new 
ConfigurationProperties(new Properties()));
+        
when(metaDataContextManager.getMetaDataContexts().getMetaData()).thenReturn(metaData);
         SingleRuleConfiguration ruleConfig = new SingleRuleConfiguration();
         ruleConfig.setTables(Collections.singleton("ds_0.t_order"));
         metaDataManagerPersistService.removeRuleConfiguration(database, 
ruleConfig, "SINGLE");

Reply via email to