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 30ac899  Fix NPE when table meta data changed (#15285)
30ac899 is described below

commit 30ac89921bfa872de0d0939d85a4f4b96afa72be
Author: Haoran Meng <[email protected]>
AuthorDate: Tue Feb 8 13:17:47 2022 +0800

    Fix NPE when table meta data changed (#15285)
---
 .../shardingsphere/mode/manager/ContextManager.java    | 18 +++++++++++++-----
 1 file changed, 13 insertions(+), 5 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 d9681f6..257c254 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
@@ -158,17 +158,17 @@ public final class ContextManager implements 
AutoCloseable {
      * @param deletedTable deleted table
      */
     public void alterSchema(final String schemaName, final TableMetaData 
changedTableMetaData, final String deletedTable) {
+        Optional.ofNullable(changedTableMetaData).ifPresent(optional -> 
alterTableSchema(schemaName, optional));
+        Optional.ofNullable(deletedTable).ifPresent(optional -> 
deleteTableSchema(schemaName, optional));
+    }
+    
+    private void alterTableSchema(final String schemaName, final TableMetaData 
changedTableMetaData) {
         ShardingSphereMetaData metaData = 
metaDataContexts.getMetaData(schemaName);
         alterSingleTableDataNodes(metaData, changedTableMetaData);
         FederationSchemaMetaData schemaMetaData = 
metaDataContexts.getOptimizerContext().getFederationMetaData().getSchemas().get(schemaName);
         metaData.getSchema().put(changedTableMetaData.getName(), 
changedTableMetaData);
         schemaMetaData.put(changedTableMetaData);
         
metaDataContexts.getOptimizerContext().getPlannerContexts().put(schemaName, 
OptimizerPlannerContextFactory.create(schemaMetaData));
-        if (null != deletedTable) {
-            metaData.getSchema().remove(deletedTable);
-            schemaMetaData.remove(deletedTable);
-            
metaDataContexts.getOptimizerContext().getPlannerContexts().put(schemaName, 
OptimizerPlannerContextFactory.create(schemaMetaData));
-        }
     }
     
     private void alterSingleTableDataNodes(final ShardingSphereMetaData 
metaData, final TableMetaData changedTableMetaData) {
@@ -181,6 +181,14 @@ public final class ContextManager implements AutoCloseable 
{
         }
     }
     
+    private void deleteTableSchema(final String schemaName, final String 
deletedTable) {
+        ShardingSphereMetaData metaData = 
metaDataContexts.getMetaData(schemaName);
+        FederationSchemaMetaData schemaMetaData = 
metaDataContexts.getOptimizerContext().getFederationMetaData().getSchemas().get(schemaName);
+        metaData.getSchema().remove(deletedTable);
+        schemaMetaData.remove(deletedTable);
+        
metaDataContexts.getOptimizerContext().getPlannerContexts().put(schemaName, 
OptimizerPlannerContextFactory.create(schemaMetaData));
+    }
+    
     private boolean containsInDataNodeContainedRule(final String tableName, 
final ShardingSphereMetaData schemaMetaData) {
         return 
schemaMetaData.getRuleMetaData().findRules(DataNodeContainedRule.class).stream().anyMatch(each
 -> each.getAllTables().contains(tableName));
     }

Reply via email to