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