mirror of https://github.com/milvus-io/milvus.git
Add DataQueryable and DataIndexed states for bulk load tasks (#16725)
issue: #16607 /kind enhancement Signed-off-by: Yuchen Gao <yuchen.gao@zilliz.com>pull/16810/head
parent
c82e2453eb
commit
1acd256481
|
@ -90,11 +90,19 @@ rootCoord:
|
|||
# seconds (24 hours).
|
||||
# Note: If default value is to be changed, change also the default in: internal/util/paramtable/component_param.go
|
||||
importTaskRetention: 86400
|
||||
# (in seconds) During index building phase of an import task, Milvus will check the building status of a task's
|
||||
# segments' indices every `importIndexCheckInterval` seconds. Default 300 seconds (5 minutes).
|
||||
# (in seconds) Check an import task's segment loading state in queryNodes every `importSegmentStateCheckInterval`
|
||||
# seconds. Default 10 seconds.
|
||||
# Note: If default value is to be changed, change also the default in: internal/util/paramtable/component_param.go
|
||||
importSegmentStateCheckInterval: 10
|
||||
# (in seconds) Maximum time to wait for segments in a single import task to be loaded in queryNodes.
|
||||
# Default 60 seconds (1 minute).
|
||||
# Note: If default value is to be changed, change also the default in: internal/util/paramtable/component_param.go
|
||||
importSegmentStateWaitLimit: 60
|
||||
# (in seconds) Check the building status of a task's segments' indices every `importIndexCheckInterval` seconds.
|
||||
# Default 300 seconds (5 minutes).
|
||||
# Note: If default value is to be changed, change also the default in: internal/util/paramtable/component_param.go
|
||||
importIndexCheckInterval: 300
|
||||
# (in seconds) Maximum time to wait before pushing flushed segments online (make them searchable) during importing.
|
||||
# (in seconds) Maximum time to wait for indices to be built on a single import task's segments.
|
||||
# Default 1200 seconds (20 minutes).
|
||||
# Note: If default value is to be changed, change also the default in: internal/util/paramtable/component_param.go
|
||||
importIndexWaitLimit: 1200
|
||||
|
|
|
@ -329,13 +329,14 @@ const char descriptor_table_protodef_common_2eproto[] PROTOBUF_SECTION_VARIABLE(
|
|||
"State\022\021\n\rUndefiedState\020\000\022\r\n\tExecuting\020\001\022"
|
||||
"\r\n\tCompleted\020\002*X\n\020ConsistencyLevel\022\n\n\006St"
|
||||
"rong\020\000\022\013\n\007Session\020\001\022\013\n\007Bounded\020\002\022\016\n\nEven"
|
||||
"tually\020\003\022\016\n\nCustomized\020\004*\227\001\n\013ImportState"
|
||||
"tually\020\003\022\016\n\nCustomized\020\004*\273\001\n\013ImportState"
|
||||
"\022\021\n\rImportPending\020\000\022\020\n\014ImportFailed\020\001\022\021\n"
|
||||
"\rImportStarted\020\002\022\024\n\020ImportDownloaded\020\003\022\020"
|
||||
"\n\014ImportParsed\020\004\022\023\n\017ImportPersisted\020\005\022\023\n"
|
||||
"\017ImportCompleted\020\006BW\n\016io.milvus.grpcB\013Co"
|
||||
"mmonProtoP\001Z3github.com/milvus-io/milvus"
|
||||
"/internal/proto/commonpb\240\001\001b\006proto3"
|
||||
"\n\014ImportParsed\020\004\022\023\n\017ImportPersisted\020\005\022\021\n"
|
||||
"\rDataQueryable\020\006\022\017\n\013DataIndexed\020\007\022\023\n\017Imp"
|
||||
"ortCompleted\020\010BW\n\016io.milvus.grpcB\013Common"
|
||||
"ProtoP\001Z3github.com/milvus-io/milvus/int"
|
||||
"ernal/proto/commonpb\240\001\001b\006proto3"
|
||||
;
|
||||
static const ::PROTOBUF_NAMESPACE_ID::internal::DescriptorTable*const descriptor_table_common_2eproto_deps[1] = {
|
||||
};
|
||||
|
@ -352,7 +353,7 @@ static ::PROTOBUF_NAMESPACE_ID::internal::SCCInfoBase*const descriptor_table_com
|
|||
static ::PROTOBUF_NAMESPACE_ID::internal::once_flag descriptor_table_common_2eproto_once;
|
||||
static bool descriptor_table_common_2eproto_initialized = false;
|
||||
const ::PROTOBUF_NAMESPACE_ID::internal::DescriptorTable descriptor_table_common_2eproto = {
|
||||
&descriptor_table_common_2eproto_initialized, descriptor_table_protodef_common_2eproto, "common.proto", 3315,
|
||||
&descriptor_table_common_2eproto_initialized, descriptor_table_protodef_common_2eproto, "common.proto", 3351,
|
||||
&descriptor_table_common_2eproto_once, descriptor_table_common_2eproto_sccs, descriptor_table_common_2eproto_deps, 8, 0,
|
||||
schemas, file_default_instances, TableStruct_common_2eproto::offsets,
|
||||
file_level_metadata_common_2eproto, 8, file_level_enum_descriptors_common_2eproto, file_level_service_descriptors_common_2eproto,
|
||||
|
@ -583,6 +584,8 @@ bool ImportState_IsValid(int value) {
|
|||
case 4:
|
||||
case 5:
|
||||
case 6:
|
||||
case 7:
|
||||
case 8:
|
||||
return true;
|
||||
default:
|
||||
return false;
|
||||
|
|
|
@ -390,7 +390,9 @@ enum ImportState : int {
|
|||
ImportDownloaded = 3,
|
||||
ImportParsed = 4,
|
||||
ImportPersisted = 5,
|
||||
ImportCompleted = 6,
|
||||
DataQueryable = 6,
|
||||
DataIndexed = 7,
|
||||
ImportCompleted = 8,
|
||||
ImportState_INT_MIN_SENTINEL_DO_NOT_USE_ = std::numeric_limits<::PROTOBUF_NAMESPACE_ID::int32>::min(),
|
||||
ImportState_INT_MAX_SENTINEL_DO_NOT_USE_ = std::numeric_limits<::PROTOBUF_NAMESPACE_ID::int32>::max()
|
||||
};
|
||||
|
|
|
@ -175,10 +175,6 @@ func TestGrpcService(t *testing.T) {
|
|||
return ret, nil
|
||||
}
|
||||
|
||||
core.CallUpdateSegmentStateService = func(ctx context.Context, segID typeutil.UniqueID, ss commonpb.SegmentState) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
var binlogLock sync.Mutex
|
||||
binlogPathArray := make([]string, 0, 16)
|
||||
core.CallBuildIndexService = func(ctx context.Context, binlog []string, field *schemapb.FieldSchema, idxInfo *etcdpb.IndexInfo, numRows int64) (typeutil.UniqueID, error) {
|
||||
|
|
|
@ -222,5 +222,7 @@ enum ImportState {
|
|||
ImportDownloaded = 3;
|
||||
ImportParsed = 4;
|
||||
ImportPersisted = 5;
|
||||
ImportCompleted = 6;
|
||||
DataQueryable = 6;
|
||||
DataIndexed = 7;
|
||||
ImportCompleted = 8;
|
||||
}
|
||||
|
|
|
@ -541,7 +541,9 @@ const (
|
|||
ImportState_ImportDownloaded ImportState = 3
|
||||
ImportState_ImportParsed ImportState = 4
|
||||
ImportState_ImportPersisted ImportState = 5
|
||||
ImportState_ImportCompleted ImportState = 6
|
||||
ImportState_DataQueryable ImportState = 6
|
||||
ImportState_DataIndexed ImportState = 7
|
||||
ImportState_ImportCompleted ImportState = 8
|
||||
)
|
||||
|
||||
var ImportState_name = map[int32]string{
|
||||
|
@ -551,7 +553,9 @@ var ImportState_name = map[int32]string{
|
|||
3: "ImportDownloaded",
|
||||
4: "ImportParsed",
|
||||
5: "ImportPersisted",
|
||||
6: "ImportCompleted",
|
||||
6: "DataQueryable",
|
||||
7: "DataIndexed",
|
||||
8: "ImportCompleted",
|
||||
}
|
||||
|
||||
var ImportState_value = map[string]int32{
|
||||
|
@ -561,7 +565,9 @@ var ImportState_value = map[string]int32{
|
|||
"ImportDownloaded": 3,
|
||||
"ImportParsed": 4,
|
||||
"ImportPersisted": 5,
|
||||
"ImportCompleted": 6,
|
||||
"DataQueryable": 6,
|
||||
"DataIndexed": 7,
|
||||
"ImportCompleted": 8,
|
||||
}
|
||||
|
||||
func (x ImportState) String() string {
|
||||
|
@ -972,115 +978,116 @@ func init() {
|
|||
func init() { proto.RegisterFile("common.proto", fileDescriptor_555bd8c177793206) }
|
||||
|
||||
var fileDescriptor_555bd8c177793206 = []byte{
|
||||
// 1747 bytes of a gzipped FileDescriptorProto
|
||||
// 1767 bytes of a gzipped FileDescriptorProto
|
||||
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x56, 0x4b, 0x73, 0x1c, 0xb7,
|
||||
0x11, 0xe6, 0xec, 0x2e, 0xb9, 0x5a, 0x2c, 0x1f, 0x10, 0xf8, 0x10, 0x2d, 0xd1, 0x8e, 0xc2, 0x93,
|
||||
0x8a, 0x55, 0x96, 0x92, 0xa8, 0x2a, 0x39, 0xf9, 0x40, 0xee, 0x90, 0xd4, 0x96, 0x48, 0x8a, 0xd9,
|
||||
0x25, 0x65, 0x57, 0x0e, 0x51, 0x81, 0x33, 0xcd, 0x5d, 0x44, 0x18, 0x60, 0x02, 0x60, 0x28, 0x6e,
|
||||
0x4e, 0x8e, 0xf3, 0x07, 0x12, 0x5f, 0x72, 0xcd, 0x0f, 0x48, 0x52, 0x79, 0x27, 0x3f, 0x21, 0xef,
|
||||
0x73, 0x9c, 0xf7, 0x31, 0x3f, 0x20, 0x4f, 0x3f, 0xe4, 0x54, 0x63, 0x66, 0x67, 0x46, 0x92, 0x7d,
|
||||
0xf2, 0x0d, 0xfd, 0x75, 0xe3, 0x43, 0xa3, 0xbb, 0xd1, 0x0d, 0x32, 0x1f, 0xe9, 0x24, 0xd1, 0xea,
|
||||
0x76, 0x6a, 0xb4, 0xd3, 0x6c, 0x39, 0x11, 0xf2, 0x22, 0xb3, 0xb9, 0x74, 0x3b, 0x57, 0x6d, 0x3e,
|
||||
0x22, 0x73, 0x43, 0xc7, 0x5d, 0x66, 0xd9, 0x6b, 0x84, 0x80, 0x31, 0xda, 0x3c, 0x8a, 0x74, 0x0c,
|
||||
0xeb, 0xc1, 0xcd, 0xe0, 0xd6, 0xe2, 0xe7, 0x5e, 0xb9, 0xfd, 0x11, 0x7b, 0x6e, 0xef, 0xa2, 0x59,
|
||||
0x4f, 0xc7, 0x30, 0xe8, 0xc0, 0x74, 0xc9, 0xd6, 0xc8, 0x9c, 0x01, 0x6e, 0xb5, 0x5a, 0x6f, 0xdc,
|
||||
0x0c, 0x6e, 0x75, 0x06, 0x85, 0xb4, 0xf9, 0x79, 0x32, 0x7f, 0x1f, 0x26, 0x0f, 0xb9, 0xcc, 0xe0,
|
||||
0x98, 0x0b, 0xc3, 0x28, 0x69, 0x3e, 0x86, 0x89, 0xe7, 0xef, 0x0c, 0x70, 0xc9, 0x56, 0xc8, 0xec,
|
||||
0x05, 0xaa, 0x8b, 0x8d, 0xb9, 0xb0, 0x79, 0x97, 0x74, 0xef, 0xc3, 0x24, 0xe4, 0x8e, 0x7f, 0xcc,
|
||||
0x36, 0x46, 0x5a, 0x31, 0x77, 0xdc, 0xef, 0x9a, 0x1f, 0xf8, 0xf5, 0xe6, 0x06, 0x69, 0xed, 0x48,
|
||||
0x7d, 0x56, 0x51, 0x06, 0x5e, 0x59, 0x50, 0xbe, 0x4a, 0xda, 0xdb, 0x71, 0x6c, 0xc0, 0x5a, 0xb6,
|
||||
0x48, 0x1a, 0x22, 0x2d, 0xd8, 0x1a, 0x22, 0x45, 0xb2, 0x54, 0x1b, 0xe7, 0xc9, 0x9a, 0x03, 0xbf,
|
||||
0xde, 0x7c, 0x3b, 0x20, 0xed, 0x43, 0x3b, 0xda, 0xe1, 0x16, 0xd8, 0x17, 0xc8, 0x95, 0xc4, 0x8e,
|
||||
0x1e, 0xb9, 0x49, 0x3a, 0x0d, 0xcd, 0xc6, 0x47, 0x86, 0xe6, 0xd0, 0x8e, 0x4e, 0x26, 0x29, 0x0c,
|
||||
0xda, 0x49, 0xbe, 0x40, 0x4f, 0x12, 0x3b, 0xea, 0x87, 0x05, 0x73, 0x2e, 0xb0, 0x0d, 0xd2, 0x71,
|
||||
0x22, 0x01, 0xeb, 0x78, 0x92, 0xae, 0x37, 0x6f, 0x06, 0xb7, 0x5a, 0x83, 0x0a, 0x60, 0xd7, 0xc9,
|
||||
0x15, 0xab, 0x33, 0x13, 0x41, 0x3f, 0x5c, 0x6f, 0xf9, 0x6d, 0xa5, 0xbc, 0xf9, 0x1a, 0xe9, 0x1c,
|
||||
0xda, 0xd1, 0x3d, 0xe0, 0x31, 0x18, 0xf6, 0x19, 0xd2, 0x3a, 0xe3, 0x36, 0xf7, 0xa8, 0xfb, 0xf1,
|
||||
0x1e, 0xe1, 0x0d, 0x06, 0xde, 0x72, 0xf3, 0xcb, 0x64, 0x3e, 0x3c, 0x3c, 0xf8, 0x04, 0x0c, 0xe8,
|
||||
0xba, 0x1d, 0x73, 0x13, 0x1f, 0xf1, 0x64, 0x9a, 0xb1, 0x0a, 0xd8, 0x7a, 0x3a, 0x4b, 0x3a, 0x65,
|
||||
0x79, 0xb0, 0x2e, 0x69, 0x0f, 0xb3, 0x28, 0x02, 0x6b, 0xe9, 0x0c, 0x5b, 0x26, 0x4b, 0xa7, 0x0a,
|
||||
0x2e, 0x53, 0x88, 0x1c, 0xc4, 0xde, 0x86, 0x06, 0xec, 0x2a, 0x59, 0xe8, 0x69, 0xa5, 0x20, 0x72,
|
||||
0x7b, 0x5c, 0x48, 0x88, 0x69, 0x83, 0xad, 0x10, 0x7a, 0x0c, 0x26, 0x11, 0xd6, 0x0a, 0xad, 0x42,
|
||||
0x50, 0x02, 0x62, 0xda, 0x64, 0xd7, 0xc8, 0x72, 0x4f, 0x4b, 0x09, 0x91, 0x13, 0x5a, 0x1d, 0x69,
|
||||
0xb7, 0x7b, 0x29, 0xac, 0xb3, 0xb4, 0x85, 0xb4, 0x7d, 0x29, 0x61, 0xc4, 0xe5, 0xb6, 0x19, 0x65,
|
||||
0x09, 0x28, 0x47, 0x67, 0x91, 0xa3, 0x00, 0x43, 0x91, 0x80, 0x42, 0x26, 0xda, 0xae, 0xa1, 0x7d,
|
||||
0x15, 0xc3, 0x25, 0xe6, 0x87, 0x5e, 0x61, 0x2f, 0x91, 0xd5, 0x02, 0xad, 0x1d, 0xc0, 0x13, 0xa0,
|
||||
0x1d, 0xb6, 0x44, 0xba, 0x85, 0xea, 0xe4, 0xc1, 0xf1, 0x7d, 0x4a, 0x6a, 0x0c, 0x03, 0xfd, 0x64,
|
||||
0x00, 0x91, 0x36, 0x31, 0xed, 0xd6, 0x5c, 0x78, 0x08, 0x91, 0xd3, 0xa6, 0x1f, 0xd2, 0x79, 0x74,
|
||||
0xb8, 0x00, 0x87, 0xc0, 0x4d, 0x34, 0x1e, 0x80, 0xcd, 0xa4, 0xa3, 0x0b, 0x8c, 0x92, 0xf9, 0x3d,
|
||||
0x21, 0xe1, 0x48, 0xbb, 0x3d, 0x9d, 0xa9, 0x98, 0x2e, 0xb2, 0x45, 0x42, 0x0e, 0xc1, 0xf1, 0x22,
|
||||
0x02, 0x4b, 0x78, 0x6c, 0x8f, 0x47, 0x63, 0x28, 0x00, 0xca, 0xd6, 0x08, 0xeb, 0x71, 0xa5, 0xb4,
|
||||
0xeb, 0x19, 0xe0, 0x0e, 0xf6, 0xb4, 0x8c, 0xc1, 0xd0, 0xab, 0xe8, 0xce, 0x33, 0xb8, 0x90, 0x40,
|
||||
0x59, 0x65, 0x1d, 0x82, 0x84, 0xd2, 0x7a, 0xb9, 0xb2, 0x2e, 0x70, 0xb4, 0x5e, 0x41, 0xe7, 0x77,
|
||||
0x32, 0x21, 0x63, 0x1f, 0x92, 0x3c, 0x2d, 0xab, 0xe8, 0x63, 0xe1, 0xfc, 0xd1, 0x41, 0x7f, 0x78,
|
||||
0x42, 0xd7, 0xd8, 0x2a, 0xb9, 0x5a, 0x20, 0x87, 0xe0, 0x8c, 0x88, 0x7c, 0xf0, 0xae, 0xa1, 0xab,
|
||||
0x0f, 0x32, 0xf7, 0xe0, 0xfc, 0x10, 0x12, 0x6d, 0x26, 0x74, 0x1d, 0x13, 0xea, 0x99, 0xa6, 0x29,
|
||||
0xa2, 0x2f, 0xe1, 0x09, 0xbb, 0x49, 0xea, 0x26, 0x55, 0x78, 0xe9, 0x75, 0x76, 0x83, 0x5c, 0x3b,
|
||||
0x4d, 0x63, 0xee, 0xa0, 0x9f, 0xe0, 0x63, 0x3b, 0xe1, 0xf6, 0x31, 0x5e, 0x37, 0x33, 0x40, 0x6f,
|
||||
0xb0, 0xeb, 0x64, 0xed, 0xd9, 0x5c, 0x94, 0xc1, 0xda, 0xc0, 0x8d, 0xf9, 0x6d, 0x7b, 0x06, 0x62,
|
||||
0x50, 0x4e, 0x70, 0x39, 0xdd, 0xf8, 0x72, 0xc5, 0xfa, 0xa2, 0xf2, 0x15, 0x54, 0xe6, 0x37, 0x7f,
|
||||
0x51, 0xf9, 0x29, 0xb6, 0x4e, 0x56, 0xf6, 0xc1, 0xbd, 0xa8, 0xb9, 0x89, 0x9a, 0x03, 0x61, 0xbd,
|
||||
0xea, 0xd4, 0x82, 0xb1, 0x53, 0xcd, 0xa7, 0x19, 0x23, 0x0b, 0x61, 0x38, 0x80, 0xaf, 0x66, 0x60,
|
||||
0xdd, 0x80, 0x47, 0x40, 0xff, 0xd1, 0xde, 0x7a, 0x83, 0x10, 0x7f, 0x7f, 0x6c, 0xaa, 0xc0, 0x18,
|
||||
0x59, 0xac, 0xa4, 0x23, 0xad, 0x80, 0xce, 0xb0, 0x79, 0x72, 0xe5, 0x54, 0x09, 0x6b, 0x33, 0x88,
|
||||
0x69, 0x80, 0xb9, 0xef, 0xab, 0x63, 0xa3, 0x47, 0xd8, 0x96, 0x68, 0x03, 0xb5, 0x7b, 0x42, 0x09,
|
||||
0x3b, 0xf6, 0x55, 0x4f, 0xc8, 0x5c, 0x51, 0x04, 0xad, 0xad, 0xb7, 0x02, 0x32, 0x3f, 0x84, 0x11,
|
||||
0x56, 0x78, 0x4e, 0xbe, 0x42, 0x68, 0x5d, 0xae, 0xe8, 0xcb, 0xd8, 0x07, 0xf8, 0x02, 0xf7, 0x8d,
|
||||
0x7e, 0x22, 0xd4, 0x88, 0x36, 0x90, 0x6d, 0x08, 0x5c, 0x7a, 0xe6, 0x2e, 0x69, 0xef, 0xc9, 0xcc,
|
||||
0x1f, 0xd3, 0xf2, 0x87, 0xa2, 0x80, 0x66, 0xb3, 0xa8, 0x0a, 0x8d, 0x4e, 0x53, 0x88, 0xe9, 0x1c,
|
||||
0x5b, 0x20, 0x9d, 0x3c, 0x43, 0xa8, 0x6b, 0x6f, 0xbd, 0x43, 0x7c, 0x4f, 0xf4, 0xad, 0x6d, 0x81,
|
||||
0x74, 0x4e, 0x55, 0x0c, 0xe7, 0x42, 0x41, 0x4c, 0x67, 0x7c, 0x79, 0xe5, 0x89, 0xa9, 0xf2, 0x1c,
|
||||
0x63, 0x04, 0x90, 0xac, 0x86, 0x01, 0xd6, 0xc8, 0x3d, 0x6e, 0x6b, 0xd0, 0x39, 0xd6, 0x6c, 0x08,
|
||||
0x36, 0x32, 0xe2, 0xac, 0xbe, 0x7d, 0x84, 0xb5, 0x33, 0x1c, 0xeb, 0x27, 0x15, 0x66, 0xe9, 0x18,
|
||||
0x4f, 0xda, 0x07, 0x37, 0x9c, 0x58, 0x07, 0x49, 0x4f, 0xab, 0x73, 0x31, 0xb2, 0x54, 0xe0, 0x49,
|
||||
0x07, 0x9a, 0xc7, 0xb5, 0xed, 0x5f, 0xc1, 0xaa, 0x1d, 0x80, 0x04, 0x6e, 0xeb, 0xac, 0x8f, 0xfd,
|
||||
0x03, 0xf3, 0xae, 0x6e, 0x4b, 0xc1, 0x2d, 0x95, 0x78, 0x15, 0xf4, 0x32, 0x17, 0x13, 0x4c, 0xca,
|
||||
0xb6, 0x74, 0x60, 0x72, 0x59, 0xb1, 0x15, 0xb2, 0x94, 0xdb, 0x1f, 0x73, 0xe3, 0x84, 0x27, 0xf9,
|
||||
0x65, 0xe0, 0xd3, 0x6f, 0x74, 0x5a, 0x61, 0xbf, 0xc2, 0x7e, 0x36, 0x7f, 0x8f, 0xdb, 0x0a, 0xfa,
|
||||
0x75, 0xc0, 0xd6, 0xc8, 0xd5, 0xe9, 0xd5, 0x2a, 0xfc, 0x37, 0x01, 0x5b, 0x26, 0x8b, 0x78, 0xb5,
|
||||
0x12, 0xb3, 0xf4, 0xb7, 0x1e, 0xc4, 0x4b, 0xd4, 0xc0, 0xdf, 0x79, 0x86, 0xe2, 0x16, 0x35, 0xfc,
|
||||
0xf7, 0xfe, 0x30, 0x64, 0x28, 0x8a, 0xc0, 0xd2, 0x77, 0x03, 0xf4, 0x74, 0x7a, 0x58, 0x01, 0xd3,
|
||||
0xf7, 0xbc, 0x21, 0xb2, 0x96, 0x86, 0xef, 0x7b, 0xc3, 0x82, 0xb3, 0x44, 0x3f, 0xf0, 0xe8, 0x3d,
|
||||
0xae, 0x62, 0x7d, 0x7e, 0x5e, 0xa2, 0x4f, 0x03, 0xb6, 0x4e, 0x96, 0x71, 0xfb, 0x0e, 0x97, 0x5c,
|
||||
0x45, 0x95, 0xfd, 0x87, 0x01, 0x5b, 0x25, 0xf4, 0xb9, 0xe3, 0x2c, 0x7d, 0xb3, 0xc1, 0xe8, 0x34,
|
||||
0xbe, 0xbe, 0xf8, 0xe9, 0x77, 0x1b, 0x3e, 0x56, 0x85, 0x61, 0x8e, 0x7d, 0xaf, 0xc1, 0x16, 0xf3,
|
||||
0xa0, 0xe7, 0xf2, 0xf7, 0x1b, 0xac, 0x4b, 0xe6, 0xfa, 0xca, 0x82, 0x71, 0xf4, 0x9b, 0x58, 0x9f,
|
||||
0x73, 0xf9, 0x63, 0xa5, 0xdf, 0xc2, 0x67, 0x30, 0xeb, 0xeb, 0x93, 0xbe, 0xed, 0x15, 0x79, 0x43,
|
||||
0xa5, 0xff, 0x6c, 0xfa, 0x08, 0xd4, 0xbb, 0xeb, 0xbf, 0x9a, 0x78, 0xd2, 0x3e, 0xb8, 0xea, 0xd5,
|
||||
0xd1, 0x7f, 0x37, 0xd9, 0x75, 0xb2, 0x3a, 0xc5, 0x7c, 0xaf, 0x2b, 0xdf, 0xdb, 0x7f, 0x9a, 0x6c,
|
||||
0x83, 0x5c, 0xc3, 0x87, 0x5f, 0x96, 0x07, 0x6e, 0x12, 0xd6, 0x89, 0xc8, 0xd2, 0xff, 0x36, 0xd9,
|
||||
0x0d, 0xb2, 0xb6, 0x0f, 0xae, 0x0c, 0x7b, 0x4d, 0xf9, 0xbf, 0x26, 0x5b, 0x20, 0x57, 0x06, 0xd8,
|
||||
0x0c, 0xe1, 0x02, 0xe8, 0xbb, 0x4d, 0xcc, 0xdd, 0x54, 0x2c, 0xdc, 0x79, 0xaf, 0x89, 0x11, 0x7d,
|
||||
0x9d, 0xbb, 0x68, 0x1c, 0x26, 0xbd, 0x31, 0x57, 0x0a, 0xa4, 0xa5, 0xef, 0x37, 0x31, 0x6e, 0x03,
|
||||
0x48, 0xf4, 0x05, 0xd4, 0xe0, 0x0f, 0x70, 0xc8, 0x31, 0x6f, 0xfc, 0xc5, 0x0c, 0xcc, 0xa4, 0x54,
|
||||
0x3c, 0x6d, 0x62, 0x06, 0x72, 0xfb, 0x67, 0x35, 0x1f, 0x36, 0xd9, 0xcb, 0x64, 0x3d, 0x7f, 0xd3,
|
||||
0xd3, 0xf8, 0xa3, 0x72, 0x04, 0x7d, 0x75, 0xae, 0xe9, 0x9b, 0xad, 0x92, 0x31, 0x04, 0xe9, 0x78,
|
||||
0xb9, 0xef, 0xeb, 0x2d, 0xf4, 0x0b, 0xdf, 0x10, 0x0e, 0xee, 0x03, 0xff, 0x15, 0xb0, 0xf4, 0xad,
|
||||
0x16, 0x26, 0x6e, 0x1f, 0xdc, 0x00, 0x52, 0x29, 0x22, 0x6e, 0xe9, 0x37, 0x3c, 0x52, 0x30, 0x7b,
|
||||
0xca, 0x3f, 0xb4, 0xd8, 0x12, 0x21, 0xf9, 0xd3, 0xf3, 0xc0, 0x3b, 0x53, 0x2a, 0x9c, 0x86, 0x17,
|
||||
0x60, 0x26, 0x1e, 0xfd, 0x63, 0x79, 0x40, 0xad, 0x41, 0xd1, 0x3f, 0xb5, 0x30, 0x64, 0x27, 0x22,
|
||||
0x81, 0x13, 0x11, 0x3d, 0xa6, 0x3f, 0xe8, 0x60, 0xc8, 0xfc, 0x8d, 0x8e, 0x74, 0x0c, 0x68, 0x63,
|
||||
0xe9, 0x0f, 0x3b, 0x58, 0x17, 0x58, 0x6e, 0x79, 0x5d, 0xfc, 0xc8, 0xcb, 0x45, 0x93, 0xed, 0x87,
|
||||
0xf4, 0xc7, 0x38, 0x95, 0x49, 0x21, 0x9f, 0x0c, 0x1f, 0xd0, 0x9f, 0x74, 0xf0, 0xa8, 0x6d, 0x29,
|
||||
0x75, 0xc4, 0x5d, 0x59, 0xf4, 0x3f, 0xed, 0xe0, 0xab, 0xa9, 0x9d, 0x5e, 0x64, 0xed, 0x67, 0x1d,
|
||||
0x8c, 0x7d, 0x81, 0xfb, 0x9a, 0x0a, 0xb1, 0x6d, 0xfe, 0xdc, 0xb3, 0xe2, 0x67, 0x13, 0x3d, 0x39,
|
||||
0x71, 0xf4, 0x17, 0xde, 0xee, 0xf9, 0x41, 0x43, 0xff, 0xdc, 0x2d, 0xea, 0xab, 0x86, 0xfd, 0xa5,
|
||||
0x9b, 0x3f, 0x83, 0x67, 0x27, 0x0b, 0xfd, 0xab, 0x87, 0x9f, 0x9f, 0x46, 0xf4, 0x6f, 0x5d, 0x74,
|
||||
0xac, 0x3e, 0x50, 0x14, 0x4f, 0xc0, 0xd2, 0xbf, 0x77, 0xb7, 0x36, 0x49, 0x3b, 0xb4, 0xd2, 0xb7,
|
||||
0xd6, 0x36, 0x69, 0x86, 0x56, 0xd2, 0x19, 0xec, 0x44, 0x3b, 0x5a, 0xcb, 0xdd, 0xcb, 0xd4, 0x3c,
|
||||
0xfc, 0x2c, 0x0d, 0xb6, 0x76, 0xc8, 0x52, 0x4f, 0x27, 0x29, 0x2f, 0x4b, 0xd5, 0x77, 0xd3, 0xbc,
|
||||
0x0d, 0x43, 0x9c, 0x87, 0x79, 0x06, 0xdb, 0xd9, 0xee, 0x25, 0x44, 0x99, 0x6f, 0xda, 0x01, 0x8a,
|
||||
0xb8, 0x09, 0x1d, 0x8c, 0x69, 0x63, 0xeb, 0x0d, 0x42, 0x7b, 0x5a, 0x59, 0x61, 0x1d, 0xa8, 0x68,
|
||||
0x72, 0x00, 0x17, 0x20, 0xfd, 0x68, 0x70, 0x46, 0xab, 0x11, 0x9d, 0xf1, 0xbf, 0x36, 0xf0, 0xbf,
|
||||
0xaf, 0x7c, 0x80, 0xec, 0xe0, 0xe4, 0xf5, 0x5f, 0xb3, 0x45, 0x42, 0x76, 0x2f, 0x40, 0xb9, 0x8c,
|
||||
0x4b, 0x39, 0xa1, 0x4d, 0x94, 0x7b, 0x99, 0x75, 0x3a, 0x11, 0x5f, 0xf3, 0x23, 0xea, 0xdb, 0x01,
|
||||
0xe9, 0xe6, 0xd3, 0xa2, 0x74, 0x2d, 0x17, 0x8f, 0x41, 0xc5, 0xc2, 0x93, 0xe3, 0xcf, 0xc2, 0x43,
|
||||
0xc5, 0x5c, 0x0b, 0x2a, 0xa3, 0xa1, 0xe3, 0xc6, 0x4d, 0xbf, 0x80, 0x39, 0x14, 0xea, 0x27, 0x4a,
|
||||
0x6a, 0x1e, 0xfb, 0x91, 0x55, 0x6e, 0x3d, 0xe6, 0xc6, 0xfa, 0xb9, 0x85, 0x1f, 0xaf, 0x82, 0xdf,
|
||||
0xf8, 0xfb, 0xc4, 0x74, 0xb6, 0x02, 0xab, 0x3b, 0xcf, 0xed, 0xbc, 0x4e, 0x16, 0x85, 0x9e, 0xfe,
|
||||
0x6e, 0x47, 0x26, 0x8d, 0x76, 0xba, 0x3d, 0xff, 0xbb, 0x3d, 0xc6, 0x9f, 0xee, 0x71, 0xf0, 0xa5,
|
||||
0xbb, 0x23, 0xe1, 0xc6, 0xd9, 0x19, 0xfe, 0x79, 0xef, 0xe4, 0x66, 0xaf, 0x0a, 0x5d, 0xac, 0xee,
|
||||
0x08, 0xe5, 0x30, 0x4f, 0xf2, 0x8e, 0xff, 0x17, 0xdf, 0xc9, 0xff, 0xc5, 0xe9, 0xd9, 0x77, 0x82,
|
||||
0xe0, 0x6c, 0xce, 0x43, 0x77, 0xff, 0x1f, 0x00, 0x00, 0xff, 0xff, 0x17, 0xcc, 0xd7, 0x5c, 0x6b,
|
||||
0x0d, 0x00, 0x00,
|
||||
0x11, 0xe6, 0xec, 0x2e, 0xb9, 0x5c, 0x2c, 0x1f, 0x10, 0x48, 0x51, 0xb4, 0x44, 0x3b, 0x0a, 0x4f,
|
||||
0x2a, 0x56, 0x59, 0x4a, 0xa2, 0xaa, 0xe4, 0xe4, 0x03, 0xb9, 0x43, 0x52, 0x5b, 0x22, 0x29, 0x66,
|
||||
0x97, 0x94, 0x5d, 0x39, 0x44, 0x05, 0xce, 0x34, 0x77, 0x11, 0x61, 0x80, 0x09, 0x80, 0xa1, 0xb8,
|
||||
0x39, 0x39, 0xce, 0x1f, 0x48, 0xfc, 0x0b, 0xf2, 0x03, 0x92, 0x54, 0xde, 0x49, 0x55, 0xfe, 0x40,
|
||||
0xde, 0xe7, 0x38, 0xef, 0x63, 0x7e, 0x40, 0x9e, 0x7e, 0xc8, 0xa9, 0xc6, 0xcc, 0xce, 0x8c, 0x24,
|
||||
0xfb, 0xe4, 0x1b, 0xfa, 0xeb, 0xc6, 0x87, 0x46, 0x77, 0xa3, 0x1b, 0x64, 0x21, 0xd2, 0x49, 0xa2,
|
||||
0xd5, 0xed, 0xd4, 0x68, 0xa7, 0xd9, 0x4a, 0x22, 0xe4, 0x45, 0x66, 0x73, 0xe9, 0x76, 0xae, 0xda,
|
||||
0x7c, 0x44, 0xe6, 0x86, 0x8e, 0xbb, 0xcc, 0xb2, 0xd7, 0x08, 0x01, 0x63, 0xb4, 0x79, 0x14, 0xe9,
|
||||
0x18, 0xd6, 0x83, 0x9b, 0xc1, 0xad, 0xa5, 0xcf, 0xbd, 0x72, 0xfb, 0x23, 0xf6, 0xdc, 0xde, 0x45,
|
||||
0xb3, 0x9e, 0x8e, 0x61, 0xd0, 0x81, 0xe9, 0x92, 0xad, 0x91, 0x39, 0x03, 0xdc, 0x6a, 0xb5, 0xde,
|
||||
0xb8, 0x19, 0xdc, 0xea, 0x0c, 0x0a, 0x69, 0xf3, 0xf3, 0x64, 0xe1, 0x3e, 0x4c, 0x1e, 0x72, 0x99,
|
||||
0xc1, 0x31, 0x17, 0x86, 0x51, 0xd2, 0x7c, 0x0c, 0x13, 0xcf, 0xdf, 0x19, 0xe0, 0x92, 0xad, 0x92,
|
||||
0xd9, 0x0b, 0x54, 0x17, 0x1b, 0x73, 0x61, 0xf3, 0x2e, 0xe9, 0xde, 0x87, 0x49, 0xc8, 0x1d, 0xff,
|
||||
0x98, 0x6d, 0x8c, 0xb4, 0x62, 0xee, 0xb8, 0xdf, 0xb5, 0x30, 0xf0, 0xeb, 0xcd, 0x0d, 0xd2, 0xda,
|
||||
0x91, 0xfa, 0xac, 0xa2, 0x0c, 0xbc, 0xb2, 0xa0, 0x7c, 0x95, 0xb4, 0xb7, 0xe3, 0xd8, 0x80, 0xb5,
|
||||
0x6c, 0x89, 0x34, 0x44, 0x5a, 0xb0, 0x35, 0x44, 0x8a, 0x64, 0xa9, 0x36, 0xce, 0x93, 0x35, 0x07,
|
||||
0x7e, 0xbd, 0xf9, 0x76, 0x40, 0xda, 0x87, 0x76, 0xb4, 0xc3, 0x2d, 0xb0, 0x2f, 0x90, 0xf9, 0xc4,
|
||||
0x8e, 0x1e, 0xb9, 0x49, 0x3a, 0x0d, 0xcd, 0xc6, 0x47, 0x86, 0xe6, 0xd0, 0x8e, 0x4e, 0x26, 0x29,
|
||||
0x0c, 0xda, 0x49, 0xbe, 0x40, 0x4f, 0x12, 0x3b, 0xea, 0x87, 0x05, 0x73, 0x2e, 0xb0, 0x0d, 0xd2,
|
||||
0x71, 0x22, 0x01, 0xeb, 0x78, 0x92, 0xae, 0x37, 0x6f, 0x06, 0xb7, 0x5a, 0x83, 0x0a, 0x60, 0xd7,
|
||||
0xc9, 0xbc, 0xd5, 0x99, 0x89, 0xa0, 0x1f, 0xae, 0xb7, 0xfc, 0xb6, 0x52, 0xde, 0x7c, 0x8d, 0x74,
|
||||
0x0e, 0xed, 0xe8, 0x1e, 0xf0, 0x18, 0x0c, 0xfb, 0x0c, 0x69, 0x9d, 0x71, 0x9b, 0x7b, 0xd4, 0xfd,
|
||||
0x78, 0x8f, 0xf0, 0x06, 0x03, 0x6f, 0xb9, 0xf9, 0x65, 0xb2, 0x10, 0x1e, 0x1e, 0x7c, 0x02, 0x06,
|
||||
0x74, 0xdd, 0x8e, 0xb9, 0x89, 0x8f, 0x78, 0x32, 0xcd, 0x58, 0x05, 0x6c, 0x3d, 0x9d, 0x25, 0x9d,
|
||||
0xb2, 0x3c, 0x58, 0x97, 0xb4, 0x87, 0x59, 0x14, 0x81, 0xb5, 0x74, 0x86, 0xad, 0x90, 0xe5, 0x53,
|
||||
0x05, 0x97, 0x29, 0x44, 0x0e, 0x62, 0x6f, 0x43, 0x03, 0x76, 0x85, 0x2c, 0xf6, 0xb4, 0x52, 0x10,
|
||||
0xb9, 0x3d, 0x2e, 0x24, 0xc4, 0xb4, 0xc1, 0x56, 0x09, 0x3d, 0x06, 0x93, 0x08, 0x6b, 0x85, 0x56,
|
||||
0x21, 0x28, 0x01, 0x31, 0x6d, 0xb2, 0x6b, 0x64, 0xa5, 0xa7, 0xa5, 0x84, 0xc8, 0x09, 0xad, 0x8e,
|
||||
0xb4, 0xdb, 0xbd, 0x14, 0xd6, 0x59, 0xda, 0x42, 0xda, 0xbe, 0x94, 0x30, 0xe2, 0x72, 0xdb, 0x8c,
|
||||
0xb2, 0x04, 0x94, 0xa3, 0xb3, 0xc8, 0x51, 0x80, 0xa1, 0x48, 0x40, 0x21, 0x13, 0x6d, 0xd7, 0xd0,
|
||||
0xbe, 0x8a, 0xe1, 0x12, 0xf3, 0x43, 0xe7, 0xd9, 0x4b, 0xe4, 0x6a, 0x81, 0xd6, 0x0e, 0xe0, 0x09,
|
||||
0xd0, 0x0e, 0x5b, 0x26, 0xdd, 0x42, 0x75, 0xf2, 0xe0, 0xf8, 0x3e, 0x25, 0x35, 0x86, 0x81, 0x7e,
|
||||
0x32, 0x80, 0x48, 0x9b, 0x98, 0x76, 0x6b, 0x2e, 0x3c, 0x84, 0xc8, 0x69, 0xd3, 0x0f, 0xe9, 0x02,
|
||||
0x3a, 0x5c, 0x80, 0x43, 0xe0, 0x26, 0x1a, 0x0f, 0xc0, 0x66, 0xd2, 0xd1, 0x45, 0x46, 0xc9, 0xc2,
|
||||
0x9e, 0x90, 0x70, 0xa4, 0xdd, 0x9e, 0xce, 0x54, 0x4c, 0x97, 0xd8, 0x12, 0x21, 0x87, 0xe0, 0x78,
|
||||
0x11, 0x81, 0x65, 0x3c, 0xb6, 0xc7, 0xa3, 0x31, 0x14, 0x00, 0x65, 0x6b, 0x84, 0xf5, 0xb8, 0x52,
|
||||
0xda, 0xf5, 0x0c, 0x70, 0x07, 0x7b, 0x5a, 0xc6, 0x60, 0xe8, 0x15, 0x74, 0xe7, 0x19, 0x5c, 0x48,
|
||||
0xa0, 0xac, 0xb2, 0x0e, 0x41, 0x42, 0x69, 0xbd, 0x52, 0x59, 0x17, 0x38, 0x5a, 0xaf, 0xa2, 0xf3,
|
||||
0x3b, 0x99, 0x90, 0xb1, 0x0f, 0x49, 0x9e, 0x96, 0xab, 0xe8, 0x63, 0xe1, 0xfc, 0xd1, 0x41, 0x7f,
|
||||
0x78, 0x42, 0xd7, 0xd8, 0x55, 0x72, 0xa5, 0x40, 0x0e, 0xc1, 0x19, 0x11, 0xf9, 0xe0, 0x5d, 0x43,
|
||||
0x57, 0x1f, 0x64, 0xee, 0xc1, 0xf9, 0x21, 0x24, 0xda, 0x4c, 0xe8, 0x3a, 0x26, 0xd4, 0x33, 0x4d,
|
||||
0x53, 0x44, 0x5f, 0xc2, 0x13, 0x76, 0x93, 0xd4, 0x4d, 0xaa, 0xf0, 0xd2, 0xeb, 0xec, 0x06, 0xb9,
|
||||
0x76, 0x9a, 0xc6, 0xdc, 0x41, 0x3f, 0xc1, 0xc7, 0x76, 0xc2, 0xed, 0x63, 0xbc, 0x6e, 0x66, 0x80,
|
||||
0xde, 0x60, 0xd7, 0xc9, 0xda, 0xb3, 0xb9, 0x28, 0x83, 0xb5, 0x81, 0x1b, 0xf3, 0xdb, 0xf6, 0x0c,
|
||||
0xc4, 0xa0, 0x9c, 0xe0, 0x72, 0xba, 0xf1, 0xe5, 0x8a, 0xf5, 0x45, 0xe5, 0x2b, 0xa8, 0xcc, 0x6f,
|
||||
0xfe, 0xa2, 0xf2, 0x53, 0x6c, 0x9d, 0xac, 0xee, 0x83, 0x7b, 0x51, 0x73, 0x13, 0x35, 0x07, 0xc2,
|
||||
0x7a, 0xd5, 0xa9, 0x05, 0x63, 0xa7, 0x9a, 0x4f, 0x33, 0x46, 0x16, 0xc3, 0x70, 0x00, 0x5f, 0xcd,
|
||||
0xc0, 0xba, 0x01, 0x8f, 0x80, 0xfe, 0xa3, 0xbd, 0xf5, 0x06, 0x21, 0xfe, 0xfe, 0xd8, 0x54, 0x81,
|
||||
0x31, 0xb2, 0x54, 0x49, 0x47, 0x5a, 0x01, 0x9d, 0x61, 0x0b, 0x64, 0xfe, 0x54, 0x09, 0x6b, 0x33,
|
||||
0x88, 0x69, 0x80, 0xb9, 0xef, 0xab, 0x63, 0xa3, 0x47, 0xd8, 0x96, 0x68, 0x03, 0xb5, 0x7b, 0x42,
|
||||
0x09, 0x3b, 0xf6, 0x55, 0x4f, 0xc8, 0x5c, 0x51, 0x04, 0xad, 0xad, 0xb7, 0x02, 0xb2, 0x30, 0x84,
|
||||
0x11, 0x56, 0x78, 0x4e, 0xbe, 0x4a, 0x68, 0x5d, 0xae, 0xe8, 0xcb, 0xd8, 0x07, 0xf8, 0x02, 0xf7,
|
||||
0x8d, 0x7e, 0x22, 0xd4, 0x88, 0x36, 0x90, 0x6d, 0x08, 0x5c, 0x7a, 0xe6, 0x2e, 0x69, 0xef, 0xc9,
|
||||
0xcc, 0x1f, 0xd3, 0xf2, 0x87, 0xa2, 0x80, 0x66, 0xb3, 0xa8, 0x0a, 0x8d, 0x4e, 0x53, 0x88, 0xe9,
|
||||
0x1c, 0x5b, 0x24, 0x9d, 0x3c, 0x43, 0xa8, 0x6b, 0x6f, 0xbd, 0x43, 0x7c, 0x4f, 0xf4, 0xad, 0x6d,
|
||||
0x91, 0x74, 0x4e, 0x55, 0x0c, 0xe7, 0x42, 0x41, 0x4c, 0x67, 0x7c, 0x79, 0xe5, 0x89, 0xa9, 0xf2,
|
||||
0x1c, 0x63, 0x04, 0x90, 0xac, 0x86, 0x01, 0xd6, 0xc8, 0x3d, 0x6e, 0x6b, 0xd0, 0x39, 0xd6, 0x6c,
|
||||
0x08, 0x36, 0x32, 0xe2, 0xac, 0xbe, 0x7d, 0x84, 0xb5, 0x33, 0x1c, 0xeb, 0x27, 0x15, 0x66, 0xe9,
|
||||
0x18, 0x4f, 0xda, 0x07, 0x37, 0x9c, 0x58, 0x07, 0x49, 0x4f, 0xab, 0x73, 0x31, 0xb2, 0x54, 0xe0,
|
||||
0x49, 0x07, 0x9a, 0xc7, 0xb5, 0xed, 0x5f, 0xc1, 0xaa, 0x1d, 0x80, 0x04, 0x6e, 0xeb, 0xac, 0x8f,
|
||||
0xfd, 0x03, 0xf3, 0xae, 0x6e, 0x4b, 0xc1, 0x2d, 0x95, 0x78, 0x15, 0xf4, 0x32, 0x17, 0x13, 0x4c,
|
||||
0xca, 0xb6, 0x74, 0x60, 0x72, 0x59, 0xb1, 0x55, 0xb2, 0x9c, 0xdb, 0x1f, 0x73, 0xe3, 0x84, 0x27,
|
||||
0xf9, 0x65, 0xe0, 0xd3, 0x6f, 0x74, 0x5a, 0x61, 0xbf, 0xc2, 0x7e, 0xb6, 0x70, 0x8f, 0xdb, 0x0a,
|
||||
0xfa, 0x75, 0xc0, 0xd6, 0xc8, 0x95, 0xe9, 0xd5, 0x2a, 0xfc, 0x37, 0x01, 0x5b, 0x21, 0x4b, 0x78,
|
||||
0xb5, 0x12, 0xb3, 0xf4, 0xb7, 0x1e, 0xc4, 0x4b, 0xd4, 0xc0, 0xdf, 0x79, 0x86, 0xe2, 0x16, 0x35,
|
||||
0xfc, 0xf7, 0xfe, 0x30, 0x64, 0x28, 0x8a, 0xc0, 0xd2, 0x77, 0x03, 0xf4, 0x74, 0x7a, 0x58, 0x01,
|
||||
0xd3, 0xf7, 0xbc, 0x21, 0xb2, 0x96, 0x86, 0xef, 0x7b, 0xc3, 0x82, 0xb3, 0x44, 0x3f, 0xf0, 0xe8,
|
||||
0x3d, 0xae, 0x62, 0x7d, 0x7e, 0x5e, 0xa2, 0x4f, 0x03, 0xb6, 0x4e, 0x56, 0x70, 0xfb, 0x0e, 0x97,
|
||||
0x5c, 0x45, 0x95, 0xfd, 0x87, 0x01, 0xbb, 0x4a, 0xe8, 0x73, 0xc7, 0x59, 0xfa, 0x66, 0x83, 0xd1,
|
||||
0x69, 0x7c, 0x7d, 0xf1, 0xd3, 0xef, 0x34, 0x7c, 0xac, 0x0a, 0xc3, 0x1c, 0xfb, 0x6e, 0x83, 0x2d,
|
||||
0xe5, 0x41, 0xcf, 0xe5, 0xef, 0x35, 0x58, 0x97, 0xcc, 0xf5, 0x95, 0x05, 0xe3, 0xe8, 0x37, 0xb1,
|
||||
0x3e, 0xe7, 0xf2, 0xc7, 0x4a, 0xbf, 0x85, 0xcf, 0x60, 0xd6, 0xd7, 0x27, 0x7d, 0xdb, 0x2b, 0xf2,
|
||||
0x86, 0x4a, 0xff, 0xd9, 0xf4, 0x11, 0xa8, 0x77, 0xd7, 0x7f, 0x35, 0xf1, 0xa4, 0x7d, 0x70, 0xd5,
|
||||
0xab, 0xa3, 0xff, 0x6e, 0xb2, 0xeb, 0xe4, 0xea, 0x14, 0xf3, 0xbd, 0xae, 0x7c, 0x6f, 0xff, 0x69,
|
||||
0xb2, 0x0d, 0x72, 0x0d, 0x1f, 0x7e, 0x59, 0x1e, 0xb8, 0x49, 0x58, 0x27, 0x22, 0x4b, 0xff, 0xdb,
|
||||
0x64, 0x37, 0xc8, 0xda, 0x3e, 0xb8, 0x32, 0xec, 0x35, 0xe5, 0xff, 0x9a, 0x6c, 0x91, 0xcc, 0x0f,
|
||||
0xb0, 0x19, 0xc2, 0x05, 0xd0, 0x77, 0x9b, 0x98, 0xbb, 0xa9, 0x58, 0xb8, 0xf3, 0x5e, 0x13, 0x23,
|
||||
0xfa, 0x3a, 0x77, 0xd1, 0x38, 0x4c, 0x7a, 0x63, 0xae, 0x14, 0x48, 0x4b, 0xdf, 0x6f, 0x62, 0xdc,
|
||||
0x06, 0x90, 0xe8, 0x0b, 0xa8, 0xc1, 0x1f, 0xe0, 0x90, 0x63, 0xde, 0xf8, 0x8b, 0x19, 0x98, 0x49,
|
||||
0xa9, 0x78, 0xda, 0xc4, 0x0c, 0xe4, 0xf6, 0xcf, 0x6a, 0x3e, 0x6c, 0xb2, 0x97, 0xc9, 0x7a, 0xfe,
|
||||
0xa6, 0xa7, 0xf1, 0x47, 0xe5, 0x08, 0xfa, 0xea, 0x5c, 0xd3, 0x37, 0x5b, 0x25, 0x63, 0x08, 0xd2,
|
||||
0xf1, 0x72, 0xdf, 0xd7, 0x5b, 0xe8, 0x17, 0xbe, 0x21, 0x1c, 0xdc, 0x07, 0xfe, 0x2b, 0x60, 0xe9,
|
||||
0x5b, 0x2d, 0x4c, 0xdc, 0x3e, 0xb8, 0x01, 0xa4, 0x52, 0x44, 0xdc, 0xd2, 0x6f, 0x78, 0xa4, 0x60,
|
||||
0xf6, 0x94, 0x7f, 0x68, 0xb1, 0x65, 0x42, 0xf2, 0xa7, 0xe7, 0x81, 0x77, 0xa6, 0x54, 0x38, 0x0d,
|
||||
0x2f, 0xc0, 0x4c, 0x3c, 0xfa, 0xc7, 0xf2, 0x80, 0x5a, 0x83, 0xa2, 0x7f, 0x6a, 0x61, 0xc8, 0x4e,
|
||||
0x44, 0x02, 0x27, 0x22, 0x7a, 0x4c, 0xbf, 0xdf, 0xc1, 0x90, 0xf9, 0x1b, 0x1d, 0xe9, 0x18, 0xd0,
|
||||
0xc6, 0xd2, 0x1f, 0x74, 0xb0, 0x2e, 0xb0, 0xdc, 0xf2, 0xba, 0xf8, 0xa1, 0x97, 0x8b, 0x26, 0xdb,
|
||||
0x0f, 0xe9, 0x8f, 0x70, 0x2a, 0x93, 0x42, 0x3e, 0x19, 0x3e, 0xa0, 0x3f, 0xee, 0xe0, 0x51, 0xdb,
|
||||
0x52, 0xea, 0x88, 0xbb, 0xb2, 0xe8, 0x7f, 0xd2, 0xc1, 0x57, 0x53, 0x3b, 0xbd, 0xc8, 0xda, 0x4f,
|
||||
0x3b, 0x18, 0xfb, 0x02, 0xf7, 0x35, 0x15, 0x62, 0xdb, 0xfc, 0x99, 0x67, 0xc5, 0xcf, 0x26, 0x7a,
|
||||
0x72, 0xe2, 0xe8, 0xcf, 0xbd, 0xdd, 0xf3, 0x83, 0x86, 0xfe, 0xb9, 0x5b, 0xd4, 0x57, 0x0d, 0xfb,
|
||||
0x4b, 0x37, 0x7f, 0x06, 0xcf, 0x4e, 0x16, 0xfa, 0x57, 0x0f, 0x3f, 0x3f, 0x8d, 0xe8, 0xdf, 0xba,
|
||||
0xe8, 0x58, 0x7d, 0xa0, 0x28, 0x9e, 0x80, 0xa5, 0x7f, 0xef, 0x6e, 0x6d, 0x92, 0x76, 0x68, 0xa5,
|
||||
0x6f, 0xad, 0x6d, 0xd2, 0x0c, 0xad, 0xa4, 0x33, 0xd8, 0x89, 0x76, 0xb4, 0x96, 0xbb, 0x97, 0xa9,
|
||||
0x79, 0xf8, 0x59, 0x1a, 0x6c, 0xed, 0x90, 0xe5, 0x9e, 0x4e, 0x52, 0x5e, 0x96, 0xaa, 0xef, 0xa6,
|
||||
0x79, 0x1b, 0x86, 0x38, 0x0f, 0xf3, 0x0c, 0xb6, 0xb3, 0xdd, 0x4b, 0x88, 0x32, 0xdf, 0xb4, 0x03,
|
||||
0x14, 0x71, 0x13, 0x3a, 0x18, 0xd3, 0xc6, 0xd6, 0x1b, 0x84, 0xf6, 0xb4, 0xb2, 0xc2, 0x3a, 0x50,
|
||||
0xd1, 0xe4, 0x00, 0x2e, 0x40, 0xfa, 0xd1, 0xe0, 0x8c, 0x56, 0x23, 0x3a, 0xe3, 0x7f, 0x6d, 0xe0,
|
||||
0x7f, 0x5f, 0xf9, 0x00, 0xd9, 0xc1, 0xc9, 0xeb, 0xbf, 0x66, 0x4b, 0x84, 0xec, 0x5e, 0x80, 0x72,
|
||||
0x19, 0x97, 0x72, 0x42, 0x9b, 0x28, 0xf7, 0x32, 0xeb, 0x74, 0x22, 0xbe, 0xe6, 0x47, 0xd4, 0x2f,
|
||||
0x02, 0xd2, 0xcd, 0xa7, 0x45, 0xe9, 0x5a, 0x2e, 0x1e, 0x83, 0x8a, 0x85, 0x27, 0xc7, 0x9f, 0x85,
|
||||
0x87, 0x8a, 0xb9, 0x16, 0x54, 0x46, 0x43, 0xc7, 0x8d, 0x9b, 0x7e, 0x01, 0x73, 0x28, 0xd4, 0x4f,
|
||||
0x94, 0xd4, 0x3c, 0xf6, 0x23, 0xab, 0xdc, 0x7a, 0xcc, 0x8d, 0xf5, 0x73, 0x0b, 0x3f, 0x5e, 0x05,
|
||||
0xbf, 0xf1, 0xf7, 0x89, 0xe9, 0x2c, 0xf2, 0x61, 0x22, 0x7d, 0x5d, 0xf1, 0x33, 0x09, 0x74, 0x0e,
|
||||
0xfb, 0x3d, 0x42, 0xbe, 0xa2, 0x20, 0xa6, 0xed, 0x6a, 0x63, 0x15, 0x97, 0xf9, 0x9d, 0xd7, 0xc9,
|
||||
0x92, 0xd0, 0xd3, 0x1f, 0xf0, 0xc8, 0xa4, 0xd1, 0x4e, 0xb7, 0xe7, 0x7f, 0xc0, 0xc7, 0xf8, 0x1b,
|
||||
0x3e, 0x0e, 0xbe, 0x74, 0x77, 0x24, 0xdc, 0x38, 0x3b, 0xc3, 0x7f, 0xf1, 0x9d, 0xdc, 0xec, 0x55,
|
||||
0xa1, 0x8b, 0xd5, 0x1d, 0xa1, 0x1c, 0xe6, 0x52, 0xde, 0xf1, 0x7f, 0xe7, 0x3b, 0xf9, 0xdf, 0x39,
|
||||
0x3d, 0xfb, 0x76, 0x10, 0x9c, 0xcd, 0x79, 0xe8, 0xee, 0xff, 0x03, 0x00, 0x00, 0xff, 0xff, 0xd8,
|
||||
0xbb, 0x7a, 0x4c, 0x8f, 0x0d, 0x00, 0x00,
|
||||
}
|
||||
|
|
|
@ -861,9 +861,9 @@ func (qc *QueryCoord) GetPartitionStates(ctx context.Context, req *querypb.GetPa
|
|||
func (qc *QueryCoord) GetSegmentInfo(ctx context.Context, req *querypb.GetSegmentInfoRequest) (*querypb.GetSegmentInfoResponse, error) {
|
||||
log.Info("getSegmentInfoRequest received",
|
||||
zap.String("role", typeutil.QueryCoordRole),
|
||||
zap.Int64("collectionID", req.CollectionID),
|
||||
zap.Int64s("segmentIDs", req.SegmentIDs),
|
||||
zap.Int64("msgID", req.Base.MsgID))
|
||||
zap.Int64("collection ID", req.GetCollectionID()),
|
||||
zap.Int64s("segment IDs", req.GetSegmentIDs()),
|
||||
zap.Int64("msg ID", req.GetBase().GetMsgID()))
|
||||
|
||||
status := &commonpb.Status{
|
||||
ErrorCode: commonpb.ErrorCode_Success,
|
||||
|
|
|
@ -322,6 +322,17 @@ func (m *importManager) importJob(ctx context.Context, req *milvuspb.ImportReque
|
|||
return resp
|
||||
}
|
||||
|
||||
// updateTaskStateCode updates a task's stateCode to `newState`.
|
||||
func (m *importManager) updateTaskStateCode(taskID int64, newState commonpb.ImportState) {
|
||||
m.workingLock.Lock()
|
||||
defer m.workingLock.Unlock()
|
||||
if v, ok := m.workingTasks[taskID]; ok {
|
||||
v.State.StateCode = newState
|
||||
} else {
|
||||
log.Error("task ID not found", zap.Int64("task ID", taskID))
|
||||
}
|
||||
}
|
||||
|
||||
// updateTaskState updates the task's state in in-memory working tasks list and in task store, given ImportResult
|
||||
// result. It returns the ImportTaskInfo of the given task.
|
||||
func (m *importManager) updateTaskState(ir *rootcoordpb.ImportResult) (*datapb.ImportTaskInfo, error) {
|
||||
|
@ -335,7 +346,7 @@ func (m *importManager) updateTaskState(ir *rootcoordpb.ImportResult) (*datapb.I
|
|||
m.workingLock.Lock()
|
||||
defer m.workingLock.Unlock()
|
||||
ok := false
|
||||
if v, ok = m.workingTasks[ir.TaskId]; ok {
|
||||
if v, ok = m.workingTasks[ir.GetTaskId()]; ok {
|
||||
// If the task has already been marked failed. Prevent further state updating and return an error.
|
||||
if v.GetState().GetStateCode() == commonpb.ImportState_ImportFailed {
|
||||
log.Warn("trying to update an already failed task which will end up being a no-op")
|
||||
|
|
|
@ -90,17 +90,17 @@ const (
|
|||
DefaultStringIndexType = "Trie"
|
||||
)
|
||||
|
||||
// MetaTable store all rootcoord meta info
|
||||
// MetaTable store all rootCoord meta info
|
||||
type MetaTable struct {
|
||||
txn kv.TxnKV // client of a reliable txnkv service, i.e. etcd client
|
||||
snapshot kv.SnapShotKV // client of a reliable snapshotkv service, i.e. etcd client
|
||||
proxyID2Meta map[typeutil.UniqueID]pb.ProxyMeta // proxy id to proxy meta
|
||||
collID2Meta map[typeutil.UniqueID]pb.CollectionInfo // collection_id -> meta
|
||||
collID2Meta map[typeutil.UniqueID]pb.CollectionInfo // collection id -> collection meta
|
||||
collName2ID map[string]typeutil.UniqueID // collection name to collection id
|
||||
collAlias2ID map[string]typeutil.UniqueID // collection alias to collection id
|
||||
partID2SegID map[typeutil.UniqueID]map[typeutil.UniqueID]bool // partition_id -> segment_id -> bool
|
||||
segID2IndexMeta map[typeutil.UniqueID]map[typeutil.UniqueID]pb.SegmentIndexInfo // collection_id/index_id/partition_id/segment_id -> meta
|
||||
indexID2Meta map[typeutil.UniqueID]pb.IndexInfo // collection_id/index_id -> meta
|
||||
partID2SegID map[typeutil.UniqueID]map[typeutil.UniqueID]bool // partition id -> segment_id -> bool
|
||||
segID2IndexMeta map[typeutil.UniqueID]map[typeutil.UniqueID]pb.SegmentIndexInfo // collection id/index_id/partition_id/segment_id -> meta
|
||||
indexID2Meta map[typeutil.UniqueID]pb.IndexInfo // collection id/index_id -> meta
|
||||
|
||||
proxyLock sync.RWMutex
|
||||
ddLock sync.RWMutex
|
||||
|
|
|
@ -142,10 +142,10 @@ type Core struct {
|
|||
CallReleaseCollectionService func(ctx context.Context, ts typeutil.Timestamp, dbID, collectionID typeutil.UniqueID) error
|
||||
CallReleasePartitionService func(ctx context.Context, ts typeutil.Timestamp, dbID, collectionID typeutil.UniqueID, partitionIDs []typeutil.UniqueID) error
|
||||
|
||||
CallWatchChannels func(ctx context.Context, collectionID int64, channelNames []string) error
|
||||
// Communicates with queryCoord service for segments info.
|
||||
CallGetSegmentInfoService func(ctx context.Context, collectionID int64, segIDs []int64) (*querypb.GetSegmentInfoResponse, error)
|
||||
|
||||
// Update segment state.
|
||||
CallUpdateSegmentStateService func(ctx context.Context, segID typeutil.UniqueID, ss commonpb.SegmentState) error
|
||||
CallWatchChannels func(ctx context.Context, collectionID int64, channelNames []string) error
|
||||
|
||||
//assign import task to data service
|
||||
CallImportService func(ctx context.Context, req *datapb.ImportTaskRequest) *datapb.ImportTaskResponse
|
||||
|
@ -277,9 +277,6 @@ func (c *Core) checkInit() error {
|
|||
if c.CallGetFlushedSegmentsService == nil {
|
||||
return fmt.Errorf("callGetFlushedSegmentsService is nil")
|
||||
}
|
||||
if c.CallUpdateSegmentStateService == nil {
|
||||
return fmt.Errorf("CallUpdateSegmentStateService is nil")
|
||||
}
|
||||
if c.CallWatchChannels == nil {
|
||||
return fmt.Errorf("callWatchChannels is nil")
|
||||
}
|
||||
|
@ -372,15 +369,15 @@ func (c *Core) checkFlushedSegments(ctx context.Context) {
|
|||
ctx2, cancel2 := context.WithTimeout(ctx, 3*time.Minute)
|
||||
segIDs, err := c.CallGetFlushedSegmentsService(ctx2, collMeta.ID, partID)
|
||||
if err != nil {
|
||||
log.Debug("failed to get flushed segments from data coord",
|
||||
zap.Int64("collection id", collMeta.ID),
|
||||
zap.Int64("partition id", partID),
|
||||
log.Debug("failed to get flushed segments from dataCoord",
|
||||
zap.Int64("collection ID", collMeta.GetID()),
|
||||
zap.Int64("partition ID", partID),
|
||||
zap.Error(err))
|
||||
cancel2()
|
||||
continue
|
||||
}
|
||||
for _, segID := range segIDs {
|
||||
indexInfos := []*etcdpb.FieldIndexInfo{}
|
||||
var indexInfos []*etcdpb.FieldIndexInfo
|
||||
indexMeta, ok := segID2IndexMeta[segID]
|
||||
if !ok {
|
||||
indexInfos = append(indexInfos, collMeta.FieldIndexes...)
|
||||
|
@ -680,29 +677,6 @@ func (c *Core) SetDataCoord(ctx context.Context, s types.DataCoord) error {
|
|||
return rsp.Segments, nil
|
||||
}
|
||||
|
||||
c.CallUpdateSegmentStateService = func(ctx context.Context, segID typeutil.UniqueID, ss commonpb.SegmentState) (retErr error) {
|
||||
defer func() {
|
||||
if err := recover(); err != nil {
|
||||
retErr = fmt.Errorf("update segment state from data coord panic, msg = %v", err)
|
||||
}
|
||||
}()
|
||||
<-initCh
|
||||
req := &datapb.SetSegmentStateRequest{
|
||||
SegmentId: segID,
|
||||
NewState: ss,
|
||||
}
|
||||
resp, err := s.SetSegmentState(ctx, req)
|
||||
if err != nil || resp.GetStatus().GetErrorCode() != commonpb.ErrorCode_Success {
|
||||
log.Error("failed to update segment state",
|
||||
zap.Any("request", req), zap.Any("response", resp), zap.Error(err))
|
||||
return err
|
||||
}
|
||||
log.Info("successfully set segment state",
|
||||
zap.Int64("segment ID", req.GetSegmentId()),
|
||||
zap.String("new segment state", req.GetNewState().String()))
|
||||
return nil
|
||||
}
|
||||
|
||||
c.CallWatchChannels = func(ctx context.Context, collectionID int64, channelNames []string) (retErr error) {
|
||||
defer func() {
|
||||
if err := recover(); err != nil {
|
||||
|
@ -855,7 +829,7 @@ func (c *Core) SetIndexCoord(s types.IndexCoord) error {
|
|||
return nil
|
||||
}
|
||||
|
||||
// SetQueryCoord set querycoord
|
||||
// SetQueryCoord sets up queryCoord and queryCoord related function calls.
|
||||
func (c *Core) SetQueryCoord(s types.QueryCoord) error {
|
||||
initCh := make(chan struct{})
|
||||
go func() {
|
||||
|
@ -923,6 +897,23 @@ func (c *Core) SetQueryCoord(s types.QueryCoord) error {
|
|||
}
|
||||
return nil
|
||||
}
|
||||
c.CallGetSegmentInfoService = func(ctx context.Context, collectionID int64, segIDs []int64) (retResp *querypb.GetSegmentInfoResponse, retErr error) {
|
||||
defer func() {
|
||||
if err := recover(); err != nil {
|
||||
retErr = fmt.Errorf("call segment info service panic, msg = %v", err)
|
||||
}
|
||||
}()
|
||||
<-initCh
|
||||
resp, err := s.GetSegmentInfo(ctx, &querypb.GetSegmentInfoRequest{
|
||||
Base: &commonpb.MsgBase{
|
||||
MsgType: commonpb.MsgType_GetSegmentState,
|
||||
SourceID: c.session.ServerID,
|
||||
},
|
||||
CollectionID: collectionID,
|
||||
SegmentIDs: segIDs,
|
||||
})
|
||||
return resp, err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
|
@ -2290,6 +2281,8 @@ func (c *Core) Import(ctx context.Context, req *milvuspb.ImportRequest) (*milvus
|
|||
// Get collection/partition ID from collection/partition name.
|
||||
var cID int64
|
||||
var ok bool
|
||||
c.MetaTable.ddLock.RLock()
|
||||
defer c.MetaTable.ddLock.RUnlock()
|
||||
if cID, ok = c.MetaTable.collName2ID[req.GetCollectionName()]; !ok {
|
||||
log.Error("failed to find collection ID for collection name",
|
||||
zap.String("collection name", req.GetCollectionName()))
|
||||
|
@ -2356,10 +2349,11 @@ func (c *Core) ReportImport(ctx context.Context, ir *rootcoordpb.ImportResult) (
|
|||
}, nil
|
||||
}
|
||||
|
||||
// That's all for reporting, if task hasn't reached persisted or completed status yet.
|
||||
if ti.GetState().GetStateCode() != commonpb.ImportState_ImportPersisted &&
|
||||
ti.GetState().GetStateCode() != commonpb.ImportState_ImportCompleted {
|
||||
log.Debug("transitional import state received, return immediately", zap.Any("import result", ir))
|
||||
// So much for reporting, unless the task just reached `ImportPersisted` state.
|
||||
if ir.GetState() != commonpb.ImportState_ImportPersisted {
|
||||
log.Debug("non import-persisted state received, return immediately",
|
||||
zap.Any("task ID", ir.GetTaskId()),
|
||||
zap.Any("import state", ir.GetState()))
|
||||
return &commonpb.Status{
|
||||
ErrorCode: commonpb.ErrorCode_Success,
|
||||
}, nil
|
||||
|
@ -2367,6 +2361,8 @@ func (c *Core) ReportImport(ctx context.Context, ir *rootcoordpb.ImportResult) (
|
|||
|
||||
// Reverse look up collection name on collection ID.
|
||||
var colName string
|
||||
c.MetaTable.ddLock.RLock()
|
||||
defer c.MetaTable.ddLock.RUnlock()
|
||||
for k, v := range c.MetaTable.collName2ID {
|
||||
if v == ti.GetCollectionId() {
|
||||
colName = k
|
||||
|
@ -2390,8 +2386,10 @@ func (c *Core) ReportImport(ctx context.Context, ir *rootcoordpb.ImportResult) (
|
|||
zap.Int64("task ID", ir.GetTaskId()))
|
||||
}()
|
||||
|
||||
// TODO: Resurrect index check when ready.
|
||||
// Flush all import data segments.
|
||||
c.CallFlushOnCollection(ctx, ti.GetCollectionId(), ir.GetSegments())
|
||||
// Check if data are "queryable" and if indices are built on all segments.
|
||||
go c.postImportPersistLoop(c.ctx, ir.GetTaskId(), ti.GetCollectionId(), colName, ir.GetSegments())
|
||||
|
||||
return &commonpb.Status{
|
||||
ErrorCode: commonpb.ErrorCode_Success,
|
||||
|
@ -2467,7 +2465,7 @@ func (c *Core) CountCompleteIndex(ctx context.Context, collectionName string, co
|
|||
zap.Int64("collection ID", collectionID))
|
||||
return 0, nil
|
||||
}
|
||||
states, err := c.CallGetIndexStatesService(ctx, getIndexStatesRequest.IndexBuildIDs)
|
||||
states, err := c.CallGetIndexStatesService(ctx, getIndexStatesRequest.GetIndexBuildIDs())
|
||||
if err != nil {
|
||||
log.Error("failed to get index state in checkSegmentIndexStates", zap.Error(err))
|
||||
return 0, err
|
||||
|
@ -2489,10 +2487,60 @@ func (c *Core) CountCompleteIndex(ctx context.Context, collectionName string, co
|
|||
return ct, nil
|
||||
}
|
||||
|
||||
// checkCompleteIndexLoop checks index build states for an import task's segments and bring these segments online when
|
||||
// the criteria are met. checkCompleteIndexLoop does the check every CheckCompleteIndexInterval and exits if:
|
||||
// (1) a certain percent of indices are built, (2) when context is done or (3) when `ImportIndexWaitLimit` has passed.
|
||||
func (c *Core) checkCompleteIndexLoop(ctx context.Context, ti *datapb.ImportTaskInfo, colName string, segIDs []UniqueID) {
|
||||
func (c *Core) postImportPersistLoop(ctx context.Context, taskID int64, colID int64, colName string, segIDs []UniqueID) {
|
||||
// Loop and check if segments are loaded in queryNodes.
|
||||
c.wg.Add(1)
|
||||
c.checkSegmentLoadedLoop(ctx, taskID, colID, segIDs)
|
||||
// Check if collection has any indexed fields. If so, start a loop to check segments' index states.
|
||||
c.MetaTable.ddLock.RLock()
|
||||
defer c.MetaTable.ddLock.RUnlock()
|
||||
colMeta := c.MetaTable.collID2Meta[colID]
|
||||
if len(colMeta.GetFieldIndexes()) != 0 {
|
||||
c.wg.Add(1)
|
||||
c.checkCompleteIndexLoop(ctx, taskID, colID, colName, segIDs)
|
||||
}
|
||||
}
|
||||
|
||||
// checkSegmentLoadedLoop loops and checks if all segments in `segIDs` are loaded in queryNodes.
|
||||
func (c *Core) checkSegmentLoadedLoop(ctx context.Context, taskID int64, colID int64, segIDs []UniqueID) {
|
||||
defer c.wg.Done()
|
||||
ticker := time.NewTicker(time.Duration(Params.RootCoordCfg.ImportSegmentStateCheckInterval*1000) * time.Millisecond)
|
||||
defer ticker.Stop()
|
||||
expireTicker := time.NewTicker(time.Duration(Params.RootCoordCfg.ImportSegmentStateWaitLimit*1000) * time.Millisecond)
|
||||
defer expireTicker.Stop()
|
||||
for {
|
||||
select {
|
||||
case <-c.ctx.Done():
|
||||
log.Info("(in check segment loaded loop) context done, exiting checkSegmentLoadedLoop")
|
||||
return
|
||||
case <-ticker.C:
|
||||
log.Info("(in check segment loaded loop) check segments' loading states",
|
||||
zap.Int64("task ID", taskID))
|
||||
resp, err := c.CallGetSegmentInfoService(ctx, colID, segIDs)
|
||||
if err != nil {
|
||||
log.Warn("failed to call get segment info on queryCoord",
|
||||
zap.Int64("collection ID", colID),
|
||||
zap.Int64s("segment IDs", segIDs))
|
||||
} else if len(resp.GetInfos()) == len(segIDs) {
|
||||
// Check if all segment info are loaded in queryNodes.
|
||||
log.Info("all import data segments loaded in queryNodes",
|
||||
zap.Int64("collection ID", colID),
|
||||
zap.Int64s("segment IDs", segIDs))
|
||||
c.importManager.updateTaskStateCode(taskID, commonpb.ImportState_DataQueryable)
|
||||
return
|
||||
}
|
||||
case <-expireTicker.C:
|
||||
log.Warn("(in check segment loaded loop) segments still not loaded after max wait time",
|
||||
zap.Int64("task ID", taskID),
|
||||
zap.Int64("collection ID", colID),
|
||||
zap.Int64s("segment IDs", segIDs))
|
||||
return
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// checkCompleteIndexLoop loops and checks if all indices are built for an import task's segments.
|
||||
func (c *Core) checkCompleteIndexLoop(ctx context.Context, taskID int64, colID int64, colName string, segIDs []UniqueID) {
|
||||
defer c.wg.Done()
|
||||
ticker := time.NewTicker(time.Duration(Params.RootCoordCfg.ImportIndexCheckInterval*1000) * time.Millisecond)
|
||||
defer ticker.Stop()
|
||||
|
@ -2501,51 +2549,26 @@ func (c *Core) checkCompleteIndexLoop(ctx context.Context, ti *datapb.ImportTask
|
|||
for {
|
||||
select {
|
||||
case <-c.ctx.Done():
|
||||
log.Info("(in check complete index loop) context done, exiting checkCompleteIndexLoop",
|
||||
zap.Int64("task ID", ti.GetId()))
|
||||
log.Info("(in check complete index loop) context done, exiting checkCompleteIndexLoop")
|
||||
return
|
||||
case <-ticker.C:
|
||||
log.Info("(in check complete index loop) check segments' index states", zap.Int64("task ID", ti.GetId()))
|
||||
if ct, err := c.CountCompleteIndex(ctx, colName, ti.GetCollectionId(), segIDs); err == nil &&
|
||||
segmentsOnlineReady(ct, len(segIDs)) {
|
||||
log.Info("segment indices are ready",
|
||||
zap.Int64("task ID", ti.GetId()),
|
||||
zap.Int("total # of segments", len(segIDs)),
|
||||
zap.Int("# of segments with index ready", ct))
|
||||
c.bringSegmentsOnline(ctx, segIDs)
|
||||
log.Info("(in check complete index loop) check segments' index states",
|
||||
zap.Int64("task ID", taskID))
|
||||
if ct, err := c.CountCompleteIndex(ctx, colName, colID, segIDs); err == nil && ct == len(segIDs) {
|
||||
log.Info("all segment indices are ready!")
|
||||
c.importManager.updateTaskStateCode(taskID, commonpb.ImportState_DataIndexed)
|
||||
return
|
||||
}
|
||||
case <-expireTicker.C:
|
||||
log.Info("(in check complete index loop) waited for sufficiently long time, bring segments online",
|
||||
zap.Int64("task ID", ti.GetId()))
|
||||
c.bringSegmentsOnline(ctx, segIDs)
|
||||
log.Warn("(in check complete index loop) indexing is taken too long",
|
||||
zap.Int64("task ID", taskID),
|
||||
zap.Int64("collection ID", colID),
|
||||
zap.Int64s("segment IDs", segIDs))
|
||||
return
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// bringSegmentsOnline brings the segments online so that data in these segments become searchable
|
||||
// it is done by changing segments' states from `importing` to `flushed`.
|
||||
func (c *Core) bringSegmentsOnline(ctx context.Context, segIDs []UniqueID) {
|
||||
log.Info("bringing import task's segments online!", zap.Any("segment IDs", segIDs))
|
||||
// TODO: Make update on segment states atomic.
|
||||
for _, id := range segIDs {
|
||||
// Explicitly mark segment states `flushing`.
|
||||
c.CallUpdateSegmentStateService(ctx, id, commonpb.SegmentState_Flushing)
|
||||
}
|
||||
}
|
||||
|
||||
// segmentsOnlineReady returns true if segments are ready to go up online (a.k.a. become searchable).
|
||||
func segmentsOnlineReady(idxBuilt, segCount int) bool {
|
||||
// Consider segments are ready when:
|
||||
// (1) all but up to 2 segments have indices ready, or
|
||||
// (2) over 85% of segments have indices ready.
|
||||
if segCount-idxBuilt <= 2 || float64(idxBuilt)/float64(segCount) > 0.85 {
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
// ExpireCredCache will call invalidate credential cache
|
||||
func (c *Core) ExpireCredCache(ctx context.Context, username string) error {
|
||||
req := proxypb.InvalidateCredCacheRequest{
|
||||
|
|
|
@ -704,7 +704,9 @@ func TestRootCoord_Base(t *testing.T) {
|
|||
Params.RootCoordCfg.DmlChannelNum = TestDMLChannelNum
|
||||
Params.RootCoordCfg.ImportIndexCheckInterval = 0.1
|
||||
Params.RootCoordCfg.ImportIndexWaitLimit = 0.2
|
||||
core, err := NewCore(ctx, coreFactory)
|
||||
Params.RootCoordCfg.ImportSegmentStateCheckInterval = 0.1
|
||||
Params.RootCoordCfg.ImportSegmentStateWaitLimit = 0.2
|
||||
core, err := NewCore(context.WithValue(ctx, ctxKey{}, ""), coreFactory)
|
||||
assert.NoError(t, err)
|
||||
randVal := rand.Int()
|
||||
Params.CommonCfg.RootCoordTimeTick = fmt.Sprintf("rootcoord-time-tick-%d", randVal)
|
||||
|
@ -1384,7 +1386,7 @@ func TestRootCoord_Base(t *testing.T) {
|
|||
})
|
||||
|
||||
wg.Add(1)
|
||||
t.Run("list import stasks", func(t *testing.T) {
|
||||
t.Run("list import tasks", func(t *testing.T) {
|
||||
defer wg.Done()
|
||||
req := &milvuspb.ListImportTasksRequest{}
|
||||
rsp, err := core.ListImportTasks(ctx, req)
|
||||
|
@ -1401,7 +1403,7 @@ func TestRootCoord_Base(t *testing.T) {
|
|||
TaskId: 1,
|
||||
RowCount: 100,
|
||||
Segments: []int64{1003, 1004, 1005},
|
||||
State: commonpb.ImportState_ImportCompleted,
|
||||
State: commonpb.ImportState_ImportPersisted,
|
||||
}
|
||||
|
||||
for _, segmentID := range []int64{1003, 1004, 1005} {
|
||||
|
@ -1461,7 +1463,7 @@ func TestRootCoord_Base(t *testing.T) {
|
|||
TaskId: 101,
|
||||
RowCount: 100,
|
||||
Segments: []int64{1003, 1004, 1005},
|
||||
State: commonpb.ImportState_ImportCompleted,
|
||||
State: commonpb.ImportState_ImportPersisted,
|
||||
}
|
||||
resp, err := core.ReportImport(context.WithValue(ctx, ctxKey{}, ""), reqIR)
|
||||
assert.NoError(t, err)
|
||||
|
@ -1484,13 +1486,13 @@ func TestRootCoord_Base(t *testing.T) {
|
|||
})
|
||||
|
||||
wg.Add(1)
|
||||
t.Run("report import bring segments online", func(t *testing.T) {
|
||||
t.Run("report import bring wait for index", func(t *testing.T) {
|
||||
defer wg.Done()
|
||||
req := &rootcoordpb.ImportResult{
|
||||
TaskId: 1,
|
||||
RowCount: 100,
|
||||
Segments: []int64{1000, 1001, 1002},
|
||||
State: commonpb.ImportState_ImportCompleted,
|
||||
State: commonpb.ImportState_ImportPersisted,
|
||||
}
|
||||
resp, err := core.ReportImport(context.WithValue(ctx, ctxKey{}, ""), req)
|
||||
assert.NoError(t, err)
|
||||
|
@ -1505,7 +1507,7 @@ func TestRootCoord_Base(t *testing.T) {
|
|||
TaskId: 1,
|
||||
RowCount: 100,
|
||||
Segments: []int64{999}, /* pre-injected failure for segment ID = 999 */
|
||||
State: commonpb.ImportState_ImportCompleted,
|
||||
State: commonpb.ImportState_ImportPersisted,
|
||||
}
|
||||
resp, err := core.ReportImport(context.WithValue(ctx, ctxKey{}, ""), req)
|
||||
assert.NoError(t, err)
|
||||
|
@ -1528,7 +1530,7 @@ func TestRootCoord_Base(t *testing.T) {
|
|||
&rootcoordpb.ImportResult{
|
||||
TaskId: 1,
|
||||
RowCount: 100,
|
||||
State: commonpb.ImportState_ImportCompleted,
|
||||
State: commonpb.ImportState_ImportPersisted,
|
||||
Segments: []int64{1000, 1001, 1002},
|
||||
})
|
||||
assert.NoError(t, err)
|
||||
|
@ -2950,12 +2952,6 @@ func TestCheckInit(t *testing.T) {
|
|||
err = c.checkInit()
|
||||
assert.Error(t, err)
|
||||
|
||||
c.CallUpdateSegmentStateService = func(ctx context.Context, segID typeutil.UniqueID, ss commonpb.SegmentState) error {
|
||||
return nil
|
||||
}
|
||||
err = c.checkInit()
|
||||
assert.Error(t, err)
|
||||
|
||||
c.CallImportService = func(ctx context.Context, req *datapb.ImportTaskRequest) *datapb.ImportTaskResponse {
|
||||
return &datapb.ImportTaskResponse{
|
||||
Status: &commonpb.Status{
|
||||
|
|
|
@ -381,13 +381,15 @@ type rootCoordConfig struct {
|
|||
Address string
|
||||
Port int
|
||||
|
||||
DmlChannelNum int64
|
||||
MaxPartitionNum int64
|
||||
MinSegmentSizeToEnableIndex int64
|
||||
ImportTaskExpiration float64
|
||||
ImportTaskRetention float64
|
||||
ImportIndexCheckInterval float64
|
||||
ImportIndexWaitLimit float64
|
||||
DmlChannelNum int64
|
||||
MaxPartitionNum int64
|
||||
MinSegmentSizeToEnableIndex int64
|
||||
ImportTaskExpiration float64
|
||||
ImportTaskRetention float64
|
||||
ImportSegmentStateCheckInterval float64
|
||||
ImportSegmentStateWaitLimit float64
|
||||
ImportIndexCheckInterval float64
|
||||
ImportIndexWaitLimit float64
|
||||
|
||||
// --- ETCD Path ---
|
||||
ImportTaskSubPath string
|
||||
|
@ -403,6 +405,8 @@ func (p *rootCoordConfig) init(base *BaseTable) {
|
|||
p.MinSegmentSizeToEnableIndex = p.Base.ParseInt64WithDefault("rootCoord.minSegmentSizeToEnableIndex", 1024)
|
||||
p.ImportTaskExpiration = p.Base.ParseFloatWithDefault("rootCoord.importTaskExpiration", 3600)
|
||||
p.ImportTaskRetention = p.Base.ParseFloatWithDefault("rootCoord.importTaskRetention", 3600*24)
|
||||
p.ImportSegmentStateCheckInterval = p.Base.ParseFloatWithDefault("rootCoord.importSegmentStateCheckInterval", 10)
|
||||
p.ImportSegmentStateWaitLimit = p.Base.ParseFloatWithDefault("rootCoord.importSegmentStateWaitLimit", 60)
|
||||
p.ImportIndexCheckInterval = p.Base.ParseFloatWithDefault("rootCoord.importIndexCheckInterval", 60*5)
|
||||
p.ImportIndexWaitLimit = p.Base.ParseFloatWithDefault("rootCoord.importIndexWaitLimit", 60*20)
|
||||
p.ImportTaskSubPath = "importtask"
|
||||
|
|
Loading…
Reference in New Issue