This is an automated email from the ASF dual-hosted git repository.
sunnianjun 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 3d54cdd4335 Move persist schema meta data to
MetaDataManagerPersistService after rule configuration altered (#32067)
3d54cdd4335 is described below
commit 3d54cdd433572d48338bd8ac45693f803bc213f6
Author: Haoran Meng <[email protected]>
AuthorDate: Thu Jul 11 18:52:46 2024 +0800
Move persist schema meta data to MetaDataManagerPersistService after rule
configuration altered (#32067)
* add afterRuleConfigurationAltered in MetaDataManagerPersistService
* Move persist schema meta data to MetaDataManagerPersistService after rule
configuration altered
---
.../rule/engine/database/type/AlterDatabaseRuleOperator.java | 6 +++++-
.../rule/engine/database/type/CreateDatabaseRuleOperator.java | 6 +++++-
.../rule/engine/database/type/DropDatabaseRuleOperator.java | 7 ++++++-
.../mode/metadata/manager/ConfigurationManager.java | 11 +++++------
.../mode/persist/service/MetaDataManagerPersistService.java | 10 ++++++++++
.../cluster/persist/ClusterMetaDataManagerPersistService.java | 7 +++++++
6 files changed, 38 insertions(+), 9 deletions(-)
diff --git
a/infra/distsql-handler/src/main/java/org/apache/shardingsphere/distsql/handler/engine/update/rdl/rule/engine/database/type/AlterDatabaseRuleOperator.java
b/infra/distsql-handler/src/main/java/org/apache/shardingsphere/distsql/handler/engine/update/rdl/rule/engine/database/type/AlterDatabaseRuleOperator.java
index f929913169d..e76262bcadf 100644
---
a/infra/distsql-handler/src/main/java/org/apache/shardingsphere/distsql/handler/engine/update/rdl/rule/engine/database/type/AlterDatabaseRuleOperator.java
+++
b/infra/distsql-handler/src/main/java/org/apache/shardingsphere/distsql/handler/engine/update/rdl/rule/engine/database/type/AlterDatabaseRuleOperator.java
@@ -27,6 +27,7 @@ import
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
import org.apache.shardingsphere.infra.metadata.version.MetaDataVersion;
import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader;
import org.apache.shardingsphere.mode.manager.ContextManager;
+import org.apache.shardingsphere.mode.metadata.MetaDataContexts;
import
org.apache.shardingsphere.mode.persist.service.MetaDataManagerPersistService;
import java.util.Collection;
@@ -51,8 +52,11 @@ public final class AlterDatabaseRuleOperator implements
DatabaseRuleOperator {
RuleConfiguration toBeAlteredRuleConfig =
executor.buildToBeAlteredRuleConfiguration(sqlStatement);
MetaDataManagerPersistService metaDataManagerPersistService =
contextManager.getPersistServiceFacade().getMetaDataManagerPersistService();
RuleConfiguration toBeDroppedRuleConfig =
executor.buildToBeDroppedRuleConfiguration(toBeAlteredRuleConfig);
+ MetaDataContexts originalMetaDataContexts =
contextManager.getMetaDataContexts();
metaDataManagerPersistService.removeRuleConfigurationItem(database.getName(),
toBeDroppedRuleConfig);
- return
metaDataManagerPersistService.alterRuleConfiguration(database.getName(),
decorateRuleConfiguration(database, toBeAlteredRuleConfig));
+ Collection<MetaDataVersion> result =
metaDataManagerPersistService.alterRuleConfiguration(database.getName(),
decorateRuleConfiguration(database, toBeAlteredRuleConfig));
+
metaDataManagerPersistService.afterRuleConfigurationAltered(database.getName(),
originalMetaDataContexts, false);
+ return result;
}
@SuppressWarnings("unchecked")
diff --git
a/infra/distsql-handler/src/main/java/org/apache/shardingsphere/distsql/handler/engine/update/rdl/rule/engine/database/type/CreateDatabaseRuleOperator.java
b/infra/distsql-handler/src/main/java/org/apache/shardingsphere/distsql/handler/engine/update/rdl/rule/engine/database/type/CreateDatabaseRuleOperator.java
index 54e5449ebfe..4afde93767c 100644
---
a/infra/distsql-handler/src/main/java/org/apache/shardingsphere/distsql/handler/engine/update/rdl/rule/engine/database/type/CreateDatabaseRuleOperator.java
+++
b/infra/distsql-handler/src/main/java/org/apache/shardingsphere/distsql/handler/engine/update/rdl/rule/engine/database/type/CreateDatabaseRuleOperator.java
@@ -27,6 +27,7 @@ import
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
import org.apache.shardingsphere.infra.metadata.version.MetaDataVersion;
import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader;
import org.apache.shardingsphere.mode.manager.ContextManager;
+import org.apache.shardingsphere.mode.metadata.MetaDataContexts;
import
org.apache.shardingsphere.mode.persist.service.MetaDataManagerPersistService;
import java.util.Collection;
@@ -49,8 +50,11 @@ public final class CreateDatabaseRuleOperator implements
DatabaseRuleOperator {
@SuppressWarnings("unchecked")
public Collection<MetaDataVersion> operate(final
DatabaseRuleDefinitionStatement sqlStatement, final ShardingSphereDatabase
database, final RuleConfiguration currentRuleConfig) {
RuleConfiguration toBeCreatedRuleConfig =
executor.buildToBeCreatedRuleConfiguration(sqlStatement);
+ MetaDataContexts originalMetaDataContexts =
contextManager.getMetaDataContexts();
MetaDataManagerPersistService metaDataManagerPersistService =
contextManager.getPersistServiceFacade().getMetaDataManagerPersistService();
- return
metaDataManagerPersistService.alterRuleConfiguration(database.getName(),
decorateRuleConfiguration(database, toBeCreatedRuleConfig));
+ Collection<MetaDataVersion> result =
metaDataManagerPersistService.alterRuleConfiguration(database.getName(),
decorateRuleConfiguration(database, toBeCreatedRuleConfig));
+
metaDataManagerPersistService.afterRuleConfigurationAltered(database.getName(),
originalMetaDataContexts, false);
+ return result;
}
@SuppressWarnings("unchecked")
diff --git
a/infra/distsql-handler/src/main/java/org/apache/shardingsphere/distsql/handler/engine/update/rdl/rule/engine/database/type/DropDatabaseRuleOperator.java
b/infra/distsql-handler/src/main/java/org/apache/shardingsphere/distsql/handler/engine/update/rdl/rule/engine/database/type/DropDatabaseRuleOperator.java
index b0e17d2c32d..c308b9e09c0 100644
---
a/infra/distsql-handler/src/main/java/org/apache/shardingsphere/distsql/handler/engine/update/rdl/rule/engine/database/type/DropDatabaseRuleOperator.java
+++
b/infra/distsql-handler/src/main/java/org/apache/shardingsphere/distsql/handler/engine/update/rdl/rule/engine/database/type/DropDatabaseRuleOperator.java
@@ -28,6 +28,7 @@ import
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
import org.apache.shardingsphere.infra.metadata.version.MetaDataVersion;
import
org.apache.shardingsphere.infra.rule.attribute.datasource.StaticDataSourceRuleAttribute;
import
org.apache.shardingsphere.infra.yaml.config.pojo.rule.YamlRuleConfiguration;
+import org.apache.shardingsphere.mode.metadata.MetaDataContexts;
import
org.apache.shardingsphere.mode.persist.service.MetaDataManagerPersistService;
import org.apache.shardingsphere.mode.tuple.annotation.RepositoryTupleEntity;
import
org.apache.shardingsphere.infra.yaml.config.swapper.rule.YamlRuleConfigurationSwapperEngine;
@@ -60,6 +61,7 @@ public final class DropDatabaseRuleOperator implements
DatabaseRuleOperator {
}
// TODO refactor to new metadata refresh way
}
+ MetaDataContexts originalMetaDataContexts =
contextManager.getMetaDataContexts();
MetaDataManagerPersistService metaDataManagerPersistService =
contextManager.getPersistServiceFacade().getMetaDataManagerPersistService();
RuleConfiguration toBeDroppedRuleConfig =
executor.buildToBeDroppedRuleConfiguration(sqlStatement);
metaDataManagerPersistService.removeRuleConfigurationItem(database.getName(),
toBeDroppedRuleConfig);
@@ -67,8 +69,11 @@ public final class DropDatabaseRuleOperator implements
DatabaseRuleOperator {
if (null != toBeAlteredRuleConfig && ((DatabaseRuleConfiguration)
toBeAlteredRuleConfig).isEmpty()) {
YamlRuleConfiguration yamlRuleConfig = new
YamlRuleConfigurationSwapperEngine().swapToYamlRuleConfiguration(currentRuleConfig);
metaDataManagerPersistService.removeRuleConfiguration(database.getName(),
Objects.requireNonNull(yamlRuleConfig.getClass().getAnnotation(RepositoryTupleEntity.class)).value());
+
metaDataManagerPersistService.afterRuleConfigurationAltered(database.getName(),
originalMetaDataContexts, true);
return Collections.emptyList();
}
- return
metaDataManagerPersistService.alterRuleConfiguration(database.getName(),
toBeAlteredRuleConfig);
+ Collection<MetaDataVersion> result =
metaDataManagerPersistService.alterRuleConfiguration(database.getName(),
toBeAlteredRuleConfig);
+
metaDataManagerPersistService.afterRuleConfigurationAltered(database.getName(),
originalMetaDataContexts, false);
+ return result;
}
}
diff --git
a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/manager/ConfigurationManager.java
b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/manager/ConfigurationManager.java
index f18e143a36f..7b42ca00e77 100644
---
a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/manager/ConfigurationManager.java
+++
b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/manager/ConfigurationManager.java
@@ -173,7 +173,7 @@ public final class ConfigurationManager {
rules.removeIf(each ->
each.getConfiguration().getClass().isAssignableFrom(ruleConfig.getClass()));
rules.addAll(DatabaseRulesBuilder.build(databaseName,
database.getProtocolType(), database.getRuleMetaData().getRules(),
ruleConfig, computeNodeInstanceContext,
database.getResourceMetaData()));
- refreshMetadata(databaseName, database, rules, false);
+ refreshMetadata(databaseName, database, rules);
} catch (final SQLException ex) {
log.error("Alter database: {} rule configurations failed",
databaseName, ex);
}
@@ -200,19 +200,18 @@ public final class ConfigurationManager {
rules.addAll(DatabaseRulesBuilder.build(databaseName,
database.getProtocolType(), database.getRuleMetaData().getRules(),
ruleConfig, computeNodeInstanceContext,
database.getResourceMetaData()));
}
- refreshMetadata(databaseName, database, rules, true);
+ refreshMetadata(databaseName, database, rules);
} catch (final SQLException ex) {
log.error("Drop database: {} rule configurations failed",
databaseName, ex);
}
}
- private void refreshMetadata(final String databaseName, final
ShardingSphereDatabase database, final Collection<ShardingSphereRule> rules,
final boolean isDropConfig) throws SQLException {
+ private void refreshMetadata(final String databaseName, final
ShardingSphereDatabase database, final Collection<ShardingSphereRule> rules)
throws SQLException {
database.getRuleMetaData().getRules().clear();
database.getRuleMetaData().getRules().addAll(rules);
MetaDataContexts reloadMetaDataContexts =
createMetaDataContextsByAlterRule(databaseName,
database.getRuleMetaData().getConfigurations());
- alterSchemaMetaData(databaseName,
reloadMetaDataContexts.getMetaData().getDatabase(databaseName),
metaDataContexts.get().getMetaData().getDatabase(databaseName), isDropConfig);
metaDataContexts.set(reloadMetaDataContexts);
-
metaDataContexts.get().getMetaData().getDatabase(databaseName).getSchemas().putAll(newShardingSphereSchemas(metaDataContexts.get().getMetaData().getDatabase(databaseName)));
+
metaDataContexts.get().getMetaData().getDatabase(databaseName).getSchemas().putAll(buildShardingSphereSchemas(metaDataContexts.get().getMetaData().getDatabase(databaseName)));
}
private MetaDataContexts createMetaDataContextsByAlterRule(final String
databaseName, final Collection<RuleConfiguration> ruleConfigs) throws
SQLException {
@@ -350,7 +349,7 @@ public final class ConfigurationManager {
: ExternalMetaDataFactory.create(databaseName, databaseConfig,
props, computeNodeInstanceContext);
}
- private Map<String, ShardingSphereSchema> newShardingSphereSchemas(final
ShardingSphereDatabase database) {
+ private Map<String, ShardingSphereSchema> buildShardingSphereSchemas(final
ShardingSphereDatabase database) {
Map<String, ShardingSphereSchema> result = new
LinkedHashMap<>(database.getSchemas().size(), 1F);
database.getSchemas().forEach((key, value) -> result.put(key, new
ShardingSphereSchema(value.getTables(), value.getViews())));
return result;
diff --git
a/mode/core/src/main/java/org/apache/shardingsphere/mode/persist/service/MetaDataManagerPersistService.java
b/mode/core/src/main/java/org/apache/shardingsphere/mode/persist/service/MetaDataManagerPersistService.java
index 07ca42177a3..19a57b69fe6 100644
---
a/mode/core/src/main/java/org/apache/shardingsphere/mode/persist/service/MetaDataManagerPersistService.java
+++
b/mode/core/src/main/java/org/apache/shardingsphere/mode/persist/service/MetaDataManagerPersistService.java
@@ -160,4 +160,14 @@ public interface MetaDataManagerPersistService {
*/
default void afterStorageUnitsAltered(String databaseName,
MetaDataContexts originalMetaDataContexts, boolean isDropConfig) {
}
+
+ /**
+ * After rule configuration altered.
+ *
+ * @param databaseName database name
+ * @param originalMetaDataContexts original meta data contexts
+ * @param isDropConfig is drop config
+ */
+ default void afterRuleConfigurationAltered(String databaseName,
MetaDataContexts originalMetaDataContexts, boolean isDropConfig) {
+ }
}
diff --git
a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/persist/ClusterMetaDataManagerPersistService.java
b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/persist/ClusterMetaDataManagerPersistService.java
index 2ce8c8aedc9..e46cfd663b6 100644
---
a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/persist/ClusterMetaDataManagerPersistService.java
+++
b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/persist/ClusterMetaDataManagerPersistService.java
@@ -183,6 +183,13 @@ public final class ClusterMetaDataManagerPersistService
implements MetaDataManag
originalMetaDataContexts.getMetaData().getDatabase(databaseName), isDropConfig);
}
+ @Override
+ public void afterRuleConfigurationAltered(final String databaseName, final
MetaDataContexts originalMetaDataContexts, final boolean isDropConfig) {
+ MetaDataContexts reloadMetaDataContexts =
metaDataContextManager.getMetaDataContexts().get();
+
metaDataContextManager.getConfigurationManager().alterSchemaMetaData(databaseName,
reloadMetaDataContexts.getMetaData().getDatabase(databaseName),
+
originalMetaDataContexts.getMetaData().getDatabase(databaseName), isDropConfig);
+ }
+
private void persistSchemaMetaData(final String databaseName, final
MetaDataContexts reloadMetaDataContexts, final boolean isDropConfig) {
if (isDropConfig) {
reloadMetaDataContexts.getMetaData().getDatabase(databaseName).getSchemas().forEach((schemaName,
schema) -> metaDataPersistService.getDatabaseMetaDataService()