You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by du...@apache.org on 2023/04/11 10:12:23 UTC

[shardingsphere] branch master updated: Avoid ContextManager is null when startup and governance center has meta data (#25107)

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 a07e22e0c48 Avoid ContextManager is null when startup and governance center has meta data (#25107)
a07e22e0c48 is described below

commit a07e22e0c48d871fbe42cf5bf4420a3875887d63
Author: zhaojinchao <zh...@apache.org>
AuthorDate: Tue Apr 11 18:12:16 2023 +0800

    Avoid ContextManager is null when startup and governance center has meta data (#25107)
    
    * Fix NPE problem when governance center has metadata
    
    * Update
---
 .../infra/instance/mode/ModeContextManager.java    |  9 -------
 .../shardingsphere/metadata/MetaDataFactory.java   | 29 +++++++++++++++++++---
 .../metadata/factory/InternalMetaDataFactory.java  | 17 +++++++------
 .../mode/manager/ContextManager.java               |  2 +-
 .../mode/metadata/MetaDataContextsFactory.java     | 13 +++++-----
 .../manager/cluster/ClusterModeContextManager.java |  5 ----
 .../standalone/StandaloneModeContextManager.java   |  5 ----
 7 files changed, 42 insertions(+), 38 deletions(-)

diff --git a/infra/common/src/main/java/org/apache/shardingsphere/infra/instance/mode/ModeContextManager.java b/infra/common/src/main/java/org/apache/shardingsphere/infra/instance/mode/ModeContextManager.java
index 917eee13f53..5ed7d90bf52 100644
--- a/infra/common/src/main/java/org/apache/shardingsphere/infra/instance/mode/ModeContextManager.java
+++ b/infra/common/src/main/java/org/apache/shardingsphere/infra/instance/mode/ModeContextManager.java
@@ -19,7 +19,6 @@ package org.apache.shardingsphere.infra.instance.mode;
 
 import org.apache.shardingsphere.infra.config.rule.RuleConfiguration;
 import org.apache.shardingsphere.infra.datasource.props.DataSourceProperties;
-import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSchema;
 import org.apache.shardingsphere.infra.metadata.database.schema.pojo.AlterSchemaMetaDataPOJO;
 import org.apache.shardingsphere.infra.metadata.database.schema.pojo.AlterSchemaPOJO;
 
@@ -124,12 +123,4 @@ public interface ModeContextManager {
      * @param props pros
      */
     void alterProperties(Properties props);
-    
-    /**
-     * Get schemas.
-     *
-     * @param databaseName database name
-     * @return schemas
-     */
-    Map<String, ShardingSphereSchema> getSchemas(String databaseName);
 }
diff --git a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/MetaDataFactory.java b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/MetaDataFactory.java
index 9de29a62f96..3b69075cb29 100644
--- a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/MetaDataFactory.java
+++ b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/MetaDataFactory.java
@@ -23,8 +23,10 @@ import org.apache.shardingsphere.infra.instance.InstanceContext;
 import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
 import org.apache.shardingsphere.metadata.factory.ExternalMetaDataFactory;
 import org.apache.shardingsphere.metadata.factory.InternalMetaDataFactory;
+import org.apache.shardingsphere.metadata.persist.MetaDataPersistService;
 
 import java.sql.SQLException;
+import java.util.Map;
 
 /**
  * Meta data factory.
@@ -35,16 +37,35 @@ public final class MetaDataFactory {
      * Create database meta data for governance center.
      *
      * @param databaseName database name
-     * @param databaseConfig database configuration
      * @param internalLoadMetaData internal load meta data
+     * @param persistService meta data persist service
+     * @param databaseConfig database configuration
      * @param props configuration properties
      * @param instanceContext instance context
      * @return database meta data
      * @throws SQLException sql exception
      */
-    public static ShardingSphereDatabase create(final String databaseName, final boolean internalLoadMetaData, final DatabaseConfiguration databaseConfig,
-                                                final ConfigurationProperties props, final InstanceContext instanceContext) throws SQLException {
-        return internalLoadMetaData ? InternalMetaDataFactory.create(databaseName, databaseConfig, props, instanceContext)
+    public static ShardingSphereDatabase create(final String databaseName, final boolean internalLoadMetaData, final MetaDataPersistService persistService,
+                                                final DatabaseConfiguration databaseConfig, final ConfigurationProperties props, final InstanceContext instanceContext) throws SQLException {
+        return internalLoadMetaData ? InternalMetaDataFactory.create(databaseName, persistService, databaseConfig, props, instanceContext)
                 : ExternalMetaDataFactory.create(databaseName, databaseConfig, props, instanceContext);
     }
+    
+    /**
+     * Create database meta data for governance center.
+     *
+     * @param internalLoadMetaData internal load meta data
+     * @param persistService meta data persist service
+     * @param databaseConfigMap database configuration
+     * @param props configuration properties
+     * @param instanceContext instance context
+     * @return database meta data
+     * @throws SQLException sql exception
+     */
+    public static Map<String, ShardingSphereDatabase> create(final boolean internalLoadMetaData, final MetaDataPersistService persistService,
+                                                             final Map<String, DatabaseConfiguration> databaseConfigMap, final ConfigurationProperties props,
+                                                             final InstanceContext instanceContext) throws SQLException {
+        return internalLoadMetaData ? InternalMetaDataFactory.create(persistService, databaseConfigMap, props, instanceContext)
+                : ExternalMetaDataFactory.create(databaseConfigMap, props, instanceContext);
+    }
 }
diff --git a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/factory/InternalMetaDataFactory.java b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/factory/InternalMetaDataFactory.java
index 385342e5614..a817293c462 100644
--- a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/factory/InternalMetaDataFactory.java
+++ b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/factory/InternalMetaDataFactory.java
@@ -24,6 +24,7 @@ import org.apache.shardingsphere.infra.database.type.DatabaseTypeEngine;
 import org.apache.shardingsphere.infra.instance.InstanceContext;
 import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
 import org.apache.shardingsphere.infra.rule.builder.database.DatabaseRulesBuilder;
+import org.apache.shardingsphere.metadata.persist.MetaDataPersistService;
 
 import java.util.Map;
 import java.util.Map.Entry;
@@ -38,37 +39,39 @@ public final class InternalMetaDataFactory {
      * Create database meta data for governance center.
      *
      * @param databaseName database name
+     * @param persistService meta data persist service
      * @param databaseConfig database configuration
      * @param props configuration properties
      * @param instanceContext instance context
      * @return database meta data
      */
-    public static ShardingSphereDatabase create(final String databaseName, final DatabaseConfiguration databaseConfig,
+    public static ShardingSphereDatabase create(final String databaseName, final MetaDataPersistService persistService, final DatabaseConfiguration databaseConfig,
                                                 final ConfigurationProperties props, final InstanceContext instanceContext) {
         return ShardingSphereDatabase.create(databaseName, DatabaseTypeEngine.getProtocolType(databaseName, databaseConfig, props), databaseConfig,
-                DatabaseRulesBuilder.build(databaseName, databaseConfig, instanceContext), instanceContext.getModeContextManager().getSchemas(databaseName));
+                DatabaseRulesBuilder.build(databaseName, databaseConfig, instanceContext), persistService.getDatabaseMetaDataService().loadSchemas(databaseName));
     }
     
     /**
      * Create databases meta data for governance center.
      *
+     * @param persistService meta data persist service
      * @param databaseConfigMap database configuration map
      * @param props properties
      * @param instanceContext instance context
      * @return databases
      */
-    public static Map<String, ShardingSphereDatabase> create(final Map<String, DatabaseConfiguration> databaseConfigMap,
+    public static Map<String, ShardingSphereDatabase> create(final MetaDataPersistService persistService, final Map<String, DatabaseConfiguration> databaseConfigMap,
                                                              final ConfigurationProperties props, final InstanceContext instanceContext) {
-        return createDatabases(databaseConfigMap, DatabaseTypeEngine.getProtocolType(databaseConfigMap, props), props, instanceContext);
+        return createDatabases(persistService, databaseConfigMap, DatabaseTypeEngine.getProtocolType(databaseConfigMap, props), props, instanceContext);
     }
     
-    private static Map<String, ShardingSphereDatabase> createDatabases(final Map<String, DatabaseConfiguration> databaseConfigMap, final DatabaseType protocolType,
-                                                                       final ConfigurationProperties props, final InstanceContext instanceContext) {
+    private static Map<String, ShardingSphereDatabase> createDatabases(final MetaDataPersistService persistService, final Map<String, DatabaseConfiguration> databaseConfigMap,
+                                                                       final DatabaseType protocolType, final ConfigurationProperties props, final InstanceContext instanceContext) {
         Map<String, ShardingSphereDatabase> result = new ConcurrentHashMap<>(databaseConfigMap.size(), 1);
         for (Entry<String, DatabaseConfiguration> entry : databaseConfigMap.entrySet()) {
             String databaseName = entry.getKey();
             if (!entry.getValue().getDataSources().isEmpty()) {
-                result.put(databaseName.toLowerCase(), create(databaseName, entry.getValue(), props, instanceContext));
+                result.put(databaseName.toLowerCase(), create(databaseName, persistService, entry.getValue(), props, instanceContext));
             } else {
                 result.put(databaseName.toLowerCase(), ShardingSphereDatabase.create(databaseName, protocolType));
             }
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 9e2ba5c8c4c..25644ab3af8 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
@@ -384,7 +384,7 @@ public final class ContextManager implements AutoCloseable {
         DatabaseConfiguration toBeCreatedDatabaseConfig =
                 new DataSourceProvidedDatabaseConfiguration(metaDataContexts.getMetaData().getDatabase(databaseName).getResourceMetaData().getDataSources(), toBeCreatedRuleConfigs);
         ShardingSphereDatabase changedDatabase = MetaDataFactory.create(metaDataContexts.getMetaData().getActualDatabaseName(databaseName),
-                internalLoadMetaData, toBeCreatedDatabaseConfig, metaDataContexts.getMetaData().getProps(), instanceContext);
+                internalLoadMetaData, metaDataContexts.getPersistService(), toBeCreatedDatabaseConfig, metaDataContexts.getMetaData().getProps(), instanceContext);
         Map<String, ShardingSphereDatabase> result = new LinkedHashMap<>(metaDataContexts.getMetaData().getDatabases());
         changedDatabase.getSchemas().putAll(newShardingSphereSchemas(changedDatabase));
         result.put(databaseName.toLowerCase(), changedDatabase);
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 78f147c91cd..0deec38a9d0 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
@@ -33,8 +33,7 @@ import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
 import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
 import org.apache.shardingsphere.infra.metadata.database.rule.ShardingSphereRuleMetaData;
 import org.apache.shardingsphere.infra.rule.builder.global.GlobalRulesBuilder;
-import org.apache.shardingsphere.metadata.factory.ExternalMetaDataFactory;
-import org.apache.shardingsphere.metadata.factory.InternalMetaDataFactory;
+import org.apache.shardingsphere.metadata.MetaDataFactory;
 import org.apache.shardingsphere.mode.manager.ContextManagerBuilderParameter;
 import org.apache.shardingsphere.metadata.persist.MetaDataPersistService;
 import org.apache.shardingsphere.mode.event.storage.StorageNodeDataSource;
@@ -87,7 +86,7 @@ public final class MetaDataContextsFactory {
         checkDataSourceStates(effectiveDatabaseConfigs, storageNodes, param.isForce());
         Collection<RuleConfiguration> globalRuleConfigs = getGlobalRuleConfigs(databaseMetaDataExisted, persistService, param.getGlobalRuleConfigs());
         ConfigurationProperties props = getConfigurationProperties(databaseMetaDataExisted, persistService, param.getProps());
-        Map<String, ShardingSphereDatabase> databases = getDatabases(databaseMetaDataExisted, effectiveDatabaseConfigs, props, instanceContext);
+        Map<String, ShardingSphereDatabase> databases = getDatabases(databaseMetaDataExisted, persistService, effectiveDatabaseConfigs, props, instanceContext);
         ShardingSphereRuleMetaData globalMetaData = new ShardingSphereRuleMetaData(GlobalRulesBuilder.buildRules(globalRuleConfigs, databases, props));
         MetaDataContexts result = new MetaDataContexts(persistService, new ShardingSphereMetaData(databases, globalMetaData, props));
         persistDatabaseConfigurations(databaseMetaDataExisted, param, result);
@@ -151,10 +150,10 @@ public final class MetaDataContextsFactory {
         return databaseMetaDataExisted ? persistService.getGlobalRuleService().load() : globalRuleConfigs;
     }
     
-    private static Map<String, ShardingSphereDatabase> getDatabases(final boolean databaseMetaDataExisted, final Map<String, DatabaseConfiguration> databaseConfigMap,
-                                                                    final ConfigurationProperties props, final InstanceContext instanceContext) throws SQLException {
-        return databaseMetaDataExisted ? InternalMetaDataFactory.create(databaseConfigMap, props, instanceContext)
-                : ExternalMetaDataFactory.create(databaseConfigMap, props, instanceContext);
+    private static Map<String, ShardingSphereDatabase> getDatabases(final boolean databaseMetaDataExisted, final MetaDataPersistService persistService,
+                                                                    final Map<String, DatabaseConfiguration> databaseConfigMap, final ConfigurationProperties props,
+                                                                    final InstanceContext instanceContext) throws SQLException {
+        return MetaDataFactory.create(databaseMetaDataExisted, persistService, databaseConfigMap, props, instanceContext);
     }
     
     private static void persistDatabaseConfigurations(final boolean databaseMetaDataExisted, final ContextManagerBuilderParameter param, final MetaDataContexts metadataContexts) {
diff --git a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/ClusterModeContextManager.java b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/ClusterModeContextManager.java
index be22cbfcb39..0f1815ff005 100644
--- a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/ClusterModeContextManager.java
+++ b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/ClusterModeContextManager.java
@@ -125,11 +125,6 @@ public final class ClusterModeContextManager implements ModeContextManager, Cont
         contextManager.getMetaDataContexts().getPersistService().getPropsService().persist(props);
     }
     
-    @Override
-    public Map<String, ShardingSphereSchema> getSchemas(final String databaseName) {
-        return contextManager.getMetaDataContexts().getPersistService().getDatabaseMetaDataService().loadSchemas(databaseName);
-    }
-    
     @Override
     public void setContextManagerAware(final ContextManager contextManager) {
         this.contextManager = contextManager;
diff --git a/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/StandaloneModeContextManager.java b/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/StandaloneModeContextManager.java
index 2de894d080b..2fcf620cd92 100644
--- a/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/StandaloneModeContextManager.java
+++ b/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/StandaloneModeContextManager.java
@@ -279,11 +279,6 @@ public final class StandaloneModeContextManager implements ModeContextManager, C
         clearServiceCache();
     }
     
-    @Override
-    public Map<String, ShardingSphereSchema> getSchemas(final String databaseName) {
-        return contextManager.getMetaDataContexts().getPersistService().getDatabaseMetaDataService().loadSchemas(databaseName);
-    }
-    
     private void clearServiceCache() {
         OrderedServicesCache.clearCache();
     }