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));
}