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 f8f575655ca Move persist schema meta data to
MetaDataManagerPersistService after storage unit altered (#32054)
f8f575655ca is described below
commit f8f575655cafc0fd15ab52a3288796fb2d408888
Author: Haoran Meng <[email protected]>
AuthorDate: Wed Jul 10 15:21:48 2024 +0800
Move persist schema meta data to MetaDataManagerPersistService after
storage unit altered (#32054)
---
.../rdl/resource/AlterStorageUnitExecutor.java | 3 ++
.../rdl/resource/RegisterStorageUnitExecutor.java | 3 ++
.../resource/UnregisterStorageUnitExecutor.java | 3 ++
.../metadata/manager/ConfigurationManager.java | 46 ++++++++--------------
.../service/MetaDataManagerPersistService.java | 11 ++++++
.../ClusterMetaDataManagerPersistService.java | 36 +++++++++++++++++
6 files changed, 72 insertions(+), 30 deletions(-)
diff --git
a/infra/distsql-handler/src/main/java/org/apache/shardingsphere/distsql/handler/executor/rdl/resource/AlterStorageUnitExecutor.java
b/infra/distsql-handler/src/main/java/org/apache/shardingsphere/distsql/handler/executor/rdl/resource/AlterStorageUnitExecutor.java
index 3a6938b4b0f..82791ab55c8 100644
---
a/infra/distsql-handler/src/main/java/org/apache/shardingsphere/distsql/handler/executor/rdl/resource/AlterStorageUnitExecutor.java
+++
b/infra/distsql-handler/src/main/java/org/apache/shardingsphere/distsql/handler/executor/rdl/resource/AlterStorageUnitExecutor.java
@@ -40,6 +40,7 @@ import
org.apache.shardingsphere.infra.exception.kernel.metadata.resource.storag
import
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
import
org.apache.shardingsphere.infra.metadata.database.resource.unit.StorageUnit;
import org.apache.shardingsphere.mode.manager.ContextManager;
+import org.apache.shardingsphere.mode.metadata.MetaDataContexts;
import java.sql.SQLException;
import java.util.Collection;
@@ -65,7 +66,9 @@ public final class AlterStorageUnitExecutor implements
DistSQLUpdateExecutor<Alt
Map<String, DataSourcePoolProperties> propsMap =
DataSourceSegmentsConverter.convert(database.getProtocolType(),
sqlStatement.getStorageUnits());
validateHandler.validate(propsMap);
try {
+ MetaDataContexts originalMetaDataContexts =
contextManager.getMetaDataContexts();
contextManager.getPersistServiceFacade().getMetaDataManagerPersistService().alterStorageUnits(database.getName(),
propsMap);
+
contextManager.getPersistServiceFacade().getMetaDataManagerPersistService().afterStorageUnitsAltered(database.getName(),
originalMetaDataContexts, false);
} catch (final SQLException | ShardingSphereExternalException ex) {
throw new StorageUnitsOperateException("alter", propsMap.keySet(),
ex);
}
diff --git
a/infra/distsql-handler/src/main/java/org/apache/shardingsphere/distsql/handler/executor/rdl/resource/RegisterStorageUnitExecutor.java
b/infra/distsql-handler/src/main/java/org/apache/shardingsphere/distsql/handler/executor/rdl/resource/RegisterStorageUnitExecutor.java
index 3af15c74b69..a0e15507fa1 100644
---
a/infra/distsql-handler/src/main/java/org/apache/shardingsphere/distsql/handler/executor/rdl/resource/RegisterStorageUnitExecutor.java
+++
b/infra/distsql-handler/src/main/java/org/apache/shardingsphere/distsql/handler/executor/rdl/resource/RegisterStorageUnitExecutor.java
@@ -33,6 +33,7 @@ import
org.apache.shardingsphere.infra.exception.kernel.metadata.resource.storag
import
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
import
org.apache.shardingsphere.infra.rule.attribute.datasource.DataSourceMapperRuleAttribute;
import org.apache.shardingsphere.mode.manager.ContextManager;
+import org.apache.shardingsphere.mode.metadata.MetaDataContexts;
import java.sql.SQLException;
import java.util.ArrayList;
@@ -67,7 +68,9 @@ public final class RegisterStorageUnitExecutor implements
DistSQLUpdateExecutor<
}
validateHandler.validate(propsMap);
try {
+ MetaDataContexts originalMetaDataContexts =
contextManager.getMetaDataContexts();
contextManager.getPersistServiceFacade().getMetaDataManagerPersistService().registerStorageUnits(database.getName(),
propsMap);
+
contextManager.getPersistServiceFacade().getMetaDataManagerPersistService().afterStorageUnitsAltered(database.getName(),
originalMetaDataContexts, false);
} catch (final SQLException | ShardingSphereExternalException ex) {
throw new StorageUnitsOperateException("register",
propsMap.keySet(), ex);
}
diff --git
a/infra/distsql-handler/src/main/java/org/apache/shardingsphere/distsql/handler/executor/rdl/resource/UnregisterStorageUnitExecutor.java
b/infra/distsql-handler/src/main/java/org/apache/shardingsphere/distsql/handler/executor/rdl/resource/UnregisterStorageUnitExecutor.java
index a01b50de523..7bdcfc73669 100644
---
a/infra/distsql-handler/src/main/java/org/apache/shardingsphere/distsql/handler/executor/rdl/resource/UnregisterStorageUnitExecutor.java
+++
b/infra/distsql-handler/src/main/java/org/apache/shardingsphere/distsql/handler/executor/rdl/resource/UnregisterStorageUnitExecutor.java
@@ -33,6 +33,7 @@ import
org.apache.shardingsphere.infra.metadata.database.resource.unit.StorageUn
import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
import org.apache.shardingsphere.infra.spi.ShardingSphereServiceLoader;
import org.apache.shardingsphere.mode.manager.ContextManager;
+import org.apache.shardingsphere.mode.metadata.MetaDataContexts;
import java.sql.SQLException;
import java.util.Collection;
@@ -57,7 +58,9 @@ public final class UnregisterStorageUnitExecutor implements
DistSQLUpdateExecuto
}
checkInUsed(sqlStatement);
try {
+ MetaDataContexts originalMetaDataContexts =
contextManager.getMetaDataContexts();
contextManager.getPersistServiceFacade().getMetaDataManagerPersistService().unregisterStorageUnits(database.getName(),
sqlStatement.getStorageUnitNames());
+
contextManager.getPersistServiceFacade().getMetaDataManagerPersistService().afterStorageUnitsAltered(database.getName(),
originalMetaDataContexts, true);
} catch (final SQLException | ShardingSphereServerException ex) {
throw new StorageUnitsOperateException("unregister",
sqlStatement.getStorageUnitNames(), ex);
}
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 f12b63963a9..f18e143a36f 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
@@ -95,7 +95,7 @@ public final class ConfigurationManager {
try {
closeStaleRules(databaseName);
SwitchingResource switchingResource =
resourceSwitchManager.registerStorageUnit(metaDataContexts.get().getMetaData().getDatabase(databaseName).getResourceMetaData(),
propsMap);
- buildNewMetaDataContext(databaseName, switchingResource, false);
+ buildNewMetaDataContext(databaseName, switchingResource);
} catch (final SQLException ex) {
log.error("Alter database: {} register storage unit failed",
databaseName, ex);
}
@@ -111,7 +111,7 @@ public final class ConfigurationManager {
try {
closeStaleRules(databaseName);
SwitchingResource switchingResource =
resourceSwitchManager.alterStorageUnit(metaDataContexts.get().getMetaData().getDatabase(databaseName).getResourceMetaData(),
propsMap);
- buildNewMetaDataContext(databaseName, switchingResource, false);
+ buildNewMetaDataContext(databaseName, switchingResource);
} catch (final SQLException ex) {
log.error("Alter database: {} register storage unit failed",
databaseName, ex);
}
@@ -128,32 +128,30 @@ public final class ConfigurationManager {
closeStaleRules(databaseName);
SwitchingResource switchingResource =
resourceSwitchManager.unregisterStorageUnit(metaDataContexts.get().getMetaData().getDatabase(databaseName).getResourceMetaData(),
Collections.singletonList(storageUnitName));
- buildNewMetaDataContext(databaseName, switchingResource, true);
+ 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 isDropConfig) throws
SQLException {
+ private void buildNewMetaDataContext(final String databaseName, final
SwitchingResource switchingResource) throws SQLException {
MetaDataContexts reloadMetaDataContexts =
createMetaDataContexts(databaseName, false, switchingResource, null);
- persistSchemaMetaData(databaseName, reloadMetaDataContexts,
isDropConfig);
-
Optional.ofNullable(reloadMetaDataContexts.getStatistics().getDatabaseData().get(databaseName))
- .ifPresent(optional ->
optional.getSchemaData().forEach((schemaName, schemaData) ->
metaDataPersistService.getShardingSphereDataPersistService()
- .persist(databaseName, schemaName, schemaData,
metaDataContexts.get().getMetaData().getDatabases())));
- alterSchemaMetaData(databaseName,
reloadMetaDataContexts.getMetaData().getDatabase(databaseName),
metaDataContexts.get().getMetaData().getDatabase(databaseName), isDropConfig);
metaDataContexts.set(reloadMetaDataContexts);
-
metaDataContexts.get().getMetaData().getDatabases().putAll(newShardingSphereDatabase(metaDataContexts.get().getMetaData().getDatabase(databaseName)));
+
metaDataContexts.get().getMetaData().getDatabases().putAll(buildShardingSphereDatabase(reloadMetaDataContexts.getMetaData().getDatabase(databaseName)));
switchingResource.closeStaleDataSources();
}
- private void persistSchemaMetaData(final String databaseName, final
MetaDataContexts reloadMetaDataContexts, final boolean isDropConfig) {
- if (isDropConfig) {
-
reloadMetaDataContexts.getMetaData().getDatabase(databaseName).getSchemas().forEach((schemaName,
schema) -> metaDataPersistService.getDatabaseMetaDataService()
-
.persistByDropConfiguration(reloadMetaDataContexts.getMetaData().getDatabase(databaseName).getName(),
schemaName, schema));
- } else {
-
reloadMetaDataContexts.getMetaData().getDatabase(databaseName).getSchemas().forEach((schemaName,
schema) -> metaDataPersistService.getDatabaseMetaDataService()
-
.persistByAlterConfiguration(reloadMetaDataContexts.getMetaData().getDatabase(databaseName).getName(),
schemaName, schema));
- }
+ private Map<String, ShardingSphereDatabase>
buildShardingSphereDatabase(final ShardingSphereDatabase originalDatabase) {
+ return
Collections.singletonMap(originalDatabase.getName().toLowerCase(), new
ShardingSphereDatabase(originalDatabase.getName(),
+ originalDatabase.getProtocolType(),
originalDatabase.getResourceMetaData(), originalDatabase.getRuleMetaData(),
buildSchemas(originalDatabase)));
+ }
+
+ private Map<String, ShardingSphereSchema> buildSchemas(final
ShardingSphereDatabase originalDatabase) {
+ Map<String, ShardingSphereSchema> result = new
LinkedHashMap<>(originalDatabase.getSchemas().size(), 1F);
+ originalDatabase.getSchemas().keySet().forEach(schemaName ->
result.put(schemaName.toLowerCase(),
+ new
ShardingSphereSchema(originalDatabase.getSchema(schemaName).getTables(),
+
metaDataPersistService.getDatabaseMetaDataService().getViewMetaDataPersistService().load(originalDatabase.getName(),
schemaName))));
+ return result;
}
/**
@@ -358,18 +356,6 @@ public final class ConfigurationManager {
return result;
}
- /**
- * Create new ShardingSphere database.
- *
- * @param originalDatabase original database
- * @return ShardingSphere databases
- */
- public Map<String, ShardingSphereDatabase> newShardingSphereDatabase(final
ShardingSphereDatabase originalDatabase) {
- return
Collections.singletonMap(originalDatabase.getName().toLowerCase(), new
ShardingSphereDatabase(originalDatabase.getName(),
- originalDatabase.getProtocolType(),
originalDatabase.getResourceMetaData(), originalDatabase.getRuleMetaData(),
-
metaDataPersistService.getDatabaseMetaDataService().loadSchemas(originalDatabase.getName())));
- }
-
/**
* Alter global rule configuration.
*
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 873947101ac..07ca42177a3 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
@@ -22,6 +22,7 @@ import
org.apache.shardingsphere.infra.datasource.pool.props.domain.DataSourcePo
import
org.apache.shardingsphere.infra.metadata.database.schema.pojo.AlterSchemaMetaDataPOJO;
import
org.apache.shardingsphere.infra.metadata.database.schema.pojo.AlterSchemaPOJO;
import org.apache.shardingsphere.infra.metadata.version.MetaDataVersion;
+import org.apache.shardingsphere.mode.metadata.MetaDataContexts;
import java.sql.SQLException;
import java.util.Collection;
@@ -149,4 +150,14 @@ public interface MetaDataManagerPersistService {
* @param props pros
*/
void alterProperties(Properties props);
+
+ /**
+ * After storage units altered.
+ *
+ * @param databaseName database name
+ * @param originalMetaDataContexts original meta data contexts
+ * @param isDropConfig is drop config
+ */
+ default void afterStorageUnitsAltered(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 ab5b3bef573..d31ec44d26e 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
@@ -19,6 +19,8 @@ package
org.apache.shardingsphere.mode.manager.cluster.persist;
import org.apache.shardingsphere.infra.config.rule.RuleConfiguration;
import
org.apache.shardingsphere.infra.datasource.pool.props.domain.DataSourcePoolProperties;
+import
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
+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;
@@ -29,6 +31,7 @@ import
org.apache.shardingsphere.metadata.persist.MetaDataPersistService;
import
org.apache.shardingsphere.metadata.persist.service.config.database.DataSourceUnitPersistService;
import
org.apache.shardingsphere.metadata.persist.service.database.DatabaseMetaDataPersistService;
import org.apache.shardingsphere.mode.metadata.MetaDataContextManager;
+import org.apache.shardingsphere.mode.metadata.MetaDataContexts;
import org.apache.shardingsphere.mode.persist.pojo.ListenerAssistedType;
import
org.apache.shardingsphere.mode.persist.service.ListenerAssistedPersistService;
import
org.apache.shardingsphere.mode.persist.service.MetaDataManagerPersistService;
@@ -39,6 +42,7 @@ import
org.apache.shardingsphere.single.config.SingleRuleConfiguration;
import java.util.Collection;
import java.util.Collections;
import java.util.Map;
+import java.util.Optional;
import java.util.Properties;
import java.util.stream.Collectors;
@@ -168,4 +172,36 @@ public final class ClusterMetaDataManagerPersistService
implements MetaDataManag
public void alterProperties(final Properties props) {
metaDataPersistService.getPropsService().persist(props);
}
+
+ @Override
+ public void afterStorageUnitsAltered(final String databaseName, final
MetaDataContexts originalMetaDataContexts, final boolean isDropConfig) {
+ MetaDataContexts reloadMetaDataContexts =
metaDataContextManager.getMetaDataContexts().get();
+ // TODO Confirm if it should be persisted twice
+ persistSchemaMetaData(databaseName, reloadMetaDataContexts,
isDropConfig);
+
Optional.ofNullable(reloadMetaDataContexts.getStatistics().getDatabaseData().get(databaseName))
+ .ifPresent(optional ->
optional.getSchemaData().forEach((schemaName, schemaData) ->
metaDataPersistService.getShardingSphereDataPersistService()
+ .persist(databaseName, schemaName, schemaData,
originalMetaDataContexts.getMetaData().getDatabases())));
+ alter(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()
+
.persistByDropConfiguration(reloadMetaDataContexts.getMetaData().getDatabase(databaseName).getName(),
schemaName, schema));
+ } else {
+
reloadMetaDataContexts.getMetaData().getDatabase(databaseName).getSchemas().forEach((schemaName,
schema) -> metaDataPersistService.getDatabaseMetaDataService()
+
.persistByAlterConfiguration(reloadMetaDataContexts.getMetaData().getDatabase(databaseName).getName(),
schemaName, schema));
+ }
+ }
+
+ private void alter(final String databaseName, final ShardingSphereDatabase
reloadDatabase, final ShardingSphereDatabase currentDatabase, final boolean
isDropConfig) {
+ Map<String, ShardingSphereSchema> toBeAlterSchemas =
GenericSchemaManager.getToBeDeletedTablesBySchemas(reloadDatabase.getSchemas(),
currentDatabase.getSchemas());
+ Map<String, ShardingSphereSchema> toBeAddedSchemas =
GenericSchemaManager.getToBeAddedTablesBySchemas(reloadDatabase.getSchemas(),
currentDatabase.getSchemas());
+ if (isDropConfig) {
+ toBeAddedSchemas.forEach((key, value) ->
metaDataPersistService.getDatabaseMetaDataService().persistByDropConfiguration(databaseName,
key, value));
+ } else {
+ toBeAddedSchemas.forEach((key, value) ->
metaDataPersistService.getDatabaseMetaDataService().persistByAlterConfiguration(databaseName,
key, value));
+ }
+ toBeAlterSchemas.forEach((key, value) ->
metaDataPersistService.getDatabaseMetaDataService().delete(databaseName, key,
value));
+ }
}