mirror of
https://gitee.com/milvus-io/milvus.git
synced 2025-12-06 17:18:35 +08:00
Display all shard error if search/query fails (#20169)
Signed-off-by: Congqi Xia <congqi.xia@zilliz.com> Signed-off-by: Congqi Xia <congqi.xia@zilliz.com>
This commit is contained in:
parent
2bfecf5b4e
commit
4c4db1f556
@ -4,6 +4,7 @@ import (
|
|||||||
"context"
|
"context"
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"strings"
|
||||||
"sync"
|
"sync"
|
||||||
|
|
||||||
"github.com/milvus-io/milvus/internal/log"
|
"github.com/milvus-io/milvus/internal/log"
|
||||||
@ -31,6 +32,19 @@ func updateShardsWithRoundRobin(shardsLeaders map[string][]nodeInfo) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// mergeErrSet merges all errors in ErrSet
|
||||||
|
func mergeErrSet(errSet map[string]error) error {
|
||||||
|
var builder strings.Builder
|
||||||
|
for channel, err := range errSet {
|
||||||
|
if err == nil {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
builder.WriteString(fmt.Sprintf("Channel: %s returns err: %s", channel, err.Error()))
|
||||||
|
}
|
||||||
|
return errors.New(builder.String())
|
||||||
|
}
|
||||||
|
|
||||||
// group dml shard leader with same nodeID
|
// group dml shard leader with same nodeID
|
||||||
func groupShardleadersWithSameQueryNode(
|
func groupShardleadersWithSameQueryNode(
|
||||||
ctx context.Context,
|
ctx context.Context,
|
||||||
@ -43,8 +57,8 @@ func groupShardleadersWithSameQueryNode(
|
|||||||
log.Ctx(ctx).Warn("no shard leaders were available",
|
log.Ctx(ctx).Warn("no shard leaders were available",
|
||||||
zap.String("channel", dml),
|
zap.String("channel", dml),
|
||||||
zap.String("leaders", fmt.Sprintf("%v", shard2leaders[dml])))
|
zap.String("leaders", fmt.Sprintf("%v", shard2leaders[dml])))
|
||||||
if e, ok := errSet[dml]; ok {
|
if _, ok := errSet[dml]; ok {
|
||||||
return nil, nil, e // return last error recorded
|
return nil, nil, mergeErrSet(errSet) // return merged last error recorded
|
||||||
}
|
}
|
||||||
return nil, nil, fmt.Errorf("no available shard leader")
|
return nil, nil, fmt.Errorf("no available shard leader")
|
||||||
}
|
}
|
||||||
|
|||||||
@ -4,6 +4,7 @@ import (
|
|||||||
"context"
|
"context"
|
||||||
"fmt"
|
"fmt"
|
||||||
"sort"
|
"sort"
|
||||||
|
"strings"
|
||||||
"sync"
|
"sync"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
@ -109,7 +110,7 @@ func TestGroupShardLeadersWithSameQueryNode(t *testing.T) {
|
|||||||
|
|
||||||
nexts["c0"] = 3
|
nexts["c0"] = 3
|
||||||
_, _, err = groupShardleadersWithSameQueryNode(ctx, shard2leaders, nexts, errSet, mgr)
|
_, _, err = groupShardleadersWithSameQueryNode(ctx, shard2leaders, nexts, errSet, mgr)
|
||||||
assert.Equal(t, err, errSet["c0"])
|
assert.True(t, strings.Contains(err.Error(), errSet["c0"].Error()))
|
||||||
|
|
||||||
nexts["c0"] = 2
|
nexts["c0"] = 2
|
||||||
nexts["c1"] = 3
|
nexts["c1"] = 3
|
||||||
@ -155,7 +156,7 @@ func TestMergeRoundRobinPolicy(t *testing.T) {
|
|||||||
querier.failset[2] = mockerr
|
querier.failset[2] = mockerr
|
||||||
querier.failset[3] = mockerr
|
querier.failset[3] = mockerr
|
||||||
err = mergeRoundRobinPolicy(ctx, mgr, querier.query, shard2leaders)
|
err = mergeRoundRobinPolicy(ctx, mgr, querier.query, shard2leaders)
|
||||||
assert.Equal(t, err, mockerr)
|
assert.True(t, strings.Contains(err.Error(), mockerr.Error()))
|
||||||
}
|
}
|
||||||
|
|
||||||
func mockQueryNodeCreator(ctx context.Context, address string) (types.QueryNode, error) {
|
func mockQueryNodeCreator(ctx context.Context, address string) (types.QueryNode, error) {
|
||||||
|
|||||||
@ -3,6 +3,7 @@ package proxy
|
|||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"strings"
|
||||||
"testing"
|
"testing"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
@ -183,7 +184,8 @@ func TestQueryTask_all(t *testing.T) {
|
|||||||
ErrorCode: commonpb.ErrorCode_NotShardLeader,
|
ErrorCode: commonpb.ErrorCode_NotShardLeader,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
assert.Equal(t, task.Execute(ctx), errInvalidShardLeaders)
|
err = task.Execute(ctx)
|
||||||
|
assert.True(t, strings.Contains(err.Error(), errInvalidShardLeaders.Error()))
|
||||||
|
|
||||||
qn.withQueryResult = &internalpb.RetrieveResults{
|
qn.withQueryResult = &internalpb.RetrieveResults{
|
||||||
Status: &commonpb.Status{
|
Status: &commonpb.Status{
|
||||||
|
|||||||
@ -6,6 +6,7 @@ import (
|
|||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
"strings"
|
||||||
"testing"
|
"testing"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
@ -1771,7 +1772,8 @@ func TestSearchTask_ErrExecute(t *testing.T) {
|
|||||||
ErrorCode: commonpb.ErrorCode_NotShardLeader,
|
ErrorCode: commonpb.ErrorCode_NotShardLeader,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
assert.Equal(t, task.Execute(ctx), errInvalidShardLeaders)
|
err = task.Execute(ctx)
|
||||||
|
assert.True(t, strings.Contains(err.Error(), errInvalidShardLeaders.Error()))
|
||||||
|
|
||||||
qn.withSearchResult = &internalpb.SearchResults{
|
qn.withSearchResult = &internalpb.SearchResults{
|
||||||
Status: &commonpb.Status{
|
Status: &commonpb.Status{
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user