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