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

zhangliang 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 71b8236db32 Add DatabaseMetaDataPersistFacade.persistAlteredTables() 
(#35012)
71b8236db32 is described below

commit 71b8236db321c0108d4c70d15e9cdec0e6a0be64
Author: Liang Zhang <zhangli...@apache.org>
AuthorDate: Sun Mar 16 16:05:24 2025 +0800

    Add DatabaseMetaDataPersistFacade.persistAlteredTables() (#35012)
    
    * Add DatabaseMetaDataPersistFacade.persistAlteredTables()
    
    * Add DatabaseMetaDataPersistFacade.persistAlteredTables()
---
 .../metadata/DatabaseMetaDataPersistFacade.java    | 29 ++++++++++++++++++++
 .../ClusterMetaDataManagerPersistService.java      | 28 ++-----------------
 .../StandaloneMetaDataManagerPersistService.java   | 32 +++++++---------------
 ...tandaloneMetaDataManagerPersistServiceTest.java |  4 ---
 4 files changed, 41 insertions(+), 52 deletions(-)

diff --git 
a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/persist/metadata/DatabaseMetaDataPersistFacade.java
 
b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/persist/metadata/DatabaseMetaDataPersistFacade.java
index 8ae46cc8fdd..3a832929a97 100644
--- 
a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/persist/metadata/DatabaseMetaDataPersistFacade.java
+++ 
b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/persist/metadata/DatabaseMetaDataPersistFacade.java
@@ -38,6 +38,7 @@ import 
org.apache.shardingsphere.mode.spi.repository.PersistRepository;
 
 import java.sql.SQLException;
 import java.util.Collection;
+import java.util.HashMap;
 import java.util.Map;
 import java.util.Map.Entry;
 
@@ -148,4 +149,32 @@ public final class DatabaseMetaDataPersistFacade {
             throw new LoadTableMetaDataFailedException(databaseName, ex);
         }
     }
+    
+    /**
+     * Persist altered tables.
+     *
+     * @param databaseName database name
+     * @param reloadMetaDataContexts reload meta data contexts
+     * @param needReloadTables need reload tables
+     * @return altered schema and tables map
+     * @throws LoadTableMetaDataFailedException if an error occurs while 
loading table metadata
+     */
+    public Map<String, Collection<ShardingSphereTable>> 
persistAlteredTables(final String databaseName, final MetaDataContexts 
reloadMetaDataContexts, final Collection<String> needReloadTables) {
+        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));
+        try {
+            Map<String, ShardingSphereSchema> schemas = 
GenericSchemaBuilder.build(needReloadTables, database.getProtocolType(), 
material);
+            Map<String, Collection<ShardingSphereTable>> result = new 
HashMap<>(schemas.size(), 1F);
+            for (Entry<String, ShardingSphereSchema> entry : 
schemas.entrySet()) {
+                Collection<ShardingSphereTable> tables = 
GenericSchemaManager.getToBeAddedTables(entry.getValue(), 
database.getSchema(entry.getKey()));
+                table.persist(databaseName, entry.getKey(), tables);
+                result.put(entry.getKey(), tables);
+            }
+            return result;
+        } catch (final SQLException ex) {
+            throw new LoadTableMetaDataFailedException(databaseName, 
needReloadTables, ex);
+        }
+    }
 }
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 9de8f21d0b6..b1bfe34d4e1 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
@@ -19,21 +19,15 @@ package 
org.apache.shardingsphere.mode.manager.cluster.persist.service;
 
 import lombok.SneakyThrows;
 import org.apache.shardingsphere.infra.config.rule.RuleConfiguration;
-import org.apache.shardingsphere.infra.database.core.type.DatabaseTypeRegistry;
 import 
org.apache.shardingsphere.infra.datasource.pool.props.domain.DataSourcePoolProperties;
 import 
org.apache.shardingsphere.infra.exception.core.ShardingSpherePreconditions;
 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.manager.GenericSchemaManager;
-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;
 import org.apache.shardingsphere.infra.metadata.statistics.SchemaStatistics;
 import org.apache.shardingsphere.infra.util.retry.RetryExecutor;
-import 
org.apache.shardingsphere.mode.exception.LoadTableMetaDataFailedException;
 import 
org.apache.shardingsphere.mode.manager.cluster.exception.ReloadMetaDataContextFailedException;
 import 
org.apache.shardingsphere.mode.manager.cluster.persist.coordinator.database.ClusterDatabaseListenerCoordinatorType;
 import 
org.apache.shardingsphere.mode.manager.cluster.persist.coordinator.database.ClusterDatabaseListenerPersistCoordinator;
@@ -46,7 +40,6 @@ import 
org.apache.shardingsphere.mode.repository.cluster.ClusterPersistRepositor
 import org.apache.shardingsphere.single.config.SingleRuleConfiguration;
 import org.apache.shardingsphere.single.rule.SingleRule;
 
-import java.sql.SQLException;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.Map;
@@ -188,7 +181,7 @@ public final class ClusterMetaDataManagerPersistService 
implements MetaDataManag
         Collection<String> needReloadTables = getNeedReloadTables(database, 
toBeAlteredRuleConfig);
         MetaDataContexts originalMetaDataContexts = new 
MetaDataContexts(metaDataContextManager.getMetaDataContexts().getMetaData(), 
metaDataContextManager.getMetaDataContexts().getStatistics());
         
metaDataPersistFacade.getDatabaseRuleService().persist(database.getName(), 
Collections.singleton(toBeAlteredRuleConfig));
-        reloadAlteredTables(database.getName(), originalMetaDataContexts, 
needReloadTables);
+        
metaDataPersistFacade.getDatabaseMetaDataFacade().persistAlteredTables(database.getName(),
 getReloadedMetaDataContexts(originalMetaDataContexts), needReloadTables);
     }
     
     @Override
@@ -199,24 +192,7 @@ public final class ClusterMetaDataManagerPersistService 
implements MetaDataManag
         Collection<String> needReloadTables = getNeedReloadTables(database, 
toBeRemovedRuleConfig);
         MetaDataContexts originalMetaDataContexts = new 
MetaDataContexts(metaDataContextManager.getMetaDataContexts().getMetaData(), 
metaDataContextManager.getMetaDataContexts().getStatistics());
         
metaDataPersistFacade.getDatabaseRuleService().delete(database.getName(), 
Collections.singleton(toBeRemovedRuleConfig));
-        reloadAlteredTables(database.getName(), originalMetaDataContexts, 
needReloadTables);
-    }
-    
-    private void reloadAlteredTables(final String databaseName, final 
MetaDataContexts originalMetaDataContexts, final Collection<String> 
needReloadTables) {
-        MetaDataContexts reloadMetaDataContexts = 
getReloadedMetaDataContexts(originalMetaDataContexts);
-        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));
-        try {
-            Map<String, ShardingSphereSchema> schemas = 
GenericSchemaBuilder.build(needReloadTables, database.getProtocolType(), 
material);
-            for (Entry<String, ShardingSphereSchema> entry : 
schemas.entrySet()) {
-                Collection<ShardingSphereTable> tables = 
GenericSchemaManager.getToBeAddedTables(entry.getValue(), 
database.getSchema(entry.getKey()));
-                
metaDataPersistFacade.getDatabaseMetaDataFacade().getTable().persist(databaseName,
 entry.getKey(), tables);
-            }
-        } catch (final SQLException ex) {
-            throw new LoadTableMetaDataFailedException(databaseName, 
needReloadTables, ex);
-        }
+        
metaDataPersistFacade.getDatabaseMetaDataFacade().persistAlteredTables(database.getName(),
 getReloadedMetaDataContexts(originalMetaDataContexts), needReloadTables);
     }
     
     private Collection<String> getNeedReloadTables(final 
ShardingSphereDatabase originalShardingDatabase, final RuleConfiguration 
toBeAlteredRuleConfig) {
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 6e0cecf3991..74e396beeb3 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
@@ -18,21 +18,15 @@
 package org.apache.shardingsphere.mode.manager.standalone.persist.service;
 
 import org.apache.shardingsphere.infra.config.rule.RuleConfiguration;
-import org.apache.shardingsphere.infra.database.core.type.DatabaseTypeRegistry;
 import 
org.apache.shardingsphere.infra.datasource.pool.props.domain.DataSourcePoolProperties;
 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.manager.GenericSchemaManager;
-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;
 import 
org.apache.shardingsphere.infra.rule.scope.GlobalRule.GlobalRuleChangedType;
 import 
org.apache.shardingsphere.infra.spi.type.ordered.cache.OrderedServicesCache;
-import 
org.apache.shardingsphere.mode.exception.LoadTableMetaDataFailedException;
 import org.apache.shardingsphere.mode.metadata.MetaDataContexts;
 import 
org.apache.shardingsphere.mode.metadata.changed.RuleItemChangedNodePathBuilder;
 import org.apache.shardingsphere.mode.metadata.manager.ActiveVersionChecker;
@@ -221,7 +215,9 @@ public final class StandaloneMetaDataManagerPersistService 
implements MetaDataMa
                 
metaDataContextManager.getDatabaseRuleItemManager().alter(databaseRuleNodePath.get());
             }
         }
-        reloadAlteredTables(database.getName(), needReloadTables);
+        Map<String, Collection<ShardingSphereTable>> schemaAndTablesMap = 
metaDataPersistFacade.getDatabaseMetaDataFacade().persistAlteredTables(
+                database.getName(), 
metaDataContextManager.getMetaDataContexts(), needReloadTables);
+        alterTables(database, schemaAndTablesMap);
         OrderedServicesCache.clearCache();
     }
     
@@ -238,25 +234,17 @@ public final class 
StandaloneMetaDataManagerPersistService implements MetaDataMa
                 
metaDataContextManager.getDatabaseRuleItemManager().drop(databaseRuleNodePath.get());
             }
         }
-        reloadAlteredTables(database.getName(), needReloadTables);
+        Map<String, Collection<ShardingSphereTable>> schemaAndTablesMap = 
metaDataPersistFacade.getDatabaseMetaDataFacade().persistAlteredTables(
+                database.getName(), 
metaDataContextManager.getMetaDataContexts(), needReloadTables);
+        alterTables(database, schemaAndTablesMap);
         OrderedServicesCache.clearCache();
     }
     
-    private void reloadAlteredTables(final String databaseName, final 
Collection<String> needReloadTables) {
-        MetaDataContexts reloadMetaDataContexts = 
metaDataContextManager.getMetaDataContexts();
-        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));
-        try {
-            Map<String, ShardingSphereSchema> schemas = 
GenericSchemaBuilder.build(needReloadTables, database.getProtocolType(), 
material);
-            for (Entry<String, ShardingSphereSchema> entry : 
schemas.entrySet()) {
-                Collection<ShardingSphereTable> tables = 
GenericSchemaManager.getToBeAddedTables(entry.getValue(), 
database.getSchema(entry.getKey()));
-                
metaDataPersistFacade.getDatabaseMetaDataFacade().getTable().persist(databaseName,
 entry.getKey(), tables);
-                tables.forEach(each -> 
metaDataContextManager.getDatabaseMetaDataManager().alterTable(databaseName, 
entry.getKey(), each));
+    private void alterTables(final ShardingSphereDatabase database, final 
Map<String, Collection<ShardingSphereTable>> schemaAndTablesMap) {
+        for (Entry<String, Collection<ShardingSphereTable>> entry : 
schemaAndTablesMap.entrySet()) {
+            for (ShardingSphereTable each : entry.getValue()) {
+                
metaDataContextManager.getDatabaseMetaDataManager().alterTable(database.getName(),
 entry.getKey(), each);
             }
-        } catch (final SQLException ex) {
-            throw new LoadTableMetaDataFailedException(databaseName, 
needReloadTables, ex);
         }
     }
     
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 ec989e647bf..907b62ebaea 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,8 +28,6 @@ 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.rule.attribute.table.TableMapperRuleAttribute;
 import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader;
 import 
org.apache.shardingsphere.mode.metadata.changed.RuleItemChangedNodePathBuilder;
 import org.apache.shardingsphere.mode.metadata.manager.MetaDataContextManager;
@@ -171,7 +169,6 @@ class StandaloneMetaDataManagerPersistServiceTest {
         when(database.getName()).thenReturn("foo_db");
         
when(database.getProtocolType()).thenReturn(TypedSPILoader.getService(DatabaseType.class,
 "FIXTURE"));
         ShardingSphereRule rule = mock(ShardingSphereRule.class);
-        when(rule.getAttributes()).thenReturn(new 
RuleAttributes(mock(TableMapperRuleAttribute.class)));
         
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);
@@ -200,7 +197,6 @@ class StandaloneMetaDataManagerPersistServiceTest {
         when(database.getName()).thenReturn("foo_db");
         
when(database.getProtocolType()).thenReturn(TypedSPILoader.getService(DatabaseType.class,
 "FIXTURE"));
         ShardingSphereRule rule = mock(ShardingSphereRule.class);
-        when(rule.getAttributes()).thenReturn(new 
RuleAttributes(mock(TableMapperRuleAttribute.class)));
         
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);

Reply via email to