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 2074e6bb207 Refactor ContextManager (#29786)
2074e6bb207 is described below
commit 2074e6bb2076ad11fa18ce6722dbe60526787294
Author: Liang Zhang <[email protected]>
AuthorDate: Sat Jan 20 16:09:09 2024 +0800
Refactor ContextManager (#29786)
* Refactor ContextManager
* Refactor ContextManager
---
.../scenario/migration/api/MigrationJobAPI.java | 2 +-
.../mode/manager/ContextManager.java | 58 ++++++++++------------
.../mode/manager/ContextManagerTest.java | 7 ++-
.../updatable/RefreshTableMetaDataExecutor.java | 8 +--
4 files changed, 36 insertions(+), 39 deletions(-)
diff --git
a/kernel/data-pipeline/scenario/migration/src/main/java/org/apache/shardingsphere/data/pipeline/scenario/migration/api/MigrationJobAPI.java
b/kernel/data-pipeline/scenario/migration/src/main/java/org/apache/shardingsphere/data/pipeline/scenario/migration/api/MigrationJobAPI.java
index c8fb395d983..419bf9e5bc8 100644
---
a/kernel/data-pipeline/scenario/migration/src/main/java/org/apache/shardingsphere/data/pipeline/scenario/migration/api/MigrationJobAPI.java
+++
b/kernel/data-pipeline/scenario/migration/src/main/java/org/apache/shardingsphere/data/pipeline/scenario/migration/api/MigrationJobAPI.java
@@ -288,7 +288,7 @@ public final class MigrationJobAPI implements
TransmissionJobAPI {
// TODO use origin database name now, wait reloadDatabaseMetaData fix
case-sensitive probelm
ContextManager contextManager =
PipelineContextManager.getContext(PipelineJobIdUtils.parseContextKey(jobId)).getContextManager();
ShardingSphereDatabase database =
contextManager.getMetaDataContexts().getMetaData().getDatabase(databaseName);
- contextManager.refreshTableMetaData(database.getName());
+ contextManager.refreshTableMetaData(database);
}
@Override
diff --git
a/mode/core/src/main/java/org/apache/shardingsphere/mode/manager/ContextManager.java
b/mode/core/src/main/java/org/apache/shardingsphere/mode/manager/ContextManager.java
index d706bfe2da6..b35f411a714 100644
---
a/mode/core/src/main/java/org/apache/shardingsphere/mode/manager/ContextManager.java
+++
b/mode/core/src/main/java/org/apache/shardingsphere/mode/manager/ContextManager.java
@@ -116,7 +116,7 @@ public final class ContextManager implements AutoCloseable {
public void refreshDatabaseMetaData(final String databaseName, final
boolean force) {
try {
ShardingSphereDatabase database =
metaDataContexts.get().getMetaData().getDatabase(databaseName);
- MetaDataContexts reloadedMetaDataContexts =
createMetaDataContexts(databaseName);
+ MetaDataContexts reloadedMetaDataContexts =
createMetaDataContexts(database);
if (force) {
metaDataContexts.set(reloadedMetaDataContexts);
metaDataContexts.get().getMetaData().getDatabase(databaseName).getSchemas()
@@ -135,29 +135,26 @@ public final class ContextManager implements
AutoCloseable {
/**
* Reload table meta data.
*
- * @param databaseName to be reloaded database name
+ * @param database to be reloaded database
*/
- public void refreshTableMetaData(final String databaseName) {
+ public void refreshTableMetaData(final ShardingSphereDatabase database) {
try {
- ShardingSphereDatabase database =
metaDataContexts.get().getMetaData().getDatabase(databaseName);
- MetaDataContexts reloadedMetaDataContexts =
createMetaDataContexts(databaseName);
- deletedSchemaNames(databaseName,
reloadedMetaDataContexts.getMetaData().getDatabase(databaseName), database);
+ MetaDataContexts reloadedMetaDataContexts =
createMetaDataContexts(database);
+ deletedSchemaNames(database.getName(), database, database);
metaDataContexts.set(reloadedMetaDataContexts);
-
metaDataContexts.get().getMetaData().getDatabase(databaseName).getSchemas()
- .forEach((schemaName, schema) ->
metaDataContexts.get().getPersistService().getDatabaseMetaDataService().compareAndPersist(database.getName(),
schemaName, schema));
+ database.getSchemas().forEach((schemaName, schema) ->
metaDataContexts.get().getPersistService().getDatabaseMetaDataService().compareAndPersist(database.getName(),
schemaName, schema));
} catch (final SQLException ex) {
- log.error("Refresh table meta data: {} failed", databaseName, ex);
+ log.error("Refresh table meta data: {} failed",
database.getName(), ex);
}
}
- private MetaDataContexts createMetaDataContexts(final String databaseName)
throws SQLException {
- ShardingSphereDatabase database =
metaDataContexts.get().getMetaData().getDatabase(databaseName);
- Map<String, DataSourcePoolProperties> dataSourcePoolPropsFromRegCenter
=
metaDataContexts.get().getPersistService().getDataSourceUnitService().load(databaseName);
+ private MetaDataContexts createMetaDataContexts(final
ShardingSphereDatabase database) throws SQLException {
+ Map<String, DataSourcePoolProperties> dataSourcePoolPropsFromRegCenter
=
metaDataContexts.get().getPersistService().getDataSourceUnitService().load(database.getName());
SwitchingResource switchingResource = new
ResourceSwitchManager().createByAlterDataSourcePoolProperties(database.getResourceMetaData(),
dataSourcePoolPropsFromRegCenter);
metaDataContexts.get().getMetaData().getDatabases().putAll(configurationContextManager.renewDatabase(database,
switchingResource));
MetaDataBasedPersistService metaDataPersistService =
metaDataContexts.get().getPersistService();
- Map<String, ShardingSphereDatabase> changedDatabases =
configurationContextManager.createChangedDatabases(databaseName, false,
- switchingResource,
metaDataPersistService.getDatabaseRulePersistService().load(databaseName));
+ Map<String, ShardingSphereDatabase> changedDatabases =
configurationContextManager.createChangedDatabases(database.getName(), false,
+ switchingResource,
metaDataPersistService.getDatabaseRulePersistService().load(database.getName()));
ConfigurationProperties props = new
ConfigurationProperties(metaDataPersistService.getPropsService().load());
RuleMetaData changedGlobalMetaData = new RuleMetaData(
GlobalRulesBuilder.buildRules(metaDataPersistService.getGlobalRuleService().load(),
changedDatabases, props));
@@ -182,29 +179,28 @@ public final class ContextManager implements
AutoCloseable {
/**
* Reload schema.
*
- * @param databaseName database name
+ * @param database database
* @param schemaName to be reloaded schema name
* @param dataSourceName data source name
*/
- public void reloadSchema(final String databaseName, final String
schemaName, final String dataSourceName) {
+ public void reloadSchema(final ShardingSphereDatabase database, final
String schemaName, final String dataSourceName) {
try {
- ShardingSphereSchema reloadedSchema = loadSchema(databaseName,
schemaName, dataSourceName);
+ ShardingSphereSchema reloadedSchema = loadSchema(database,
schemaName, dataSourceName);
if (reloadedSchema.getTables().isEmpty()) {
-
metaDataContexts.get().getMetaData().getDatabase(databaseName).dropSchema(schemaName);
-
metaDataContexts.get().getPersistService().getDatabaseMetaDataService().dropSchema(metaDataContexts.get().getMetaData().getDatabase(databaseName).getName(),
+ database.dropSchema(schemaName);
+
metaDataContexts.get().getPersistService().getDatabaseMetaDataService().dropSchema(database.getName(),
schemaName);
} else {
-
metaDataContexts.get().getMetaData().getDatabase(databaseName).addSchema(schemaName,
reloadedSchema);
+ database.addSchema(schemaName, reloadedSchema);
metaDataContexts.get().getPersistService().getDatabaseMetaDataService()
-
.compareAndPersist(metaDataContexts.get().getMetaData().getDatabase(databaseName).getName(),
schemaName, reloadedSchema);
+ .compareAndPersist(database.getName(), schemaName,
reloadedSchema);
}
} catch (final SQLException ex) {
- log.error("Reload meta data of database: {} schema: {} with data
source: {} failed", databaseName, schemaName, dataSourceName, ex);
+ log.error("Reload meta data of database: {} schema: {} with data
source: {} failed", database.getName(), schemaName, dataSourceName, ex);
}
}
- private ShardingSphereSchema loadSchema(final String databaseName, final
String schemaName, final String dataSourceName) throws SQLException {
- ShardingSphereDatabase database =
metaDataContexts.get().getMetaData().getDatabase(databaseName);
+ private ShardingSphereSchema loadSchema(final ShardingSphereDatabase
database, final String schemaName, final String dataSourceName) throws
SQLException {
database.reloadRules(MutableDataNodeRule.class);
GenericSchemaBuilderMaterial material = new
GenericSchemaBuilderMaterial(database.getProtocolType(),
Collections.singletonMap(dataSourceName,
database.getResourceMetaData().getStorageUnits().get(dataSourceName).getStorageType()),
@@ -218,38 +214,36 @@ public final class ContextManager implements
AutoCloseable {
/**
* Reload table.
*
- * @param databaseName database name
+ * @param database database
* @param schemaName schema name
* @param tableName to be reloaded table name
*/
- public void reloadTable(final String databaseName, final String
schemaName, final String tableName) {
- ShardingSphereDatabase database =
metaDataContexts.get().getMetaData().getDatabase(databaseName);
+ public void reloadTable(final ShardingSphereDatabase database, final
String schemaName, final String tableName) {
GenericSchemaBuilderMaterial material = new
GenericSchemaBuilderMaterial(database.getProtocolType(),
database.getResourceMetaData().getStorageUnits(),
database.getRuleMetaData().getRules(),
metaDataContexts.get().getMetaData().getProps(), schemaName);
try {
persistTable(database, schemaName, tableName, material);
} catch (final SQLException ex) {
- log.error("Reload table: {} meta data of database: {} schema: {}
failed", tableName, databaseName, schemaName, ex);
+ log.error("Reload table: {} meta data of database: {} schema: {}
failed", tableName, database.getName(), schemaName, ex);
}
}
/**
* Reload table from single data source.
*
- * @param databaseName database name
+ * @param database database
* @param schemaName schema name
* @param dataSourceName data source name
* @param tableName to be reloaded table name
*/
- public void reloadTable(final String databaseName, final String
schemaName, final String dataSourceName, final String tableName) {
- ShardingSphereDatabase database =
metaDataContexts.get().getMetaData().getDatabase(databaseName);
+ public void reloadTable(final ShardingSphereDatabase database, final
String schemaName, final String dataSourceName, final String tableName) {
StorageUnit storageUnit =
database.getResourceMetaData().getStorageUnits().get(dataSourceName);
GenericSchemaBuilderMaterial material = new
GenericSchemaBuilderMaterial(database.getProtocolType(),
Collections.singletonMap(dataSourceName, storageUnit.getStorageType()),
Collections.singletonMap(dataSourceName,
storageUnit.getDataSource()), database.getRuleMetaData().getRules(),
metaDataContexts.get().getMetaData().getProps(), schemaName);
try {
persistTable(database, schemaName, tableName, material);
} catch (final SQLException ex) {
- log.error("Reload table: {} meta data of database: {} schema: {}
with data source: {} failed", tableName, databaseName, schemaName,
dataSourceName, ex);
+ log.error("Reload table: {} meta data of database: {} schema: {}
with data source: {} failed", tableName, database.getName(), schemaName,
dataSourceName, ex);
}
}
diff --git
a/mode/core/src/test/java/org/apache/shardingsphere/mode/manager/ContextManagerTest.java
b/mode/core/src/test/java/org/apache/shardingsphere/mode/manager/ContextManagerTest.java
index 381362e62fc..8b907de9ea5 100644
---
a/mode/core/src/test/java/org/apache/shardingsphere/mode/manager/ContextManagerTest.java
+++
b/mode/core/src/test/java/org/apache/shardingsphere/mode/manager/ContextManagerTest.java
@@ -98,6 +98,7 @@ class ContextManagerTest {
private ShardingSphereDatabase mockDatabase() {
ShardingSphereDatabase result = mock(ShardingSphereDatabase.class,
RETURNS_DEEP_STUBS);
+ when(result.getName()).thenReturn("foo_db");
when(result.getProtocolType()).thenReturn(TypedSPILoader.getService(DatabaseType.class,
"FIXTURE"));
MutableDataNodeRule mutableDataNodeRule =
mock(MutableDataNodeRule.class, RETURNS_DEEP_STUBS);
when(mutableDataNodeRule.findTableDataNode("foo_schema",
"foo_tbl")).thenReturn(Optional.of(mock(DataNode.class)));
@@ -301,7 +302,8 @@ class ContextManagerTest {
MetaDataPersistService persistService =
mock(MetaDataPersistService.class);
when(persistService.getDatabaseMetaDataService()).thenReturn(databaseMetaDataPersistService);
when(metaDataContexts.getPersistService()).thenReturn(persistService);
- contextManager.reloadSchema("foo_db", "foo_schema", "foo_ds");
+ ShardingSphereDatabase database = mockDatabase();
+ contextManager.reloadSchema(database, "foo_schema", "foo_ds");
verify(databaseMetaDataPersistService).dropSchema("foo_db",
"foo_schema");
}
@@ -311,7 +313,8 @@ class ContextManagerTest {
MetaDataPersistService persistService =
mock(MetaDataPersistService.class);
when(persistService.getDatabaseMetaDataService()).thenReturn(databaseMetaDataPersistService);
when(metaDataContexts.getPersistService()).thenReturn(persistService);
- contextManager.reloadTable("foo_db", "foo_schema", "foo_table");
+ ShardingSphereDatabase database = mockDatabase();
+ contextManager.reloadTable(database, "foo_schema", "foo_table");
assertTrue(contextManager.getMetaDataContexts().getMetaData().getDatabase("foo_db").getResourceMetaData().getStorageUnits().containsKey("foo_ds"));
}
diff --git
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/RefreshTableMetaDataExecutor.java
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/RefreshTableMetaDataExecutor.java
index 83eaab39235..434b727e48e 100644
---
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/RefreshTableMetaDataExecutor.java
+++
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/RefreshTableMetaDataExecutor.java
@@ -48,16 +48,16 @@ public final class RefreshTableMetaDataExecutor implements
DatabaseAwareUpdatabl
String schemaName = getSchemaName(sqlStatement);
if (sqlStatement.getStorageUnitName().isPresent()) {
if (sqlStatement.getTableName().isPresent()) {
- contextManager.reloadTable(database.getName(), schemaName,
sqlStatement.getStorageUnitName().get(), sqlStatement.getTableName().get());
+ contextManager.reloadTable(database, schemaName,
sqlStatement.getStorageUnitName().get(), sqlStatement.getTableName().get());
} else {
- contextManager.reloadSchema(database.getName(), schemaName,
sqlStatement.getStorageUnitName().get());
+ contextManager.reloadSchema(database, schemaName,
sqlStatement.getStorageUnitName().get());
}
return;
}
if (sqlStatement.getTableName().isPresent()) {
- contextManager.reloadTable(database.getName(), schemaName,
sqlStatement.getTableName().get());
+ contextManager.reloadTable(database, schemaName,
sqlStatement.getTableName().get());
} else {
- contextManager.refreshTableMetaData(database.getName());
+ contextManager.refreshTableMetaData(database);
}
}