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 2022/02/08 05:18:47 UTC
[shardingsphere] branch master updated: Fix NPE when table meta data changed (#15285)
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 <me...@gmail.com>
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));
}