From 4035083188c8cfacff97fa00fdb333b8da2288df Mon Sep 17 00:00:00 2001 From: neza2017 Date: Mon, 8 Feb 2021 14:49:12 +0800 Subject: [PATCH] Support Index name Signed-off-by: neza2017 --- internal/core/src/pb/etcd_meta.pb.cc | 130 +++++++++++++----- internal/core/src/pb/etcd_meta.pb.h | 84 +++++++++++ .../masterservice/masterservice_test.go | 2 +- internal/masterservice/master_service.go | 2 +- internal/masterservice/master_service_test.go | 7 +- internal/masterservice/meta_table.go | 4 +- internal/masterservice/meta_table_test.go | 6 +- internal/masterservice/task.go | 7 +- internal/proto/etcd_meta.proto | 1 + internal/proto/etcdpb/etcd_meta.pb.go | 115 +++++++++------- 10 files changed, 261 insertions(+), 97 deletions(-) diff --git a/internal/core/src/pb/etcd_meta.pb.cc b/internal/core/src/pb/etcd_meta.pb.cc index 23e4cefb58..360e82ee4c 100644 --- a/internal/core/src/pb/etcd_meta.pb.cc +++ b/internal/core/src/pb/etcd_meta.pb.cc @@ -279,6 +279,7 @@ const ::PROTOBUF_NAMESPACE_ID::uint32 TableStruct_etcd_5fmeta_2eproto::offsets[] PROTOBUF_FIELD_OFFSET(::milvus::proto::etcd::CollectionInfo, create_time_), PROTOBUF_FIELD_OFFSET(::milvus::proto::etcd::CollectionInfo, partitionids_), PROTOBUF_FIELD_OFFSET(::milvus::proto::etcd::CollectionInfo, index_params_), + PROTOBUF_FIELD_OFFSET(::milvus::proto::etcd::CollectionInfo, index_names_), ~0u, // no _has_bits_ PROTOBUF_FIELD_OFFSET(::milvus::proto::etcd::IndexInfo, _internal_metadata_), ~0u, // no _extensions_ @@ -347,12 +348,12 @@ static const ::PROTOBUF_NAMESPACE_ID::internal::MigrationSchema schemas[] PROTOB { 17, -1, sizeof(::milvus::proto::etcd::PartitionInfo)}, { 25, -1, sizeof(::milvus::proto::etcd::IndexParamsInfo)}, { 32, -1, sizeof(::milvus::proto::etcd::CollectionInfo)}, - { 42, -1, sizeof(::milvus::proto::etcd::IndexInfo)}, - { 50, -1, sizeof(::milvus::proto::etcd::SegmentIndexInfo)}, - { 59, -1, sizeof(::milvus::proto::etcd::CollectionMeta)}, - { 70, -1, sizeof(::milvus::proto::etcd::FieldBinlogFiles)}, - { 77, -1, sizeof(::milvus::proto::etcd::SegmentMeta)}, - { 92, -1, sizeof(::milvus::proto::etcd::FieldIndexMeta)}, + { 43, -1, sizeof(::milvus::proto::etcd::IndexInfo)}, + { 51, -1, sizeof(::milvus::proto::etcd::SegmentIndexInfo)}, + { 60, -1, sizeof(::milvus::proto::etcd::CollectionMeta)}, + { 71, -1, sizeof(::milvus::proto::etcd::FieldBinlogFiles)}, + { 78, -1, sizeof(::milvus::proto::etcd::SegmentMeta)}, + { 93, -1, sizeof(::milvus::proto::etcd::FieldIndexMeta)}, }; static ::PROTOBUF_NAMESPACE_ID::Message const * const file_default_instances[] = { @@ -381,35 +382,36 @@ const char descriptor_table_protodef_etcd_5fmeta_2eproto[] PROTOBUF_SECTION_VARI "ID\030\002 \001(\003\022\022\n\nsegmentIDs\030\003 \003(\003\"[\n\017IndexPar" "amsInfo\022\017\n\007filedID\030\001 \001(\003\0227\n\014index_params" "\030\002 \003(\0132!.milvus.proto.common.KeyValuePai" - "r\"\270\001\n\016CollectionInfo\022\n\n\002ID\030\001 \001(\003\0225\n\006sche" + "r\"\315\001\n\016CollectionInfo\022\n\n\002ID\030\001 \001(\003\0225\n\006sche" "ma\030\002 \001(\0132%.milvus.proto.schema.Collectio" "nSchema\022\023\n\013create_time\030\003 \001(\004\022\024\n\014partitio" "nIDs\030\004 \003(\003\0228\n\014index_params\030\005 \003(\0132\".milvu" - "s.proto.etcd.IndexParamsInfo\"i\n\tIndexInf" - "o\022\022\n\nindex_name\030\001 \001(\t\022\017\n\007indexID\030\002 \001(\003\0227" - "\n\014index_params\030\003 \003(\0132!.milvus.proto.comm" - "on.KeyValuePair\"X\n\020SegmentIndexInfo\022\021\n\ts" - "egmentID\030\001 \001(\003\022\017\n\007fieldID\030\002 \001(\003\022\017\n\007index" - "ID\030\003 \001(\003\022\017\n\007buildID\030\004 \001(\003\"\252\001\n\016Collection" - "Meta\022\n\n\002ID\030\001 \001(\003\0225\n\006schema\030\002 \001(\0132%.milvu" - "s.proto.schema.CollectionSchema\022\023\n\013creat" - "e_time\030\003 \001(\004\022\022\n\nsegmentIDs\030\004 \003(\003\022\026\n\016part" - "ition_tags\030\005 \003(\t\022\024\n\014partitionIDs\030\006 \003(\003\"9" - "\n\020FieldBinlogFiles\022\017\n\007fieldID\030\001 \001(\003\022\024\n\014b" - "inlog_files\030\002 \003(\t\"\204\002\n\013SegmentMeta\022\021\n\tseg" - "mentID\030\001 \001(\003\022\024\n\014collectionID\030\002 \001(\003\022\025\n\rpa" - "rtition_tag\030\003 \001(\t\022\025\n\rchannel_start\030\004 \001(\005" - "\022\023\n\013channel_end\030\005 \001(\005\022\021\n\topen_time\030\006 \001(\004" - "\022\022\n\nclose_time\030\007 \001(\004\022\020\n\010num_rows\030\010 \001(\003\022\020" - "\n\010mem_size\030\t \001(\003\022>\n\021binlog_file_paths\030\n " - "\003(\0132#.milvus.proto.etcd.FieldBinlogFiles" - "\"\310\001\n\016FieldIndexMeta\022\021\n\tsegmentID\030\001 \001(\003\022\017" - "\n\007fieldID\030\002 \001(\003\022\017\n\007indexID\030\003 \001(\003\0227\n\014inde" - "x_params\030\004 \003(\0132!.milvus.proto.common.Key" - "ValuePair\022.\n\005state\030\005 \001(\0162\037.milvus.proto." - "common.IndexState\022\030\n\020index_file_paths\030\006 " - "\003(\tB@Z>github.com/zilliztech/milvus-dist" - "ributed/internal/proto/etcdpbb\006proto3" + "s.proto.etcd.IndexParamsInfo\022\023\n\013index_na" + "mes\030\006 \003(\t\"i\n\tIndexInfo\022\022\n\nindex_name\030\001 \001" + "(\t\022\017\n\007indexID\030\002 \001(\003\0227\n\014index_params\030\003 \003(" + "\0132!.milvus.proto.common.KeyValuePair\"X\n\020" + "SegmentIndexInfo\022\021\n\tsegmentID\030\001 \001(\003\022\017\n\007f" + "ieldID\030\002 \001(\003\022\017\n\007indexID\030\003 \001(\003\022\017\n\007buildID" + "\030\004 \001(\003\"\252\001\n\016CollectionMeta\022\n\n\002ID\030\001 \001(\003\0225\n" + "\006schema\030\002 \001(\0132%.milvus.proto.schema.Coll" + "ectionSchema\022\023\n\013create_time\030\003 \001(\004\022\022\n\nseg" + "mentIDs\030\004 \003(\003\022\026\n\016partition_tags\030\005 \003(\t\022\024\n" + "\014partitionIDs\030\006 \003(\003\"9\n\020FieldBinlogFiles\022" + "\017\n\007fieldID\030\001 \001(\003\022\024\n\014binlog_files\030\002 \003(\t\"\204" + "\002\n\013SegmentMeta\022\021\n\tsegmentID\030\001 \001(\003\022\024\n\014col" + "lectionID\030\002 \001(\003\022\025\n\rpartition_tag\030\003 \001(\t\022\025" + "\n\rchannel_start\030\004 \001(\005\022\023\n\013channel_end\030\005 \001" + "(\005\022\021\n\topen_time\030\006 \001(\004\022\022\n\nclose_time\030\007 \001(" + "\004\022\020\n\010num_rows\030\010 \001(\003\022\020\n\010mem_size\030\t \001(\003\022>\n" + "\021binlog_file_paths\030\n \003(\0132#.milvus.proto." + "etcd.FieldBinlogFiles\"\310\001\n\016FieldIndexMeta" + "\022\021\n\tsegmentID\030\001 \001(\003\022\017\n\007fieldID\030\002 \001(\003\022\017\n\007" + "indexID\030\003 \001(\003\0227\n\014index_params\030\004 \003(\0132!.mi" + "lvus.proto.common.KeyValuePair\022.\n\005state\030" + "\005 \001(\0162\037.milvus.proto.common.IndexState\022\030" + "\n\020index_file_paths\030\006 \003(\tB@Z>github.com/z" + "illiztech/milvus-distributed/internal/pr" + "oto/etcdpbb\006proto3" ; static const ::PROTOBUF_NAMESPACE_ID::internal::DescriptorTable*const descriptor_table_etcd_5fmeta_2eproto_deps[2] = { &::descriptor_table_common_2eproto, @@ -431,7 +433,7 @@ static ::PROTOBUF_NAMESPACE_ID::internal::SCCInfoBase*const descriptor_table_etc static ::PROTOBUF_NAMESPACE_ID::internal::once_flag descriptor_table_etcd_5fmeta_2eproto_once; static bool descriptor_table_etcd_5fmeta_2eproto_initialized = false; const ::PROTOBUF_NAMESPACE_ID::internal::DescriptorTable descriptor_table_etcd_5fmeta_2eproto = { - &descriptor_table_etcd_5fmeta_2eproto_initialized, descriptor_table_protodef_etcd_5fmeta_2eproto, "etcd_meta.proto", 1597, + &descriptor_table_etcd_5fmeta_2eproto_initialized, descriptor_table_protodef_etcd_5fmeta_2eproto, "etcd_meta.proto", 1618, &descriptor_table_etcd_5fmeta_2eproto_once, descriptor_table_etcd_5fmeta_2eproto_sccs, descriptor_table_etcd_5fmeta_2eproto_deps, 11, 2, schemas, file_default_instances, TableStruct_etcd_5fmeta_2eproto::offsets, file_level_metadata_etcd_5fmeta_2eproto, 11, file_level_enum_descriptors_etcd_5fmeta_2eproto, file_level_service_descriptors_etcd_5fmeta_2eproto, @@ -1960,7 +1962,8 @@ CollectionInfo::CollectionInfo(const CollectionInfo& from) : ::PROTOBUF_NAMESPACE_ID::Message(), _internal_metadata_(nullptr), partitionids_(from.partitionids_), - index_params_(from.index_params_) { + index_params_(from.index_params_), + index_names_(from.index_names_) { _internal_metadata_.MergeFrom(from._internal_metadata_); if (from.has_schema()) { schema_ = new ::milvus::proto::schema::CollectionSchema(*from.schema_); @@ -2006,6 +2009,7 @@ void CollectionInfo::Clear() { partitionids_.Clear(); index_params_.Clear(); + index_names_.Clear(); if (GetArenaNoVirtual() == nullptr && schema_ != nullptr) { delete schema_; } @@ -2067,6 +2071,18 @@ const char* CollectionInfo::_InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE } while (::PROTOBUF_NAMESPACE_ID::internal::UnalignedLoad<::PROTOBUF_NAMESPACE_ID::uint8>(ptr) == 42); } else goto handle_unusual; continue; + // repeated string index_names = 6; + case 6: + if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 50)) { + ptr -= 1; + do { + ptr += 1; + ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParserUTF8(add_index_names(), ptr, ctx, "milvus.proto.etcd.CollectionInfo.index_names"); + CHK_(ptr); + if (!ctx->DataAvailable(ptr)) break; + } while (::PROTOBUF_NAMESPACE_ID::internal::UnalignedLoad<::PROTOBUF_NAMESPACE_ID::uint8>(ptr) == 50); + } else goto handle_unusual; + continue; default: { handle_unusual: if ((tag & 7) == 4 || tag == 0) { @@ -2161,6 +2177,22 @@ bool CollectionInfo::MergePartialFromCodedStream( break; } + // repeated string index_names = 6; + case 6: { + if (static_cast< ::PROTOBUF_NAMESPACE_ID::uint8>(tag) == (50 & 0xFF)) { + DO_(::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::ReadString( + input, this->add_index_names())); + DO_(::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::VerifyUtf8String( + this->index_names(this->index_names_size() - 1).data(), + static_cast(this->index_names(this->index_names_size() - 1).length()), + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::PARSE, + "milvus.proto.etcd.CollectionInfo.index_names")); + } else { + goto handle_unusual; + } + break; + } + default: { handle_unusual: if (tag == 0) { @@ -2224,6 +2256,16 @@ void CollectionInfo::SerializeWithCachedSizes( output); } + // repeated string index_names = 6; + for (int i = 0, n = this->index_names_size(); i < n; i++) { + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::VerifyUtf8String( + this->index_names(i).data(), static_cast(this->index_names(i).length()), + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::SERIALIZE, + "milvus.proto.etcd.CollectionInfo.index_names"); + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::WriteString( + 6, this->index_names(i), output); + } + if (_internal_metadata_.have_unknown_fields()) { ::PROTOBUF_NAMESPACE_ID::internal::WireFormat::SerializeUnknownFields( _internal_metadata_.unknown_fields(), output); @@ -2275,6 +2317,16 @@ void CollectionInfo::SerializeWithCachedSizes( 5, this->index_params(static_cast(i)), target); } + // repeated string index_names = 6; + for (int i = 0, n = this->index_names_size(); i < n; i++) { + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::VerifyUtf8String( + this->index_names(i).data(), static_cast(this->index_names(i).length()), + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::SERIALIZE, + "milvus.proto.etcd.CollectionInfo.index_names"); + target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite:: + WriteStringToArray(6, this->index_names(i), target); + } + if (_internal_metadata_.have_unknown_fields()) { target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormat::SerializeUnknownFieldsToArray( _internal_metadata_.unknown_fields(), target); @@ -2322,6 +2374,14 @@ size_t CollectionInfo::ByteSizeLong() const { } } + // repeated string index_names = 6; + total_size += 1 * + ::PROTOBUF_NAMESPACE_ID::internal::FromIntSize(this->index_names_size()); + for (int i = 0, n = this->index_names_size(); i < n; i++) { + total_size += ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::StringSize( + this->index_names(i)); + } + // .milvus.proto.schema.CollectionSchema schema = 2; if (this->has_schema()) { total_size += 1 + @@ -2372,6 +2432,7 @@ void CollectionInfo::MergeFrom(const CollectionInfo& from) { partitionids_.MergeFrom(from.partitionids_); index_params_.MergeFrom(from.index_params_); + index_names_.MergeFrom(from.index_names_); if (from.has_schema()) { mutable_schema()->::milvus::proto::schema::CollectionSchema::MergeFrom(from.schema()); } @@ -2406,6 +2467,7 @@ void CollectionInfo::InternalSwap(CollectionInfo* other) { _internal_metadata_.Swap(&other->_internal_metadata_); partitionids_.InternalSwap(&other->partitionids_); CastToBase(&index_params_)->InternalSwap(CastToBase(&other->index_params_)); + index_names_.InternalSwap(CastToBase(&other->index_names_)); swap(schema_, other->schema_); swap(id_, other->id_); swap(create_time_, other->create_time_); diff --git a/internal/core/src/pb/etcd_meta.pb.h b/internal/core/src/pb/etcd_meta.pb.h index edbe92f3f1..d81298c6fb 100644 --- a/internal/core/src/pb/etcd_meta.pb.h +++ b/internal/core/src/pb/etcd_meta.pb.h @@ -861,6 +861,7 @@ class CollectionInfo : enum : int { kPartitionIDsFieldNumber = 4, kIndexParamsFieldNumber = 5, + kIndexNamesFieldNumber = 6, kSchemaFieldNumber = 2, kIDFieldNumber = 1, kCreateTimeFieldNumber = 3, @@ -887,6 +888,23 @@ class CollectionInfo : const ::PROTOBUF_NAMESPACE_ID::RepeatedPtrField< ::milvus::proto::etcd::IndexParamsInfo >& index_params() const; + // repeated string index_names = 6; + int index_names_size() const; + void clear_index_names(); + const std::string& index_names(int index) const; + std::string* mutable_index_names(int index); + void set_index_names(int index, const std::string& value); + void set_index_names(int index, std::string&& value); + void set_index_names(int index, const char* value); + void set_index_names(int index, const char* value, size_t size); + std::string* add_index_names(); + void add_index_names(const std::string& value); + void add_index_names(std::string&& value); + void add_index_names(const char* value); + void add_index_names(const char* value, size_t size); + const ::PROTOBUF_NAMESPACE_ID::RepeatedPtrField& index_names() const; + ::PROTOBUF_NAMESPACE_ID::RepeatedPtrField* mutable_index_names(); + // .milvus.proto.schema.CollectionSchema schema = 2; bool has_schema() const; void clear_schema(); @@ -913,6 +931,7 @@ class CollectionInfo : ::PROTOBUF_NAMESPACE_ID::RepeatedField< ::PROTOBUF_NAMESPACE_ID::int64 > partitionids_; mutable std::atomic _partitionids_cached_byte_size_; ::PROTOBUF_NAMESPACE_ID::RepeatedPtrField< ::milvus::proto::etcd::IndexParamsInfo > index_params_; + ::PROTOBUF_NAMESPACE_ID::RepeatedPtrField index_names_; ::milvus::proto::schema::CollectionSchema* schema_; ::PROTOBUF_NAMESPACE_ID::int64 id_; ::PROTOBUF_NAMESPACE_ID::uint64 create_time_; @@ -2527,6 +2546,71 @@ CollectionInfo::index_params() const { return index_params_; } +// repeated string index_names = 6; +inline int CollectionInfo::index_names_size() const { + return index_names_.size(); +} +inline void CollectionInfo::clear_index_names() { + index_names_.Clear(); +} +inline const std::string& CollectionInfo::index_names(int index) const { + // @@protoc_insertion_point(field_get:milvus.proto.etcd.CollectionInfo.index_names) + return index_names_.Get(index); +} +inline std::string* CollectionInfo::mutable_index_names(int index) { + // @@protoc_insertion_point(field_mutable:milvus.proto.etcd.CollectionInfo.index_names) + return index_names_.Mutable(index); +} +inline void CollectionInfo::set_index_names(int index, const std::string& value) { + // @@protoc_insertion_point(field_set:milvus.proto.etcd.CollectionInfo.index_names) + index_names_.Mutable(index)->assign(value); +} +inline void CollectionInfo::set_index_names(int index, std::string&& value) { + // @@protoc_insertion_point(field_set:milvus.proto.etcd.CollectionInfo.index_names) + index_names_.Mutable(index)->assign(std::move(value)); +} +inline void CollectionInfo::set_index_names(int index, const char* value) { + GOOGLE_DCHECK(value != nullptr); + index_names_.Mutable(index)->assign(value); + // @@protoc_insertion_point(field_set_char:milvus.proto.etcd.CollectionInfo.index_names) +} +inline void CollectionInfo::set_index_names(int index, const char* value, size_t size) { + index_names_.Mutable(index)->assign( + reinterpret_cast(value), size); + // @@protoc_insertion_point(field_set_pointer:milvus.proto.etcd.CollectionInfo.index_names) +} +inline std::string* CollectionInfo::add_index_names() { + // @@protoc_insertion_point(field_add_mutable:milvus.proto.etcd.CollectionInfo.index_names) + return index_names_.Add(); +} +inline void CollectionInfo::add_index_names(const std::string& value) { + index_names_.Add()->assign(value); + // @@protoc_insertion_point(field_add:milvus.proto.etcd.CollectionInfo.index_names) +} +inline void CollectionInfo::add_index_names(std::string&& value) { + index_names_.Add(std::move(value)); + // @@protoc_insertion_point(field_add:milvus.proto.etcd.CollectionInfo.index_names) +} +inline void CollectionInfo::add_index_names(const char* value) { + GOOGLE_DCHECK(value != nullptr); + index_names_.Add()->assign(value); + // @@protoc_insertion_point(field_add_char:milvus.proto.etcd.CollectionInfo.index_names) +} +inline void CollectionInfo::add_index_names(const char* value, size_t size) { + index_names_.Add()->assign(reinterpret_cast(value), size); + // @@protoc_insertion_point(field_add_pointer:milvus.proto.etcd.CollectionInfo.index_names) +} +inline const ::PROTOBUF_NAMESPACE_ID::RepeatedPtrField& +CollectionInfo::index_names() const { + // @@protoc_insertion_point(field_list:milvus.proto.etcd.CollectionInfo.index_names) + return index_names_; +} +inline ::PROTOBUF_NAMESPACE_ID::RepeatedPtrField* +CollectionInfo::mutable_index_names() { + // @@protoc_insertion_point(field_mutable_list:milvus.proto.etcd.CollectionInfo.index_names) + return &index_names_; +} + // ------------------------------------------------------------------- // IndexInfo diff --git a/internal/distributed/masterservice/masterservice_test.go b/internal/distributed/masterservice/masterservice_test.go index f69d7a2124..47ce375ec3 100644 --- a/internal/distributed/masterservice/masterservice_test.go +++ b/internal/distributed/masterservice/masterservice_test.go @@ -519,7 +519,7 @@ func TestGrpcService(t *testing.T) { assert.Equal(t, rsp.Status.ErrorCode, commonpb.ErrorCode_SUCCESS) assert.Equal(t, len(rsp.IndexDescriptions), 2) assert.Equal(t, rsp.IndexDescriptions[0].IndexName, cms.Params.DefaultIndexName) - assert.Equal(t, rsp.IndexDescriptions[1].IndexName, "index_field_100_0") + assert.Equal(t, rsp.IndexDescriptions[1].IndexName, "testColl_index_100") }) diff --git a/internal/masterservice/master_service.go b/internal/masterservice/master_service.go index 02095d5922..9f6ffa6adc 100644 --- a/internal/masterservice/master_service.go +++ b/internal/masterservice/master_service.go @@ -381,7 +381,7 @@ func (c *Core) startSegmentFlushCompletedLoop() { t := &CreateIndexTask{ core: c, segmentID: seg, - indexName: fmt.Sprintf("index_field_%d_%d", f.FiledID, i), + indexName: coll.IndexNames[i], fieldSchema: fieldSch, indexParams: nil, } diff --git a/internal/masterservice/master_service_test.go b/internal/masterservice/master_service_test.go index 7c1210a8cb..94fe38471d 100644 --- a/internal/masterservice/master_service_test.go +++ b/internal/masterservice/master_service_test.go @@ -592,6 +592,7 @@ func TestMasterService(t *testing.T) { collMeta, err := core.MetaTable.GetCollectionByName("testColl") assert.Nil(t, err) assert.Equal(t, len(collMeta.IndexParams), 1) + assert.Equal(t, len(collMeta.IndexNames), 1) rsp, err := core.CreateIndex(req) assert.Nil(t, err) @@ -603,6 +604,8 @@ func TestMasterService(t *testing.T) { collMeta, err = core.MetaTable.GetCollectionByName("testColl") assert.Nil(t, err) assert.Equal(t, len(collMeta.IndexParams), 2) + assert.Equal(t, len(collMeta.IndexNames), 2) + assert.Equal(t, collMeta.IndexNames[1], Params.DefaultIndexName) req.FieldName = "no field" rsp, err = core.CreateIndex(req) @@ -731,8 +734,8 @@ func TestMasterService(t *testing.T) { } assert.ElementsMatch(t, indexNames, []string{ - "index_field_100_0", - "index_field_100_1", + "testColl_index_100", + Params.DefaultIndexName, Params.DefaultIndexName, }) }) diff --git a/internal/masterservice/meta_table.go b/internal/masterservice/meta_table.go index 73ce36f399..c66f10741f 100644 --- a/internal/masterservice/meta_table.go +++ b/internal/masterservice/meta_table.go @@ -634,7 +634,7 @@ func (mt *metaTable) unlockIsSegmentIndexed(segID typeutil.UniqueID, fieldSchema } // return segment ids, type params, error -func (mt *metaTable) GetNotIndexedSegments(collName string, fieldName string, indexParams []*commonpb.KeyValuePair) ([]typeutil.UniqueID, schemapb.FieldSchema, error) { +func (mt *metaTable) GetNotIndexedSegments(collName string, fieldName string, indexParams []*commonpb.KeyValuePair, indexName string) ([]typeutil.UniqueID, schemapb.FieldSchema, error) { mt.ddLock.Lock() defer mt.ddLock.Unlock() @@ -655,6 +655,7 @@ func (mt *metaTable) GetNotIndexedSegments(collName string, fieldName string, in if indexParams != nil { for _, f := range collMeta.IndexParams { if f.FiledID == fieldSchema.FieldID { + // (collMeta.IndexNames[i] == indexName) if EqualKeyPairArray(f.IndexParams, indexParams) { exist = true break @@ -667,6 +668,7 @@ func (mt *metaTable) GetNotIndexedSegments(collName string, fieldName string, in FiledID: fieldSchema.FieldID, IndexParams: indexParams, }) + collMeta.IndexNames = append(collMeta.IndexNames, indexName) mt.collID2Meta[collMeta.ID] = collMeta k1 := path.Join(CollectionMetaPrefix, strconv.FormatInt(collMeta.ID, 10)) v1 := proto.MarshalTextString(&collMeta) diff --git a/internal/masterservice/meta_table_test.go b/internal/masterservice/meta_table_test.go index 24486a3d0d..da8ccdcdce 100644 --- a/internal/masterservice/meta_table_test.go +++ b/internal/masterservice/meta_table_test.go @@ -151,9 +151,9 @@ func TestMetaTable(t *testing.T) { }, } - _, field, err := mt.GetNotIndexedSegments("collTest", "field110", params) + _, field, err := mt.GetNotIndexedSegments("collTest", "field110", params, "field110-idx") assert.NotNil(t, err) - seg, field, err := mt.GetNotIndexedSegments("testColl", "field110", params) + seg, field, err := mt.GetNotIndexedSegments("testColl", "field110", params, "field110-idx") assert.Nil(t, err) assert.Equal(t, len(seg), 1) assert.Equal(t, seg[0], int64(101)) @@ -166,7 +166,7 @@ func TestMetaTable(t *testing.T) { }, } - seg, field, err = mt.GetNotIndexedSegments("testColl", "field110", params) + seg, field, err = mt.GetNotIndexedSegments("testColl", "field110", params, "field110-idx") assert.Nil(t, err) assert.Equal(t, len(seg), 2) assert.Equal(t, seg[0], int64(100)) diff --git a/internal/masterservice/task.go b/internal/masterservice/task.go index 1a051a3535..b378e1b02a 100644 --- a/internal/masterservice/task.go +++ b/internal/masterservice/task.go @@ -109,6 +109,7 @@ func (t *CreateCollectionReqTask) Execute() error { CreateTime: collTs, PartitionIDs: make([]typeutil.UniqueID, 0, 16), IndexParams: make([]*etcdpb.IndexParamsInfo, 0, 16), + IndexNames: make([]string, 0, 16), } partMeta := etcdpb.PartitionInfo{ PartitionName: Params.DefaultPartitionName, @@ -123,6 +124,7 @@ func (t *CreateCollectionReqTask) Execute() error { IndexParams: field.IndexParams, } collMeta.IndexParams = append(collMeta.IndexParams, indexParam) + collMeta.IndexNames = append(collMeta.IndexNames, fmt.Sprintf("%s_index_%d", collMeta.Schema.Name, field.FieldID)) } } } @@ -582,7 +584,8 @@ func (t *CreateIndexReqTask) IgnoreTimeStamp() bool { } func (t *CreateIndexReqTask) Execute() error { - segIDs, field, err := t.core.MetaTable.GetNotIndexedSegments(t.Req.CollectionName, t.Req.FieldName, t.Req.ExtraParams) + indexName := Params.DefaultIndexName //TODO, get name from request + segIDs, field, err := t.core.MetaTable.GetNotIndexedSegments(t.Req.CollectionName, t.Req.FieldName, t.Req.ExtraParams, indexName) if err != nil { return err } @@ -593,7 +596,7 @@ func (t *CreateIndexReqTask) Execute() error { task := CreateIndexTask{ core: t.core, segmentID: seg, - indexName: Params.DefaultIndexName, //TODO, get name from request + indexName: indexName, fieldSchema: &field, indexParams: t.Req.ExtraParams, } diff --git a/internal/proto/etcd_meta.proto b/internal/proto/etcd_meta.proto index d6719301ff..d23129eb64 100644 --- a/internal/proto/etcd_meta.proto +++ b/internal/proto/etcd_meta.proto @@ -35,6 +35,7 @@ message CollectionInfo { uint64 create_time = 3; repeated int64 partitionIDs = 4; repeated IndexParamsInfo index_params = 5; + repeated string index_names = 6; } message IndexInfo { diff --git a/internal/proto/etcdpb/etcd_meta.pb.go b/internal/proto/etcdpb/etcd_meta.pb.go index fd7f6cae9f..4f8a24d3c9 100644 --- a/internal/proto/etcdpb/etcd_meta.pb.go +++ b/internal/proto/etcdpb/etcd_meta.pb.go @@ -248,6 +248,7 @@ type CollectionInfo struct { CreateTime uint64 `protobuf:"varint,3,opt,name=create_time,json=createTime,proto3" json:"create_time,omitempty"` PartitionIDs []int64 `protobuf:"varint,4,rep,packed,name=partitionIDs,proto3" json:"partitionIDs,omitempty"` IndexParams []*IndexParamsInfo `protobuf:"bytes,5,rep,name=index_params,json=indexParams,proto3" json:"index_params,omitempty"` + IndexNames []string `protobuf:"bytes,6,rep,name=index_names,json=indexNames,proto3" json:"index_names,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -313,6 +314,13 @@ func (m *CollectionInfo) GetIndexParams() []*IndexParamsInfo { return nil } +func (m *CollectionInfo) GetIndexNames() []string { + if m != nil { + return m.IndexNames + } + return nil +} + type IndexInfo struct { IndexName string `protobuf:"bytes,1,opt,name=index_name,json=indexName,proto3" json:"index_name,omitempty"` IndexID int64 `protobuf:"varint,2,opt,name=indexID,proto3" json:"indexID,omitempty"` @@ -764,58 +772,59 @@ func init() { func init() { proto.RegisterFile("etcd_meta.proto", fileDescriptor_975d306d62b73e88) } var fileDescriptor_975d306d62b73e88 = []byte{ - // 844 bytes of a gzipped FileDescriptorProto + // 861 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x55, 0x5d, 0x8f, 0xdb, 0x44, - 0x14, 0x55, 0x3e, 0x36, 0x59, 0xdf, 0x64, 0x93, 0xdd, 0x79, 0x32, 0xa5, 0xa5, 0xa9, 0xab, 0x42, - 0x24, 0x44, 0x22, 0x2d, 0x82, 0x37, 0x10, 0xb4, 0x69, 0xa5, 0x08, 0xd1, 0x06, 0x67, 0xc5, 0x03, - 0x2f, 0xd6, 0xc4, 0xbe, 0x4d, 0x46, 0xf2, 0x8c, 0x53, 0xcf, 0x98, 0xee, 0xee, 0x03, 0xe2, 0x15, - 0x7e, 0x02, 0x7f, 0x91, 0xdf, 0x80, 0x84, 0x7c, 0xc7, 0x71, 0xec, 0x6c, 0x84, 0xd0, 0x4a, 0x7d, - 0x9c, 0x73, 0xcf, 0x78, 0xee, 0x3d, 0xe7, 0x9e, 0x04, 0x86, 0x68, 0xc2, 0x28, 0x90, 0x68, 0xf8, - 0x64, 0x9b, 0x26, 0x26, 0x61, 0x17, 0x52, 0xc4, 0xbf, 0x66, 0xda, 0x9e, 0x26, 0x79, 0xf5, 0x41, - 0x3f, 0x4c, 0xa4, 0x4c, 0x94, 0x85, 0x1e, 0xf4, 0x75, 0xb8, 0x41, 0x59, 0xd0, 0xbd, 0xbf, 0x1a, - 0x00, 0x57, 0xa8, 0xb8, 0x32, 0x3f, 0xa2, 0xe1, 0x6c, 0x00, 0xcd, 0xf9, 0xcc, 0x6d, 0x8c, 0x1a, - 0xe3, 0x96, 0xdf, 0x9c, 0xcf, 0xd8, 0xa7, 0x30, 0x54, 0x99, 0x0c, 0xde, 0x65, 0x98, 0xde, 0x04, - 0x2a, 0x89, 0x50, 0xbb, 0x4d, 0x2a, 0x9e, 0xa9, 0x4c, 0xfe, 0x94, 0xa3, 0xaf, 0x73, 0x90, 0x7d, - 0x0e, 0x17, 0x42, 0x69, 0x4c, 0x4d, 0x10, 0x6e, 0xb8, 0x52, 0x18, 0xcf, 0x67, 0xda, 0x6d, 0x8d, - 0x5a, 0x63, 0xc7, 0x3f, 0xb7, 0x85, 0x17, 0x25, 0xce, 0x3e, 0x83, 0xa1, 0xfd, 0x60, 0xc9, 0x75, - 0xdb, 0xa3, 0xc6, 0xd8, 0xf1, 0x07, 0x04, 0x97, 0x4c, 0xef, 0xf7, 0x06, 0x38, 0x8b, 0x34, 0xb9, - 0xbe, 0x39, 0xda, 0xdb, 0xd7, 0xd0, 0xe5, 0x51, 0x94, 0xa2, 0xb6, 0x3d, 0xf5, 0x2e, 0x1f, 0x4e, - 0x6a, 0xb3, 0x17, 0x53, 0x7f, 0x6f, 0x39, 0xfe, 0x8e, 0x9c, 0xf7, 0x9a, 0xa2, 0xce, 0xe2, 0x63, - 0xbd, 0xda, 0xc2, 0xbe, 0x57, 0xef, 0x1a, 0xce, 0x16, 0x3c, 0x35, 0xc2, 0x88, 0x44, 0xcd, 0xd5, - 0xdb, 0x84, 0x3d, 0x83, 0xc1, 0x76, 0x07, 0x04, 0x8a, 0x4b, 0xa4, 0x8e, 0x1c, 0xff, 0xac, 0x44, - 0x5f, 0x73, 0x89, 0x6c, 0x04, 0xbd, 0x12, 0x98, 0xcf, 0x0a, 0xd1, 0xaa, 0x10, 0xfb, 0x04, 0x40, - 0xe3, 0x5a, 0xa2, 0x32, 0xbb, 0xf7, 0x5b, 0x7e, 0x05, 0xf1, 0xde, 0xc1, 0x70, 0xae, 0x22, 0xbc, - 0x5e, 0xf0, 0x94, 0x4b, 0x4d, 0x6f, 0xbb, 0xd0, 0x7d, 0x2b, 0x62, 0x8c, 0x4a, 0x19, 0x76, 0x47, - 0x36, 0x83, 0xbe, 0xc8, 0xc9, 0xc1, 0x96, 0xd8, 0x6e, 0x73, 0xd4, 0x1a, 0xf7, 0x2e, 0x9f, 0x1c, - 0x15, 0xe4, 0x07, 0xbc, 0xf9, 0x99, 0xc7, 0x19, 0x2e, 0xb8, 0x48, 0xfd, 0x9e, 0xd8, 0xbf, 0xe1, - 0xfd, 0xdd, 0x80, 0xc1, 0x8b, 0x24, 0x8e, 0x31, 0x2c, 0xc7, 0x3d, 0x14, 0xfd, 0x1b, 0xe8, 0xd8, - 0xfd, 0x29, 0x34, 0x7f, 0x56, 0x7f, 0xa2, 0xd8, 0xad, 0xfd, 0x47, 0x96, 0x04, 0xf8, 0xc5, 0x25, - 0xf6, 0x18, 0x7a, 0x61, 0x8a, 0xdc, 0x60, 0x60, 0x84, 0x44, 0xb7, 0x35, 0x6a, 0x8c, 0xdb, 0x3e, - 0x58, 0xe8, 0x4a, 0x48, 0x64, 0x1e, 0xf4, 0x2b, 0x22, 0x69, 0xb7, 0x4d, 0xba, 0xd4, 0x30, 0xf6, - 0xf2, 0x60, 0xd8, 0x13, 0x1a, 0xd6, 0x9b, 0xdc, 0xd9, 0xfc, 0xc9, 0x81, 0x80, 0xf5, 0x69, 0xff, - 0x6c, 0x80, 0x43, 0x04, 0x1a, 0xf4, 0x11, 0x80, 0xfd, 0x68, 0xc5, 0x53, 0x87, 0x10, 0xf2, 0xd3, - 0x85, 0x2e, 0x1d, 0x4a, 0x2f, 0x77, 0xc7, 0x3b, 0xd2, 0xb7, 0xee, 0x25, 0xfd, 0x6f, 0x70, 0xbe, - 0x2c, 0xbc, 0x2f, 0x5b, 0x7a, 0x08, 0x4e, 0xb9, 0x0f, 0x85, 0x05, 0x7b, 0xc0, 0x2e, 0x03, 0xc6, - 0xd1, 0xbe, 0xa3, 0xe2, 0x58, 0xed, 0xb5, 0x55, 0xef, 0xd5, 0x85, 0xee, 0x2a, 0x13, 0x74, 0xa7, - 0x6d, 0x2b, 0xc5, 0xf1, 0xc0, 0xfa, 0xa3, 0x79, 0xfb, 0xd0, 0xd6, 0xd7, 0x03, 0xd1, 0x3e, 0x0c, - 0x44, 0x3d, 0x79, 0x86, 0xaf, 0xad, 0xf1, 0xd5, 0xe4, 0x5d, 0xf1, 0xb5, 0xbe, 0xb3, 0x41, 0x9d, - 0xbb, 0x1b, 0xe4, 0xbd, 0x81, 0xf3, 0x57, 0xb9, 0x58, 0xcf, 0x85, 0x8a, 0x93, 0xf5, 0x2b, 0x11, - 0xa3, 0xae, 0xea, 0xd9, 0xa8, 0xeb, 0xf9, 0x04, 0xfa, 0x2b, 0x22, 0x06, 0x79, 0xdc, 0x6c, 0xb8, - 0x1c, 0xbf, 0xb7, 0xda, 0x5f, 0xf6, 0xfe, 0x69, 0x42, 0xaf, 0xf0, 0x8f, 0xb4, 0xfb, 0x6f, 0xeb, - 0x3c, 0xe8, 0x87, 0xfb, 0x98, 0xed, 0xfc, 0xab, 0x61, 0xec, 0x29, 0x9c, 0xd5, 0xa6, 0x25, 0xc1, - 0x9c, 0xca, 0x1c, 0x57, 0x7c, 0x9d, 0x93, 0x8a, 0xdf, 0xb0, 0x40, 0x1b, 0x9e, 0x1a, 0x72, 0xf5, - 0xc4, 0xef, 0x17, 0xe0, 0x32, 0xc7, 0x48, 0xf8, 0x82, 0x84, 0x2a, 0x72, 0x4f, 0x88, 0x02, 0x05, - 0xf4, 0x52, 0x45, 0xec, 0x63, 0x70, 0x92, 0x2d, 0x2a, 0xeb, 0x4b, 0x87, 0x7c, 0x39, 0xcd, 0x01, - 0x72, 0xe5, 0x11, 0x40, 0x18, 0x27, 0xba, 0x70, 0xad, 0x4b, 0x55, 0x87, 0x10, 0x2a, 0x7f, 0x04, - 0xa7, 0xf9, 0x1f, 0x44, 0x9a, 0xbc, 0xd7, 0xee, 0xa9, 0x95, 0x4d, 0x65, 0xd2, 0x4f, 0xde, 0xeb, - 0xbc, 0x24, 0x51, 0x06, 0x5a, 0xdc, 0xa2, 0xeb, 0xd8, 0x92, 0x44, 0xb9, 0x14, 0xb7, 0xc8, 0xde, - 0xc0, 0x45, 0x45, 0xd1, 0x60, 0xcb, 0xcd, 0x46, 0xbb, 0x40, 0xc1, 0x79, 0x7a, 0x24, 0xc6, 0x87, - 0x5e, 0xf9, 0xc3, 0xbd, 0xf6, 0x8b, 0xfc, 0xae, 0xf7, 0x47, 0x13, 0x06, 0xc4, 0xa2, 0xf4, 0xfc, - 0x0f, 0x0b, 0xee, 0x93, 0x9e, 0xc3, 0xa4, 0xb7, 0xef, 0x93, 0x74, 0xf6, 0x15, 0x9c, 0x68, 0xc3, - 0x0d, 0x92, 0x11, 0x83, 0xcb, 0xc7, 0x47, 0xaf, 0xd3, 0x18, 0xcb, 0x9c, 0xe6, 0x5b, 0x36, 0x1b, - 0xc3, 0xb9, 0x7d, 0xbc, 0xa2, 0x58, 0x87, 0x16, 0x71, 0x40, 0x78, 0xa9, 0xc5, 0xf3, 0xef, 0x7e, - 0xf9, 0x76, 0x2d, 0xcc, 0x26, 0x5b, 0xe5, 0x1f, 0x9b, 0xde, 0x8a, 0x38, 0x16, 0xb7, 0x06, 0xc3, - 0xcd, 0xd4, 0x3e, 0xf4, 0x45, 0x24, 0xb4, 0x49, 0xc5, 0x2a, 0x33, 0x18, 0x4d, 0x85, 0x32, 0x98, - 0x2a, 0x1e, 0x4f, 0xe9, 0xf5, 0x69, 0xae, 0xf6, 0x76, 0xb5, 0xea, 0xd0, 0xe9, 0xcb, 0x7f, 0x03, - 0x00, 0x00, 0xff, 0xff, 0xf3, 0x18, 0xad, 0xa6, 0x5d, 0x08, 0x00, 0x00, + 0x14, 0x95, 0x93, 0x6c, 0x76, 0x7d, 0x93, 0x4d, 0x76, 0xfd, 0x64, 0x4a, 0x4b, 0x53, 0x57, 0x85, + 0x48, 0x88, 0x44, 0x5a, 0x04, 0x6f, 0x20, 0x68, 0xd3, 0x4a, 0x11, 0xa2, 0x0d, 0xce, 0x8a, 0x07, + 0x5e, 0xac, 0x89, 0x7d, 0x9b, 0x8c, 0xe4, 0x19, 0xa7, 0x9e, 0x31, 0xdd, 0xdd, 0x07, 0xc4, 0x2b, + 0x88, 0x5f, 0xc0, 0x5f, 0xe4, 0x37, 0x20, 0xa1, 0xf9, 0x88, 0x3f, 0x92, 0x08, 0xa1, 0x95, 0x78, + 0x9c, 0x73, 0xcf, 0xcc, 0xbd, 0xf7, 0x9c, 0x7b, 0x6d, 0x18, 0xa2, 0x8c, 0x93, 0x88, 0xa1, 0x24, + 0x93, 0x6d, 0x9e, 0xc9, 0xcc, 0xbb, 0x64, 0x34, 0xfd, 0xb9, 0x10, 0xe6, 0x34, 0x51, 0xd1, 0x07, + 0xfd, 0x38, 0x63, 0x2c, 0xe3, 0x06, 0x7a, 0xd0, 0x17, 0xf1, 0x06, 0x99, 0xa5, 0x07, 0x7f, 0x3a, + 0x00, 0xd7, 0xc8, 0x09, 0x97, 0xdf, 0xa3, 0x24, 0xde, 0x00, 0x5a, 0xf3, 0x99, 0xef, 0x8c, 0x9c, + 0x71, 0x3b, 0x6c, 0xcd, 0x67, 0xde, 0xc7, 0x30, 0xe4, 0x05, 0x8b, 0xde, 0x15, 0x98, 0xdf, 0x46, + 0x3c, 0x4b, 0x50, 0xf8, 0x2d, 0x1d, 0x3c, 0xe7, 0x05, 0xfb, 0x41, 0xa1, 0xaf, 0x15, 0xe8, 0x7d, + 0x0a, 0x97, 0x94, 0x0b, 0xcc, 0x65, 0x14, 0x6f, 0x08, 0xe7, 0x98, 0xce, 0x67, 0xc2, 0x6f, 0x8f, + 0xda, 0x63, 0x37, 0xbc, 0x30, 0x81, 0x17, 0x25, 0xee, 0x7d, 0x02, 0x43, 0xf3, 0x60, 0xc9, 0xf5, + 0x3b, 0x23, 0x67, 0xec, 0x86, 0x03, 0x0d, 0x97, 0xcc, 0xe0, 0x57, 0x07, 0xdc, 0x45, 0x9e, 0xdd, + 0xdc, 0x1e, 0xad, 0xed, 0x4b, 0x38, 0x25, 0x49, 0x92, 0xa3, 0x30, 0x35, 0xf5, 0xae, 0x1e, 0x4e, + 0x1a, 0xbd, 0xdb, 0xae, 0xbf, 0x35, 0x9c, 0x70, 0x47, 0x56, 0xb5, 0xe6, 0x28, 0x8a, 0xf4, 0x58, + 0xad, 0x26, 0x50, 0xd5, 0x1a, 0xdc, 0xc0, 0xf9, 0x82, 0xe4, 0x92, 0x4a, 0x9a, 0xf1, 0x39, 0x7f, + 0x9b, 0x79, 0xcf, 0x60, 0xb0, 0xdd, 0x01, 0x11, 0x27, 0x0c, 0x75, 0x45, 0x6e, 0x78, 0x5e, 0xa2, + 0xaf, 0x09, 0x43, 0x6f, 0x04, 0xbd, 0x12, 0x98, 0xcf, 0xac, 0x68, 0x75, 0xc8, 0xfb, 0x08, 0x40, + 0xe0, 0x9a, 0x21, 0x97, 0xbb, 0xfc, 0xed, 0xb0, 0x86, 0x04, 0xef, 0x60, 0x38, 0xe7, 0x09, 0xde, + 0x2c, 0x48, 0x4e, 0x98, 0xd0, 0xb9, 0x7d, 0x38, 0x7d, 0x4b, 0x53, 0x4c, 0x4a, 0x19, 0x76, 0x47, + 0x6f, 0x06, 0x7d, 0xaa, 0xc8, 0xd1, 0x56, 0xb3, 0xfd, 0xd6, 0xa8, 0x3d, 0xee, 0x5d, 0x3d, 0x39, + 0x2a, 0xc8, 0x77, 0x78, 0xfb, 0x23, 0x49, 0x0b, 0x5c, 0x10, 0x9a, 0x87, 0x3d, 0x5a, 0xe5, 0x08, + 0xfe, 0x68, 0xc1, 0xe0, 0x45, 0x96, 0xa6, 0x18, 0x97, 0xed, 0xee, 0x8b, 0xfe, 0x15, 0x74, 0xcd, + 0xfc, 0x58, 0xcd, 0x9f, 0x35, 0x53, 0xd8, 0xd9, 0xaa, 0x1e, 0x59, 0x6a, 0x20, 0xb4, 0x97, 0xbc, + 0xc7, 0xd0, 0x8b, 0x73, 0x24, 0x12, 0x23, 0x49, 0x19, 0xfa, 0xed, 0x91, 0x33, 0xee, 0x84, 0x60, + 0xa0, 0x6b, 0xca, 0xd0, 0x0b, 0xa0, 0x5f, 0x13, 0x49, 0xf8, 0x1d, 0xad, 0x4b, 0x03, 0xf3, 0x5e, + 0xee, 0x35, 0x7b, 0xa2, 0x9b, 0x0d, 0x26, 0x07, 0x93, 0x3f, 0xd9, 0x13, 0xb0, 0xd1, 0xad, 0xaa, + 0xc5, 0x3c, 0xa3, 0x5c, 0x14, 0x7e, 0x57, 0x4f, 0x00, 0x68, 0x48, 0x59, 0x28, 0x82, 0xdf, 0x1d, + 0x70, 0xf5, 0x0b, 0x5a, 0x89, 0x47, 0x00, 0x15, 0xdd, 0x9a, 0xee, 0x96, 0x6c, 0xe5, 0x8d, 0x3e, + 0x94, 0x66, 0xef, 0x8e, 0x07, 0xde, 0xb4, 0xef, 0xe5, 0xcd, 0x2f, 0x70, 0xb1, 0xb4, 0xc3, 0x51, + 0x96, 0xf4, 0x10, 0xdc, 0x72, 0x60, 0xac, 0x47, 0x15, 0x60, 0xa6, 0x05, 0xd3, 0xa4, 0xaa, 0xc8, + 0x1e, 0xeb, 0xb5, 0xb6, 0x9b, 0xb5, 0xfa, 0x70, 0xba, 0x2a, 0xa8, 0xbe, 0xd3, 0x31, 0x11, 0x7b, + 0x0c, 0xfe, 0x72, 0xea, 0xb3, 0x71, 0x74, 0x21, 0xff, 0xef, 0xd9, 0x68, 0x6e, 0x4c, 0x67, 0x7f, + 0x63, 0x9a, 0xab, 0x29, 0xc9, 0xda, 0x4c, 0x46, 0x7d, 0x35, 0xaf, 0xc9, 0x5a, 0x1c, 0x8c, 0x58, + 0xf7, 0x70, 0xc4, 0x82, 0x37, 0x70, 0xf1, 0x4a, 0x89, 0xf5, 0x9c, 0xf2, 0x34, 0x5b, 0xbf, 0xa2, + 0x29, 0x8a, 0xba, 0x9e, 0x4e, 0x53, 0xcf, 0x27, 0xd0, 0x5f, 0x69, 0x62, 0xa4, 0xf6, 0xd1, 0x6c, + 0x9f, 0x1b, 0xf6, 0x56, 0xd5, 0xe5, 0xe0, 0xef, 0x16, 0xf4, 0xac, 0x7f, 0x5a, 0xbb, 0x7f, 0xb7, + 0x2e, 0x80, 0x7e, 0x5c, 0xed, 0xe1, 0xce, 0xbf, 0x06, 0xe6, 0x3d, 0x85, 0xf3, 0x46, 0xb7, 0x5a, + 0x30, 0xb7, 0xd6, 0xc7, 0x35, 0x59, 0x2b, 0x92, 0xfd, 0xc8, 0x45, 0x42, 0x92, 0x5c, 0x6a, 0x57, + 0x4f, 0xc2, 0xbe, 0x05, 0x97, 0x0a, 0xd3, 0xc2, 0x5b, 0x12, 0xf2, 0xc4, 0x3f, 0xd1, 0x14, 0xb0, + 0xd0, 0x4b, 0x9e, 0x78, 0x1f, 0x82, 0x9b, 0x6d, 0x91, 0x1b, 0x5f, 0xba, 0xda, 0x97, 0x33, 0x05, + 0x68, 0x57, 0x1e, 0x01, 0xc4, 0x69, 0x26, 0xac, 0x6b, 0xa7, 0x3a, 0xea, 0x6a, 0x44, 0x87, 0x3f, + 0x80, 0x33, 0xf5, 0x07, 0xc9, 0xb3, 0xf7, 0xc2, 0x3f, 0x33, 0xb2, 0xf1, 0x82, 0x85, 0xd9, 0x7b, + 0xa1, 0x42, 0x0c, 0x59, 0x24, 0xe8, 0x1d, 0xfa, 0xae, 0x09, 0x31, 0x64, 0x4b, 0x7a, 0x87, 0xde, + 0x1b, 0xb8, 0xac, 0x29, 0x1a, 0x6d, 0x89, 0xdc, 0x08, 0x1f, 0xf4, 0xe2, 0x3c, 0x3d, 0xb2, 0xe7, + 0xfb, 0x5e, 0x85, 0xc3, 0x4a, 0xfb, 0x85, 0xba, 0x1b, 0xfc, 0xd6, 0x82, 0x81, 0x66, 0xe9, 0xed, + 0xf9, 0x0f, 0x16, 0xdc, 0x67, 0x7b, 0xf6, 0x37, 0xbd, 0x73, 0x9f, 0x4d, 0xf7, 0xbe, 0x80, 0x13, + 0x21, 0x89, 0x44, 0x6d, 0xc4, 0xe0, 0xea, 0xf1, 0xd1, 0xeb, 0xba, 0x8d, 0xa5, 0xa2, 0x85, 0x86, + 0xed, 0x8d, 0xe1, 0xc2, 0x24, 0xaf, 0x29, 0x66, 0xbe, 0x69, 0x03, 0x8d, 0x97, 0x5a, 0x3c, 0xff, + 0xe6, 0xa7, 0xaf, 0xd7, 0x54, 0x6e, 0x8a, 0x95, 0x7a, 0x6c, 0x7a, 0x47, 0xd3, 0x94, 0xde, 0x49, + 0x8c, 0x37, 0x53, 0x93, 0xe8, 0xb3, 0x84, 0x0a, 0x99, 0xd3, 0x55, 0x21, 0x31, 0x99, 0x52, 0x2e, + 0x31, 0xe7, 0x24, 0x9d, 0xea, 0xec, 0x53, 0xa5, 0xf6, 0x76, 0xb5, 0xea, 0xea, 0xd3, 0xe7, 0xff, + 0x04, 0x00, 0x00, 0xff, 0xff, 0x85, 0x45, 0xd7, 0x1c, 0x7e, 0x08, 0x00, 0x00, }