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 f15ef6a4f8f Create temporary metadata contexts when alter storage
units (#32284)
f15ef6a4f8f is described below
commit f15ef6a4f8f6672adb445dbc8712eb95d4ffeb3e
Author: Haoran Meng <[email protected]>
AuthorDate: Mon Jul 29 10:25:11 2024 +0800
Create temporary metadata contexts when alter storage units (#32284)
* Create temporary metadata contexts when alter storage units
* Create temporary metadata contexts when alter storage units
* Create temporary metadata contexts when alter storage units
* Create temporary metadata contexts when alter storage units
* Add persist schema by alter and drop configuration
---
.../schema/manager/GenericSchemaManager.java | 1 +
.../metadata/persist/MetaDataPersistService.java | 13 ++-----
.../database/DatabaseMetaDataPersistService.java | 25 +++++++++++++
.../mode/metadata/manager/StorageUnitManager.java | 2 +-
.../ClusterMetaDataManagerPersistService.java | 43 ++++++++++++++++------
5 files changed, 63 insertions(+), 21 deletions(-)
diff --git
a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/manager/GenericSchemaManager.java
b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/manager/GenericSchemaManager.java
index c0830117752..4429f0d4087 100644
---
a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/manager/GenericSchemaManager.java
+++
b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/manager/GenericSchemaManager.java
@@ -42,6 +42,7 @@ public final class GenericSchemaManager {
*/
public static Map<String, ShardingSphereSchema>
getToBeAddedTablesBySchemas(final Map<String, ShardingSphereSchema>
reloadSchemas, final Map<String, ShardingSphereSchema> currentSchemas) {
Map<String, ShardingSphereSchema> result = new
LinkedHashMap<>(currentSchemas.size(), 1F);
+ reloadSchemas.entrySet().stream().filter(entry ->
!currentSchemas.containsKey(entry.getKey())).forEach(entry ->
result.put(entry.getKey(), entry.getValue()));
reloadSchemas.entrySet().stream().filter(entry ->
currentSchemas.containsKey(entry.getKey())).collect(Collectors.toMap(Entry::getKey,
Entry::getValue))
.forEach((key, value) -> result.put(key,
getToBeAddedTablesBySchema(value, currentSchemas.get(key))));
return result;
diff --git
a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/MetaDataPersistService.java
b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/MetaDataPersistService.java
index acb5da8c3f5..1ddb919b8ca 100644
---
a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/MetaDataPersistService.java
+++
b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/MetaDataPersistService.java
@@ -149,15 +149,10 @@ public final class MetaDataPersistService {
* @param currentDatabase current database
*/
public void persistReloadDatabaseByAlter(final String databaseName, final
ShardingSphereDatabase reloadDatabase, final ShardingSphereDatabase
currentDatabase) {
- Map<String, ShardingSphereSchema> toBeAlterSchemas =
GenericSchemaManager.getToBeDeletedTablesBySchemas(reloadDatabase.getSchemas(),
currentDatabase.getSchemas());
+ Map<String, ShardingSphereSchema> toBeDeletedSchemas =
GenericSchemaManager.getToBeDeletedTablesBySchemas(reloadDatabase.getSchemas(),
currentDatabase.getSchemas());
Map<String, ShardingSphereSchema> toBeAddedSchemas =
GenericSchemaManager.getToBeAddedTablesBySchemas(reloadDatabase.getSchemas(),
currentDatabase.getSchemas());
- toBeAddedSchemas.forEach((schemaName, schema) -> {
- if (schema.isEmpty()) {
- databaseMetaDataService.addSchema(databaseName, schemaName);
- }
-
databaseMetaDataService.getTableMetaDataPersistService().persist(databaseName,
schemaName, schema.getTables());
- });
- toBeAlterSchemas.forEach((key, value) ->
databaseMetaDataService.delete(databaseName, key, value));
+ toBeAddedSchemas.forEach((key, value) ->
databaseMetaDataService.persistByAlterConfiguration(databaseName, key, value));
+ toBeDeletedSchemas.forEach((key, value) ->
databaseMetaDataService.delete(databaseName, key, value));
}
/**
@@ -170,7 +165,7 @@ public final class MetaDataPersistService {
public void persistReloadDatabaseByDrop(final String databaseName, final
ShardingSphereDatabase reloadDatabase, final ShardingSphereDatabase
currentDatabase) {
Map<String, ShardingSphereSchema> toBeAlterSchemas =
GenericSchemaManager.getToBeDeletedTablesBySchemas(reloadDatabase.getSchemas(),
currentDatabase.getSchemas());
Map<String, ShardingSphereSchema> toBeAddedSchemas =
GenericSchemaManager.getToBeAddedTablesBySchemas(reloadDatabase.getSchemas(),
currentDatabase.getSchemas());
- toBeAddedSchemas.forEach((key, value) ->
databaseMetaDataService.getTableMetaDataPersistService().persist(databaseName,
key, value.getTables()));
+ toBeAddedSchemas.forEach((key, value) ->
databaseMetaDataService.persistByDropConfiguration(databaseName, key, value));
toBeAlterSchemas.forEach((key, value) ->
databaseMetaDataService.delete(databaseName, key, value));
}
}
diff --git
a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/database/DatabaseMetaDataPersistService.java
b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/database/DatabaseMetaDataPersistService.java
index c7247f7f2a5..ce39647d3bf 100644
---
a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/database/DatabaseMetaDataPersistService.java
+++
b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/database/DatabaseMetaDataPersistService.java
@@ -143,4 +143,29 @@ public final class DatabaseMetaDataPersistService {
private Collection<String> loadAllSchemaNames(final String databaseName) {
return
repository.getChildrenKeys(DatabaseMetaDataNode.getMetaDataSchemasPath(databaseName));
}
+
+ /**
+ * Persist by alter configuration.
+ *
+ * @param databaseName database name
+ * @param schemaName schema name
+ * @param schema schema meta data
+ */
+ public void persistByAlterConfiguration(final String databaseName, final
String schemaName, final ShardingSphereSchema schema) {
+ if (schema.getTables().isEmpty() && schema.getViews().isEmpty()) {
+ addSchema(databaseName, schemaName);
+ }
+ tableMetaDataPersistService.persist(databaseName, schemaName,
schema.getTables());
+ }
+
+ /**
+ * Persist by drop configuration.
+ *
+ * @param databaseName database name
+ * @param schemaName schema name
+ * @param schema schema meta data
+ */
+ public void persistByDropConfiguration(final String databaseName, final
String schemaName, final ShardingSphereSchema schema) {
+ tableMetaDataPersistService.persist(databaseName, schemaName,
schema.getTables());
+ }
}
diff --git
a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/manager/StorageUnitManager.java
b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/manager/StorageUnitManager.java
index 9b2ec0017e1..1caf0699e07 100644
---
a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/manager/StorageUnitManager.java
+++
b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/manager/StorageUnitManager.java
@@ -123,7 +123,7 @@ public final class StorageUnitManager {
}
private void buildNewMetaDataContext(final String databaseName, final
SwitchingResource switchingResource) throws SQLException {
- MetaDataContexts reloadMetaDataContexts =
createMetaDataContexts(databaseName, false, switchingResource, null);
+ MetaDataContexts reloadMetaDataContexts =
createMetaDataContexts(databaseName, true, switchingResource, null);
metaDataContexts.set(reloadMetaDataContexts);
metaDataContexts.get().getMetaData().getDatabases().putAll(buildShardingSphereDatabase(reloadMetaDataContexts.getMetaData().getDatabase(databaseName)));
switchingResource.closeStaleDataSources();
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 c7c7a7810a8..6ab399681c1 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
@@ -30,6 +30,8 @@ import
org.apache.shardingsphere.metadata.persist.service.config.database.DataSo
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.metadata.MetaDataContextsFactory;
+import org.apache.shardingsphere.mode.metadata.manager.SwitchingResource;
import org.apache.shardingsphere.mode.persist.pojo.ListenerAssisted;
import org.apache.shardingsphere.mode.persist.pojo.ListenerAssistedType;
import
org.apache.shardingsphere.mode.persist.service.ListenerAssistedPersistService;
@@ -37,6 +39,7 @@ import
org.apache.shardingsphere.mode.persist.service.MetaDataManagerPersistServ
import org.apache.shardingsphere.mode.spi.PersistRepository;
import org.apache.shardingsphere.single.config.SingleRuleConfiguration;
+import java.sql.SQLException;
import java.util.Collection;
import java.util.Collections;
import java.util.Map;
@@ -113,28 +116,43 @@ public final class ClusterMetaDataManagerPersistService
implements MetaDataManag
}
@Override
- public void registerStorageUnits(final String databaseName, final
Map<String, DataSourcePoolProperties> toBeRegisteredProps) {
+ public void registerStorageUnits(final String databaseName, final
Map<String, DataSourcePoolProperties> toBeRegisteredProps) throws SQLException {
MetaDataContexts originalMetaDataContexts =
metaDataContextManager.getMetaDataContexts().get();
+ SwitchingResource switchingResource =
metaDataContextManager.getResourceSwitchManager()
+
.switchByRegisterStorageUnit(originalMetaDataContexts.getMetaData().getDatabase(databaseName).getResourceMetaData(),
toBeRegisteredProps);
+ MetaDataContexts reloadMetaDataContexts =
MetaDataContextsFactory.createBySwitchResource(databaseName, false,
+ switchingResource, originalMetaDataContexts,
metaDataPersistService, metaDataContextManager.getComputeNodeInstanceContext());
metaDataPersistService.getDataSourceUnitService().persistConfigurations(databaseName,
toBeRegisteredProps);
- afterStorageUnitsAltered(databaseName, originalMetaDataContexts);
+ afterStorageUnitsAltered(databaseName, originalMetaDataContexts,
reloadMetaDataContexts);
+ reloadMetaDataContexts.close();
}
@Override
- public void alterStorageUnits(final String databaseName, final Map<String,
DataSourcePoolProperties> toBeUpdatedProps) {
+ public void alterStorageUnits(final String databaseName, final Map<String,
DataSourcePoolProperties> toBeUpdatedProps) throws SQLException {
MetaDataContexts originalMetaDataContexts =
metaDataContextManager.getMetaDataContexts().get();
+ SwitchingResource switchingResource =
metaDataContextManager.getResourceSwitchManager()
+
.switchByAlterStorageUnit(originalMetaDataContexts.getMetaData().getDatabase(databaseName).getResourceMetaData(),
toBeUpdatedProps);
+ MetaDataContexts reloadMetaDataContexts =
MetaDataContextsFactory.createBySwitchResource(databaseName, false,
+ switchingResource, originalMetaDataContexts,
metaDataPersistService, metaDataContextManager.getComputeNodeInstanceContext());
DataSourceUnitPersistService dataSourceService =
metaDataPersistService.getDataSourceUnitService();
metaDataPersistService.getMetaDataVersionPersistService()
.switchActiveVersion(dataSourceService.persistConfigurations(databaseName,
toBeUpdatedProps));
- afterStorageUnitsAltered(databaseName, originalMetaDataContexts);
+ afterStorageUnitsAltered(databaseName, originalMetaDataContexts,
reloadMetaDataContexts);
+ reloadMetaDataContexts.close();
}
@Override
- public void unregisterStorageUnits(final String databaseName, final
Collection<String> toBeDroppedStorageUnitNames) {
- MetaDataContexts originalMetaDataContexts =
metaDataContextManager.getMetaDataContexts().get();
+ public void unregisterStorageUnits(final String databaseName, final
Collection<String> toBeDroppedStorageUnitNames) throws SQLException {
for (String each : getToBeDroppedResourceNames(databaseName,
toBeDroppedStorageUnitNames)) {
+ MetaDataContexts originalMetaDataContexts =
metaDataContextManager.getMetaDataContexts().get();
+ SwitchingResource switchingResource =
metaDataContextManager.getResourceSwitchManager()
+
.switchByUnregisterStorageUnit(originalMetaDataContexts.getMetaData().getDatabase(databaseName).getResourceMetaData(),
Collections.singletonList(each));
+ MetaDataContexts reloadMetaDataContexts =
MetaDataContextsFactory.createBySwitchResource(databaseName, false,
+ switchingResource, originalMetaDataContexts,
metaDataPersistService, metaDataContextManager.getComputeNodeInstanceContext());
metaDataPersistService.getDataSourceUnitService().delete(databaseName, each);
+ afterStorageUnitsDropped(databaseName, originalMetaDataContexts,
reloadMetaDataContexts);
+ reloadMetaDataContexts.close();
}
- afterStorageUnitsDropped(databaseName, originalMetaDataContexts);
}
private Collection<String> getToBeDroppedResourceNames(final String
databaseName, final Collection<String> toBeDroppedResourceNames) {
@@ -185,8 +203,10 @@ public final class ClusterMetaDataManagerPersistService
implements MetaDataManag
metaDataPersistService.getPropsService().persist(props);
}
- private void afterStorageUnitsAltered(final String databaseName, final
MetaDataContexts originalMetaDataContexts) {
- MetaDataContexts reloadMetaDataContexts =
metaDataContextManager.getMetaDataContexts().get();
+ private void afterStorageUnitsAltered(final String databaseName, final
MetaDataContexts originalMetaDataContexts, final MetaDataContexts
reloadMetaDataContexts) {
+
reloadMetaDataContexts.getMetaData().getDatabase(databaseName).getSchemas().forEach((schemaName,
schema) -> metaDataPersistService.getDatabaseMetaDataService()
+
.persistByAlterConfiguration(reloadMetaDataContexts.getMetaData().getDatabase(databaseName).getName(),
schemaName, schema));
+ // TODO confirm
Optional.ofNullable(reloadMetaDataContexts.getStatistics().getDatabaseData().get(databaseName))
.ifPresent(optional ->
optional.getSchemaData().forEach((schemaName, schemaData) ->
metaDataPersistService.getShardingSphereDataPersistService()
.persist(databaseName, schemaName, schemaData,
originalMetaDataContexts.getMetaData().getDatabases())));
@@ -194,8 +214,9 @@ public final class ClusterMetaDataManagerPersistService
implements MetaDataManag
originalMetaDataContexts.getMetaData().getDatabase(databaseName));
}
- private void afterStorageUnitsDropped(final String databaseName, final
MetaDataContexts originalMetaDataContexts) {
- MetaDataContexts reloadMetaDataContexts =
metaDataContextManager.getMetaDataContexts().get();
+ private void afterStorageUnitsDropped(final String databaseName, final
MetaDataContexts originalMetaDataContexts, final MetaDataContexts
reloadMetaDataContexts) {
+
reloadMetaDataContexts.getMetaData().getDatabase(databaseName).getSchemas().forEach((schemaName,
schema) -> metaDataPersistService.getDatabaseMetaDataService()
+
.persistByDropConfiguration(reloadMetaDataContexts.getMetaData().getDatabase(databaseName).getName(),
schemaName, schema));
Optional.ofNullable(reloadMetaDataContexts.getStatistics().getDatabaseData().get(databaseName))
.ifPresent(optional ->
optional.getSchemaData().forEach((schemaName, schemaData) ->
metaDataPersistService.getShardingSphereDataPersistService()
.persist(databaseName, schemaName, schemaData,
originalMetaDataContexts.getMetaData().getDatabases())));