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 8da09fa4604 Fix load view failed if view metadata is incomplete 
(#38047)
8da09fa4604 is described below

commit 8da09fa4604bd1f19462bc1e32f71618f73e84f5
Author: Haoran Meng <[email protected]>
AuthorDate: Sun Feb 15 07:04:17 2026 +0800

    Fix load view failed if view metadata is incomplete (#38047)
---
 .../metadata/service/ViewMetaDataPersistService.java   | 18 +++++++++++++-----
 .../handler/database/metadata/ViewChangedHandler.java  | 10 +++++++---
 .../database/metadata/ViewChangedHandlerTest.java      |  8 ++++++--
 3 files changed, 26 insertions(+), 10 deletions(-)

diff --git 
a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/persist/metadata/service/ViewMetaDataPersistService.java
 
b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/persist/metadata/service/ViewMetaDataPersistService.java
index 69d1a94cde9..21aa5a0ff37 100644
--- 
a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/persist/metadata/service/ViewMetaDataPersistService.java
+++ 
b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/persist/metadata/service/ViewMetaDataPersistService.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.ShardingSphereView;
 import org.apache.shardingsphere.infra.util.yaml.YamlEngine;
@@ -29,6 +30,7 @@ import 
org.apache.shardingsphere.mode.node.path.version.VersionNodePath;
 import org.apache.shardingsphere.mode.spi.repository.PersistRepository;
 
 import java.util.Collection;
+import java.util.Optional;
 import java.util.stream.Collectors;
 
 /**
@@ -52,7 +54,7 @@ public final class ViewMetaDataPersistService {
      */
     public Collection<ShardingSphereView> load(final String databaseName, 
final String schemaName) {
         return repository.getChildrenKeys(NodePathGenerator.toPath(new 
ViewMetaDataNodePath(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());
     }
     
     /**
@@ -63,11 +65,17 @@ public final class ViewMetaDataPersistService {
      * @param viewName view name
      * @return loaded view
      */
-    public ShardingSphereView load(final String databaseName, final String 
schemaName, final String viewName) {
+    public Optional<ShardingSphereView> load(final String databaseName, final 
String schemaName, final String viewName) {
         VersionNodePath versionNodePath = new VersionNodePath(new 
ViewMetaDataNodePath(databaseName, schemaName, viewName));
-        int activeVersion = 
Integer.parseInt(repository.query(versionNodePath.getActiveVersionPath()));
-        String view = 
repository.query(versionNodePath.getVersionPath(activeVersion));
-        return swapper.swapToObject(YamlEngine.unmarshal(view, 
YamlShardingSphereView.class));
+        String activeVersion = 
repository.query(versionNodePath.getActiveVersionPath());
+        if (Strings.isNullOrEmpty(activeVersion)) {
+            return Optional.empty();
+        }
+        String view = 
repository.query(versionNodePath.getVersionPath(Integer.parseInt(activeVersion)));
+        if (Strings.isNullOrEmpty(view)) {
+            return Optional.empty();
+        }
+        return Optional.of(swapper.swapToObject(YamlEngine.unmarshal(view, 
YamlShardingSphereView.class)));
     }
     
     /**
diff --git 
a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/dispatch/handler/database/metadata/ViewChangedHandler.java
 
b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/dispatch/handler/database/metadata/ViewChangedHandler.java
index 4a4f64c6ff8..259d989612d 100644
--- 
a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/dispatch/handler/database/metadata/ViewChangedHandler.java
+++ 
b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/dispatch/handler/database/metadata/ViewChangedHandler.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.ViewMetaDataNodePath;
 
+import java.util.Optional;
+
 /**
  * View changed handler.
  */
@@ -65,9 +67,11 @@ public final class ViewChangedHandler implements 
DatabaseLeafValueChangedHandler
     }
     
     private void handleCreatedOrAltered(final String databaseName, final 
String schemaName, final String viewName) {
-        ShardingSphereView view = 
contextManager.getPersistServiceFacade().getMetaDataFacade().getDatabaseMetaDataFacade().getView().load(databaseName,
 schemaName, viewName);
-        
contextManager.getMetaDataContextManager().getDatabaseMetaDataManager().alterView(databaseName,
 schemaName, view);
-        statisticsRefreshEngine.asyncRefresh();
+        Optional<ShardingSphereView> view = 
contextManager.getPersistServiceFacade().getMetaDataFacade().getDatabaseMetaDataFacade().getView().load(databaseName,
 schemaName, viewName);
+        if (view.isPresent()) {
+            
contextManager.getMetaDataContextManager().getDatabaseMetaDataManager().alterView(databaseName,
 schemaName, view.get());
+            statisticsRefreshEngine.asyncRefresh();
+        }
     }
     
     private void handleDropped(final String databaseName, final String 
schemaName, final String viewName) {
diff --git 
a/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/dispatch/handler/database/metadata/ViewChangedHandlerTest.java
 
b/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/dispatch/handler/database/metadata/ViewChangedHandlerTest.java
index 4ae9ed90670..3f55d7f732f 100644
--- 
a/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/dispatch/handler/database/metadata/ViewChangedHandlerTest.java
+++ 
b/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/dispatch/handler/database/metadata/ViewChangedHandlerTest.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 ViewChangedHandlerTest {
     @Test
     void assertHandleViewCreated() {
         ShardingSphereView view = mock(ShardingSphereView.class);
-        
when(contextManager.getPersistServiceFacade().getMetaDataFacade().getDatabaseMetaDataFacade().getView().load("foo_db",
 "foo_schema", "foo_view")).thenReturn(view);
+        
when(contextManager.getPersistServiceFacade().getMetaDataFacade().getDatabaseMetaDataFacade().getView().load("foo_db",
 "foo_schema", "foo_view"))
+                .thenReturn(Optional.of(view));
         handler.handle("foo_db", new 
DataChangedEvent("/metadata/foo_db/schemas/foo_schema/views/foo_view/active_version",
 "0", Type.ADDED));
         
verify(contextManager.getMetaDataContextManager().getDatabaseMetaDataManager()).alterView("foo_db",
 "foo_schema", view);
     }
@@ -56,7 +59,8 @@ class ViewChangedHandlerTest {
     @Test
     void assertHandleViewAltered() {
         ShardingSphereView view = mock(ShardingSphereView.class);
-        
when(contextManager.getPersistServiceFacade().getMetaDataFacade().getDatabaseMetaDataFacade().getView().load("foo_db",
 "foo_schema", "foo_view")).thenReturn(view);
+        
when(contextManager.getPersistServiceFacade().getMetaDataFacade().getDatabaseMetaDataFacade().getView().load("foo_db",
 "foo_schema", "foo_view"))
+                .thenReturn(Optional.of(view));
         handler.handle("foo_db", new 
DataChangedEvent("/metadata/foo_db/schemas/foo_schema/views/foo_view/active_version",
 "0", Type.UPDATED));
         
verify(contextManager.getMetaDataContextManager().getDatabaseMetaDataManager()).alterView("foo_db",
 "foo_schema", view);
     }

Reply via email to