refactor: avoid routing tables returning errors due to incorrect metadata (#225)
diff --git a/server/cluster/metadata/cluster_metadata.go b/server/cluster/metadata/cluster_metadata.go
index 112f98a..dbd7290 100644
--- a/server/cluster/metadata/cluster_metadata.go
+++ b/server/cluster/metadata/cluster_metadata.go
@@ -456,22 +456,24 @@
if err != nil {
return RouteTablesResult{}, errors.WithMessage(err, "table manager get table")
}
- if exists {
- // TODO: Adapt to the current implementation of the partition table, which may need to be reconstructed later.
- if !table.IsPartitioned() {
- tables[table.ID] = table
- tableIDs = append(tableIDs, table.ID)
- } else {
- routeEntries[table.Name] = RouteEntry{
- Table: TableInfo{
- ID: table.ID,
- Name: table.Name,
- SchemaID: table.SchemaID,
- SchemaName: schemaName,
- PartitionInfo: table.PartitionInfo,
- },
- NodeShards: nil,
- }
+ if !exists {
+ continue
+ }
+
+ // TODO: Adapt to the current implementation of the partition table, which may need to be reconstructed later.
+ if !table.IsPartitioned() {
+ tables[table.ID] = table
+ tableIDs = append(tableIDs, table.ID)
+ } else {
+ routeEntries[table.Name] = RouteEntry{
+ Table: TableInfo{
+ ID: table.ID,
+ Name: table.Name,
+ SchemaID: table.SchemaID,
+ SchemaName: schemaName,
+ PartitionInfo: table.PartitionInfo,
+ },
+ NodeShards: nil,
}
}
}
@@ -495,9 +497,9 @@
// If nodeShards length bigger than 1, randomly select a nodeShard.
nodeShardsResult := nodeShards
if len(nodeShards) > 1 {
- selectIndex, err := rand.Int(rand.Reader, big.NewInt(int64(len(nodeShards))))
- if err != nil {
- return RouteTablesResult{}, errors.WithMessage(err, "generate random node index")
+ selectIndex, err2 := rand.Int(rand.Reader, big.NewInt(int64(len(nodeShards))))
+ if err2 != nil {
+ return RouteTablesResult{}, errors.WithMessage(err2, "generate random node index")
}
nodeShardsResult = []ShardNodeWithVersion{nodeShards[selectIndex.Uint64()]}
}
diff --git a/server/cluster/metadata/cluster_metadata_test.go b/server/cluster/metadata/cluster_metadata_test.go
index cd078ce..2c0ad9c 100644
--- a/server/cluster/metadata/cluster_metadata_test.go
+++ b/server/cluster/metadata/cluster_metadata_test.go
@@ -116,9 +116,10 @@
re.True(exists)
re.Equal(testTableName, t.Name)
- // Route table should return error when table metadata is not exists in any shard.
- _, err = m.RouteTables(ctx, testSchema, []string{testTableName})
- re.Error(err)
+ // Route table return empty when table not assign to any node.
+ routeTable, err := m.RouteTables(ctx, testSchema, []string{testTableName})
+ re.NoError(err)
+ re.Equal(0, len(routeTable.RouteEntries[testTableName].NodeShards))
// Test drop table metadata.
dropMetadataResult, err := m.DropTableMetadata(ctx, testSchema, testTableName)
diff --git a/server/cluster/metadata/topology_manager.go b/server/cluster/metadata/topology_manager.go
index f303ccf..92986dd 100644
--- a/server/cluster/metadata/topology_manager.go
+++ b/server/cluster/metadata/topology_manager.go
@@ -365,14 +365,18 @@
shardViewVersions := make(map[storage.ShardID]uint64, 0)
for _, tableID := range tableIDs {
shardIDs, ok := m.tableShardMapping[tableID]
+ // If the table is not assigned to any shard, return an empty slice.
if !ok {
- return GetShardNodesByTableIDsResult{}, ErrShardNotFound.WithCausef("table id:%d, not shard is assigned", tableID)
+ tableShardNodes[tableID] = []storage.ShardNode{}
+ continue
}
for _, shardID := range shardIDs {
shardNodes, ok := m.shardNodesMapping[shardID]
if !ok {
- return GetShardNodesByTableIDsResult{}, ErrNodeNotFound.WithCausef("shard id:%d, no node is assigned", shardID)
+ // If the shard is not assigned to any node, return an empty slice.
+ tableShardNodes[tableID] = []storage.ShardNode{}
+ continue
}
if _, exists := tableShardNodes[tableID]; !exists {