add search/query request cost metrics on qn (#24413)

Signed-off-by: Wei Liu <wei.liu@zilliz.com>
pull/24909/head
wei liu 2023-06-15 14:24:38 +08:00 committed by GitHub
parent 7faf934f91
commit e40d95e093
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 356 additions and 168 deletions

View File

@ -117,6 +117,15 @@ message SearchResults {
bytes sliced_blob = 10; bytes sliced_blob = 10;
int64 sliced_num_count = 11; int64 sliced_num_count = 11;
int64 sliced_offset = 12; int64 sliced_offset = 12;
// search request cost
CostAggregation costAggregation = 13;
}
message CostAggregation {
int64 responseTime = 1;
int64 serviceTime = 2;
int64 totalNQ = 3;
} }
message RetrieveRequest { message RetrieveRequest {
@ -136,6 +145,8 @@ message RetrieveRequest {
int64 iteration_extension_reduce_rate = 14; int64 iteration_extension_reduce_rate = 14;
} }
message RetrieveResults { message RetrieveResults {
common.MsgBase base = 1; common.MsgBase base = 1;
common.Status status = 2; common.Status status = 2;
@ -145,6 +156,9 @@ message RetrieveResults {
repeated int64 sealed_segmentIDs_retrieved = 6; repeated int64 sealed_segmentIDs_retrieved = 6;
repeated string channelIDs_retrieved = 7; repeated string channelIDs_retrieved = 7;
repeated int64 global_sealed_segmentIDs = 8; repeated int64 global_sealed_segmentIDs = 8;
// query request cost
CostAggregation costAggregation = 13;
} }
message LoadIndex { message LoadIndex {

View File

@ -911,6 +911,8 @@ type SearchResults struct {
SlicedBlob []byte `protobuf:"bytes,10,opt,name=sliced_blob,json=slicedBlob,proto3" json:"sliced_blob,omitempty"` SlicedBlob []byte `protobuf:"bytes,10,opt,name=sliced_blob,json=slicedBlob,proto3" json:"sliced_blob,omitempty"`
SlicedNumCount int64 `protobuf:"varint,11,opt,name=sliced_num_count,json=slicedNumCount,proto3" json:"sliced_num_count,omitempty"` SlicedNumCount int64 `protobuf:"varint,11,opt,name=sliced_num_count,json=slicedNumCount,proto3" json:"sliced_num_count,omitempty"`
SlicedOffset int64 `protobuf:"varint,12,opt,name=sliced_offset,json=slicedOffset,proto3" json:"sliced_offset,omitempty"` SlicedOffset int64 `protobuf:"varint,12,opt,name=sliced_offset,json=slicedOffset,proto3" json:"sliced_offset,omitempty"`
// search request cost
CostAggregation *CostAggregation `protobuf:"bytes,13,opt,name=costAggregation,proto3" json:"costAggregation,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"` XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"` XXX_sizecache int32 `json:"-"`
@ -1025,6 +1027,68 @@ func (m *SearchResults) GetSlicedOffset() int64 {
return 0 return 0
} }
func (m *SearchResults) GetCostAggregation() *CostAggregation {
if m != nil {
return m.CostAggregation
}
return nil
}
type CostAggregation struct {
ResponseTime int64 `protobuf:"varint,1,opt,name=responseTime,proto3" json:"responseTime,omitempty"`
ServiceTime int64 `protobuf:"varint,2,opt,name=serviceTime,proto3" json:"serviceTime,omitempty"`
TotalNQ int64 `protobuf:"varint,3,opt,name=totalNQ,proto3" json:"totalNQ,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *CostAggregation) Reset() { *m = CostAggregation{} }
func (m *CostAggregation) String() string { return proto.CompactTextString(m) }
func (*CostAggregation) ProtoMessage() {}
func (*CostAggregation) Descriptor() ([]byte, []int) {
return fileDescriptor_41f4a519b878ee3b, []int{14}
}
func (m *CostAggregation) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_CostAggregation.Unmarshal(m, b)
}
func (m *CostAggregation) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_CostAggregation.Marshal(b, m, deterministic)
}
func (m *CostAggregation) XXX_Merge(src proto.Message) {
xxx_messageInfo_CostAggregation.Merge(m, src)
}
func (m *CostAggregation) XXX_Size() int {
return xxx_messageInfo_CostAggregation.Size(m)
}
func (m *CostAggregation) XXX_DiscardUnknown() {
xxx_messageInfo_CostAggregation.DiscardUnknown(m)
}
var xxx_messageInfo_CostAggregation proto.InternalMessageInfo
func (m *CostAggregation) GetResponseTime() int64 {
if m != nil {
return m.ResponseTime
}
return 0
}
func (m *CostAggregation) GetServiceTime() int64 {
if m != nil {
return m.ServiceTime
}
return 0
}
func (m *CostAggregation) GetTotalNQ() int64 {
if m != nil {
return m.TotalNQ
}
return 0
}
type RetrieveRequest struct { type RetrieveRequest struct {
Base *commonpb.MsgBase `protobuf:"bytes,1,opt,name=base,proto3" json:"base,omitempty"` Base *commonpb.MsgBase `protobuf:"bytes,1,opt,name=base,proto3" json:"base,omitempty"`
ReqID int64 `protobuf:"varint,2,opt,name=reqID,proto3" json:"reqID,omitempty"` ReqID int64 `protobuf:"varint,2,opt,name=reqID,proto3" json:"reqID,omitempty"`
@ -1049,7 +1113,7 @@ func (m *RetrieveRequest) Reset() { *m = RetrieveRequest{} }
func (m *RetrieveRequest) String() string { return proto.CompactTextString(m) } func (m *RetrieveRequest) String() string { return proto.CompactTextString(m) }
func (*RetrieveRequest) ProtoMessage() {} func (*RetrieveRequest) ProtoMessage() {}
func (*RetrieveRequest) Descriptor() ([]byte, []int) { func (*RetrieveRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_41f4a519b878ee3b, []int{14} return fileDescriptor_41f4a519b878ee3b, []int{15}
} }
func (m *RetrieveRequest) XXX_Unmarshal(b []byte) error { func (m *RetrieveRequest) XXX_Unmarshal(b []byte) error {
@ -1177,6 +1241,8 @@ type RetrieveResults struct {
SealedSegmentIDsRetrieved []int64 `protobuf:"varint,6,rep,packed,name=sealed_segmentIDs_retrieved,json=sealedSegmentIDsRetrieved,proto3" json:"sealed_segmentIDs_retrieved,omitempty"` SealedSegmentIDsRetrieved []int64 `protobuf:"varint,6,rep,packed,name=sealed_segmentIDs_retrieved,json=sealedSegmentIDsRetrieved,proto3" json:"sealed_segmentIDs_retrieved,omitempty"`
ChannelIDsRetrieved []string `protobuf:"bytes,7,rep,name=channelIDs_retrieved,json=channelIDsRetrieved,proto3" json:"channelIDs_retrieved,omitempty"` ChannelIDsRetrieved []string `protobuf:"bytes,7,rep,name=channelIDs_retrieved,json=channelIDsRetrieved,proto3" json:"channelIDs_retrieved,omitempty"`
GlobalSealedSegmentIDs []int64 `protobuf:"varint,8,rep,packed,name=global_sealed_segmentIDs,json=globalSealedSegmentIDs,proto3" json:"global_sealed_segmentIDs,omitempty"` GlobalSealedSegmentIDs []int64 `protobuf:"varint,8,rep,packed,name=global_sealed_segmentIDs,json=globalSealedSegmentIDs,proto3" json:"global_sealed_segmentIDs,omitempty"`
// query request cost
CostAggregation *CostAggregation `protobuf:"bytes,13,opt,name=costAggregation,proto3" json:"costAggregation,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"` XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"` XXX_sizecache int32 `json:"-"`
@ -1186,7 +1252,7 @@ func (m *RetrieveResults) Reset() { *m = RetrieveResults{} }
func (m *RetrieveResults) String() string { return proto.CompactTextString(m) } func (m *RetrieveResults) String() string { return proto.CompactTextString(m) }
func (*RetrieveResults) ProtoMessage() {} func (*RetrieveResults) ProtoMessage() {}
func (*RetrieveResults) Descriptor() ([]byte, []int) { func (*RetrieveResults) Descriptor() ([]byte, []int) {
return fileDescriptor_41f4a519b878ee3b, []int{15} return fileDescriptor_41f4a519b878ee3b, []int{16}
} }
func (m *RetrieveResults) XXX_Unmarshal(b []byte) error { func (m *RetrieveResults) XXX_Unmarshal(b []byte) error {
@ -1263,6 +1329,13 @@ func (m *RetrieveResults) GetGlobalSealedSegmentIDs() []int64 {
return nil return nil
} }
func (m *RetrieveResults) GetCostAggregation() *CostAggregation {
if m != nil {
return m.CostAggregation
}
return nil
}
type LoadIndex struct { type LoadIndex struct {
Base *commonpb.MsgBase `protobuf:"bytes,1,opt,name=base,proto3" json:"base,omitempty"` Base *commonpb.MsgBase `protobuf:"bytes,1,opt,name=base,proto3" json:"base,omitempty"`
SegmentID int64 `protobuf:"varint,2,opt,name=segmentID,proto3" json:"segmentID,omitempty"` SegmentID int64 `protobuf:"varint,2,opt,name=segmentID,proto3" json:"segmentID,omitempty"`
@ -1279,7 +1352,7 @@ func (m *LoadIndex) Reset() { *m = LoadIndex{} }
func (m *LoadIndex) String() string { return proto.CompactTextString(m) } func (m *LoadIndex) String() string { return proto.CompactTextString(m) }
func (*LoadIndex) ProtoMessage() {} func (*LoadIndex) ProtoMessage() {}
func (*LoadIndex) Descriptor() ([]byte, []int) { func (*LoadIndex) Descriptor() ([]byte, []int) {
return fileDescriptor_41f4a519b878ee3b, []int{16} return fileDescriptor_41f4a519b878ee3b, []int{17}
} }
func (m *LoadIndex) XXX_Unmarshal(b []byte) error { func (m *LoadIndex) XXX_Unmarshal(b []byte) error {
@ -1354,7 +1427,7 @@ func (m *IndexStats) Reset() { *m = IndexStats{} }
func (m *IndexStats) String() string { return proto.CompactTextString(m) } func (m *IndexStats) String() string { return proto.CompactTextString(m) }
func (*IndexStats) ProtoMessage() {} func (*IndexStats) ProtoMessage() {}
func (*IndexStats) Descriptor() ([]byte, []int) { func (*IndexStats) Descriptor() ([]byte, []int) {
return fileDescriptor_41f4a519b878ee3b, []int{17} return fileDescriptor_41f4a519b878ee3b, []int{18}
} }
func (m *IndexStats) XXX_Unmarshal(b []byte) error { func (m *IndexStats) XXX_Unmarshal(b []byte) error {
@ -1402,7 +1475,7 @@ func (m *FieldStats) Reset() { *m = FieldStats{} }
func (m *FieldStats) String() string { return proto.CompactTextString(m) } func (m *FieldStats) String() string { return proto.CompactTextString(m) }
func (*FieldStats) ProtoMessage() {} func (*FieldStats) ProtoMessage() {}
func (*FieldStats) Descriptor() ([]byte, []int) { func (*FieldStats) Descriptor() ([]byte, []int) {
return fileDescriptor_41f4a519b878ee3b, []int{18} return fileDescriptor_41f4a519b878ee3b, []int{19}
} }
func (m *FieldStats) XXX_Unmarshal(b []byte) error { func (m *FieldStats) XXX_Unmarshal(b []byte) error {
@ -1458,7 +1531,7 @@ func (m *SegmentStats) Reset() { *m = SegmentStats{} }
func (m *SegmentStats) String() string { return proto.CompactTextString(m) } func (m *SegmentStats) String() string { return proto.CompactTextString(m) }
func (*SegmentStats) ProtoMessage() {} func (*SegmentStats) ProtoMessage() {}
func (*SegmentStats) Descriptor() ([]byte, []int) { func (*SegmentStats) Descriptor() ([]byte, []int) {
return fileDescriptor_41f4a519b878ee3b, []int{19} return fileDescriptor_41f4a519b878ee3b, []int{20}
} }
func (m *SegmentStats) XXX_Unmarshal(b []byte) error { func (m *SegmentStats) XXX_Unmarshal(b []byte) error {
@ -1521,7 +1594,7 @@ func (m *ChannelTimeTickMsg) Reset() { *m = ChannelTimeTickMsg{} }
func (m *ChannelTimeTickMsg) String() string { return proto.CompactTextString(m) } func (m *ChannelTimeTickMsg) String() string { return proto.CompactTextString(m) }
func (*ChannelTimeTickMsg) ProtoMessage() {} func (*ChannelTimeTickMsg) ProtoMessage() {}
func (*ChannelTimeTickMsg) Descriptor() ([]byte, []int) { func (*ChannelTimeTickMsg) Descriptor() ([]byte, []int) {
return fileDescriptor_41f4a519b878ee3b, []int{20} return fileDescriptor_41f4a519b878ee3b, []int{21}
} }
func (m *ChannelTimeTickMsg) XXX_Unmarshal(b []byte) error { func (m *ChannelTimeTickMsg) XXX_Unmarshal(b []byte) error {
@ -1587,7 +1660,7 @@ func (m *CredentialInfo) Reset() { *m = CredentialInfo{} }
func (m *CredentialInfo) String() string { return proto.CompactTextString(m) } func (m *CredentialInfo) String() string { return proto.CompactTextString(m) }
func (*CredentialInfo) ProtoMessage() {} func (*CredentialInfo) ProtoMessage() {}
func (*CredentialInfo) Descriptor() ([]byte, []int) { func (*CredentialInfo) Descriptor() ([]byte, []int) {
return fileDescriptor_41f4a519b878ee3b, []int{21} return fileDescriptor_41f4a519b878ee3b, []int{22}
} }
func (m *CredentialInfo) XXX_Unmarshal(b []byte) error { func (m *CredentialInfo) XXX_Unmarshal(b []byte) error {
@ -1655,7 +1728,7 @@ func (m *ListPolicyRequest) Reset() { *m = ListPolicyRequest{} }
func (m *ListPolicyRequest) String() string { return proto.CompactTextString(m) } func (m *ListPolicyRequest) String() string { return proto.CompactTextString(m) }
func (*ListPolicyRequest) ProtoMessage() {} func (*ListPolicyRequest) ProtoMessage() {}
func (*ListPolicyRequest) Descriptor() ([]byte, []int) { func (*ListPolicyRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_41f4a519b878ee3b, []int{22} return fileDescriptor_41f4a519b878ee3b, []int{23}
} }
func (m *ListPolicyRequest) XXX_Unmarshal(b []byte) error { func (m *ListPolicyRequest) XXX_Unmarshal(b []byte) error {
@ -1697,7 +1770,7 @@ func (m *ListPolicyResponse) Reset() { *m = ListPolicyResponse{} }
func (m *ListPolicyResponse) String() string { return proto.CompactTextString(m) } func (m *ListPolicyResponse) String() string { return proto.CompactTextString(m) }
func (*ListPolicyResponse) ProtoMessage() {} func (*ListPolicyResponse) ProtoMessage() {}
func (*ListPolicyResponse) Descriptor() ([]byte, []int) { func (*ListPolicyResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_41f4a519b878ee3b, []int{23} return fileDescriptor_41f4a519b878ee3b, []int{24}
} }
func (m *ListPolicyResponse) XXX_Unmarshal(b []byte) error { func (m *ListPolicyResponse) XXX_Unmarshal(b []byte) error {
@ -1751,7 +1824,7 @@ func (m *ShowConfigurationsRequest) Reset() { *m = ShowConfigurationsReq
func (m *ShowConfigurationsRequest) String() string { return proto.CompactTextString(m) } func (m *ShowConfigurationsRequest) String() string { return proto.CompactTextString(m) }
func (*ShowConfigurationsRequest) ProtoMessage() {} func (*ShowConfigurationsRequest) ProtoMessage() {}
func (*ShowConfigurationsRequest) Descriptor() ([]byte, []int) { func (*ShowConfigurationsRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_41f4a519b878ee3b, []int{24} return fileDescriptor_41f4a519b878ee3b, []int{25}
} }
func (m *ShowConfigurationsRequest) XXX_Unmarshal(b []byte) error { func (m *ShowConfigurationsRequest) XXX_Unmarshal(b []byte) error {
@ -1798,7 +1871,7 @@ func (m *ShowConfigurationsResponse) Reset() { *m = ShowConfigurationsRe
func (m *ShowConfigurationsResponse) String() string { return proto.CompactTextString(m) } func (m *ShowConfigurationsResponse) String() string { return proto.CompactTextString(m) }
func (*ShowConfigurationsResponse) ProtoMessage() {} func (*ShowConfigurationsResponse) ProtoMessage() {}
func (*ShowConfigurationsResponse) Descriptor() ([]byte, []int) { func (*ShowConfigurationsResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_41f4a519b878ee3b, []int{25} return fileDescriptor_41f4a519b878ee3b, []int{26}
} }
func (m *ShowConfigurationsResponse) XXX_Unmarshal(b []byte) error { func (m *ShowConfigurationsResponse) XXX_Unmarshal(b []byte) error {
@ -1845,7 +1918,7 @@ func (m *Rate) Reset() { *m = Rate{} }
func (m *Rate) String() string { return proto.CompactTextString(m) } func (m *Rate) String() string { return proto.CompactTextString(m) }
func (*Rate) ProtoMessage() {} func (*Rate) ProtoMessage() {}
func (*Rate) Descriptor() ([]byte, []int) { func (*Rate) Descriptor() ([]byte, []int) {
return fileDescriptor_41f4a519b878ee3b, []int{26} return fileDescriptor_41f4a519b878ee3b, []int{27}
} }
func (m *Rate) XXX_Unmarshal(b []byte) error { func (m *Rate) XXX_Unmarshal(b []byte) error {
@ -1896,6 +1969,7 @@ func init() {
proto.RegisterType((*CreateIndexRequest)(nil), "milvus.proto.internal.CreateIndexRequest") proto.RegisterType((*CreateIndexRequest)(nil), "milvus.proto.internal.CreateIndexRequest")
proto.RegisterType((*SearchRequest)(nil), "milvus.proto.internal.SearchRequest") proto.RegisterType((*SearchRequest)(nil), "milvus.proto.internal.SearchRequest")
proto.RegisterType((*SearchResults)(nil), "milvus.proto.internal.SearchResults") proto.RegisterType((*SearchResults)(nil), "milvus.proto.internal.SearchResults")
proto.RegisterType((*CostAggregation)(nil), "milvus.proto.internal.CostAggregation")
proto.RegisterType((*RetrieveRequest)(nil), "milvus.proto.internal.RetrieveRequest") proto.RegisterType((*RetrieveRequest)(nil), "milvus.proto.internal.RetrieveRequest")
proto.RegisterType((*RetrieveResults)(nil), "milvus.proto.internal.RetrieveResults") proto.RegisterType((*RetrieveResults)(nil), "milvus.proto.internal.RetrieveResults")
proto.RegisterType((*LoadIndex)(nil), "milvus.proto.internal.LoadIndex") proto.RegisterType((*LoadIndex)(nil), "milvus.proto.internal.LoadIndex")
@ -1914,120 +1988,125 @@ func init() {
func init() { proto.RegisterFile("internal.proto", fileDescriptor_41f4a519b878ee3b) } func init() { proto.RegisterFile("internal.proto", fileDescriptor_41f4a519b878ee3b) }
var fileDescriptor_41f4a519b878ee3b = []byte{ var fileDescriptor_41f4a519b878ee3b = []byte{
// 1835 bytes of a gzipped FileDescriptorProto // 1906 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x58, 0xcd, 0x6f, 0x1c, 0x49, 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x58, 0x4b, 0x6f, 0x1c, 0xb9,
0x15, 0xa7, 0xe7, 0x7b, 0xde, 0x8c, 0x9d, 0x71, 0xc5, 0x09, 0x1d, 0x27, 0xbb, 0xf6, 0x36, 0x48, 0x11, 0x4e, 0xcf, 0x7b, 0x6a, 0x46, 0xd2, 0x88, 0x2b, 0x3b, 0xed, 0xc7, 0xae, 0xb5, 0x9d, 0x20,
0x98, 0x45, 0x1b, 0x2f, 0x5e, 0xed, 0x86, 0x03, 0x02, 0xc5, 0x6e, 0xaf, 0x35, 0xda, 0x71, 0x70, 0x51, 0x36, 0x58, 0x7b, 0xa3, 0xc5, 0xae, 0x73, 0x08, 0x12, 0xd8, 0x6a, 0xad, 0x30, 0xd8, 0x91,
0x7a, 0xa2, 0x95, 0xe0, 0xd2, 0xaa, 0x99, 0x7e, 0x1e, 0x17, 0xe9, 0x2f, 0x57, 0x55, 0xc7, 0x76, 0x23, 0xf7, 0x18, 0x0b, 0x24, 0x97, 0x06, 0x67, 0xba, 0x34, 0x62, 0xdc, 0x2f, 0x91, 0x6c, 0x3d,
0xce, 0xdc, 0x90, 0xb8, 0x71, 0x41, 0x82, 0x33, 0x42, 0xe2, 0x0c, 0x37, 0xfe, 0xaf, 0x15, 0x07, 0x7c, 0xce, 0x2d, 0x40, 0x6e, 0xb9, 0x04, 0x48, 0x7e, 0x40, 0x80, 0x9c, 0x93, 0x5b, 0xfe, 0x41,
0x54, 0x1f, 0x3d, 0x1f, 0xb6, 0x63, 0xd9, 0x8e, 0x80, 0xdd, 0x5b, 0xbd, 0xf7, 0x7e, 0xf5, 0xaa, 0x7e, 0x90, 0x4f, 0x01, 0x1f, 0x3d, 0x0f, 0x69, 0x2c, 0x48, 0x72, 0x1e, 0x9b, 0x1b, 0x59, 0xf5,
0xea, 0xbd, 0x57, 0xbf, 0x7e, 0xd5, 0xb0, 0xcc, 0x52, 0x89, 0x3c, 0xa5, 0xf1, 0xd3, 0x9c, 0x67, 0xb1, 0x48, 0x56, 0x15, 0x3f, 0x16, 0x09, 0xab, 0x2c, 0x95, 0xc8, 0x53, 0x1a, 0x3f, 0xce, 0x79,
0x32, 0x23, 0x0f, 0x12, 0x16, 0xbf, 0x29, 0x84, 0x91, 0x9e, 0x96, 0xc6, 0xb5, 0xee, 0x38, 0x4b, 0x26, 0x33, 0x72, 0x27, 0x61, 0xf1, 0x49, 0x21, 0x4c, 0xef, 0x71, 0xa9, 0xbc, 0xdf, 0x1d, 0x67,
0x92, 0x2c, 0x35, 0xea, 0xb5, 0xae, 0x18, 0x1f, 0x63, 0x42, 0x8d, 0xe4, 0x3d, 0x86, 0x47, 0xfb, 0x49, 0x92, 0xa5, 0x46, 0x7c, 0xbf, 0x2b, 0xc6, 0x47, 0x98, 0x50, 0xd3, 0xf3, 0x1e, 0xc0, 0xbd,
0x28, 0x5f, 0xb1, 0x04, 0x5f, 0xb1, 0xf1, 0xeb, 0xdd, 0x63, 0x9a, 0xa6, 0x18, 0x07, 0x78, 0x52, 0x3d, 0x94, 0xaf, 0x58, 0x82, 0xaf, 0xd8, 0xf8, 0xf5, 0xce, 0x11, 0x4d, 0x53, 0x8c, 0x03, 0x3c,
0xa0, 0x90, 0xde, 0x07, 0xf0, 0x78, 0x1f, 0xe5, 0x50, 0x52, 0xc9, 0x84, 0x64, 0x63, 0x71, 0xc1, 0x2e, 0x50, 0x48, 0xef, 0x43, 0x78, 0xb0, 0x87, 0x72, 0x28, 0xa9, 0x64, 0x42, 0xb2, 0xb1, 0xb8,
0xfc, 0x00, 0xee, 0xef, 0xa3, 0xf4, 0xa3, 0x0b, 0xea, 0xaf, 0xa1, 0xf5, 0x22, 0x8b, 0xb0, 0x9f, 0xa0, 0xbe, 0x03, 0x1f, 0xec, 0xa1, 0xf4, 0xa3, 0x0b, 0xe2, 0x6f, 0xa0, 0xf5, 0x22, 0x8b, 0xb0,
0x1e, 0x65, 0xe4, 0x0b, 0x68, 0xd2, 0x28, 0xe2, 0x28, 0x84, 0xeb, 0x6c, 0x38, 0x9b, 0x9d, 0xed, 0x9f, 0x1e, 0x66, 0xe4, 0x4b, 0x68, 0xd2, 0x28, 0xe2, 0x28, 0x84, 0xeb, 0x6c, 0x3a, 0x5b, 0x9d,
0x27, 0x4f, 0x17, 0xf6, 0x68, 0x77, 0xf6, 0xdc, 0x60, 0x82, 0x12, 0x4c, 0x08, 0xd4, 0x78, 0x16, 0xed, 0x87, 0x8f, 0x17, 0xd6, 0x68, 0x57, 0xf6, 0xcc, 0x60, 0x82, 0x12, 0x4c, 0x08, 0xd4, 0x78,
0xa3, 0x5b, 0xd9, 0x70, 0x36, 0xdb, 0x81, 0x1e, 0x7b, 0xbf, 0x05, 0xe8, 0xa7, 0x4c, 0x1e, 0x52, 0x16, 0xa3, 0x5b, 0xd9, 0x74, 0xb6, 0xda, 0x81, 0x6e, 0x7b, 0xbf, 0x01, 0xe8, 0xa7, 0x4c, 0x1e,
0x4e, 0x13, 0x41, 0x1e, 0x42, 0x23, 0x55, 0xab, 0xf8, 0xda, 0x71, 0x35, 0xb0, 0x12, 0xf1, 0xa1, 0x50, 0x4e, 0x13, 0x41, 0xee, 0x42, 0x23, 0x55, 0xb3, 0xf8, 0xda, 0x70, 0x35, 0xb0, 0x3d, 0xe2,
0x2b, 0x24, 0xe5, 0x32, 0xcc, 0x35, 0xce, 0xad, 0x6c, 0x54, 0x37, 0x3b, 0xdb, 0x1f, 0x5d, 0xb9, 0x43, 0x57, 0x48, 0xca, 0x65, 0x98, 0x6b, 0x9c, 0x5b, 0xd9, 0xac, 0x6e, 0x75, 0xb6, 0x3f, 0x5e,
0xec, 0x57, 0x78, 0xfe, 0x35, 0x8d, 0x0b, 0x3c, 0xa4, 0x8c, 0x07, 0x1d, 0x3d, 0xcd, 0x78, 0xf7, 0x3a, 0xed, 0xd7, 0x78, 0xfe, 0x0d, 0x8d, 0x0b, 0x3c, 0xa0, 0x8c, 0x07, 0x1d, 0x3d, 0xcc, 0x58,
0x7e, 0x0d, 0x30, 0x94, 0x9c, 0xa5, 0x93, 0x01, 0x13, 0x52, 0xad, 0xf5, 0x46, 0xe1, 0xd4, 0x21, 0xf7, 0x7e, 0x05, 0x30, 0x94, 0x9c, 0xa5, 0x93, 0x01, 0x13, 0x52, 0xcd, 0x75, 0xa2, 0x70, 0x6a,
0xaa, 0x9b, 0xed, 0xc0, 0x4a, 0xe4, 0x33, 0x68, 0x08, 0x49, 0x65, 0x21, 0xf4, 0x3e, 0x3b, 0xdb, 0x13, 0xd5, 0xad, 0x76, 0x60, 0x7b, 0xe4, 0x73, 0x68, 0x08, 0x49, 0x65, 0x21, 0xf4, 0x3a, 0x3b,
0x8f, 0xaf, 0x5c, 0x65, 0xa8, 0x21, 0x81, 0x85, 0x7a, 0x7f, 0xaf, 0xc0, 0xea, 0x42, 0x54, 0x6d, 0xdb, 0x0f, 0x96, 0xce, 0x32, 0xd4, 0x90, 0xc0, 0x42, 0xbd, 0xbf, 0x56, 0x60, 0x63, 0xc1, 0xab,
0xdc, 0xc8, 0xa7, 0x50, 0x1b, 0x51, 0x81, 0xd7, 0x06, 0xea, 0x40, 0x4c, 0x76, 0xa8, 0xc0, 0x40, 0xd6, 0x6f, 0xe4, 0x33, 0xa8, 0x8d, 0xa8, 0xc0, 0x2b, 0x1d, 0xb5, 0x2f, 0x26, 0xcf, 0xa9, 0xc0,
0x23, 0x55, 0x94, 0xa2, 0x51, 0xdf, 0xd7, 0xab, 0x57, 0x03, 0x3d, 0x26, 0x1e, 0x74, 0xc7, 0x59, 0x40, 0x23, 0x95, 0x97, 0xa2, 0x51, 0xdf, 0xd7, 0xb3, 0x57, 0x03, 0xdd, 0x26, 0x1e, 0x74, 0xc7,
0x1c, 0xe3, 0x58, 0xb2, 0x2c, 0xed, 0xfb, 0x6e, 0x55, 0xdb, 0x16, 0x74, 0x0a, 0x93, 0x53, 0x2e, 0x59, 0x1c, 0xe3, 0x58, 0xb2, 0x2c, 0xed, 0xfb, 0x6e, 0x55, 0xeb, 0x16, 0x64, 0x0a, 0x93, 0x53,
0x99, 0x11, 0x85, 0x5b, 0xdb, 0xa8, 0x2a, 0xcc, 0xbc, 0x8e, 0xfc, 0x18, 0x7a, 0x92, 0xd3, 0x37, 0x2e, 0x99, 0xe9, 0x0a, 0xb7, 0xb6, 0x59, 0x55, 0x98, 0x79, 0x19, 0xf9, 0x11, 0xf4, 0x24, 0xa7,
0x18, 0x87, 0x92, 0x25, 0x28, 0x24, 0x4d, 0x72, 0xb7, 0xbe, 0xe1, 0x6c, 0xd6, 0x82, 0x7b, 0x46, 0x27, 0x18, 0x87, 0x92, 0x25, 0x28, 0x24, 0x4d, 0x72, 0xb7, 0xbe, 0xe9, 0x6c, 0xd5, 0x82, 0x35,
0xff, 0xaa, 0x54, 0x93, 0x2d, 0xb8, 0x3f, 0x29, 0x28, 0xa7, 0xa9, 0x44, 0x9c, 0x43, 0x37, 0x34, 0x23, 0x7f, 0x55, 0x8a, 0xc9, 0x13, 0xf8, 0x60, 0x52, 0x50, 0x4e, 0x53, 0x89, 0x38, 0x87, 0x6e,
0x9a, 0x4c, 0x4d, 0xb3, 0x09, 0x3f, 0x81, 0x15, 0x05, 0xcb, 0x0a, 0x39, 0x07, 0x6f, 0x6a, 0x78, 0x68, 0x34, 0x99, 0xaa, 0x66, 0x03, 0x7e, 0x0c, 0xeb, 0x0a, 0x96, 0x15, 0x72, 0x0e, 0xde, 0xd4,
0xcf, 0x1a, 0xa6, 0x60, 0xef, 0x1f, 0x0e, 0x3c, 0xb8, 0x10, 0x2f, 0x91, 0x67, 0xa9, 0xc0, 0x3b, 0xf0, 0x9e, 0x55, 0x4c, 0xc1, 0xde, 0xdf, 0x1c, 0xb8, 0x73, 0xc1, 0x5f, 0x22, 0xcf, 0x52, 0x81,
0x04, 0xec, 0x2e, 0x09, 0x23, 0xcf, 0xa0, 0xae, 0x46, 0xc2, 0xad, 0xde, 0xb4, 0x94, 0x0c, 0xde, 0xb7, 0x70, 0xd8, 0x6d, 0x02, 0x46, 0x9e, 0x42, 0x5d, 0xb5, 0x84, 0x5b, 0xbd, 0x6e, 0x2a, 0x19,
0xfb, 0x8b, 0x03, 0x64, 0x97, 0x23, 0x95, 0xf8, 0x3c, 0x66, 0xf4, 0x3d, 0xf2, 0xfc, 0x7d, 0x68, 0xbc, 0xf7, 0x67, 0x07, 0xc8, 0x0e, 0x47, 0x2a, 0xf1, 0x59, 0xcc, 0xe8, 0x7b, 0xc4, 0xf9, 0xbb,
0x46, 0xa3, 0x30, 0xa5, 0x49, 0x79, 0x21, 0x1a, 0xd1, 0xe8, 0x05, 0x4d, 0x90, 0xfc, 0x08, 0xee, 0xd0, 0x8c, 0x46, 0x61, 0x4a, 0x93, 0xf2, 0x40, 0x34, 0xa2, 0xd1, 0x0b, 0x9a, 0x20, 0xf9, 0x21,
0xcd, 0x12, 0x6b, 0x00, 0x55, 0x0d, 0x58, 0x9e, 0xa9, 0x35, 0x70, 0x15, 0xea, 0x54, 0xed, 0xc1, 0xac, 0xcd, 0x02, 0x6b, 0x00, 0x55, 0x0d, 0x58, 0x9d, 0x89, 0x35, 0x70, 0x03, 0xea, 0x54, 0xad,
0xad, 0x69, 0xb3, 0x11, 0x3c, 0x01, 0x3d, 0x9f, 0x67, 0xf9, 0x7f, 0x6b, 0x77, 0xd3, 0x45, 0xab, 0xc1, 0xad, 0x69, 0xb5, 0xe9, 0x78, 0x02, 0x7a, 0x3e, 0xcf, 0xf2, 0xff, 0xd4, 0xea, 0xa6, 0x93,
0xf3, 0x8b, 0xfe, 0xd9, 0x81, 0x95, 0xe7, 0xb1, 0x44, 0xfe, 0x2d, 0x0d, 0xca, 0xbf, 0x2a, 0x65, 0x56, 0xe7, 0x27, 0xfd, 0x93, 0x03, 0xeb, 0xcf, 0x62, 0x89, 0xfc, 0x5b, 0xea, 0x94, 0x7f, 0x54,
0xd6, 0xfa, 0x69, 0x84, 0x67, 0xff, 0xcf, 0x0d, 0x7e, 0x00, 0x70, 0xc4, 0x30, 0x8e, 0x0c, 0xc6, 0xca, 0xa8, 0xf5, 0xd3, 0x08, 0xcf, 0xfe, 0x97, 0x0b, 0xfc, 0x10, 0xe0, 0x90, 0x61, 0x1c, 0x19,
0xec, 0xb2, 0xad, 0x35, 0xda, 0x5c, 0x5e, 0xff, 0xfa, 0x35, 0xd7, 0xbf, 0x71, 0xc5, 0xf5, 0x77, 0x8c, 0x59, 0x65, 0x5b, 0x4b, 0xb4, 0xba, 0x3c, 0xfe, 0xf5, 0x2b, 0x8e, 0x7f, 0x63, 0xc9, 0xf1,
0xa1, 0xa9, 0x9d, 0xf4, 0x7d, 0x7d, 0xe9, 0xaa, 0x41, 0x29, 0x2a, 0xf2, 0xc4, 0x33, 0xc9, 0x69, 0x77, 0xa1, 0xa9, 0x8d, 0xf4, 0x7d, 0x7d, 0xe8, 0xaa, 0x41, 0xd9, 0x55, 0xe4, 0x89, 0x67, 0x92,
0x49, 0x9e, 0xad, 0x1b, 0x93, 0xa7, 0x9e, 0x66, 0xc9, 0xf3, 0x9b, 0x1a, 0x2c, 0x0d, 0x91, 0xf2, 0xd3, 0x92, 0x3c, 0x5b, 0xd7, 0x26, 0x4f, 0x3d, 0xcc, 0x92, 0xe7, 0xdb, 0x1a, 0xac, 0x0c, 0x91,
0xf1, 0xf1, 0xdd, 0x83, 0xb7, 0x0a, 0x75, 0x8e, 0x27, 0x53, 0x6e, 0x33, 0xc2, 0xf4, 0xc4, 0xd5, 0xf2, 0xf1, 0xd1, 0xed, 0x9d, 0xb7, 0x01, 0x75, 0x8e, 0xc7, 0x53, 0x6e, 0x33, 0x9d, 0xe9, 0x8e,
0x6b, 0x4e, 0x5c, 0xbb, 0x01, 0xe1, 0xd5, 0xaf, 0x20, 0xbc, 0x1e, 0x54, 0x23, 0x11, 0xeb, 0x80, 0xab, 0x57, 0xec, 0xb8, 0x76, 0x0d, 0xc2, 0xab, 0x2f, 0x21, 0xbc, 0x1e, 0x54, 0x23, 0x11, 0x6b,
0xb5, 0x03, 0x35, 0x54, 0x34, 0x95, 0xc7, 0x74, 0x8c, 0xc7, 0x59, 0x1c, 0x21, 0x0f, 0x27, 0x3c, 0x87, 0xb5, 0x03, 0xd5, 0x54, 0x34, 0x95, 0xc7, 0x74, 0x8c, 0x47, 0x59, 0x1c, 0x21, 0x0f, 0x27,
0x2b, 0x0c, 0x4d, 0x75, 0x83, 0xde, 0x9c, 0x61, 0x5f, 0xe9, 0xc9, 0x33, 0x68, 0x45, 0x22, 0x0e, 0x3c, 0x2b, 0x0c, 0x4d, 0x75, 0x83, 0xde, 0x9c, 0x62, 0x4f, 0xc9, 0xc9, 0x53, 0x68, 0x45, 0x22,
0xe5, 0x79, 0x8e, 0x6e, 0x6b, 0xc3, 0xd9, 0x5c, 0x7e, 0xc7, 0x31, 0x7d, 0x11, 0xbf, 0x3a, 0xcf, 0x0e, 0xe5, 0x79, 0x8e, 0x6e, 0x6b, 0xd3, 0xd9, 0x5a, 0x7d, 0xc7, 0x36, 0x7d, 0x11, 0xbf, 0x3a,
0x31, 0x68, 0x46, 0x66, 0x40, 0x3e, 0x85, 0x55, 0x81, 0x9c, 0xd1, 0x98, 0xbd, 0xc5, 0x28, 0xc4, 0xcf, 0x31, 0x68, 0x46, 0xa6, 0x41, 0x3e, 0x83, 0x0d, 0x81, 0x9c, 0xd1, 0x98, 0xbd, 0xc1, 0x28,
0xb3, 0x9c, 0x87, 0x79, 0x4c, 0x53, 0xb7, 0xad, 0x17, 0x22, 0x33, 0xdb, 0xde, 0x59, 0xce, 0x0f, 0xc4, 0xb3, 0x9c, 0x87, 0x79, 0x4c, 0x53, 0xb7, 0xad, 0x27, 0x22, 0x33, 0xdd, 0xee, 0x59, 0xce,
0x63, 0x9a, 0x92, 0x4d, 0xe8, 0x65, 0x85, 0xcc, 0x0b, 0x19, 0xea, 0xbc, 0x89, 0x90, 0x45, 0x2e, 0x0f, 0x62, 0x9a, 0x92, 0x2d, 0xe8, 0x65, 0x85, 0xcc, 0x0b, 0x19, 0xea, 0xb8, 0x89, 0x90, 0x45,
0xe8, 0x13, 0x2d, 0x1b, 0xfd, 0x97, 0x5a, 0xdd, 0x8f, 0xae, 0x24, 0xf1, 0xce, 0xad, 0x48, 0xbc, 0x2e, 0xe8, 0x1d, 0xad, 0x1a, 0xf9, 0x57, 0x5a, 0xdc, 0x8f, 0x96, 0x92, 0x78, 0xe7, 0x46, 0x24,
0x7b, 0x3b, 0x12, 0x5f, 0xba, 0x9a, 0xc4, 0xc9, 0x32, 0x54, 0xd2, 0x13, 0x77, 0x59, 0xa7, 0xa6, 0xde, 0xbd, 0x19, 0x89, 0xaf, 0x2c, 0x27, 0x71, 0xb2, 0x0a, 0x95, 0xf4, 0xd8, 0x5d, 0xd5, 0xa1,
0x92, 0x9e, 0xa8, 0x44, 0xca, 0x2c, 0x7f, 0xed, 0xde, 0x33, 0x89, 0x54, 0x63, 0xf2, 0x21, 0x40, 0xa9, 0xa4, 0xc7, 0x2a, 0x90, 0x32, 0xcb, 0x5f, 0xbb, 0x6b, 0x26, 0x90, 0xaa, 0x4d, 0x3e, 0x02,
0x82, 0x92, 0xb3, 0xb1, 0x0a, 0x8b, 0xdb, 0xd3, 0x79, 0x98, 0xd3, 0x90, 0x1f, 0xc2, 0x12, 0x9b, 0x48, 0x50, 0x72, 0x36, 0x56, 0x6e, 0x71, 0x7b, 0x3a, 0x0e, 0x73, 0x12, 0xf2, 0x7d, 0x58, 0x61,
0xa4, 0x19, 0xc7, 0x7d, 0x9e, 0x9d, 0xb2, 0x74, 0xe2, 0xae, 0x6c, 0x38, 0x9b, 0xad, 0x60, 0x51, 0x93, 0x34, 0xe3, 0xb8, 0xc7, 0xb3, 0x53, 0x96, 0x4e, 0xdc, 0xf5, 0x4d, 0x67, 0xab, 0x15, 0x2c,
0xe9, 0xfd, 0xbb, 0x3a, 0x2b, 0x3e, 0x51, 0xc4, 0x52, 0xfc, 0xaf, 0x3e, 0x13, 0xd3, 0x8a, 0xad, 0x0a, 0xbd, 0x7f, 0xce, 0x25, 0x9f, 0x28, 0x62, 0x29, 0xfe, 0x5b, 0xd7, 0xc4, 0x34, 0x63, 0xab,
0xce, 0x57, 0xec, 0x3a, 0x74, 0xcc, 0x11, 0x4c, 0x65, 0xd4, 0x2e, 0x9d, 0x6a, 0x1d, 0x3a, 0x69, 0xf3, 0x19, 0xfb, 0x08, 0x3a, 0x66, 0x0b, 0x26, 0x33, 0x6a, 0x97, 0x76, 0xf5, 0x08, 0x3a, 0x69,
0x91, 0x84, 0x27, 0x05, 0x72, 0x86, 0xc2, 0xde, 0x65, 0x48, 0x8b, 0xe4, 0xa5, 0xd1, 0x90, 0xfb, 0x91, 0x84, 0xc7, 0x05, 0x72, 0x86, 0xc2, 0x9e, 0x65, 0x48, 0x8b, 0xe4, 0xa5, 0x91, 0x90, 0x0f,
0x50, 0x97, 0x59, 0x1e, 0xbe, 0xb6, 0x57, 0x59, 0xc5, 0xea, 0x2b, 0xf2, 0x73, 0x58, 0x13, 0x48, 0xa0, 0x2e, 0xb3, 0x3c, 0x7c, 0x6d, 0x8f, 0xb2, 0xf2, 0xd5, 0xd7, 0xe4, 0x67, 0x70, 0x5f, 0x20,
0x63, 0x8c, 0x42, 0x81, 0x93, 0x04, 0x53, 0xd9, 0xf7, 0x45, 0x28, 0xf4, 0xb1, 0x31, 0x72, 0x9b, 0x8d, 0x31, 0x0a, 0x05, 0x4e, 0x12, 0x4c, 0x65, 0xdf, 0x17, 0xa1, 0xd0, 0xdb, 0xc6, 0xc8, 0x6d,
0xba, 0x18, 0x5c, 0x83, 0x18, 0x4e, 0x01, 0x43, 0x6b, 0x57, 0xb9, 0x1e, 0x9b, 0x9e, 0x6d, 0x61, 0xea, 0x64, 0x70, 0x0d, 0x62, 0x38, 0x05, 0x0c, 0xad, 0x5e, 0xc5, 0x7a, 0x6c, 0x6a, 0xb6, 0x85,
0x5a, 0x4b, 0x37, 0x37, 0x64, 0x66, 0x9a, 0x4e, 0xf8, 0x19, 0xb8, 0x93, 0x38, 0x1b, 0xd1, 0x38, 0x61, 0x2d, 0x5d, 0xdc, 0x90, 0x99, 0x6a, 0x3a, 0xe0, 0xa7, 0xe0, 0x4e, 0xe2, 0x6c, 0x44, 0xe3,
0xbc, 0xb4, 0xaa, 0xdb, 0xd6, 0x8b, 0x3d, 0x34, 0xf6, 0xe1, 0x85, 0x25, 0xd5, 0xf1, 0x44, 0xcc, 0xf0, 0xd2, 0xac, 0x6e, 0x5b, 0x4f, 0x76, 0xd7, 0xe8, 0x87, 0x17, 0xa6, 0x54, 0xdb, 0x13, 0x31,
0xc6, 0x18, 0x85, 0xa3, 0x38, 0x1b, 0xb9, 0xa0, 0x8b, 0x1a, 0x8c, 0x6a, 0x27, 0xce, 0x46, 0xaa, 0x1b, 0x63, 0x14, 0x8e, 0xe2, 0x6c, 0xe4, 0x82, 0x4e, 0x6a, 0x30, 0xa2, 0xe7, 0x71, 0x36, 0x52,
0x98, 0x2d, 0x40, 0x85, 0x61, 0x9c, 0x15, 0xa9, 0xd4, 0x25, 0x5a, 0x0d, 0x96, 0x8d, 0xfe, 0x45, 0xc9, 0x6c, 0x01, 0xca, 0x0d, 0xe3, 0xac, 0x48, 0xa5, 0x4e, 0xd1, 0x6a, 0xb0, 0x6a, 0xe4, 0x2f,
0x91, 0xec, 0x2a, 0x2d, 0xf9, 0x01, 0x2c, 0x59, 0x64, 0x76, 0x74, 0x24, 0x50, 0xea, 0xda, 0xac, 0x8a, 0x64, 0x47, 0x49, 0xc9, 0xf7, 0x60, 0xc5, 0x22, 0xb3, 0xc3, 0x43, 0x81, 0x52, 0xe7, 0x66,
0x06, 0x5d, 0xa3, 0xfc, 0x95, 0xd6, 0x79, 0xff, 0xac, 0xc1, 0xbd, 0x40, 0x45, 0x17, 0xdf, 0xe0, 0x35, 0xe8, 0x1a, 0xe1, 0x2f, 0xb5, 0x8c, 0x1c, 0x28, 0x6e, 0x15, 0xf2, 0xd9, 0x64, 0xc2, 0x71,
0x77, 0x89, 0x7d, 0xde, 0xc5, 0x02, 0x8d, 0x5b, 0xb1, 0x40, 0xf3, 0xc6, 0x2c, 0xd0, 0xba, 0x15, 0x42, 0xd5, 0xd9, 0xd6, 0x39, 0xd9, 0xd9, 0xfe, 0xc1, 0xe3, 0xa5, 0xc5, 0xf1, 0xe3, 0x9d, 0x45,
0x0b, 0xb4, 0x6f, 0xc7, 0x02, 0xf0, 0x0e, 0x16, 0x58, 0x85, 0x7a, 0xcc, 0x12, 0x56, 0x26, 0xd8, 0x74, 0x70, 0x71, 0xb8, 0x77, 0x0c, 0x6b, 0x17, 0x30, 0x8a, 0x4e, 0xb8, 0x2d, 0x42, 0x54, 0x8a,
0x08, 0x97, 0xef, 0x75, 0xf7, 0x8a, 0x7b, 0x4d, 0x1e, 0x41, 0x8b, 0x09, 0x5b, 0x1f, 0x4b, 0x1a, 0xdb, 0x0a, 0x74, 0x41, 0x46, 0x36, 0xa1, 0x23, 0x90, 0x9f, 0xb0, 0xb1, 0x81, 0x18, 0x1a, 0x9b,
0xd0, 0x64, 0xc2, 0x14, 0xc6, 0x1e, 0xac, 0x33, 0x89, 0x9c, 0xea, 0xcf, 0x29, 0x9e, 0x49, 0x4c, 0x17, 0x29, 0x1a, 0x96, 0x99, 0xa4, 0xf1, 0x8b, 0x97, 0x36, 0x65, 0xca, 0xae, 0xf7, 0xf7, 0x1a,
0x85, 0x1a, 0x71, 0x8c, 0x8a, 0x31, 0x86, 0x9c, 0x4a, 0xb4, 0xcc, 0xf3, 0x64, 0x0a, 0xdb, 0x2b, 0xac, 0x05, 0x2a, 0x45, 0xf0, 0x04, 0xff, 0x9f, 0x28, 0xf4, 0x5d, 0x54, 0xd6, 0xb8, 0x11, 0x95,
0x51, 0x81, 0x06, 0x05, 0x54, 0xa2, 0xf7, 0xd7, 0xea, 0x7c, 0xe9, 0x7c, 0x0b, 0xb8, 0xe3, 0x63, 0x35, 0xaf, 0x4d, 0x65, 0xad, 0x1b, 0x51, 0x59, 0xfb, 0x66, 0x54, 0x06, 0xef, 0xa0, 0xb2, 0x0d,
0xa8, 0xb2, 0xc8, 0x74, 0x27, 0x9d, 0x6d, 0x77, 0xd1, 0x8f, 0x7d, 0xc4, 0xf5, 0x7d, 0x11, 0x28, 0xa8, 0xc7, 0x2c, 0x61, 0x65, 0x96, 0x9a, 0xce, 0x65, 0x72, 0xea, 0x2e, 0x21, 0x27, 0x72, 0x0f,
0x10, 0xf9, 0x25, 0x74, 0x6c, 0x19, 0x44, 0x54, 0x52, 0x5d, 0x62, 0x9d, 0xed, 0x0f, 0xaf, 0x9c, 0x5a, 0x4c, 0xd8, 0x24, 0x5f, 0xd1, 0x80, 0x26, 0x13, 0x26, 0xbb, 0x77, 0xe1, 0x11, 0x93, 0xc8,
0xa3, 0xeb, 0xc2, 0xa7, 0x92, 0x06, 0xa6, 0xbb, 0x10, 0x6a, 0x4c, 0x7e, 0x01, 0x8f, 0x2f, 0x33, 0x75, 0x82, 0x85, 0x78, 0x26, 0x31, 0x15, 0xaa, 0xc5, 0x31, 0x2a, 0xc6, 0x18, 0x72, 0x2a, 0xd1,
0x0a, 0xb7, 0xe1, 0x88, 0xdc, 0x86, 0xae, 0xac, 0x47, 0x17, 0x29, 0xa5, 0x8c, 0x57, 0x44, 0x7e, 0xd2, 0xe7, 0xc3, 0x29, 0x6c, 0xb7, 0x44, 0x05, 0x1a, 0x14, 0x50, 0x89, 0xde, 0xdb, 0xea, 0x7c,
0x0a, 0xab, 0x73, 0x9c, 0x32, 0x9b, 0xd8, 0xd4, 0xa4, 0x32, 0xc7, 0x37, 0xb3, 0x29, 0xd7, 0xb1, 0xea, 0x7c, 0x0b, 0x08, 0xf0, 0x13, 0xa8, 0xb2, 0xc8, 0x94, 0x58, 0x9d, 0x6d, 0x77, 0xd1, 0x8e,
0x4a, 0xeb, 0x3a, 0x56, 0xf1, 0xbe, 0x71, 0xa0, 0x3d, 0xc8, 0x68, 0xa4, 0x3b, 0xb4, 0x3b, 0x24, 0x7d, 0x89, 0xf6, 0x7d, 0x11, 0x28, 0x10, 0xf9, 0x05, 0x74, 0x6c, 0x1a, 0x44, 0x54, 0x52, 0x9d,
0xe9, 0x09, 0xb4, 0xa7, 0x6b, 0xd9, 0x3b, 0x3e, 0x53, 0x28, 0xeb, 0xb4, 0xc9, 0xb2, 0x9d, 0xd9, 0x62, 0x9d, 0xed, 0x8f, 0x96, 0x8e, 0xd1, 0x79, 0xe1, 0x53, 0x49, 0x03, 0x53, 0x22, 0x09, 0xd5,
0x5c, 0xd7, 0x35, 0xd7, 0x3d, 0xd5, 0x16, 0xbb, 0xa7, 0x75, 0xe8, 0x30, 0xb5, 0xa1, 0x30, 0xa7, 0x26, 0x3f, 0x87, 0x07, 0x97, 0x69, 0x91, 0x5b, 0x77, 0x44, 0x6e, 0x43, 0x67, 0xd6, 0xbd, 0x8b,
0xf2, 0xd8, 0x5c, 0xf3, 0x76, 0x00, 0x5a, 0x75, 0xa8, 0x34, 0xaa, 0xbd, 0x2a, 0x01, 0xba, 0xbd, 0xbc, 0x58, 0xfa, 0x2b, 0x22, 0x3f, 0x81, 0x8d, 0x39, 0x62, 0x9c, 0x0d, 0x6c, 0x6a, 0x66, 0x9c,
0x6a, 0xdc, 0xb8, 0xbd, 0xb2, 0x4e, 0x74, 0x7b, 0xf5, 0x3b, 0x47, 0x3d, 0x84, 0x23, 0x3c, 0x53, 0x23, 0xcd, 0xd9, 0x90, 0xab, 0xa8, 0xb1, 0x75, 0x25, 0x35, 0xfe, 0xfb, 0xa9, 0xea, 0xad, 0x03,
0x45, 0x74, 0xd9, 0xa9, 0x73, 0x17, 0xa7, 0x8a, 0x7f, 0x14, 0xff, 0x72, 0x8c, 0xa9, 0x9c, 0x65, 0xed, 0x41, 0x46, 0x23, 0x5d, 0xb8, 0xde, 0x22, 0xec, 0x0f, 0xa1, 0x3d, 0x5d, 0xbd, 0x65, 0x8d,
0x42, 0xd8, 0xe0, 0x90, 0xb4, 0x48, 0x02, 0x63, 0xb2, 0x59, 0x10, 0xde, 0x1f, 0x1c, 0x00, 0x5d, 0x99, 0x40, 0x69, 0xa7, 0xb5, 0xa7, 0x2d, 0x58, 0xe7, 0x8a, 0xd1, 0xb9, 0xa2, 0xb2, 0xb6, 0x58,
0x4a, 0x66, 0x1b, 0x17, 0x89, 0xd0, 0xb9, 0xbe, 0xf1, 0xac, 0x2c, 0x86, 0x6e, 0xa7, 0x0c, 0xdd, 0x54, 0x3e, 0x82, 0x0e, 0x53, 0x0b, 0x0a, 0x73, 0x2a, 0x8f, 0x0c, 0x71, 0xb4, 0x03, 0xd0, 0xa2,
0x35, 0x2f, 0xad, 0xe9, 0xcf, 0x8e, 0xd9, 0xe1, 0x6d, 0x74, 0xf5, 0xd8, 0xfb, 0xa3, 0x03, 0x5d, 0x03, 0x25, 0x51, 0x55, 0x67, 0x09, 0xd0, 0x55, 0x67, 0xe3, 0xda, 0x55, 0xa7, 0x35, 0xa2, 0xab,
0xbb, 0x3b, 0xb3, 0xa5, 0x85, 0x2c, 0x3b, 0x17, 0xb3, 0xac, 0xbf, 0xcc, 0x49, 0xc6, 0xcf, 0x43, 0xce, 0xdf, 0x3a, 0x00, 0x7a, 0xe3, 0x2a, 0x2d, 0x2f, 0x1b, 0x75, 0x6e, 0x63, 0x54, 0x31, 0x9a,
0xc1, 0xde, 0xa2, 0xdd, 0x10, 0x18, 0xd5, 0x90, 0xbd, 0x45, 0xc5, 0x38, 0x3a, 0x24, 0xd9, 0xa9, 0xba, 0x96, 0x38, 0xc6, 0x54, 0xce, 0x62, 0x2b, 0xac, 0x73, 0x48, 0x5a, 0x24, 0x81, 0x51, 0xd9,
0xb0, 0xf7, 0xb2, 0xa9, 0xc2, 0x90, 0x9d, 0x0a, 0xc5, 0x7a, 0x1c, 0xc7, 0x98, 0xca, 0xf8, 0x3c, 0xb8, 0x0a, 0xef, 0xf7, 0x0e, 0x80, 0x4e, 0x4e, 0xb3, 0x8c, 0x8b, 0xd4, 0xea, 0x5c, 0x5d, 0x8f,
0x4c, 0xb2, 0x88, 0x1d, 0x31, 0x8c, 0x74, 0x35, 0xb4, 0x82, 0x5e, 0x69, 0x38, 0xb0, 0x7a, 0xf5, 0x57, 0x16, 0x5d, 0xf7, 0xbc, 0x74, 0xdd, 0x15, 0x0f, 0xd0, 0x69, 0x7a, 0xcc, 0x36, 0x6f, 0xbd,
0x80, 0x25, 0xf6, 0x17, 0x49, 0xf9, 0x9f, 0xe5, 0x40, 0x4c, 0xee, 0x50, 0xb5, 0x2a, 0xc4, 0xc6, 0xab, 0xdb, 0xde, 0x1f, 0x1c, 0xe8, 0xda, 0xd5, 0x99, 0x25, 0x2d, 0x44, 0xd9, 0xb9, 0x18, 0x65,
0x8f, 0x2a, 0x44, 0xf3, 0x6b, 0xa3, 0x1d, 0x2c, 0xe8, 0x54, 0x13, 0x35, 0xe5, 0x61, 0x13, 0xc7, 0x5d, 0xb0, 0x24, 0x19, 0x3f, 0x0f, 0x05, 0x7b, 0x53, 0xde, 0x5b, 0x60, 0x44, 0x43, 0xf6, 0x06,
0x5a, 0x30, 0xa7, 0x51, 0x3b, 0x8f, 0xf0, 0x88, 0x16, 0xf1, 0x3c, 0x5f, 0xd7, 0x0c, 0x5f, 0x5b, 0x15, 0x87, 0x69, 0x97, 0x64, 0xa7, 0xa2, 0xbc, 0xb7, 0x94, 0x1b, 0xb2, 0x53, 0xa1, 0x78, 0x94,
0xc3, 0xc2, 0xd3, 0x7b, 0x79, 0x97, 0x63, 0x84, 0xa9, 0x64, 0x34, 0xd6, 0x3f, 0x74, 0xd6, 0xa0, 0xe3, 0x18, 0x53, 0x19, 0x9f, 0x87, 0x49, 0x16, 0xb1, 0x43, 0x86, 0x91, 0xce, 0x86, 0x56, 0xd0,
0x55, 0x08, 0x95, 0x86, 0xc4, 0xec, 0xbc, 0x1d, 0x4c, 0x65, 0xf2, 0x09, 0x10, 0x4c, 0xc7, 0xfc, 0x2b, 0x15, 0xfb, 0x56, 0xae, 0xde, 0xf5, 0xc4, 0xfe, 0x1c, 0x95, 0xdf, 0x4f, 0xfb, 0x62, 0x72,
0x3c, 0x57, 0x15, 0x94, 0x53, 0x21, 0x4e, 0x33, 0x1e, 0xd9, 0xb7, 0xcf, 0xca, 0xd4, 0x72, 0x68, 0x8b, 0xac, 0x55, 0x2e, 0x36, 0x76, 0x54, 0x22, 0x9a, 0x1f, 0x9f, 0x76, 0xb0, 0x20, 0x53, 0xb5,
0x0d, 0xe4, 0x21, 0x34, 0x24, 0xa6, 0x34, 0x95, 0xf6, 0x8e, 0x59, 0xc9, 0x32, 0xbd, 0x28, 0x72, 0xe5, 0x94, 0xd9, 0x8d, 0x1f, 0x6b, 0xc1, 0x9c, 0x44, 0xad, 0x3c, 0xc2, 0x43, 0x5a, 0xc4, 0xf3,
0xe4, 0x36, 0xa6, 0x4d, 0x26, 0x86, 0x4a, 0x54, 0x2f, 0x27, 0x71, 0x4c, 0xb7, 0x3f, 0xff, 0x62, 0x37, 0x40, 0xcd, 0xdc, 0x00, 0x56, 0xb1, 0xf0, 0x23, 0xb1, 0xba, 0xc3, 0x31, 0xc2, 0x54, 0x32,
0xe6, 0xbe, 0x6e, 0x5e, 0x4e, 0x46, 0x5d, 0xfa, 0xf6, 0xf6, 0x60, 0x65, 0xc0, 0x84, 0x3c, 0xcc, 0x1a, 0xeb, 0x7f, 0xae, 0xfb, 0xd0, 0x2a, 0x84, 0x0a, 0x83, 0xad, 0x06, 0xda, 0xc1, 0xb4, 0x4f,
0x62, 0x36, 0x3e, 0xbf, 0x73, 0x1f, 0xe0, 0xfd, 0xde, 0x01, 0x32, 0xef, 0xc7, 0xfe, 0x78, 0x98, 0x3e, 0x05, 0x82, 0xe9, 0x98, 0x9f, 0xe7, 0x2a, 0x83, 0x72, 0x2a, 0xc4, 0x69, 0xc6, 0x23, 0xfb,
0x71, 0xbc, 0x73, 0x73, 0x8e, 0xff, 0x08, 0xba, 0xb9, 0x76, 0x13, 0xb2, 0xf4, 0x28, 0x2b, 0xb3, 0x24, 0x5c, 0x9f, 0x6a, 0x0e, 0xac, 0x82, 0xdc, 0x85, 0x86, 0xc4, 0x94, 0xa6, 0xd2, 0x9e, 0x31,
0xd7, 0x31, 0x3a, 0x15, 0x5b, 0xa1, 0xde, 0x7b, 0x2a, 0x98, 0x21, 0xcf, 0x62, 0x34, 0xc9, 0x6b, 0xdb, 0xb3, 0x77, 0x87, 0x28, 0x72, 0xe4, 0xd6, 0xa7, 0x4d, 0x26, 0x86, 0xaa, 0xab, 0x1e, 0x94,
0x07, 0x6d, 0xa5, 0x09, 0x94, 0xc2, 0x9b, 0xc0, 0xa3, 0xe1, 0x71, 0x76, 0xba, 0x9b, 0xa5, 0x47, 0xe2, 0x88, 0x6e, 0x7f, 0xf1, 0xe5, 0xcc, 0x7c, 0xdd, 0x3c, 0x28, 0x8d, 0xb8, 0xb4, 0xed, 0xed,
0x6c, 0x52, 0x98, 0x0f, 0xd9, 0x7b, 0x3c, 0xa0, 0x5d, 0x68, 0xe6, 0x54, 0xaa, 0x3b, 0x65, 0x73, 0xc2, 0xfa, 0x80, 0x09, 0x79, 0x90, 0xc5, 0x6c, 0x7c, 0x7e, 0xeb, 0xca, 0xc2, 0xfb, 0x9d, 0x03,
0x54, 0x8a, 0xde, 0x9f, 0x1c, 0x58, 0xbb, 0x6a, 0xa5, 0xf7, 0x39, 0xfe, 0x3e, 0x2c, 0x8d, 0x8d, 0x64, 0xde, 0x8e, 0xfd, 0x8f, 0x99, 0xdd, 0x1a, 0xce, 0xf5, 0x6f, 0x8d, 0x8f, 0xa1, 0x9b, 0x6b,
0x3b, 0xe3, 0xed, 0xe6, 0x3f, 0xe6, 0x16, 0xe7, 0x79, 0x7b, 0x50, 0x53, 0x9f, 0x6b, 0xb2, 0x05, 0x33, 0x21, 0x4b, 0x0f, 0xb3, 0x32, 0x7a, 0x1d, 0x23, 0x53, 0xbe, 0x15, 0xea, 0x19, 0xac, 0x9c,
0x15, 0x2e, 0xf5, 0x0e, 0x96, 0xb7, 0xd7, 0xdf, 0xc1, 0x14, 0x0a, 0xa8, 0x5f, 0x5b, 0x15, 0x2e, 0x19, 0xf2, 0x2c, 0x46, 0x13, 0xbc, 0x76, 0xd0, 0x56, 0x92, 0x40, 0x09, 0xbc, 0x09, 0xdc, 0x1b,
0x49, 0x17, 0x1c, 0xae, 0x4f, 0xea, 0x04, 0x0e, 0xff, 0xf8, 0x6f, 0x0e, 0xb4, 0x4a, 0x33, 0x59, 0x1e, 0x65, 0xa7, 0x3b, 0x59, 0x7a, 0xc8, 0x26, 0x85, 0xb9, 0x1a, 0xdf, 0xe3, 0x5f, 0xc1, 0x85,
0x81, 0x25, 0xdf, 0x1f, 0xec, 0x4e, 0xb9, 0xaa, 0xf7, 0x3d, 0xd2, 0x83, 0xae, 0xef, 0x0f, 0x0e, 0x66, 0x4e, 0xa5, 0x3a, 0x53, 0x36, 0x46, 0x65, 0xd7, 0xfb, 0xa3, 0x03, 0xf7, 0x97, 0xcd, 0xf4,
0xcb, 0x1e, 0xad, 0xe7, 0x90, 0x2e, 0xb4, 0x7c, 0x7f, 0xa0, 0xc9, 0xa7, 0x57, 0xb1, 0xd2, 0x97, 0x3e, 0xdb, 0xdf, 0x83, 0x95, 0xb1, 0x31, 0x67, 0xac, 0x5d, 0xff, 0xbf, 0x72, 0x71, 0x9c, 0xb7,
0x71, 0x21, 0x8e, 0x7b, 0xd5, 0xa9, 0x83, 0x24, 0xa7, 0xc6, 0x41, 0x8d, 0x2c, 0x41, 0xdb, 0x3f, 0x0b, 0x35, 0x55, 0x00, 0x90, 0x27, 0x50, 0xe1, 0x52, 0xaf, 0x60, 0x75, 0xfb, 0xd1, 0x3b, 0x98,
0x18, 0xf4, 0x53, 0x81, 0x5c, 0xf6, 0xea, 0x56, 0xf4, 0x31, 0x46, 0x89, 0xbd, 0x06, 0xb9, 0x07, 0x42, 0x01, 0xf5, 0x23, 0xb4, 0xc2, 0x25, 0xe9, 0x82, 0xc3, 0xf5, 0x4e, 0x9d, 0xc0, 0xe1, 0x9f,
0x1d, 0xff, 0x60, 0xb0, 0x53, 0xc4, 0xaf, 0xd5, 0x77, 0xac, 0xd7, 0xd4, 0xf6, 0x97, 0x03, 0xd3, 0xfc, 0xc5, 0x81, 0x56, 0xa9, 0x26, 0xeb, 0xb0, 0xe2, 0xfb, 0x83, 0x9d, 0x29, 0x57, 0xf5, 0xbe,
0x71, 0xf7, 0x5a, 0xda, 0xfd, 0xcb, 0x81, 0x7a, 0x03, 0x9c, 0xf7, 0xda, 0x3b, 0xcf, 0x7e, 0xf3, 0x43, 0x7a, 0xd0, 0xf5, 0xfd, 0xc1, 0x41, 0x59, 0xf5, 0xf5, 0x1c, 0xd2, 0x85, 0x96, 0xef, 0x0f,
0xf9, 0x84, 0xc9, 0xe3, 0x62, 0xa4, 0x02, 0xb4, 0x65, 0xce, 0xfa, 0x09, 0xcb, 0xec, 0x68, 0xab, 0x34, 0xf9, 0xf4, 0x2a, 0xb6, 0xf7, 0x55, 0x5c, 0x88, 0xa3, 0x5e, 0x75, 0x6a, 0x20, 0xc9, 0xa9,
0x3c, 0xef, 0x96, 0x3e, 0xfe, 0x54, 0xcc, 0x47, 0xa3, 0x86, 0xd6, 0x7c, 0xf6, 0x9f, 0x00, 0x00, 0x31, 0x50, 0x23, 0x2b, 0xd0, 0xf6, 0xf7, 0x07, 0xfd, 0x54, 0x20, 0x97, 0xbd, 0xba, 0xed, 0xfa,
0x00, 0xff, 0xff, 0x56, 0x6c, 0x12, 0x3b, 0x2a, 0x16, 0x00, 0x00, 0x18, 0xa3, 0xc4, 0x5e, 0x83, 0xac, 0x41, 0xc7, 0xdf, 0x1f, 0x3c, 0x2f, 0xe2, 0xd7, 0xea, 0x1e,
0xeb, 0x35, 0xb5, 0xfe, 0xe5, 0xc0, 0x3c, 0x44, 0x7a, 0x2d, 0x6d, 0xfe, 0xe5, 0x40, 0x3d, 0x8d,
0xce, 0x7b, 0xed, 0xe7, 0x4f, 0x7f, 0xfd, 0xc5, 0x84, 0xc9, 0xa3, 0x62, 0xa4, 0x1c, 0xf4, 0xc4,
0xec, 0xf5, 0x53, 0x96, 0xd9, 0xd6, 0x93, 0x72, 0xbf, 0x4f, 0xf4, 0xf6, 0xa7, 0xdd, 0x7c, 0x34,
0x6a, 0x68, 0xc9, 0xe7, 0xff, 0x0a, 0x00, 0x00, 0xff, 0xff, 0x70, 0x7b, 0x95, 0x84, 0x41, 0x17,
0x00, 0x00,
} }

View File

@ -264,7 +264,7 @@ func (sd *shardDelegator) Query(ctx context.Context, req *querypb.QueryRequest)
} }
if !funcutil.SliceContain(req.GetDmlChannels(), sd.vchannelName) { if !funcutil.SliceContain(req.GetDmlChannels(), sd.vchannelName) {
log.Warn("deletgator received query request not belongs to it", log.Warn("delegator received query request not belongs to it",
zap.Strings("reqChannels", req.GetDmlChannels()), zap.Strings("reqChannels", req.GetDmlChannels()),
) )
return nil, fmt.Errorf("dml channel not match, delegator channel %s, search channels %v", sd.vchannelName, req.GetDmlChannels()) return nil, fmt.Errorf("dml channel not match, delegator channel %s, search channels %v", sd.vchannelName, req.GetDmlChannels())

View File

@ -22,6 +22,7 @@ import (
"math" "math"
"github.com/golang/protobuf/proto" "github.com/golang/protobuf/proto"
"github.com/samber/lo"
"go.uber.org/zap" "go.uber.org/zap"
"github.com/milvus-io/milvus-proto/go-api/v2/commonpb" "github.com/milvus-io/milvus-proto/go-api/v2/commonpb"
@ -66,6 +67,14 @@ func ReduceSearchResults(ctx context.Context, results []*internalpb.SearchResult
return nil, err return nil, err
} }
requestCosts := lo.FilterMap(results, func(result *internalpb.SearchResults, _ int) (*internalpb.CostAggregation, bool) {
if result.CostAggregation == nil {
return nil, false
}
return result.CostAggregation, true
})
searchResults.CostAggregation = mergeRequestCost(requestCosts)
return searchResults, nil return searchResults, nil
} }
@ -274,6 +283,14 @@ func MergeInternalRetrieveResult(ctx context.Context, retrieveResults []*interna
log.Debug("skip duplicated query result while reducing internal.RetrieveResults", zap.Int64("dupCount", skipDupCnt)) log.Debug("skip duplicated query result while reducing internal.RetrieveResults", zap.Int64("dupCount", skipDupCnt))
} }
requestCosts := lo.FilterMap(retrieveResults, func(result *internalpb.RetrieveResults, _ int) (*internalpb.CostAggregation, bool) {
if result.CostAggregation == nil {
return nil, false
}
return result.CostAggregation, true
})
ret.CostAggregation = mergeRequestCost(requestCosts)
return ret, nil return ret, nil
} }

View File

@ -22,6 +22,7 @@ import (
"sort" "sort"
"testing" "testing"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/suite" "github.com/stretchr/testify/suite"
"github.com/milvus-io/milvus-proto/go-api/v2/schemapb" "github.com/milvus-io/milvus-proto/go-api/v2/schemapb"
@ -574,6 +575,39 @@ func (suite *ResultSuite) TestSort() {
suite.Equal([]byte{2, 3, 4, 5, 6, 7, 8, 9}, result.FieldsData[7].GetVectors().GetBinaryVector()) suite.Equal([]byte{2, 3, 4, 5, 6, 7, 8, 9}, result.FieldsData[7].GetVectors().GetBinaryVector())
} }
func TestResult_MergeRequestCost(t *testing.T) {
costs := []*internalpb.CostAggregation{
{
ResponseTime: 11,
ServiceTime: 12,
TotalNQ: 13,
},
{
ResponseTime: 21,
ServiceTime: 22,
TotalNQ: 23,
},
{
ResponseTime: 31,
ServiceTime: 32,
TotalNQ: 33,
},
{
ResponseTime: 41,
ServiceTime: 42,
TotalNQ: 43,
},
}
channelCost := mergeRequestCost(costs)
assert.Equal(t, int64(41), channelCost.ResponseTime)
assert.Equal(t, int64(42), channelCost.ServiceTime)
assert.Equal(t, int64(43), channelCost.TotalNQ)
}
func TestResult(t *testing.T) { func TestResult(t *testing.T) {
suite.Run(t, new(ResultSuite)) suite.Run(t, new(ResultSuite))
} }

View File

@ -12,6 +12,7 @@ import (
"go.uber.org/zap" "go.uber.org/zap"
"github.com/milvus-io/milvus-proto/go-api/v2/schemapb" "github.com/milvus-io/milvus-proto/go-api/v2/schemapb"
"github.com/milvus-io/milvus/internal/proto/internalpb"
"github.com/milvus-io/milvus/internal/storage" "github.com/milvus-io/milvus/internal/storage"
"github.com/milvus-io/milvus/pkg/common" "github.com/milvus-io/milvus/pkg/common"
"github.com/milvus-io/milvus/pkg/log" "github.com/milvus-io/milvus/pkg/log"
@ -282,3 +283,16 @@ func fillFieldData(ctx context.Context, vcm storage.ChunkManager, dataPath strin
return fmt.Errorf("invalid data type: %s", fieldData.Type.String()) return fmt.Errorf("invalid data type: %s", fieldData.Type.String())
} }
} }
// mergeRequestCost merge the costs of request, the cost may came from different worker in same channel
// or different channel in same collection, for now we just choose the part with the highest response time
func mergeRequestCost(requestCosts []*internalpb.CostAggregation) *internalpb.CostAggregation {
var result *internalpb.CostAggregation
for _, cost := range requestCosts {
if result == nil || result.ResponseTime < cost.ResponseTime {
result = cost
}
}
return result
}

View File

@ -701,29 +701,29 @@ func (node *QueryNode) SearchSegments(ctx context.Context, req *querypb.SearchRe
searchCtx, cancel := context.WithCancel(ctx) searchCtx, cancel := context.WithCancel(ctx)
defer cancel() defer cancel()
tr := timerecord.NewTimeRecorder("searchChannel") tr := timerecord.NewTimeRecorder("searchSegments")
log.Debug("search channel...") log.Debug("search segments...")
collection := node.manager.Collection.Get(req.Req.GetCollectionID()) collection := node.manager.Collection.Get(req.Req.GetCollectionID())
if collection == nil { if collection == nil {
log.Warn("failed to search channel", zap.Error(segments.ErrCollectionNotFound)) log.Warn("failed to search segments", zap.Error(segments.ErrCollectionNotFound))
return nil, segments.WrapCollectionNotFound(req.GetReq().GetCollectionID()) return nil, segments.WrapCollectionNotFound(req.GetReq().GetCollectionID())
} }
task := tasks.NewSearchTask(searchCtx, collection, node.manager, req) task := tasks.NewSearchTask(searchCtx, collection, node.manager, req)
if !node.scheduler.Add(task) { if !node.scheduler.Add(task) {
err := merr.WrapErrTaskQueueFull() err := merr.WrapErrTaskQueueFull()
log.Warn("failed to search channel", zap.Error(err)) log.Warn("failed to search segments", zap.Error(err))
return nil, err return nil, err
} }
err := task.Wait() err := task.Wait()
if err != nil { if err != nil {
log.Warn("failed to search channel", zap.Error(err)) log.Warn("failed to search segments", zap.Error(err))
return nil, err return nil, err
} }
tr.CtxElapse(ctx, fmt.Sprintf("search channel done, channel = %s, segmentIDs = %v", tr.CtxElapse(ctx, fmt.Sprintf("search segments done, channel = %s, segmentIDs = %v",
channel, channel,
req.GetSegmentIDs(), req.GetSegmentIDs(),
)) ))
@ -732,7 +732,13 @@ func (node *QueryNode) SearchSegments(ctx context.Context, req *querypb.SearchRe
latency := tr.ElapseSpan() latency := tr.ElapseSpan()
metrics.QueryNodeSQReqLatency.WithLabelValues(fmt.Sprint(paramtable.GetNodeID()), metrics.SearchLabel, metrics.FromLeader).Observe(float64(latency.Milliseconds())) metrics.QueryNodeSQReqLatency.WithLabelValues(fmt.Sprint(paramtable.GetNodeID()), metrics.SearchLabel, metrics.FromLeader).Observe(float64(latency.Milliseconds()))
metrics.QueryNodeSQCount.WithLabelValues(fmt.Sprint(paramtable.GetNodeID()), metrics.SearchLabel, metrics.SuccessLabel).Inc() metrics.QueryNodeSQCount.WithLabelValues(fmt.Sprint(paramtable.GetNodeID()), metrics.SearchLabel, metrics.SuccessLabel).Inc()
return task.Result(), nil
result := task.Result()
if result.CostAggregation != nil {
// update channel's response time
result.CostAggregation.ResponseTime = int64(latency)
}
return result, nil
} }
// Search performs replica search tasks. // Search performs replica search tasks.
@ -813,7 +819,6 @@ func (node *QueryNode) Search(ctx context.Context, req *querypb.SearchRequest) (
} }
runningGp.Go(func() error { runningGp.Go(func() error {
ret, err := node.searchChannel(runningCtx, req, ch) ret, err := node.searchChannel(runningCtx, req, ch)
mu.Lock() mu.Lock()
defer mu.Unlock() defer mu.Unlock()
@ -835,24 +840,27 @@ func (node *QueryNode) Search(ctx context.Context, req *querypb.SearchRequest) (
} }
tr := timerecord.NewTimeRecorderWithTrace(ctx, "searchRequestReduce") tr := timerecord.NewTimeRecorderWithTrace(ctx, "searchRequestReduce")
ret, err := segments.ReduceSearchResults(ctx, toReduceResults, req.Req.GetNq(), req.Req.GetTopk(), req.Req.GetMetricType()) result, err := segments.ReduceSearchResults(ctx, toReduceResults, req.Req.GetNq(), req.Req.GetTopk(), req.Req.GetMetricType())
if err != nil { if err != nil {
log.Warn("failed to reduce search results", zap.Error(err)) log.Warn("failed to reduce search results", zap.Error(err))
failRet.Status.ErrorCode = commonpb.ErrorCode_UnexpectedError failRet.Status.ErrorCode = commonpb.ErrorCode_UnexpectedError
failRet.Status.Reason = err.Error() failRet.Status.Reason = err.Error()
return failRet, nil return failRet, nil
} }
metrics.QueryNodeReduceLatency.WithLabelValues( metrics.QueryNodeReduceLatency.WithLabelValues(fmt.Sprint(paramtable.GetNodeID()), metrics.SearchLabel).
fmt.Sprint(paramtable.GetNodeID()),
metrics.SearchLabel).
Observe(float64(tr.ElapseSpan().Milliseconds())) Observe(float64(tr.ElapseSpan().Milliseconds()))
if !req.FromShardLeader {
collector.Rate.Add(metricsinfo.NQPerSecond, float64(req.GetReq().GetNq())) collector.Rate.Add(metricsinfo.NQPerSecond, float64(req.GetReq().GetNq()))
collector.Rate.Add(metricsinfo.SearchThroughput, float64(proto.Size(req))) collector.Rate.Add(metricsinfo.SearchThroughput, float64(proto.Size(req)))
metrics.QueryNodeExecuteCounter.WithLabelValues(strconv.FormatInt(paramtable.GetNodeID(), 10), metrics.SearchLabel).Add(float64(proto.Size(req))) metrics.QueryNodeExecuteCounter.WithLabelValues(strconv.FormatInt(paramtable.GetNodeID(), 10), metrics.SearchLabel).
Add(float64(proto.Size(req)))
if result.CostAggregation != nil {
// update channel's response time
currentTotalNQ := node.scheduler.GetWaitingTaskTotalNQ()
result.CostAggregation.TotalNQ = currentTotalNQ
} }
return ret, nil return result, nil
} }
// only used for delegator query segments from worker // only used for delegator query segments from worker
@ -882,7 +890,7 @@ func (node *QueryNode) QuerySegments(ctx context.Context, req *querypb.QueryRequ
} }
defer node.lifetime.Done() defer node.lifetime.Done()
log.Debug("start do query with channel", log.Debug("start do query segments",
zap.Bool("fromShardLeader", req.GetFromShardLeader()), zap.Bool("fromShardLeader", req.GetFromShardLeader()),
zap.Int64s("segmentIDs", req.GetSegmentIDs()), zap.Int64s("segmentIDs", req.GetSegmentIDs()),
) )
@ -890,7 +898,7 @@ func (node *QueryNode) QuerySegments(ctx context.Context, req *querypb.QueryRequ
queryCtx, cancel := context.WithCancel(ctx) queryCtx, cancel := context.WithCancel(ctx)
defer cancel() defer cancel()
tr := timerecord.NewTimeRecorder("queryChannel") tr := timerecord.NewTimeRecorder("querySegments")
results, err := node.querySegments(queryCtx, req) results, err := node.querySegments(queryCtx, req)
if err != nil { if err != nil {
log.Warn("failed to query channel", zap.Error(err)) log.Warn("failed to query channel", zap.Error(err))
@ -910,6 +918,11 @@ func (node *QueryNode) QuerySegments(ctx context.Context, req *querypb.QueryRequ
latency := tr.ElapseSpan() latency := tr.ElapseSpan()
metrics.QueryNodeSQReqLatency.WithLabelValues(fmt.Sprint(paramtable.GetNodeID()), metrics.QueryLabel, metrics.FromLeader).Observe(float64(latency.Milliseconds())) metrics.QueryNodeSQReqLatency.WithLabelValues(fmt.Sprint(paramtable.GetNodeID()), metrics.QueryLabel, metrics.FromLeader).Observe(float64(latency.Milliseconds()))
metrics.QueryNodeSQCount.WithLabelValues(fmt.Sprint(paramtable.GetNodeID()), metrics.QueryLabel, metrics.SuccessLabel).Inc() metrics.QueryNodeSQCount.WithLabelValues(fmt.Sprint(paramtable.GetNodeID()), metrics.QueryLabel, metrics.SuccessLabel).Inc()
results.CostAggregation = &internalpb.CostAggregation{
ServiceTime: latency.Milliseconds(),
ResponseTime: latency.Milliseconds(),
TotalNQ: 0,
}
return results, nil return results, nil
} }

View File

@ -9,6 +9,7 @@ import (
"github.com/milvus-io/milvus/pkg/util/conc" "github.com/milvus-io/milvus/pkg/util/conc"
"github.com/milvus-io/milvus/pkg/util/metricsinfo" "github.com/milvus-io/milvus/pkg/util/metricsinfo"
"github.com/milvus-io/milvus/pkg/util/paramtable" "github.com/milvus-io/milvus/pkg/util/paramtable"
"go.uber.org/atomic"
) )
const ( const (
@ -20,10 +21,8 @@ type Scheduler struct {
mergingSearchTasks []*SearchTask mergingSearchTasks []*SearchTask
mergedSearchTasks chan *SearchTask mergedSearchTasks chan *SearchTask
queryProcessQueue chan *QueryTask
queryWaitQueue chan *QueryTask
pool *conc.Pool[any] pool *conc.Pool[any]
waitingTaskTotalNQ atomic.Int64
} }
func NewScheduler() *Scheduler { func NewScheduler() *Scheduler {
@ -33,9 +32,9 @@ func NewScheduler() *Scheduler {
searchWaitQueue: make(chan *SearchTask, maxWaitTaskNum), searchWaitQueue: make(chan *SearchTask, maxWaitTaskNum),
mergingSearchTasks: make([]*SearchTask, 0), mergingSearchTasks: make([]*SearchTask, 0),
mergedSearchTasks: make(chan *SearchTask), mergedSearchTasks: make(chan *SearchTask),
// queryProcessQueue: make(chan),
pool: conc.NewPool[any](maxReadConcurrency, conc.WithPreAlloc(true)), pool: conc.NewPool[any](maxReadConcurrency, conc.WithPreAlloc(true)),
waitingTaskTotalNQ: *atomic.NewInt64(0),
} }
} }
@ -46,6 +45,7 @@ func (s *Scheduler) Add(task Task) bool {
select { select {
case s.searchWaitQueue <- t: case s.searchWaitQueue <- t:
collector.Counter.Inc(metricsinfo.ReadyQueueType, 1) collector.Counter.Inc(metricsinfo.ReadyQueueType, 1)
s.waitingTaskTotalNQ.Add(t.nq)
metrics.QueryNodeReadTaskUnsolveLen.WithLabelValues(fmt.Sprint(paramtable.GetNodeID())).Inc() metrics.QueryNodeReadTaskUnsolveLen.WithLabelValues(fmt.Sprint(paramtable.GetNodeID())).Inc()
default: default:
return false return false
@ -165,6 +165,11 @@ func (s *Scheduler) process(t Task) {
metrics.QueryNodeReadTaskConcurrency.WithLabelValues(fmt.Sprint(paramtable.GetNodeID())).Dec() metrics.QueryNodeReadTaskConcurrency.WithLabelValues(fmt.Sprint(paramtable.GetNodeID())).Dec()
return nil, err return nil, err
}) })
switch t := t.(type) {
case *SearchTask:
s.waitingTaskTotalNQ.Sub(t.nq)
}
} }
// mergeTasks merge the given task with one of merged tasks, // mergeTasks merge the given task with one of merged tasks,
@ -174,6 +179,7 @@ func (s *Scheduler) mergeTasks(t Task) {
merged := false merged := false
for _, task := range s.mergingSearchTasks { for _, task := range s.mergingSearchTasks {
if task.Merge(t) { if task.Merge(t) {
s.waitingTaskTotalNQ.Sub(t.nq)
merged = true merged = true
break break
} }
@ -183,3 +189,7 @@ func (s *Scheduler) mergeTasks(t Task) {
} }
} }
} }
func (s *Scheduler) GetWaitingTaskTotalNQ() int64 {
return s.waitingTaskTotalNQ.Load()
}

View File

@ -63,7 +63,6 @@ func NewSearchTask(ctx context.Context,
originTopks: []int64{req.GetReq().GetTopk()}, originTopks: []int64{req.GetReq().GetTopk()},
originNqs: []int64{req.GetReq().GetNq()}, originNqs: []int64{req.GetReq().GetNq()},
notifier: make(chan error, 1), notifier: make(chan error, 1),
tr: timerecord.NewTimeRecorderWithTrace(ctx, "searchTask"), tr: timerecord.NewTimeRecorderWithTrace(ctx, "searchTask"),
} }
} }
@ -86,6 +85,8 @@ func (t *SearchTask) Execute() error {
zap.String("shard", t.req.GetDmlChannels()[0]), zap.String("shard", t.req.GetDmlChannels()[0]),
) )
executeRecord := timerecord.NewTimeRecorderWithTrace(t.ctx, "searchTaskExecute")
req := t.req req := t.req
t.combinePlaceHolderGroups() t.combinePlaceHolderGroups()
searchReq, err := segments.NewSearchRequest(t.collection, req, t.placeholderGroup) searchReq, err := segments.NewSearchRequest(t.collection, req, t.placeholderGroup)
@ -135,12 +136,15 @@ func (t *SearchTask) Execute() error {
TopK: t.originTopks[i], TopK: t.originTopks[i],
SlicedOffset: 1, SlicedOffset: 1,
SlicedNumCount: 1, SlicedNumCount: 1,
CostAggregation: &internalpb.CostAggregation{
ServiceTime: executeRecord.ElapseSpan().Milliseconds(),
},
} }
} }
return nil return nil
} }
tr := timerecord.NewTimeRecorderWithTrace(t.ctx, "searchTaskReduce") reduceRecord := timerecord.NewTimeRecorderWithTrace(t.ctx, "searchTaskReduce")
blobs, err := segments.ReduceSearchResultsAndFillData( blobs, err := segments.ReduceSearchResultsAndFillData(
searchReq.Plan(), searchReq.Plan(),
results, results,
@ -174,7 +178,7 @@ func (t *SearchTask) Execute() error {
metrics.QueryNodeReduceLatency.WithLabelValues( metrics.QueryNodeReduceLatency.WithLabelValues(
fmt.Sprint(paramtable.GetNodeID()), fmt.Sprint(paramtable.GetNodeID()),
metrics.SearchLabel). metrics.SearchLabel).
Observe(float64(tr.ElapseSpan().Milliseconds())) Observe(float64(reduceRecord.ElapseSpan().Milliseconds()))
task.result = &internalpb.SearchResults{ task.result = &internalpb.SearchResults{
Status: util.WrapStatus(commonpb.ErrorCode_Success, ""), Status: util.WrapStatus(commonpb.ErrorCode_Success, ""),
@ -184,6 +188,9 @@ func (t *SearchTask) Execute() error {
SlicedBlob: bs, SlicedBlob: bs,
SlicedOffset: 1, SlicedOffset: 1,
SlicedNumCount: 1, SlicedNumCount: 1,
CostAggregation: &internalpb.CostAggregation{
ServiceTime: executeRecord.ElapseSpan().Milliseconds(),
},
} }
} }
return nil return nil