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 <[email protected]>
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);