From acf6a6742d358bb434e7c0b3481b4c9f4d4d4f14 Mon Sep 17 00:00:00 2001 From: Liang Zhang Date: Sun, 19 Jan 2025 16:12:10 +0800 Subject: [PATCH] Add computeNodeInstanceContext as field of MetaDataContextsFactory (#34398) * Refactor MetaDataContextsFactory * Refactor MetaDataContextsFactory * Add computeNodeInstanceContext as field of MetaDataContextsFactory --- .../mode/metadata/MetaDataContextManager.java | 4 +- .../metadata/MetaDataContextsFactory.java | 38 ++++++++----------- .../DatabaseRuleConfigurationManager.java | 2 +- .../metadata/manager/StorageUnitManager.java | 4 +- .../metadata/MetaDataContextsFactoryTest.java | 4 +- .../cluster/ClusterContextManagerBuilder.java | 2 +- .../ClusterMetaDataManagerPersistService.java | 12 +++--- .../StandaloneContextManagerBuilder.java | 2 +- ...andaloneMetaDataManagerPersistService.java | 12 +++--- 9 files changed, 37 insertions(+), 43 deletions(-) diff --git a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/MetaDataContextManager.java b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/MetaDataContextManager.java index 38a4942e969b3..119d40b1098a6 100644 --- a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/MetaDataContextManager.java +++ b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/MetaDataContextManager.java @@ -145,8 +145,8 @@ private MetaDataContexts createMetaDataContexts(final ShardingSphereDatabase dat Map dataSourcePoolPropsFromRegCenter = metaDataPersistService.getDataSourceUnitService().load(database.getName()); SwitchingResource switchingResource = resourceSwitchManager.switchByAlterStorageUnit(database.getResourceMetaData(), dataSourcePoolPropsFromRegCenter); Collection ruleConfigs = metaDataPersistService.getDatabaseRulePersistService().load(database.getName()); - ShardingSphereDatabase changedDatabase = new MetaDataContextsFactory(metaDataPersistService) - .createChangedDatabase(database.getName(), false, switchingResource, ruleConfigs, metaDataContexts, computeNodeInstanceContext); + ShardingSphereDatabase changedDatabase = new MetaDataContextsFactory(metaDataPersistService, computeNodeInstanceContext) + .createChangedDatabase(database.getName(), false, switchingResource, ruleConfigs, metaDataContexts); metaDataContexts.getMetaData().putDatabase(changedDatabase); ConfigurationProperties props = new ConfigurationProperties(metaDataPersistService.getPropsService().load()); Collection globalRuleConfigs = metaDataPersistService.getGlobalRuleService().load(); diff --git a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/MetaDataContextsFactory.java b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/MetaDataContextsFactory.java index 2fb10a2090eb6..681608c445f65 100644 --- a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/MetaDataContextsFactory.java +++ b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/MetaDataContextsFactory.java @@ -64,25 +64,25 @@ public final class MetaDataContextsFactory { private final MetaDataPersistService persistService; + private final ComputeNodeInstanceContext instanceContext; + /** * Create meta data contexts. * * @param param context manager builder parameter - * @param instanceContext compute node instance context * @return meta data contexts * @throws SQLException SQL exception */ - public MetaDataContexts create(final ContextManagerBuilderParameter param, final ComputeNodeInstanceContext instanceContext) throws SQLException { - return containsRegisteredDatabases() ? createFromRegisterCenter(param, instanceContext) : createFromLocalConfiguration(param, instanceContext); + public MetaDataContexts create(final ContextManagerBuilderParameter param) throws SQLException { + return containsRegisteredDatabases() ? createFromRegisterCenter(param) : createFromLocalConfiguration(param); } private boolean containsRegisteredDatabases() { return !persistService.getDatabaseMetaDataFacade().getDatabase().loadAllDatabaseNames().isEmpty(); } - private MetaDataContexts createFromRegisterCenter(final ContextManagerBuilderParameter param, final ComputeNodeInstanceContext instanceContext) { - Map effectiveDatabaseConfigs = createEffectiveDatabaseConfigurations( - getDatabaseNames(param.getDatabaseConfigs(), instanceContext), param.getDatabaseConfigs()); + private MetaDataContexts createFromRegisterCenter(final ContextManagerBuilderParameter param) { + Map effectiveDatabaseConfigs = createEffectiveDatabaseConfigurations(getDatabaseNames(param.getDatabaseConfigs()), param.getDatabaseConfigs()); Collection globalRuleConfigs = persistService.getGlobalRuleService().load(); // TODO load global data sources from persist service Map globalDataSources = param.getGlobalDataSources(); @@ -92,7 +92,7 @@ private MetaDataContexts createFromRegisterCenter(final ContextManagerBuilderPar return createMetaDataContexts(globalRuleConfigs, globalDataSources, databases, props); } - private MetaDataContexts createFromLocalConfiguration(final ContextManagerBuilderParameter param, final ComputeNodeInstanceContext instanceContext) throws SQLException { + private MetaDataContexts createFromLocalConfiguration(final ContextManagerBuilderParameter param) throws SQLException { ConfigurationProperties props = new ConfigurationProperties(param.getProps()); Collection databases = ShardingSphereDatabasesFactory.create(param.getDatabaseConfigs(), props, instanceContext); MetaDataContexts result = createMetaDataContexts(param.getGlobalRuleConfigs(), param.getGlobalDataSources(), databases, props); @@ -136,7 +136,7 @@ private void persistMetaData(final MetaDataContexts metaDataContexts) { } } - private Collection getDatabaseNames(final Map databaseConfigs, final ComputeNodeInstanceContext instanceContext) { + private Collection getDatabaseNames(final Map databaseConfigs) { return instanceContext.getInstance().getMetaData() instanceof JDBCInstanceMetaData ? databaseConfigs.keySet() : persistService.getDatabaseMetaDataFacade().getDatabase().loadAllDatabaseNames(); @@ -170,14 +170,12 @@ private Map> loadSchemas(final Collecti * @param internalLoadMetaData internal load meta data * @param switchingResource switching resource * @param originalMetaDataContexts original meta data contexts - * @param instanceContext compute node instance context * @return meta data contexts * @throws SQLException SQL exception */ public MetaDataContexts createBySwitchResource(final String databaseName, final boolean internalLoadMetaData, final SwitchingResource switchingResource, - final MetaDataContexts originalMetaDataContexts, final ComputeNodeInstanceContext instanceContext) throws SQLException { - ShardingSphereDatabase changedDatabase = createChangedDatabase( - databaseName, internalLoadMetaData, switchingResource, null, originalMetaDataContexts, instanceContext); + final MetaDataContexts originalMetaDataContexts) throws SQLException { + ShardingSphereDatabase changedDatabase = createChangedDatabase(databaseName, internalLoadMetaData, switchingResource, null, originalMetaDataContexts); ConfigurationProperties props = originalMetaDataContexts.getMetaData().getProps(); ShardingSphereMetaData clonedMetaData = cloneMetaData(originalMetaDataContexts.getMetaData(), changedDatabase); RuleMetaData changedGlobalMetaData = new RuleMetaData( @@ -194,14 +192,12 @@ public MetaDataContexts createBySwitchResource(final String databaseName, final * @param internalLoadMetaData internal load meta data * @param ruleConfigs rule configs * @param originalMetaDataContexts original meta data contexts - * @param instanceContext compute node instance context * @return meta data contexts * @throws SQLException SQL exception */ public MetaDataContexts createByAlterRule(final String databaseName, final boolean internalLoadMetaData, final Collection ruleConfigs, - final MetaDataContexts originalMetaDataContexts, final ComputeNodeInstanceContext instanceContext) throws SQLException { - ShardingSphereDatabase changedDatabase = createChangedDatabase( - databaseName, internalLoadMetaData, null, ruleConfigs, originalMetaDataContexts, instanceContext); + final MetaDataContexts originalMetaDataContexts) throws SQLException { + ShardingSphereDatabase changedDatabase = createChangedDatabase(databaseName, internalLoadMetaData, null, ruleConfigs, originalMetaDataContexts); ShardingSphereMetaData clonedMetaData = cloneMetaData(originalMetaDataContexts.getMetaData(), changedDatabase); ConfigurationProperties props = originalMetaDataContexts.getMetaData().getProps(); RuleMetaData changedGlobalMetaData = new RuleMetaData( @@ -226,24 +222,22 @@ private ShardingSphereMetaData cloneMetaData(final ShardingSphereMetaData origin * @param switchingResource switching resource * @param ruleConfigs rule configurations * @param originalMetaDataContext original meta data contexts - * @param instanceContext compute node instance context * @return changed database * @throws SQLException SQL exception */ - public ShardingSphereDatabase createChangedDatabase(final String databaseName, final boolean internalLoadMetaData, - final SwitchingResource switchingResource, final Collection ruleConfigs, - final MetaDataContexts originalMetaDataContext, final ComputeNodeInstanceContext instanceContext) throws SQLException { + public ShardingSphereDatabase createChangedDatabase(final String databaseName, final boolean internalLoadMetaData, final SwitchingResource switchingResource, + final Collection ruleConfigs, final MetaDataContexts originalMetaDataContext) throws SQLException { ResourceMetaData effectiveResourceMetaData = getEffectiveResourceMetaData(originalMetaDataContext.getMetaData().getDatabase(databaseName), switchingResource); Collection toBeCreatedRuleConfigs = null == ruleConfigs ? originalMetaDataContext.getMetaData().getDatabase(databaseName).getRuleMetaData().getConfigurations() : ruleConfigs; DatabaseConfiguration toBeCreatedDatabaseConfig = getDatabaseConfiguration(effectiveResourceMetaData, switchingResource, toBeCreatedRuleConfigs); return createChangedDatabase(originalMetaDataContext.getMetaData().getDatabase(databaseName).getName(), internalLoadMetaData, - toBeCreatedDatabaseConfig, originalMetaDataContext.getMetaData().getProps(), instanceContext); + toBeCreatedDatabaseConfig, originalMetaDataContext.getMetaData().getProps()); } private ShardingSphereDatabase createChangedDatabase(final String databaseName, final boolean internalLoadMetaData, final DatabaseConfiguration databaseConfig, - final ConfigurationProperties props, final ComputeNodeInstanceContext instanceContext) throws SQLException { + final ConfigurationProperties props) throws SQLException { DatabaseType protocolType = DatabaseTypeEngine.getProtocolType(databaseConfig, props); return internalLoadMetaData ? ShardingSphereDatabase.create(databaseName, protocolType, databaseConfig, instanceContext, persistService.getDatabaseMetaDataFacade().getSchema().load(databaseName)) diff --git a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/manager/DatabaseRuleConfigurationManager.java b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/manager/DatabaseRuleConfigurationManager.java index 08387674c4ec5..996b7a7f16d96 100644 --- a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/manager/DatabaseRuleConfigurationManager.java +++ b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/manager/DatabaseRuleConfigurationManager.java @@ -102,7 +102,7 @@ public synchronized void dropRuleConfiguration(final String databaseName, final } private void refreshMetadata(final String databaseName, final Collection ruleConfigurations) throws SQLException { - metaDataContexts.update(new MetaDataContextsFactory(metaDataPersistService).createByAlterRule(databaseName, false, ruleConfigurations, metaDataContexts, computeNodeInstanceContext)); + metaDataContexts.update(new MetaDataContextsFactory(metaDataPersistService, computeNodeInstanceContext).createByAlterRule(databaseName, false, ruleConfigurations, metaDataContexts)); } private Collection getRuleConfigurations(final Collection rules) { 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 3079015c6f667..66539df3e15d9 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 @@ -107,8 +107,8 @@ public synchronized void unregisterStorageUnit(final String databaseName, final } private void buildNewMetaDataContext(final String databaseName, final SwitchingResource switchingResource) throws SQLException { - MetaDataContexts reloadMetaDataContexts = new MetaDataContextsFactory(metaDataPersistService).createBySwitchResource( - databaseName, true, switchingResource, metaDataContexts, computeNodeInstanceContext); + MetaDataContexts reloadMetaDataContexts = new MetaDataContextsFactory(metaDataPersistService, computeNodeInstanceContext).createBySwitchResource( + databaseName, true, switchingResource, metaDataContexts); metaDataContexts.update(reloadMetaDataContexts); metaDataContexts.getMetaData().putDatabase(buildDatabase(reloadMetaDataContexts.getMetaData().getDatabase(databaseName))); switchingResource.closeStaleDataSources(); diff --git a/mode/core/src/test/java/org/apache/shardingsphere/mode/metadata/MetaDataContextsFactoryTest.java b/mode/core/src/test/java/org/apache/shardingsphere/mode/metadata/MetaDataContextsFactoryTest.java index f88f1a4fabed1..79f8feeebcfe0 100644 --- a/mode/core/src/test/java/org/apache/shardingsphere/mode/metadata/MetaDataContextsFactoryTest.java +++ b/mode/core/src/test/java/org/apache/shardingsphere/mode/metadata/MetaDataContextsFactoryTest.java @@ -109,7 +109,7 @@ private GlobalRulePersistService mockGlobalRulePersistService() { void assertCreateWithJDBCInstanceMetaData() throws SQLException { ComputeNodeInstanceContext computeNodeInstanceContext = mock(ComputeNodeInstanceContext.class, RETURNS_DEEP_STUBS); when(computeNodeInstanceContext.getInstance().getMetaData()).thenReturn(mock(JDBCInstanceMetaData.class)); - MetaDataContexts actual = new MetaDataContextsFactory(metaDataPersistService).create(createContextManagerBuilderParameter(), computeNodeInstanceContext); + MetaDataContexts actual = new MetaDataContextsFactory(metaDataPersistService, computeNodeInstanceContext).create(createContextManagerBuilderParameter()); assertThat(actual.getMetaData().getGlobalRuleMetaData().getRules().size(), is(1)); assertThat(actual.getMetaData().getGlobalRuleMetaData().getRules().iterator().next(), instanceOf(MockedRule.class)); assertTrue(actual.getMetaData().containsDatabase("foo_db")); @@ -120,7 +120,7 @@ void assertCreateWithJDBCInstanceMetaData() throws SQLException { void assertCreateWithProxyInstanceMetaData() throws SQLException { when(databaseMetaDataPersistFacade.getDatabase().loadAllDatabaseNames()).thenReturn(Collections.singletonList("foo_db")); when(metaDataPersistService.getDatabaseMetaDataFacade()).thenReturn(databaseMetaDataPersistFacade); - MetaDataContexts actual = new MetaDataContextsFactory(metaDataPersistService).create(createContextManagerBuilderParameter(), mock(ComputeNodeInstanceContext.class, RETURNS_DEEP_STUBS)); + MetaDataContexts actual = new MetaDataContextsFactory(metaDataPersistService, mock(ComputeNodeInstanceContext.class, RETURNS_DEEP_STUBS)).create(createContextManagerBuilderParameter()); assertThat(actual.getMetaData().getGlobalRuleMetaData().getRules().size(), is(1)); assertThat(actual.getMetaData().getGlobalRuleMetaData().getRules().iterator().next(), instanceOf(MockedRule.class)); assertTrue(actual.getMetaData().containsDatabase("foo_db")); diff --git a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/ClusterContextManagerBuilder.java b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/ClusterContextManagerBuilder.java index de6545ebea9aa..d3288bfad095d 100644 --- a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/ClusterContextManagerBuilder.java +++ b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/ClusterContextManagerBuilder.java @@ -60,7 +60,7 @@ public ContextManager build(final ContextManagerBuilderParameter param, final Ev ClusterPersistRepository repository = getClusterPersistRepository(config, computeNodeInstanceContext); LockContext lockContext = new ClusterLockContext(new GlobalLockPersistService(repository)); computeNodeInstanceContext.init(new ClusterWorkerIdGenerator(repository, param.getInstanceMetaData().getId()), lockContext); - MetaDataContexts metaDataContexts = new MetaDataContextsFactory(new MetaDataPersistService(repository)).create(param, computeNodeInstanceContext); + MetaDataContexts metaDataContexts = new MetaDataContextsFactory(new MetaDataPersistService(repository), computeNodeInstanceContext).create(param); ContextManager result = new ContextManager(metaDataContexts, computeNodeInstanceContext, repository); registerOnline(computeNodeInstanceContext, param, result, repository); return result; diff --git a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/persist/service/ClusterMetaDataManagerPersistService.java b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/persist/service/ClusterMetaDataManagerPersistService.java index b8bc61de5635e..bccb6da4eaad7 100644 --- a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/persist/service/ClusterMetaDataManagerPersistService.java +++ b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/persist/service/ClusterMetaDataManagerPersistService.java @@ -125,8 +125,8 @@ public void registerStorageUnits(final String databaseName, final Map toBeRegisteredProps) throws SQLException { SwitchingResource switchingResource = metaDataContextManager.getResourceSwitchManager().switchByRegisterStorageUnit(metaDataContextManager.getMetaDataContexts() .getMetaData().getDatabase(databaseName).getResourceMetaData(), toBeRegisteredProps); - ShardingSphereDatabase changedDatabase = new MetaDataContextsFactory(metaDataPersistService).createChangedDatabase( - databaseName, false, switchingResource, null, metaDataContextManager.getMetaDataContexts(), metaDataContextManager.getComputeNodeInstanceContext()); + ShardingSphereDatabase changedDatabase = new MetaDataContextsFactory(metaDataPersistService, metaDataContextManager.getComputeNodeInstanceContext()).createChangedDatabase( + databaseName, false, switchingResource, null, metaDataContextManager.getMetaDataContexts()); metaDataContextManager.getMetaDataContexts().getMetaData().putDatabase(changedDatabase); metaDataContextManager.getMetaDataContexts().getMetaData().getGlobalRuleMetaData().getRules() .forEach(each -> ((GlobalRule) each).refresh(metaDataContextManager.getMetaDataContexts().getMetaData().getAllDatabases(), GlobalRuleChangedType.DATABASE_CHANGED)); @@ -246,8 +246,8 @@ public void registerStorageUnits(final String databaseName, final Map toBeUpdatedProps) throws SQLException { SwitchingResource switchingResource = metaDataContextManager.getResourceSwitchManager().switchByAlterStorageUnit(metaDataContextManager.getMetaDataContexts().getMetaData() .getDatabase(databaseName).getResourceMetaData(), toBeUpdatedProps); - ShardingSphereDatabase changedDatabase = new MetaDataContextsFactory(metaDataPersistService).createChangedDatabase( - databaseName, true, switchingResource, null, metaDataContextManager.getMetaDataContexts(), metaDataContextManager.getComputeNodeInstanceContext()); + ShardingSphereDatabase changedDatabase = new MetaDataContextsFactory(metaDataPersistService, metaDataContextManager.getComputeNodeInstanceContext()).createChangedDatabase( + databaseName, true, switchingResource, null, metaDataContextManager.getMetaDataContexts()); metaDataContextManager.getMetaDataContexts().getMetaData().putDatabase(changedDatabase); metaDataContextManager.getMetaDataContexts().getMetaData().getGlobalRuleMetaData().getRules() .forEach(each -> ((GlobalRule) each).refresh(metaDataContextManager.getMetaDataContexts().getMetaData().getAllDatabases(), GlobalRuleChangedType.DATABASE_CHANGED)); @@ -262,8 +262,8 @@ public void alterStorageUnits(final String databaseName, final Map toBeDroppedStorageUnitNames) throws SQLException { SwitchingResource switchingResource = metaDataContextManager.getResourceSwitchManager().switchByUnregisterStorageUnit(metaDataContextManager.getMetaDataContexts().getMetaData() .getDatabase(databaseName).getResourceMetaData(), toBeDroppedStorageUnitNames); - MetaDataContexts reloadMetaDataContexts = new MetaDataContextsFactory(metaDataPersistService).createBySwitchResource( - databaseName, false, switchingResource, metaDataContextManager.getMetaDataContexts(), metaDataContextManager.getComputeNodeInstanceContext()); + MetaDataContexts reloadMetaDataContexts = new MetaDataContextsFactory(metaDataPersistService, metaDataContextManager.getComputeNodeInstanceContext()).createBySwitchResource( + databaseName, false, switchingResource, metaDataContextManager.getMetaDataContexts()); metaDataPersistService.persistReloadDatabaseByDrop(databaseName, reloadMetaDataContexts.getMetaData().getDatabase(databaseName), metaDataContextManager.getMetaDataContexts().getMetaData().getDatabase(databaseName)); metaDataContextManager.dropSchemas(databaseName, reloadMetaDataContexts.getMetaData().getDatabase(databaseName),