This is an automated email from the ASF dual-hosted git repository.

menghaoran 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 fda6865bccb Fix load table failed if table metadata uncompleted 
(#38046)
fda6865bccb is described below

commit fda6865bccb2315aeee6e2cacb77b477f49bf045
Author: Haoran Meng <[email protected]>
AuthorDate: Sat Feb 14 23:53:43 2026 +0800

    Fix load table failed if table metadata uncompleted (#38046)
---
 .../service/TableMetaDataPersistDisabledService.java  |  5 +++--
 .../service/TableMetaDataPersistEnabledService.java   | 19 ++++++++++++++-----
 .../persist/service/TableMetaDataPersistService.java  |  3 ++-
 .../TableMetaDataPersistDisabledServiceTest.java      |  4 ++--
 .../database/metadata/TableChangedHandler.java        | 10 +++++++---
 .../database/metadata/TableChangedHandlerTest.java    |  8 ++++++--
 6 files changed, 34 insertions(+), 15 deletions(-)

diff --git 
a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/persist/metadata/service/TableMetaDataPersistDisabledService.java
 
b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/persist/metadata/service/TableMetaDataPersistDisabledService.java
index 1f71f8f2b18..c16486712b6 100644
--- 
a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/persist/metadata/service/TableMetaDataPersistDisabledService.java
+++ 
b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/persist/metadata/service/TableMetaDataPersistDisabledService.java
@@ -30,6 +30,7 @@ import 
org.apache.shardingsphere.mode.spi.repository.PersistRepository;
 
 import java.util.Collection;
 import java.util.LinkedList;
+import java.util.Optional;
 
 /**
  * Table meta data persist service for disabled persist.
@@ -47,8 +48,8 @@ public final class TableMetaDataPersistDisabledService 
implements TableMetaDataP
     }
     
     @Override
-    public ShardingSphereTable load(final String databaseName, final String 
schemaName, final String tableName) {
-        return null;
+    public Optional<ShardingSphereTable> load(final String databaseName, final 
String schemaName, final String tableName) {
+        return Optional.empty();
     }
     
     @Override
diff --git 
a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/persist/metadata/service/TableMetaDataPersistEnabledService.java
 
b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/persist/metadata/service/TableMetaDataPersistEnabledService.java
index d38edd41e7c..91414ed8579 100644
--- 
a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/persist/metadata/service/TableMetaDataPersistEnabledService.java
+++ 
b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/persist/metadata/service/TableMetaDataPersistEnabledService.java
@@ -17,6 +17,7 @@
 
 package org.apache.shardingsphere.mode.metadata.persist.metadata.service;
 
+import com.google.common.base.Strings;
 import lombok.RequiredArgsConstructor;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereTable;
 import org.apache.shardingsphere.infra.util.yaml.YamlEngine;
@@ -30,6 +31,7 @@ import 
org.apache.shardingsphere.mode.persist.service.TableMetaDataPersistServic
 import org.apache.shardingsphere.mode.spi.repository.PersistRepository;
 
 import java.util.Collection;
+import java.util.Optional;
 import java.util.stream.Collectors;
 
 /**
@@ -47,15 +49,22 @@ public final class TableMetaDataPersistEnabledService 
implements TableMetaDataPe
     @Override
     public Collection<ShardingSphereTable> load(final String databaseName, 
final String schemaName) {
         return repository.getChildrenKeys(NodePathGenerator.toPath(new 
TableMetaDataNodePath(databaseName, schemaName, null))).stream()
-                .map(each -> load(databaseName, schemaName, 
each)).collect(Collectors.toList());
+                .map(each -> load(databaseName, schemaName, each))
+                
.filter(Optional::isPresent).map(Optional::get).collect(Collectors.toList());
     }
     
     @Override
-    public ShardingSphereTable load(final String databaseName, final String 
schemaName, final String tableName) {
+    public Optional<ShardingSphereTable> load(final String databaseName, final 
String schemaName, final String tableName) {
         VersionNodePath versionNodePath = new VersionNodePath(new 
TableMetaDataNodePath(databaseName, schemaName, tableName));
-        int activeVersion = 
Integer.parseInt(repository.query(versionNodePath.getActiveVersionPath()));
-        String tableContent = 
repository.query(versionNodePath.getVersionPath(activeVersion));
-        return swapper.swapToObject(YamlEngine.unmarshal(tableContent, 
YamlShardingSphereTable.class));
+        String activeVersion = 
repository.query(versionNodePath.getActiveVersionPath());
+        if (Strings.isNullOrEmpty(activeVersion)) {
+            return Optional.empty();
+        }
+        String tableContent = 
repository.query(versionNodePath.getVersionPath(Integer.parseInt(activeVersion)));
+        if (Strings.isNullOrEmpty(tableContent)) {
+            return Optional.empty();
+        }
+        return 
Optional.of(swapper.swapToObject(YamlEngine.unmarshal(tableContent, 
YamlShardingSphereTable.class)));
     }
     
     @Override
diff --git 
a/mode/core/src/main/java/org/apache/shardingsphere/mode/persist/service/TableMetaDataPersistService.java
 
b/mode/core/src/main/java/org/apache/shardingsphere/mode/persist/service/TableMetaDataPersistService.java
index aa6ea3dd3de..01aa95cd3ce 100644
--- 
a/mode/core/src/main/java/org/apache/shardingsphere/mode/persist/service/TableMetaDataPersistService.java
+++ 
b/mode/core/src/main/java/org/apache/shardingsphere/mode/persist/service/TableMetaDataPersistService.java
@@ -20,6 +20,7 @@ package org.apache.shardingsphere.mode.persist.service;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereTable;
 
 import java.util.Collection;
+import java.util.Optional;
 
 /**
  * Table meta data persist service.
@@ -43,7 +44,7 @@ public interface TableMetaDataPersistService {
      * @param tableName to be loaded table name
      * @return loaded table
      */
-    ShardingSphereTable load(String databaseName, String schemaName, String 
tableName);
+    Optional<ShardingSphereTable> load(String databaseName, String schemaName, 
String tableName);
     
     /**
      * Persist tables.
diff --git 
a/mode/core/src/test/java/org/apache/shardingsphere/mode/metadata/persist/metadata/service/TableMetaDataPersistDisabledServiceTest.java
 
b/mode/core/src/test/java/org/apache/shardingsphere/mode/metadata/persist/metadata/service/TableMetaDataPersistDisabledServiceTest.java
index 3f9efd7ce6a..2567e0b8b7a 100644
--- 
a/mode/core/src/test/java/org/apache/shardingsphere/mode/metadata/persist/metadata/service/TableMetaDataPersistDisabledServiceTest.java
+++ 
b/mode/core/src/test/java/org/apache/shardingsphere/mode/metadata/persist/metadata/service/TableMetaDataPersistDisabledServiceTest.java
@@ -33,7 +33,7 @@ import org.mockito.junit.jupiter.MockitoExtension;
 
 import java.util.Collections;
 
-import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.junit.jupiter.api.Assertions.assertFalse;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.verify;
@@ -59,7 +59,7 @@ class TableMetaDataPersistDisabledServiceTest {
     
     @Test
     void assertLoadTable() {
-        assertNull(persistService.load("foo_db", "foo_schema", "foo_tbl"));
+        assertFalse(persistService.load("foo_db", "foo_schema", 
"foo_tbl").isPresent());
     }
     
     @Test
diff --git 
a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/dispatch/handler/database/metadata/TableChangedHandler.java
 
b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/dispatch/handler/database/metadata/TableChangedHandler.java
index eb9fc34df37..cc58db7816c 100644
--- 
a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/dispatch/handler/database/metadata/TableChangedHandler.java
+++ 
b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/dispatch/handler/database/metadata/TableChangedHandler.java
@@ -28,6 +28,8 @@ import 
org.apache.shardingsphere.mode.node.path.engine.searcher.NodePathSearcher
 import 
org.apache.shardingsphere.mode.node.path.type.database.metadata.schema.SchemaMetaDataNodePath;
 import 
org.apache.shardingsphere.mode.node.path.type.database.metadata.schema.TableMetaDataNodePath;
 
+import java.util.Optional;
+
 /**
  * Table changed handler.
  */
@@ -65,9 +67,11 @@ public final class TableChangedHandler implements 
DatabaseLeafValueChangedHandle
     }
     
     private void handleCreatedOrAltered(final String databaseName, final 
String schemaName, final String tableName) {
-        ShardingSphereTable table = 
contextManager.getPersistServiceFacade().getMetaDataFacade().getDatabaseMetaDataFacade().getTable().load(databaseName,
 schemaName, tableName);
-        
contextManager.getMetaDataContextManager().getDatabaseMetaDataManager().alterTable(databaseName,
 schemaName, table);
-        statisticsRefreshEngine.asyncRefresh();
+        Optional<ShardingSphereTable> table = 
contextManager.getPersistServiceFacade().getMetaDataFacade().getDatabaseMetaDataFacade().getTable().load(databaseName,
 schemaName, tableName);
+        if (table.isPresent()) {
+            
contextManager.getMetaDataContextManager().getDatabaseMetaDataManager().alterTable(databaseName,
 schemaName, table.get());
+            statisticsRefreshEngine.asyncRefresh();
+        }
     }
     
     private void handleDropped(final String databaseName, final String 
schemaName, final String tableName) {
diff --git 
a/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/dispatch/handler/database/metadata/TableChangedHandlerTest.java
 
b/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/dispatch/handler/database/metadata/TableChangedHandlerTest.java
index d31bc956426..c90a93f6a65 100644
--- 
a/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/dispatch/handler/database/metadata/TableChangedHandlerTest.java
+++ 
b/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/dispatch/handler/database/metadata/TableChangedHandlerTest.java
@@ -28,6 +28,8 @@ import org.mockito.Answers;
 import org.mockito.Mock;
 import org.mockito.junit.jupiter.MockitoExtension;
 
+import java.util.Optional;
+
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
@@ -48,7 +50,8 @@ class TableChangedHandlerTest {
     @Test
     void assertHandleTableCreated() {
         ShardingSphereTable table = mock(ShardingSphereTable.class);
-        
when(contextManager.getPersistServiceFacade().getMetaDataFacade().getDatabaseMetaDataFacade().getTable().load("foo_db",
 "foo_schema", "foo_tbl")).thenReturn(table);
+        
when(contextManager.getPersistServiceFacade().getMetaDataFacade().getDatabaseMetaDataFacade().getTable().load("foo_db",
 "foo_schema", "foo_tbl"))
+                .thenReturn(Optional.of(table));
         handler.handle("foo_db", new 
DataChangedEvent("/metadata/foo_db/schemas/foo_schema/tables/foo_tbl/active_version",
 "0", Type.ADDED));
         
verify(contextManager.getMetaDataContextManager().getDatabaseMetaDataManager()).alterTable("foo_db",
 "foo_schema", table);
     }
@@ -56,7 +59,8 @@ class TableChangedHandlerTest {
     @Test
     void assertHandleTableAltered() {
         ShardingSphereTable table = mock(ShardingSphereTable.class);
-        
when(contextManager.getPersistServiceFacade().getMetaDataFacade().getDatabaseMetaDataFacade().getTable().load("foo_db",
 "foo_schema", "foo_tbl")).thenReturn(table);
+        
when(contextManager.getPersistServiceFacade().getMetaDataFacade().getDatabaseMetaDataFacade().getTable().load("foo_db",
 "foo_schema", "foo_tbl"))
+                .thenReturn(Optional.of(table));
         handler.handle("foo_db", new 
DataChangedEvent("/metadata/foo_db/schemas/foo_schema/tables/foo_tbl/active_version",
 "0", Type.UPDATED));
         
verify(contextManager.getMetaDataContextManager().getDatabaseMetaDataManager()).alterTable("foo_db",
 "foo_schema", table);
     }

Reply via email to