This is an automated email from the ASF dual-hosted git repository.
duanzhengqiang 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 6c21b8d3af9 Refactor ContextManager.reloadDatabaseMetaData (#18887)
6c21b8d3af9 is described below
commit 6c21b8d3af91a0476db5f1a1e6e6d8ec3af48430
Author: Liang Zhang <[email protected]>
AuthorDate: Wed Jul 6 14:06:22 2022 +0800
Refactor ContextManager.reloadDatabaseMetaData (#18887)
* Refactor ContextManager.reloadDatabaseMetaData
* Rename reloadDatabase
* Rename reloadDatabase
* Rename reloadDatabase
---
.../mode/manager/ContextManager.java | 49 +++++++---------------
.../mode/manager/ContextManagerTest.java | 4 +-
.../updatable/RefreshTableMetadataHandler.java | 2 +-
3 files changed, 17 insertions(+), 38 deletions(-)
diff --git
a/shardingsphere-mode/shardingsphere-mode-core/src/main/java/org/apache/shardingsphere/mode/manager/ContextManager.java
b/shardingsphere-mode/shardingsphere-mode-core/src/main/java/org/apache/shardingsphere/mode/manager/ContextManager.java
index 33580c3e208..29022149c1f 100644
---
a/shardingsphere-mode/shardingsphere-mode-core/src/main/java/org/apache/shardingsphere/mode/manager/ContextManager.java
+++
b/shardingsphere-mode/shardingsphere-mode-core/src/main/java/org/apache/shardingsphere/mode/manager/ContextManager.java
@@ -36,10 +36,10 @@ import
org.apache.shardingsphere.infra.instance.InstanceContext;
import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
import
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
import
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabasesFactory;
+import
org.apache.shardingsphere.infra.metadata.database.resource.ShardingSphereResource;
import
org.apache.shardingsphere.infra.metadata.database.rule.ShardingSphereRuleMetaData;
import
org.apache.shardingsphere.infra.metadata.database.schema.builder.GenericSchemaBuilder;
import
org.apache.shardingsphere.infra.metadata.database.schema.builder.GenericSchemaBuilderMaterials;
-import
org.apache.shardingsphere.infra.metadata.database.schema.builder.SystemSchemaBuilder;
import
org.apache.shardingsphere.infra.metadata.database.schema.decorator.model.ShardingSphereSchema;
import
org.apache.shardingsphere.infra.metadata.database.schema.decorator.model.ShardingSphereTable;
import org.apache.shardingsphere.infra.rule.builder.global.GlobalRulesBuilder;
@@ -57,9 +57,9 @@ import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.LinkedList;
import java.util.Map;
+import java.util.Map.Entry;
import java.util.Optional;
import java.util.Properties;
-import java.util.concurrent.ConcurrentHashMap;
import java.util.stream.Collectors;
/**
@@ -304,16 +304,6 @@ public final class ContextManager implements AutoCloseable
{
return result;
}
- private MetaDataContexts createMetaDataContexts(final String databaseName,
final Map<String, ShardingSphereSchema> actualSchemas) {
- ShardingSphereDatabase alteredMetaData = new
ShardingSphereDatabase(databaseName,
metaDataContexts.getMetaData().getDatabases().get(databaseName).getProtocolType(),
-
metaDataContexts.getMetaData().getDatabases().get(databaseName).getResource(),
metaDataContexts.getMetaData().getDatabases().get(databaseName).getRuleMetaData(),
actualSchemas);
- Map<String, ShardingSphereDatabase> alteredDatabases = new
HashMap<>(metaDataContexts.getMetaData().getDatabases());
- alteredDatabases.put(databaseName, alteredMetaData);
- metaDataContexts.getOptimizerContext().alterDatabase(databaseName,
actualSchemas);
- return newMetaDataContexts(new
ShardingSphereMetaData(alteredDatabases,
metaDataContexts.getMetaData().getGlobalRuleMetaData(),
metaDataContexts.getMetaData().getProps()),
- metaDataContexts.getOptimizerContext());
- }
-
private MetaDataContexts createMetaDataContexts(final String databaseName,
final SwitchingResource switchingResource, final Collection<RuleConfiguration>
ruleConfigs) throws SQLException {
Map<String, ShardingSphereDatabase> changedDatabases =
createChangedDatabases(databaseName, switchingResource, ruleConfigs);
ShardingSphereRuleMetaData changedGlobalMetaData = new
ShardingSphereRuleMetaData(
@@ -372,38 +362,27 @@ public final class ContextManager implements
AutoCloseable {
}
/**
- * Reload database meta data.
+ * Reload database.
*
* @param databaseName to be reloaded database name
*/
- public synchronized void reloadDatabaseMetaData(final String databaseName)
{
+ public synchronized void reloadDatabase(final String databaseName) {
try {
- Map<String, ShardingSphereSchema> actualSchemas =
loadSchemas(databaseName);
- Map<String, ShardingSphereSchema> pendingDeletedSchemas =
getPendingDeletedSchemas(databaseName, actualSchemas);
- metaDataContexts = createMetaDataContexts(databaseName,
actualSchemas);
- pendingDeletedSchemas.keySet().forEach(each ->
metaDataContexts.getPersistService().ifPresent(optional ->
optional.getDatabaseMetaDataService().deleteSchema(databaseName, each)));
- persistMetaData(metaDataContexts);
+ ShardingSphereResource currentResource =
metaDataContexts.getMetaData().getDatabases().get(databaseName).getResource();
+ SwitchingResource switchingResource = new
SwitchingResource(currentResource, currentResource.getDataSources(),
Collections.emptyMap());
+ MetaDataContexts reloadedMetaDataContexts =
createMetaDataContexts(databaseName, switchingResource, null);
+ Map<String, ShardingSphereSchema> toBeDeletedSchemas =
getToBeDeletedSchemas(reloadedMetaDataContexts.getMetaData().getDatabases().get(databaseName));
+ metaDataContexts = reloadedMetaDataContexts;
+ toBeDeletedSchemas.keySet().forEach(each ->
reloadedMetaDataContexts.getPersistService().ifPresent(optional ->
optional.getDatabaseMetaDataService().deleteSchema(databaseName, each)));
+ persistMetaData(reloadedMetaDataContexts);
} catch (final SQLException ex) {
log.error("Reload database:{} failed", databaseName, ex);
}
}
- private Map<String, ShardingSphereSchema> loadSchemas(final String
databaseName) throws SQLException {
- ShardingSphereDatabase database =
metaDataContexts.getMetaData().getDatabases().get(databaseName);
- Map<String, DataSource> dataSourceMap =
database.getResource().getDataSources();
- database.reloadRules(instanceContext);
- DatabaseType storageType =
DatabaseTypeEngine.getDatabaseType(dataSourceMap.values());
- Map<String, ShardingSphereSchema> result = new ConcurrentHashMap<>();
- GenericSchemaBuilderMaterials materials = new
GenericSchemaBuilderMaterials(database.getProtocolType(),
- storageType, dataSourceMap,
database.getRuleMetaData().getRules(),
metaDataContexts.getMetaData().getProps(), databaseName);
- result.putAll(GenericSchemaBuilder.build(materials));
- result.putAll(SystemSchemaBuilder.build(databaseName,
database.getProtocolType()));
- return result;
- }
-
- private Map<String, ShardingSphereSchema> getPendingDeletedSchemas(final
String databaseName, final Map<String, ShardingSphereSchema> actualSchemas) {
- Map<String, ShardingSphereSchema> originalSchemas =
metaDataContexts.getMetaData().getDatabases().get(databaseName).getSchemas();
- return originalSchemas.entrySet().stream().filter(entry ->
!actualSchemas.containsKey(entry.getKey())).collect(Collectors.toMap(Map.Entry::getKey,
Map.Entry::getValue));
+ private Map<String, ShardingSphereSchema> getToBeDeletedSchemas(final
ShardingSphereDatabase reloadedDatabase) {
+ Map<String, ShardingSphereSchema> currentSchemas =
metaDataContexts.getMetaData().getDatabases().get(reloadedDatabase.getName()).getSchemas();
+ return currentSchemas.entrySet().stream().filter(entry ->
!reloadedDatabase.getSchemas().containsKey(entry.getKey())).collect(Collectors.toMap(Entry::getKey,
Entry::getValue));
}
/**
diff --git
a/shardingsphere-mode/shardingsphere-mode-core/src/test/java/org/apache/shardingsphere/mode/manager/ContextManagerTest.java
b/shardingsphere-mode/shardingsphere-mode-core/src/test/java/org/apache/shardingsphere/mode/manager/ContextManagerTest.java
index 654f472d4eb..a2be5b6631e 100644
---
a/shardingsphere-mode/shardingsphere-mode-core/src/test/java/org/apache/shardingsphere/mode/manager/ContextManagerTest.java
+++
b/shardingsphere-mode/shardingsphere-mode-core/src/test/java/org/apache/shardingsphere/mode/manager/ContextManagerTest.java
@@ -256,13 +256,13 @@ public final class ContextManagerTest {
}
@Test
- public void assertReloadDatabaseMetaData() {
+ public void assertReloadDatabase() {
when(metaDataContexts.getMetaData().getDatabases().get("foo_db").getResource().getDataSources()).thenReturn(Collections.singletonMap("foo_ds",
new MockedDataSource()));
DatabaseMetaDataPersistService databaseMetaDataPersistService =
mock(DatabaseMetaDataPersistService.class, RETURNS_DEEP_STUBS);
MetaDataPersistService metaDataPersistService =
mock(MetaDataPersistService.class);
when(metaDataPersistService.getDatabaseMetaDataService()).thenReturn(databaseMetaDataPersistService);
when(metaDataContexts.getPersistService()).thenReturn(Optional.of(metaDataPersistService));
- contextManager.reloadDatabaseMetaData("foo_db");
+ contextManager.reloadDatabase("foo_db");
verify(databaseMetaDataPersistService,
times(1)).deleteSchema(eq("foo_db"), eq("foo_schema"));
verify(databaseMetaDataPersistService,
times(1)).persistMetaData(eq("foo_db"), eq("foo_db"),
any(ShardingSphereSchema.class));
}
diff --git
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/ral/common/updatable/RefreshTableMetadataHandler.java
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/ral/common/updatable/RefreshTableMetadataHandler.java
index ef3939f1ddd..35b86149ef7 100644
---
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/ral/common/updatable/RefreshTableMetadataHandler.java
+++
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/ral/common/updatable/RefreshTableMetadataHandler.java
@@ -47,7 +47,7 @@ public final class RefreshTableMetadataHandler extends
UpdatableRALBackendHandle
if (getSqlStatement().getTableName().isPresent()) {
contextManager.reloadTableMetaData(databaseName, schemaName,
getSqlStatement().getTableName().get());
} else {
- contextManager.reloadDatabaseMetaData(databaseName);
+ contextManager.reloadDatabase(databaseName);
}
}