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
Ten Thousand Leaves 2022-05-05 21:17:50 +08:00 committed by GitHub
parent c82e2453eb
commit 1acd256481
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
12 changed files with 289 additions and 237 deletions

View File

@ -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

View File

@ -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;

View File

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

View File

@ -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) {

View File

@ -222,5 +222,7 @@ enum ImportState {
ImportDownloaded = 3;
ImportParsed = 4;
ImportPersisted = 5;
ImportCompleted = 6;
DataQueryable = 6;
DataIndexed = 7;
ImportCompleted = 8;
}

View File

@ -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,
}

View File

@ -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,

View File

@ -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")

View File

@ -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

View File

@ -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{

View File

@ -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{

View File

@ -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"