You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by zh...@apache.org on 2026/08/12 07:42:25 UTC
(shardingsphere) branch master updated: Optimize handling of SingleRuleConfiguration in metadata persistence (#39422)
This is an automated email from the ASF dual-hosted git repository.
sandynz 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 0088c78f707 Optimize handling of SingleRuleConfiguration in metadata persistence (#39422)
0088c78f707 is described below
commit 0088c78f707429523526cfd0c2c88fed143d9f33
Author: Haoran Meng <me...@gmail.com>
AuthorDate: Wed Aug 12 15:42:18 2026 +0800
Optimize handling of SingleRuleConfiguration in metadata persistence (#39422)
---
.../ClusterMetaDataManagerPersistService.java | 28 +++++++++--
.../ClusterMetaDataManagerPersistServiceTest.java | 18 ++++++-
.../StandaloneMetaDataManagerPersistService.java | 58 ++++++++++++----------
...tandaloneMetaDataManagerPersistServiceTest.java | 17 +++++++
4 files changed, 91 insertions(+), 30 deletions(-)
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 31baf237ac6..f5a8653c66d 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
@@ -202,6 +202,17 @@ public final class ClusterMetaDataManagerPersistService implements MetaDataManag
return;
}
MetaDataContexts originalMetaDataContexts = new MetaDataContexts(metaDataContextManager.getMetaDataContexts().getMetaData(), metaDataContextManager.getMetaDataContexts().getStatistics());
+ if (toBeAlteredRuleConfig instanceof SingleRuleConfiguration) {
+ alterSingleRuleConfigurationItem(database, (SingleRuleConfiguration) toBeAlteredRuleConfig, originalMetaDataContexts);
+ return;
+ }
+ metaDataPersistFacade.getDatabaseRuleService().persist(database.getName(), Collections.singleton(toBeAlteredRuleConfig));
+ MetaDataContexts reloadMetaDataContexts = getReloadedMetaDataContexts(originalMetaDataContexts);
+ metaDataPersistFacade.getDatabaseMetaDataFacade().persistReloadDatabase(database.getName(), rebuildDatabaseSchemaIndex(database.getName(), reloadMetaDataContexts),
+ originalMetaDataContexts.getMetaData().getDatabase(database.getName()));
+ }
+
+ private void alterSingleRuleConfigurationItem(final ShardingSphereDatabase database, final SingleRuleConfiguration toBeAlteredRuleConfig, final MetaDataContexts originalMetaDataContexts) {
metaDataPersistFacade.getDatabaseRuleService().persist(database.getName(), Collections.singleton(toBeAlteredRuleConfig));
MetaDataContexts reloadMetaDataContexts = getReloadedMetaDataContexts(originalMetaDataContexts);
metaDataPersistFacade.getDatabaseMetaDataFacade().persistReloadDatabase(database.getName(), rebuildDatabaseSchemaIndex(database.getName(), reloadMetaDataContexts),
@@ -215,7 +226,7 @@ public final class ClusterMetaDataManagerPersistService implements MetaDataManag
}
MetaDataContexts originalMetaDataContexts = new MetaDataContexts(metaDataContextManager.getMetaDataContexts().getMetaData(), metaDataContextManager.getMetaDataContexts().getStatistics());
if (toBeRemovedRuleItemConfig instanceof SingleRuleConfiguration) {
- removeSingleRuleConfiguration(database, toBeRemovedRuleItemConfig, originalMetaDataContexts);
+ removeSingleRuleConfigurationItem(database, (SingleRuleConfiguration) toBeRemovedRuleItemConfig, originalMetaDataContexts);
return;
}
Collection<String> needReloadTables = toBeRemovedRuleItemConfig.getLogicTableNames();
@@ -223,11 +234,16 @@ public final class ClusterMetaDataManagerPersistService implements MetaDataManag
metaDataPersistFacade.getDatabaseMetaDataFacade().persistAlteredTables(database.getName(), getReloadedMetaDataContexts(originalMetaDataContexts), needReloadTables);
}
+ private void removeSingleRuleConfigurationItem(final ShardingSphereDatabase database, final SingleRuleConfiguration toBeRemovedRuleItemConfig, final MetaDataContexts originalMetaDataContexts) {
+ metaDataPersistFacade.getDatabaseRuleService().delete(database.getName(), Collections.singleton(toBeRemovedRuleItemConfig));
+ persistReloadDatabaseByUnloadSingleTable(database, originalMetaDataContexts);
+ }
+
@Override
public void removeRuleConfiguration(final ShardingSphereDatabase database, final RuleConfiguration toBeRemovedRuleConfig, final String ruleType) {
MetaDataContexts originalMetaDataContexts = new MetaDataContexts(metaDataContextManager.getMetaDataContexts().getMetaData(), metaDataContextManager.getMetaDataContexts().getStatistics());
if (toBeRemovedRuleConfig instanceof SingleRuleConfiguration) {
- removeSingleRuleConfiguration(database, toBeRemovedRuleConfig, originalMetaDataContexts);
+ removeSingleRuleConfiguration(database, (SingleRuleConfiguration) toBeRemovedRuleConfig, originalMetaDataContexts);
return;
}
Collection<String> needReloadTables = toBeRemovedRuleConfig.getLogicTableNames();
@@ -235,8 +251,12 @@ public final class ClusterMetaDataManagerPersistService implements MetaDataManag
metaDataPersistFacade.getDatabaseMetaDataFacade().persistAlteredTables(database.getName(), getReloadedMetaDataContexts(originalMetaDataContexts), needReloadTables);
}
- private void removeSingleRuleConfiguration(final ShardingSphereDatabase database, final RuleConfiguration toBeRemovedRuleItemConfig, final MetaDataContexts originalMetaDataContexts) {
- metaDataPersistFacade.getDatabaseRuleService().delete(database.getName(), Collections.singleton(toBeRemovedRuleItemConfig));
+ private void removeSingleRuleConfiguration(final ShardingSphereDatabase database, final SingleRuleConfiguration toBeRemovedRuleConfig, final MetaDataContexts originalMetaDataContexts) {
+ metaDataPersistFacade.getDatabaseRuleService().delete(database.getName(), Collections.singleton(toBeRemovedRuleConfig));
+ persistReloadDatabaseByUnloadSingleTable(database, originalMetaDataContexts);
+ }
+
+ private void persistReloadDatabaseByUnloadSingleTable(final ShardingSphereDatabase database, final MetaDataContexts originalMetaDataContexts) {
metaDataPersistFacade.getDatabaseMetaDataFacade().persistReloadDatabaseByUnloadSingleTable(database.getName(),
rebuildDatabaseSchemaIndex(database.getName(), getReloadedMetaDataContexts(originalMetaDataContexts)),
originalMetaDataContexts.getMetaData().getDatabase(database.getName()));
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 529ff5eef95..7d9aa0f2b61 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
@@ -162,7 +162,7 @@ class ClusterMetaDataManagerPersistServiceTest {
}
@Test
- void assertAlterRuleConfiguration() {
+ void assertAlterRuleConfigurationWithSingleRule() {
ShardingSphereDatabase database = mock(ShardingSphereDatabase.class, Answers.RETURNS_DEEP_STUBS);
when(database.getName()).thenReturn("foo_db");
when(database.getProtocolType()).thenReturn(TypedSPILoader.getService(DatabaseType.class, "MySQL"));
@@ -177,6 +177,22 @@ class ClusterMetaDataManagerPersistServiceTest {
verify(metaDataPersistFacade.getDatabaseMetaDataFacade()).persistReloadDatabase(eq("foo_db"), any(), any());
}
+ @Test
+ void assertAlterRuleConfiguration() {
+ ShardingSphereDatabase database = mock(ShardingSphereDatabase.class, Answers.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);
+ RuleConfiguration ruleConfig = mock(RuleConfiguration.class);
+ metaDataManagerPersistService.alterRuleConfiguration(database, ruleConfig);
+ verify(metaDataPersistFacade.getDatabaseRuleService()).persist("foo_db", Collections.singleton(ruleConfig));
+ verify(metaDataPersistFacade.getDatabaseMetaDataFacade()).persistReloadDatabase(eq("foo_db"), any(), any());
+ }
+
@Test
void assertRemoveNullRuleConfigurationItem() {
metaDataManagerPersistService.removeRuleConfigurationItem(new ShardingSphereDatabase("foo_db", mock(), mock(), mock(), Collections.emptyList(), new ConfigurationProperties(new Properties())),
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 428cccb0462..9c15c36b687 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
@@ -219,7 +219,19 @@ public final class StandaloneMetaDataManagerPersistService implements MetaDataMa
if (null == toBeAlteredRuleConfig) {
return;
}
- Collection<String> needReloadTables = getNeedReloadTables(database, toBeAlteredRuleConfig);
+ if (toBeAlteredRuleConfig instanceof SingleRuleConfiguration) {
+ alterSingleRuleConfigurationItem(database, (SingleRuleConfiguration) toBeAlteredRuleConfig);
+ return;
+ }
+ Collection<MetaDataVersion> metaDataVersions = metaDataPersistFacade.getDatabaseRuleService().persist(database.getName(), Collections.singleton(toBeAlteredRuleConfig));
+ alterRuleItem(database.getName(), metaDataVersions);
+ persistAndAlterSchemaTables(database, toBeAlteredRuleConfig.getLogicTableNames());
+ clearServicesCache();
+ }
+
+ private void alterSingleRuleConfigurationItem(final ShardingSphereDatabase database, final SingleRuleConfiguration toBeAlteredRuleConfig) {
+ Collection<String> originalSingleTables = database.getRuleMetaData().getSingleRule(SingleRule.class).getConfiguration().getLogicTableNames();
+ Collection<String> needReloadTables = toBeAlteredRuleConfig.getLogicTableNames().stream().filter(each -> !originalSingleTables.contains(each)).collect(Collectors.toList());
Collection<MetaDataVersion> metaDataVersions = metaDataPersistFacade.getDatabaseRuleService().persist(database.getName(), Collections.singleton(toBeAlteredRuleConfig));
alterRuleItem(database.getName(), metaDataVersions);
persistAndAlterSchemaTables(database, needReloadTables);
@@ -243,18 +255,20 @@ public final class StandaloneMetaDataManagerPersistService implements MetaDataMa
return;
}
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(), reloadedDatabase, database);
- clearServicesCache();
+ removeSingleRuleConfigurationItem(database, (SingleRuleConfiguration) toBeRemovedRuleItemConfig);
return;
}
- Collection<String> needReloadTables = getNeedReloadTables(database, toBeRemovedRuleItemConfig);
Collection<MetaDataVersion> metaDataVersions = metaDataPersistFacade.getDatabaseRuleService().delete(database.getName(), Collections.singleton(toBeRemovedRuleItemConfig));
removeRuleItem(database.getName(), metaDataVersions);
- persistAndAlterSchemaTables(database, needReloadTables);
+ persistAndAlterSchemaTables(database, toBeRemovedRuleItemConfig.getLogicTableNames());
+ clearServicesCache();
+ }
+
+ private void removeSingleRuleConfigurationItem(final ShardingSphereDatabase database, final SingleRuleConfiguration toBeRemovedRuleItemConfig) {
+ 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(), reloadedDatabase, database);
clearServicesCache();
}
@@ -266,14 +280,6 @@ public final class StandaloneMetaDataManagerPersistService implements MetaDataMa
}
}
- private Collection<String> getNeedReloadTables(final ShardingSphereDatabase originalDatabase, final RuleConfiguration toBeAlteredRuleConfig) {
- if (toBeAlteredRuleConfig instanceof SingleRuleConfiguration) {
- Collection<String> originalSingleTables = originalDatabase.getRuleMetaData().getSingleRule(SingleRule.class).getConfiguration().getLogicTableNames();
- return toBeAlteredRuleConfig.getLogicTableNames().stream().filter(each -> !originalSingleTables.contains(each)).collect(Collectors.toList());
- }
- return toBeAlteredRuleConfig.getLogicTableNames();
- }
-
private void alterSchemaTables(final ShardingSphereDatabase database, final Map<String, Collection<ShardingSphereTable>> schemaAndTablesMap) {
for (Entry<String, Collection<ShardingSphereTable>> entry : schemaAndTablesMap.entrySet()) {
for (ShardingSphereTable each : entry.getValue()) {
@@ -285,18 +291,20 @@ public final class StandaloneMetaDataManagerPersistService implements MetaDataMa
@Override
public void removeRuleConfiguration(final ShardingSphereDatabase database, final RuleConfiguration toBeRemovedRuleConfig, final String ruleType) {
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(), reloadedDatabase, database);
- clearServicesCache();
+ removeSingleRuleConfiguration(database, ruleType);
return;
}
- Collection<String> needReloadTables = getNeedReloadTables(database, toBeRemovedRuleConfig);
metaDataPersistFacade.getDatabaseRuleService().delete(database.getName(), ruleType);
metaDataContextManager.getDatabaseRuleItemManager().drop(new DatabaseRuleNodePath(database.getName(), ruleType, null));
- persistAndAlterSchemaTables(database, needReloadTables);
+ persistAndAlterSchemaTables(database, toBeRemovedRuleConfig.getLogicTableNames());
+ clearServicesCache();
+ }
+
+ private void removeSingleRuleConfiguration(final ShardingSphereDatabase database, final String ruleType) {
+ 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(), reloadedDatabase, database);
clearServicesCache();
}
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 44a378fe582..2bdfea11105 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
@@ -177,6 +177,23 @@ class StandaloneMetaDataManagerPersistServiceTest {
verify(metaDataContextManager.getDatabaseRuleItemManager()).alter(deepEq(databaseRuleNodePath));
}
+ @Test
+ void assertAlterRuleConfigurationWithSingleRule() {
+ ShardingSphereDatabase database = mock(ShardingSphereDatabase.class, RETURNS_DEEP_STUBS);
+ when(database.getName()).thenReturn("foo_db");
+ when(database.getProtocolType()).thenReturn(TypedSPILoader.getService(DatabaseType.class, "MySQL"));
+ SingleRule singleRule = mock(SingleRule.class);
+ when(singleRule.getConfiguration()).thenReturn(new SingleRuleConfiguration(Collections.singleton("foo_ds.foo_tbl"), null));
+ when(singleRule.getAttributes()).thenReturn(new RuleAttributes());
+ when(database.getRuleMetaData()).thenReturn(new RuleMetaData(Collections.singleton(singleRule)));
+ ShardingSphereMetaData metaData = new ShardingSphereMetaData(Collections.singleton(database), mock(), mock(), new ConfigurationProperties(new Properties()));
+ when(metaDataContextManager.getMetaDataContexts().getMetaData()).thenReturn(metaData);
+ SingleRuleConfiguration ruleConfig = new SingleRuleConfiguration(Arrays.asList("foo_ds.foo_tbl", "foo_ds.bar_tbl"), null);
+ metaDataManagerPersistService.alterRuleConfiguration(database, ruleConfig);
+ verify(metaDataPersistFacade.getDatabaseRuleService()).persist("foo_db", Collections.singleton(ruleConfig));
+ verify(metaDataPersistFacade.getDatabaseMetaDataFacade()).persistAlteredTables(eq("foo_db"), any(), eq(Collections.singletonList("bar_tbl")));
+ }
+
@Test
void assertRemoveNullRuleConfigurationItem() {
metaDataManagerPersistService.removeRuleConfigurationItem(new ShardingSphereDatabase("foo_db", mock(), mock(), mock(), Collections.emptyList(), new ConfigurationProperties(new Properties())),