Create default partition when receive CreateCollectionMsg (#6305)

* create default partition when create collection

Signed-off-by: yudong.cai <yudong.cai@zilliz.com>

* fix unittest

Signed-off-by: yudong.cai <yudong.cai@zilliz.com>

* adjust sleep time for unittest

Signed-off-by: yudong.cai <yudong.cai@zilliz.com>
pull/6316/head
Cai Yudong 2021-07-06 09:16:03 +08:00 committed by GitHub
parent b5851d0e22
commit 21a9bcd844
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
13 changed files with 468 additions and 507 deletions

View File

@ -202,7 +202,7 @@ const ::PROTOBUF_NAMESPACE_ID::uint32 TableStruct_etcd_5fmeta_2eproto::offsets[]
PROTOBUF_FIELD_OFFSET(::milvus::proto::etcd::CollectionInfo, schema_),
PROTOBUF_FIELD_OFFSET(::milvus::proto::etcd::CollectionInfo, create_time_),
PROTOBUF_FIELD_OFFSET(::milvus::proto::etcd::CollectionInfo, partitionids_),
PROTOBUF_FIELD_OFFSET(::milvus::proto::etcd::CollectionInfo, partitonnames_),
PROTOBUF_FIELD_OFFSET(::milvus::proto::etcd::CollectionInfo, partitionnames_),
PROTOBUF_FIELD_OFFSET(::milvus::proto::etcd::CollectionInfo, field_indexes_),
PROTOBUF_FIELD_OFFSET(::milvus::proto::etcd::CollectionInfo, virtual_channel_names_),
PROTOBUF_FIELD_OFFSET(::milvus::proto::etcd::CollectionInfo, physical_channel_names_),
@ -261,24 +261,24 @@ const char descriptor_table_protodef_etcd_5fmeta_2eproto[] PROTOBUF_SECTION_VARI
"\022\n\nindex_name\030\001 \001(\t\022\017\n\007indexID\030\002 \001(\003\0227\n\014"
"index_params\030\003 \003(\0132!.milvus.proto.common"
".KeyValuePair\"2\n\016FieldIndexInfo\022\017\n\007filed"
"ID\030\001 \001(\003\022\017\n\007indexID\030\002 \001(\003\"\216\002\n\016Collection"
"ID\030\001 \001(\003\022\017\n\007indexID\030\002 \001(\003\"\217\002\n\016Collection"
"Info\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\024\n\014partitionIDs\030\004 \003(\003\022\025\n\rpa"
"rtitonNames\030\005 \003(\t\0228\n\rfield_indexes\030\006 \003(\013"
"2!.milvus.proto.etcd.FieldIndexInfo\022\035\n\025v"
"irtual_channel_names\030\007 \003(\t\022\036\n\026physical_c"
"hannel_names\030\010 \003(\t\"\231\001\n\020SegmentIndexInfo\022"
"\024\n\014collectionID\030\001 \001(\003\022\023\n\013partitionID\030\002 \001"
"(\003\022\021\n\tsegmentID\030\003 \001(\003\022\017\n\007fieldID\030\004 \001(\003\022\017"
"\n\007indexID\030\005 \001(\003\022\017\n\007buildID\030\006 \001(\003\022\024\n\014enab"
"le_index\030\007 \001(\010\"\252\001\n\016CollectionMeta\022\n\n\002ID\030"
"\001 \001(\003\0225\n\006schema\030\002 \001(\0132%.milvus.proto.sch"
"ema.CollectionSchema\022\023\n\013create_time\030\003 \001("
"\004\022\022\n\nsegmentIDs\030\004 \003(\003\022\026\n\016partition_tags\030"
"\005 \003(\t\022\024\n\014partitionIDs\030\006 \003(\003B3Z1github.co"
"m/milvus-io/milvus/internal/proto/etcdpb"
"b\006proto3"
"e_time\030\003 \001(\004\022\024\n\014partitionIDs\030\004 \003(\003\022\026\n\016pa"
"rtitionNames\030\005 \003(\t\0228\n\rfield_indexes\030\006 \003("
"\0132!.milvus.proto.etcd.FieldIndexInfo\022\035\n\025"
"virtual_channel_names\030\007 \003(\t\022\036\n\026physical_"
"channel_names\030\010 \003(\t\"\231\001\n\020SegmentIndexInfo"
"\022\024\n\014collectionID\030\001 \001(\003\022\023\n\013partitionID\030\002 "
"\001(\003\022\021\n\tsegmentID\030\003 \001(\003\022\017\n\007fieldID\030\004 \001(\003\022"
"\017\n\007indexID\030\005 \001(\003\022\017\n\007buildID\030\006 \001(\003\022\024\n\014ena"
"ble_index\030\007 \001(\010\"\252\001\n\016CollectionMeta\022\n\n\002ID"
"\030\001 \001(\003\0225\n\006schema\030\002 \001(\0132%.milvus.proto.sc"
"hema.CollectionSchema\022\023\n\013create_time\030\003 \001"
"(\004\022\022\n\nsegmentIDs\030\004 \003(\003\022\026\n\016partition_tags"
"\030\005 \003(\t\022\024\n\014partitionIDs\030\006 \003(\003B3Z1github.c"
"om/milvus-io/milvus/internal/proto/etcdp"
"bb\006proto3"
;
static const ::PROTOBUF_NAMESPACE_ID::internal::DescriptorTable*const descriptor_table_etcd_5fmeta_2eproto_deps[2] = {
&::descriptor_table_common_2eproto,
@ -296,7 +296,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", 1088,
&descriptor_table_etcd_5fmeta_2eproto_initialized, descriptor_table_protodef_etcd_5fmeta_2eproto, "etcd_meta.proto", 1089,
&descriptor_table_etcd_5fmeta_2eproto_once, descriptor_table_etcd_5fmeta_2eproto_sccs, descriptor_table_etcd_5fmeta_2eproto_deps, 7, 2,
schemas, file_default_instances, TableStruct_etcd_5fmeta_2eproto::offsets,
file_level_metadata_etcd_5fmeta_2eproto, 7, file_level_enum_descriptors_etcd_5fmeta_2eproto, file_level_service_descriptors_etcd_5fmeta_2eproto,
@ -1802,7 +1802,7 @@ CollectionInfo::CollectionInfo(const CollectionInfo& from)
: ::PROTOBUF_NAMESPACE_ID::Message(),
_internal_metadata_(nullptr),
partitionids_(from.partitionids_),
partitonnames_(from.partitonnames_),
partitionnames_(from.partitionnames_),
field_indexes_(from.field_indexes_),
virtual_channel_names_(from.virtual_channel_names_),
physical_channel_names_(from.physical_channel_names_) {
@ -1850,7 +1850,7 @@ void CollectionInfo::Clear() {
(void) cached_has_bits;
partitionids_.Clear();
partitonnames_.Clear();
partitionnames_.Clear();
field_indexes_.Clear();
virtual_channel_names_.Clear();
physical_channel_names_.Clear();
@ -1903,13 +1903,13 @@ const char* CollectionInfo::_InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE
CHK_(ptr);
} else goto handle_unusual;
continue;
// repeated string partitonNames = 5;
// repeated string partitionNames = 5;
case 5:
if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 42)) {
ptr -= 1;
do {
ptr += 1;
ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParserUTF8(add_partitonnames(), ptr, ctx, "milvus.proto.etcd.CollectionInfo.partitonNames");
ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParserUTF8(add_partitionnames(), ptr, ctx, "milvus.proto.etcd.CollectionInfo.partitionNames");
CHK_(ptr);
if (!ctx->DataAvailable(ptr)) break;
} while (::PROTOBUF_NAMESPACE_ID::internal::UnalignedLoad<::PROTOBUF_NAMESPACE_ID::uint8>(ptr) == 42);
@ -2034,16 +2034,16 @@ bool CollectionInfo::MergePartialFromCodedStream(
break;
}
// repeated string partitonNames = 5;
// repeated string partitionNames = 5;
case 5: {
if (static_cast< ::PROTOBUF_NAMESPACE_ID::uint8>(tag) == (42 & 0xFF)) {
DO_(::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::ReadString(
input, this->add_partitonnames()));
input, this->add_partitionnames()));
DO_(::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::VerifyUtf8String(
this->partitonnames(this->partitonnames_size() - 1).data(),
static_cast<int>(this->partitonnames(this->partitonnames_size() - 1).length()),
this->partitionnames(this->partitionnames_size() - 1).data(),
static_cast<int>(this->partitionnames(this->partitionnames_size() - 1).length()),
::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::PARSE,
"milvus.proto.etcd.CollectionInfo.partitonNames"));
"milvus.proto.etcd.CollectionInfo.partitionNames"));
} else {
goto handle_unusual;
}
@ -2147,14 +2147,14 @@ void CollectionInfo::SerializeWithCachedSizes(
this->partitionids(i), output);
}
// repeated string partitonNames = 5;
for (int i = 0, n = this->partitonnames_size(); i < n; i++) {
// repeated string partitionNames = 5;
for (int i = 0, n = this->partitionnames_size(); i < n; i++) {
::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::VerifyUtf8String(
this->partitonnames(i).data(), static_cast<int>(this->partitonnames(i).length()),
this->partitionnames(i).data(), static_cast<int>(this->partitionnames(i).length()),
::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::SERIALIZE,
"milvus.proto.etcd.CollectionInfo.partitonNames");
"milvus.proto.etcd.CollectionInfo.partitionNames");
::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::WriteString(
5, this->partitonnames(i), output);
5, this->partitionnames(i), output);
}
// repeated .milvus.proto.etcd.FieldIndexInfo field_indexes = 6;
@ -2229,14 +2229,14 @@ void CollectionInfo::SerializeWithCachedSizes(
WriteInt64NoTagToArray(this->partitionids_, target);
}
// repeated string partitonNames = 5;
for (int i = 0, n = this->partitonnames_size(); i < n; i++) {
// repeated string partitionNames = 5;
for (int i = 0, n = this->partitionnames_size(); i < n; i++) {
::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::VerifyUtf8String(
this->partitonnames(i).data(), static_cast<int>(this->partitonnames(i).length()),
this->partitionnames(i).data(), static_cast<int>(this->partitionnames(i).length()),
::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::SERIALIZE,
"milvus.proto.etcd.CollectionInfo.partitonNames");
"milvus.proto.etcd.CollectionInfo.partitionNames");
target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::
WriteStringToArray(5, this->partitonnames(i), target);
WriteStringToArray(5, this->partitionnames(i), target);
}
// repeated .milvus.proto.etcd.FieldIndexInfo field_indexes = 6;
@ -2303,12 +2303,12 @@ size_t CollectionInfo::ByteSizeLong() const {
total_size += data_size;
}
// repeated string partitonNames = 5;
// repeated string partitionNames = 5;
total_size += 1 *
::PROTOBUF_NAMESPACE_ID::internal::FromIntSize(this->partitonnames_size());
for (int i = 0, n = this->partitonnames_size(); i < n; i++) {
::PROTOBUF_NAMESPACE_ID::internal::FromIntSize(this->partitionnames_size());
for (int i = 0, n = this->partitionnames_size(); i < n; i++) {
total_size += ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::StringSize(
this->partitonnames(i));
this->partitionnames(i));
}
// repeated .milvus.proto.etcd.FieldIndexInfo field_indexes = 6;
@ -2387,7 +2387,7 @@ void CollectionInfo::MergeFrom(const CollectionInfo& from) {
(void) cached_has_bits;
partitionids_.MergeFrom(from.partitionids_);
partitonnames_.MergeFrom(from.partitonnames_);
partitionnames_.MergeFrom(from.partitionnames_);
field_indexes_.MergeFrom(from.field_indexes_);
virtual_channel_names_.MergeFrom(from.virtual_channel_names_);
physical_channel_names_.MergeFrom(from.physical_channel_names_);
@ -2424,7 +2424,7 @@ void CollectionInfo::InternalSwap(CollectionInfo* other) {
using std::swap;
_internal_metadata_.Swap(&other->_internal_metadata_);
partitionids_.InternalSwap(&other->partitionids_);
partitonnames_.InternalSwap(CastToBase(&other->partitonnames_));
partitionnames_.InternalSwap(CastToBase(&other->partitionnames_));
CastToBase(&field_indexes_)->InternalSwap(CastToBase(&other->field_indexes_));
virtual_channel_names_.InternalSwap(CastToBase(&other->virtual_channel_names_));
physical_channel_names_.InternalSwap(CastToBase(&other->physical_channel_names_));

View File

@ -837,7 +837,7 @@ class CollectionInfo :
enum : int {
kPartitionIDsFieldNumber = 4,
kPartitonNamesFieldNumber = 5,
kPartitionNamesFieldNumber = 5,
kFieldIndexesFieldNumber = 6,
kVirtualChannelNamesFieldNumber = 7,
kPhysicalChannelNamesFieldNumber = 8,
@ -856,22 +856,22 @@ class CollectionInfo :
::PROTOBUF_NAMESPACE_ID::RepeatedField< ::PROTOBUF_NAMESPACE_ID::int64 >*
mutable_partitionids();
// repeated string partitonNames = 5;
int partitonnames_size() const;
void clear_partitonnames();
const std::string& partitonnames(int index) const;
std::string* mutable_partitonnames(int index);
void set_partitonnames(int index, const std::string& value);
void set_partitonnames(int index, std::string&& value);
void set_partitonnames(int index, const char* value);
void set_partitonnames(int index, const char* value, size_t size);
std::string* add_partitonnames();
void add_partitonnames(const std::string& value);
void add_partitonnames(std::string&& value);
void add_partitonnames(const char* value);
void add_partitonnames(const char* value, size_t size);
const ::PROTOBUF_NAMESPACE_ID::RepeatedPtrField<std::string>& partitonnames() const;
::PROTOBUF_NAMESPACE_ID::RepeatedPtrField<std::string>* mutable_partitonnames();
// repeated string partitionNames = 5;
int partitionnames_size() const;
void clear_partitionnames();
const std::string& partitionnames(int index) const;
std::string* mutable_partitionnames(int index);
void set_partitionnames(int index, const std::string& value);
void set_partitionnames(int index, std::string&& value);
void set_partitionnames(int index, const char* value);
void set_partitionnames(int index, const char* value, size_t size);
std::string* add_partitionnames();
void add_partitionnames(const std::string& value);
void add_partitionnames(std::string&& value);
void add_partitionnames(const char* value);
void add_partitionnames(const char* value, size_t size);
const ::PROTOBUF_NAMESPACE_ID::RepeatedPtrField<std::string>& partitionnames() const;
::PROTOBUF_NAMESPACE_ID::RepeatedPtrField<std::string>* mutable_partitionnames();
// repeated .milvus.proto.etcd.FieldIndexInfo field_indexes = 6;
int field_indexes_size() const;
@ -943,7 +943,7 @@ class CollectionInfo :
::PROTOBUF_NAMESPACE_ID::internal::InternalMetadataWithArena _internal_metadata_;
::PROTOBUF_NAMESPACE_ID::RepeatedField< ::PROTOBUF_NAMESPACE_ID::int64 > partitionids_;
mutable std::atomic<int> _partitionids_cached_byte_size_;
::PROTOBUF_NAMESPACE_ID::RepeatedPtrField<std::string> partitonnames_;
::PROTOBUF_NAMESPACE_ID::RepeatedPtrField<std::string> partitionnames_;
::PROTOBUF_NAMESPACE_ID::RepeatedPtrField< ::milvus::proto::etcd::FieldIndexInfo > field_indexes_;
::PROTOBUF_NAMESPACE_ID::RepeatedPtrField<std::string> virtual_channel_names_;
::PROTOBUF_NAMESPACE_ID::RepeatedPtrField<std::string> physical_channel_names_;
@ -1839,69 +1839,69 @@ CollectionInfo::mutable_partitionids() {
return &partitionids_;
}
// repeated string partitonNames = 5;
inline int CollectionInfo::partitonnames_size() const {
return partitonnames_.size();
// repeated string partitionNames = 5;
inline int CollectionInfo::partitionnames_size() const {
return partitionnames_.size();
}
inline void CollectionInfo::clear_partitonnames() {
partitonnames_.Clear();
inline void CollectionInfo::clear_partitionnames() {
partitionnames_.Clear();
}
inline const std::string& CollectionInfo::partitonnames(int index) const {
// @@protoc_insertion_point(field_get:milvus.proto.etcd.CollectionInfo.partitonNames)
return partitonnames_.Get(index);
inline const std::string& CollectionInfo::partitionnames(int index) const {
// @@protoc_insertion_point(field_get:milvus.proto.etcd.CollectionInfo.partitionNames)
return partitionnames_.Get(index);
}
inline std::string* CollectionInfo::mutable_partitonnames(int index) {
// @@protoc_insertion_point(field_mutable:milvus.proto.etcd.CollectionInfo.partitonNames)
return partitonnames_.Mutable(index);
inline std::string* CollectionInfo::mutable_partitionnames(int index) {
// @@protoc_insertion_point(field_mutable:milvus.proto.etcd.CollectionInfo.partitionNames)
return partitionnames_.Mutable(index);
}
inline void CollectionInfo::set_partitonnames(int index, const std::string& value) {
// @@protoc_insertion_point(field_set:milvus.proto.etcd.CollectionInfo.partitonNames)
partitonnames_.Mutable(index)->assign(value);
inline void CollectionInfo::set_partitionnames(int index, const std::string& value) {
// @@protoc_insertion_point(field_set:milvus.proto.etcd.CollectionInfo.partitionNames)
partitionnames_.Mutable(index)->assign(value);
}
inline void CollectionInfo::set_partitonnames(int index, std::string&& value) {
// @@protoc_insertion_point(field_set:milvus.proto.etcd.CollectionInfo.partitonNames)
partitonnames_.Mutable(index)->assign(std::move(value));
inline void CollectionInfo::set_partitionnames(int index, std::string&& value) {
// @@protoc_insertion_point(field_set:milvus.proto.etcd.CollectionInfo.partitionNames)
partitionnames_.Mutable(index)->assign(std::move(value));
}
inline void CollectionInfo::set_partitonnames(int index, const char* value) {
inline void CollectionInfo::set_partitionnames(int index, const char* value) {
GOOGLE_DCHECK(value != nullptr);
partitonnames_.Mutable(index)->assign(value);
// @@protoc_insertion_point(field_set_char:milvus.proto.etcd.CollectionInfo.partitonNames)
partitionnames_.Mutable(index)->assign(value);
// @@protoc_insertion_point(field_set_char:milvus.proto.etcd.CollectionInfo.partitionNames)
}
inline void CollectionInfo::set_partitonnames(int index, const char* value, size_t size) {
partitonnames_.Mutable(index)->assign(
inline void CollectionInfo::set_partitionnames(int index, const char* value, size_t size) {
partitionnames_.Mutable(index)->assign(
reinterpret_cast<const char*>(value), size);
// @@protoc_insertion_point(field_set_pointer:milvus.proto.etcd.CollectionInfo.partitonNames)
// @@protoc_insertion_point(field_set_pointer:milvus.proto.etcd.CollectionInfo.partitionNames)
}
inline std::string* CollectionInfo::add_partitonnames() {
// @@protoc_insertion_point(field_add_mutable:milvus.proto.etcd.CollectionInfo.partitonNames)
return partitonnames_.Add();
inline std::string* CollectionInfo::add_partitionnames() {
// @@protoc_insertion_point(field_add_mutable:milvus.proto.etcd.CollectionInfo.partitionNames)
return partitionnames_.Add();
}
inline void CollectionInfo::add_partitonnames(const std::string& value) {
partitonnames_.Add()->assign(value);
// @@protoc_insertion_point(field_add:milvus.proto.etcd.CollectionInfo.partitonNames)
inline void CollectionInfo::add_partitionnames(const std::string& value) {
partitionnames_.Add()->assign(value);
// @@protoc_insertion_point(field_add:milvus.proto.etcd.CollectionInfo.partitionNames)
}
inline void CollectionInfo::add_partitonnames(std::string&& value) {
partitonnames_.Add(std::move(value));
// @@protoc_insertion_point(field_add:milvus.proto.etcd.CollectionInfo.partitonNames)
inline void CollectionInfo::add_partitionnames(std::string&& value) {
partitionnames_.Add(std::move(value));
// @@protoc_insertion_point(field_add:milvus.proto.etcd.CollectionInfo.partitionNames)
}
inline void CollectionInfo::add_partitonnames(const char* value) {
inline void CollectionInfo::add_partitionnames(const char* value) {
GOOGLE_DCHECK(value != nullptr);
partitonnames_.Add()->assign(value);
// @@protoc_insertion_point(field_add_char:milvus.proto.etcd.CollectionInfo.partitonNames)
partitionnames_.Add()->assign(value);
// @@protoc_insertion_point(field_add_char:milvus.proto.etcd.CollectionInfo.partitionNames)
}
inline void CollectionInfo::add_partitonnames(const char* value, size_t size) {
partitonnames_.Add()->assign(reinterpret_cast<const char*>(value), size);
// @@protoc_insertion_point(field_add_pointer:milvus.proto.etcd.CollectionInfo.partitonNames)
inline void CollectionInfo::add_partitionnames(const char* value, size_t size) {
partitionnames_.Add()->assign(reinterpret_cast<const char*>(value), size);
// @@protoc_insertion_point(field_add_pointer:milvus.proto.etcd.CollectionInfo.partitionNames)
}
inline const ::PROTOBUF_NAMESPACE_ID::RepeatedPtrField<std::string>&
CollectionInfo::partitonnames() const {
// @@protoc_insertion_point(field_list:milvus.proto.etcd.CollectionInfo.partitonNames)
return partitonnames_;
CollectionInfo::partitionnames() const {
// @@protoc_insertion_point(field_list:milvus.proto.etcd.CollectionInfo.partitionNames)
return partitionnames_;
}
inline ::PROTOBUF_NAMESPACE_ID::RepeatedPtrField<std::string>*
CollectionInfo::mutable_partitonnames() {
// @@protoc_insertion_point(field_mutable_list:milvus.proto.etcd.CollectionInfo.partitonNames)
return &partitonnames_;
CollectionInfo::mutable_partitionnames() {
// @@protoc_insertion_point(field_mutable_list:milvus.proto.etcd.CollectionInfo.partitionNames)
return &partitionnames_;
}
// repeated .milvus.proto.etcd.FieldIndexInfo field_indexes = 6;

View File

@ -34,7 +34,7 @@ message CollectionInfo {
schema.CollectionSchema schema = 2;
uint64 create_time = 3;
repeated int64 partitionIDs = 4;
repeated string partitonNames = 5;
repeated string partitionNames = 5;
repeated FieldIndexInfo field_indexes = 6;
repeated string virtual_channel_names = 7;
repeated string physical_channel_names = 8;

View File

@ -247,7 +247,7 @@ type CollectionInfo struct {
Schema *schemapb.CollectionSchema `protobuf:"bytes,2,opt,name=schema,proto3" json:"schema,omitempty"`
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"`
PartitonNames []string `protobuf:"bytes,5,rep,name=partitonNames,proto3" json:"partitonNames,omitempty"`
PartitionNames []string `protobuf:"bytes,5,rep,name=partitionNames,proto3" json:"partitionNames,omitempty"`
FieldIndexes []*FieldIndexInfo `protobuf:"bytes,6,rep,name=field_indexes,json=fieldIndexes,proto3" json:"field_indexes,omitempty"`
VirtualChannelNames []string `protobuf:"bytes,7,rep,name=virtual_channel_names,json=virtualChannelNames,proto3" json:"virtual_channel_names,omitempty"`
PhysicalChannelNames []string `protobuf:"bytes,8,rep,name=physical_channel_names,json=physicalChannelNames,proto3" json:"physical_channel_names,omitempty"`
@ -309,9 +309,9 @@ func (m *CollectionInfo) GetPartitionIDs() []int64 {
return nil
}
func (m *CollectionInfo) GetPartitonNames() []string {
func (m *CollectionInfo) GetPartitionNames() []string {
if m != nil {
return m.PartitonNames
return m.PartitionNames
}
return nil
}
@ -516,47 +516,47 @@ func init() {
func init() { proto.RegisterFile("etcd_meta.proto", fileDescriptor_975d306d62b73e88) }
var fileDescriptor_975d306d62b73e88 = []byte{
// 666 bytes of a gzipped FileDescriptorProto
// 664 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x53, 0xcd, 0x6e, 0xd3, 0x4c,
0x14, 0x95, 0x93, 0x36, 0xa9, 0x6f, 0xdc, 0xb4, 0x9d, 0xef, 0x47, 0x56, 0xd5, 0xef, 0xc3, 0xb5,
0x28, 0x44, 0x42, 0x24, 0xa2, 0x45, 0xec, 0x58, 0x40, 0xad, 0x4a, 0x11, 0xa2, 0x2a, 0x6e, 0xc5,
0x82, 0x8d, 0x35, 0xb1, 0x6f, 0x92, 0x91, 0xec, 0x71, 0xf0, 0x8c, 0xab, 0x66, 0xc7, 0x9a, 0x47,
0xe0, 0x05, 0x59, 0xf0, 0x0a, 0x2c, 0x90, 0x67, 0x6c, 0x27, 0x6e, 0xc3, 0x92, 0x9d, 0xcf, 0xb9,
0x73, 0xc7, 0xe7, 0x9e, 0x7b, 0x06, 0xf6, 0x50, 0x86, 0x51, 0x90, 0xa0, 0xa4, 0xc3, 0x45, 0x96,
0xca, 0x94, 0x1c, 0x24, 0x2c, 0xbe, 0xcd, 0x85, 0x46, 0xc3, 0xa2, 0x7a, 0x68, 0x85, 0x69, 0x92,
0xa4, 0x5c, 0x53, 0x87, 0x96, 0x08, 0xe7, 0x98, 0x94, 0xc7, 0xdd, 0x6f, 0x06, 0xc0, 0x0d, 0x72,
0xca, 0xe5, 0x7b, 0x94, 0x94, 0xf4, 0xa1, 0x35, 0xf6, 0x6c, 0xc3, 0x31, 0x06, 0x6d, 0xbf, 0x35,
0xf6, 0xc8, 0x13, 0xd8, 0xe3, 0x79, 0x12, 0x7c, 0xce, 0x31, 0x5b, 0x06, 0x3c, 0x8d, 0x50, 0xd8,
0x2d, 0x55, 0xdc, 0xe5, 0x79, 0xf2, 0xa1, 0x60, 0x2f, 0x0b, 0x92, 0x3c, 0x83, 0x03, 0xc6, 0x05,
0x66, 0x32, 0x08, 0xe7, 0x94, 0x73, 0x8c, 0xc7, 0x9e, 0xb0, 0xdb, 0x4e, 0x7b, 0x60, 0xfa, 0xfb,
0xba, 0x70, 0x5e, 0xf3, 0xe4, 0x29, 0xec, 0xe9, 0x0b, 0xeb, 0xb3, 0xf6, 0x96, 0x63, 0x0c, 0x4c,
0xbf, 0xaf, 0xe8, 0xfa, 0xa4, 0xfb, 0xc5, 0x00, 0xf3, 0x2a, 0x4b, 0xef, 0x96, 0x1b, 0xb5, 0xbd,
0x82, 0x2e, 0x8d, 0xa2, 0x0c, 0x85, 0xd6, 0xd4, 0x3b, 0x3d, 0x1a, 0x36, 0x66, 0x2f, 0xa7, 0x7e,
0xa3, 0xcf, 0xf8, 0xd5, 0xe1, 0x42, 0x6b, 0x86, 0x22, 0x8f, 0x37, 0x69, 0xd5, 0x85, 0x95, 0x56,
0xf7, 0xab, 0x01, 0xe6, 0x98, 0x47, 0x78, 0x37, 0xe6, 0xd3, 0x94, 0xfc, 0x07, 0xc0, 0x0a, 0x10,
0x70, 0x9a, 0xa0, 0x92, 0x62, 0xfa, 0xa6, 0x62, 0x2e, 0x69, 0x82, 0xc4, 0x86, 0xae, 0x02, 0x63,
0xaf, 0x74, 0xa9, 0x82, 0xc4, 0x03, 0x4b, 0x37, 0x2e, 0x68, 0x46, 0x13, 0xfd, 0xbb, 0xde, 0xe9,
0xf1, 0x46, 0xc1, 0xef, 0x70, 0xf9, 0x91, 0xc6, 0x39, 0x5e, 0x51, 0x96, 0xf9, 0x3d, 0xd5, 0x76,
0xa5, 0xba, 0x5c, 0x0f, 0xfa, 0x17, 0x0c, 0xe3, 0x68, 0x25, 0xc8, 0x86, 0xee, 0x94, 0xc5, 0x18,
0xd5, 0xc6, 0x54, 0xf0, 0xf7, 0x5a, 0xdc, 0x9f, 0x2d, 0xe8, 0x9f, 0xa7, 0x71, 0x8c, 0xa1, 0x64,
0x29, 0x57, 0xd7, 0xdc, 0xb7, 0xf6, 0x35, 0x74, 0x74, 0x4a, 0x4a, 0x67, 0x4f, 0x9a, 0x42, 0xcb,
0x04, 0xad, 0x2e, 0xb9, 0x56, 0x84, 0x5f, 0x36, 0x91, 0x47, 0xd0, 0x0b, 0x33, 0xa4, 0x12, 0x03,
0xc9, 0x12, 0xb4, 0xdb, 0x8e, 0x31, 0xd8, 0xf2, 0x41, 0x53, 0x37, 0x2c, 0x41, 0xe2, 0x82, 0xb5,
0xa0, 0x99, 0x64, 0x4a, 0x80, 0x27, 0xec, 0x2d, 0xa7, 0x3d, 0x68, 0xfb, 0x0d, 0x8e, 0x3c, 0x86,
0x5d, 0x8d, 0x53, 0x5e, 0x98, 0x2b, 0xec, 0x6d, 0xb5, 0xa2, 0x26, 0x49, 0x2e, 0x60, 0x77, 0x5a,
0x58, 0x12, 0xa8, 0xe9, 0x50, 0xd8, 0x9d, 0x4d, 0xce, 0x16, 0xcf, 0x60, 0xd8, 0xb4, 0xce, 0xb7,
0xa6, 0x35, 0x46, 0x41, 0x4e, 0xe1, 0x9f, 0x5b, 0x96, 0xc9, 0x9c, 0xc6, 0x55, 0x2a, 0xd4, 0x8e,
0x85, 0xdd, 0x55, 0x7f, 0xfd, 0xab, 0x2c, 0x96, 0xc9, 0xd0, 0xff, 0x7e, 0x09, 0xff, 0x2e, 0xe6,
0x4b, 0xc1, 0xc2, 0x07, 0x4d, 0x3b, 0xaa, 0xe9, 0xef, 0xaa, 0xba, 0xde, 0xe5, 0x7e, 0x37, 0x60,
0xff, 0x1a, 0x67, 0x09, 0x72, 0xb9, 0xda, 0xa3, 0x0b, 0x56, 0xb8, 0x5a, 0x49, 0xb5, 0x8a, 0x06,
0x47, 0x1c, 0xe8, 0xad, 0x19, 0x54, 0x6e, 0x75, 0x9d, 0x22, 0x47, 0x60, 0x8a, 0xf2, 0x66, 0x4f,
0xb9, 0xde, 0xf6, 0x57, 0x84, 0xce, 0x4a, 0x31, 0xb2, 0x7e, 0x6e, 0x2a, 0x2b, 0x0a, 0xae, 0x67,
0x65, 0xbb, 0x99, 0x5b, 0x1b, 0xba, 0x93, 0x9c, 0xa9, 0x9e, 0x8e, 0xae, 0x94, 0x90, 0x1c, 0x83,
0x85, 0x9c, 0x4e, 0x62, 0xd4, 0xce, 0xdb, 0x5d, 0xc7, 0x18, 0xec, 0xf8, 0x3d, 0xcd, 0xa9, 0xc1,
0xdc, 0x1f, 0xc6, 0x7a, 0xd0, 0x36, 0xbe, 0xe1, 0x3f, 0x1d, 0xb4, 0xff, 0x01, 0x6a, 0x03, 0xaa,
0x98, 0xad, 0x31, 0xe4, 0x04, 0xfa, 0xb5, 0x81, 0x81, 0xa4, 0xb3, 0x7b, 0x29, 0x63, 0x29, 0xbf,
0xa1, 0x33, 0xf1, 0x20, 0xaf, 0x9d, 0x87, 0x79, 0x7d, 0x7b, 0xf6, 0xe9, 0xc5, 0x8c, 0xc9, 0x79,
0x3e, 0x29, 0xde, 0xf1, 0x48, 0x8f, 0xf1, 0x9c, 0xa5, 0xe5, 0xd7, 0x88, 0x71, 0x89, 0x19, 0xa7,
0xf1, 0x48, 0x4d, 0x36, 0x2a, 0x12, 0xb9, 0x98, 0x4c, 0x3a, 0x0a, 0x9d, 0xfd, 0x0a, 0x00, 0x00,
0xff, 0xff, 0x4d, 0x6b, 0x68, 0xa8, 0xc7, 0x05, 0x00, 0x00,
0xd4, 0x12, 0x09, 0x91, 0x88, 0x16, 0xb1, 0x63, 0x01, 0xb5, 0x2a, 0x45, 0x88, 0xaa, 0xb8, 0x15,
0x0b, 0x36, 0xd6, 0xc4, 0xbe, 0x49, 0x46, 0xb2, 0xc7, 0xc1, 0x33, 0xae, 0x9a, 0x1d, 0x6b, 0x1e,
0x81, 0x17, 0x64, 0xc1, 0x3b, 0x20, 0xe4, 0x19, 0xdb, 0x71, 0xda, 0xb0, 0x64, 0xe7, 0x73, 0xee,
0xdc, 0xf1, 0xb9, 0xe7, 0x9e, 0x81, 0x3d, 0x94, 0x61, 0x14, 0x24, 0x28, 0xe9, 0x70, 0x91, 0xa5,
0x32, 0x25, 0x07, 0x09, 0x8b, 0xef, 0x72, 0xa1, 0xd1, 0xb0, 0xa8, 0x1e, 0x5a, 0x61, 0x9a, 0x24,
0x29, 0xd7, 0xd4, 0xa1, 0x25, 0xc2, 0x39, 0x26, 0xe5, 0x71, 0xf7, 0x9b, 0x01, 0x70, 0x8b, 0x9c,
0x72, 0xf9, 0x1e, 0x25, 0x25, 0x7d, 0x68, 0x8d, 0x3d, 0xdb, 0x70, 0x8c, 0x41, 0xdb, 0x6f, 0x8d,
0x3d, 0x72, 0x0a, 0x7b, 0x3c, 0x4f, 0x82, 0xcf, 0x39, 0x66, 0xcb, 0x80, 0xa7, 0x11, 0x0a, 0xbb,
0xa5, 0x8a, 0xbb, 0x3c, 0x4f, 0x3e, 0x14, 0xec, 0x55, 0x41, 0x92, 0x67, 0x70, 0xc0, 0xb8, 0xc0,
0x4c, 0x06, 0xe1, 0x9c, 0x72, 0x8e, 0xf1, 0xd8, 0x13, 0x76, 0xdb, 0x69, 0x0f, 0x4c, 0x7f, 0x5f,
0x17, 0x2e, 0x6a, 0x9e, 0x3c, 0x85, 0x3d, 0x7d, 0x61, 0x7d, 0xd6, 0xde, 0x72, 0x8c, 0x81, 0xe9,
0xf7, 0x15, 0x5d, 0x9f, 0x74, 0xbf, 0x18, 0x60, 0x5e, 0x67, 0xe9, 0xfd, 0x72, 0xa3, 0xb6, 0x57,
0xd0, 0xa5, 0x51, 0x94, 0xa1, 0xd0, 0x9a, 0x7a, 0x67, 0x47, 0xc3, 0xb5, 0xd9, 0xcb, 0xa9, 0xdf,
0xe8, 0x33, 0x7e, 0x75, 0xb8, 0xd0, 0x9a, 0xa1, 0xc8, 0xe3, 0x4d, 0x5a, 0x75, 0x61, 0xa5, 0xd5,
0xfd, 0x6a, 0x80, 0x39, 0xe6, 0x11, 0xde, 0x8f, 0xf9, 0x34, 0x25, 0xff, 0x01, 0xb0, 0x02, 0x04,
0x9c, 0x26, 0xa8, 0xa4, 0x98, 0xbe, 0xa9, 0x98, 0x2b, 0x9a, 0x20, 0xb1, 0xa1, 0xab, 0xc0, 0xd8,
0x2b, 0x5d, 0xaa, 0x20, 0xf1, 0xc0, 0xd2, 0x8d, 0x0b, 0x9a, 0xd1, 0x44, 0xff, 0xae, 0x77, 0x76,
0xbc, 0x51, 0xf0, 0x3b, 0x5c, 0x7e, 0xa4, 0x71, 0x8e, 0xd7, 0x94, 0x65, 0x7e, 0x4f, 0xb5, 0x5d,
0xab, 0x2e, 0xd7, 0x83, 0xfe, 0x25, 0xc3, 0x38, 0x5a, 0x09, 0xb2, 0xa1, 0x3b, 0x65, 0x31, 0x46,
0xb5, 0x31, 0x15, 0xfc, 0xbd, 0x16, 0xf7, 0x67, 0x0b, 0xfa, 0x17, 0x69, 0x1c, 0x63, 0x28, 0x59,
0xca, 0xd5, 0x35, 0x0f, 0xad, 0x7d, 0x0d, 0x1d, 0x9d, 0x92, 0xd2, 0xd9, 0x93, 0x75, 0xa1, 0x65,
0x82, 0x56, 0x97, 0xdc, 0x28, 0xc2, 0x2f, 0x9b, 0xc8, 0x13, 0xe8, 0x85, 0x19, 0x52, 0x89, 0x81,
0x64, 0x09, 0xda, 0x6d, 0xc7, 0x18, 0x6c, 0xf9, 0xa0, 0xa9, 0x5b, 0x96, 0x20, 0x71, 0xc1, 0x5a,
0xd0, 0x4c, 0x32, 0x25, 0xc0, 0x13, 0xf6, 0x96, 0xd3, 0x1e, 0xb4, 0xfd, 0x35, 0x8e, 0x9c, 0x42,
0xbf, 0xc6, 0x85, 0xbb, 0xc2, 0xde, 0x56, 0x3b, 0x7a, 0xc0, 0x92, 0x4b, 0xd8, 0x9d, 0x16, 0xa6,
0x04, 0x6a, 0x3e, 0x14, 0x76, 0x67, 0x93, 0xb7, 0xc5, 0x43, 0x18, 0xae, 0x9b, 0xe7, 0x5b, 0xd3,
0x1a, 0xa3, 0x20, 0x67, 0xf0, 0xcf, 0x1d, 0xcb, 0x64, 0x4e, 0xe3, 0x2a, 0x17, 0x6a, 0xcb, 0xc2,
0xee, 0xaa, 0xdf, 0xfe, 0x55, 0x16, 0xcb, 0x6c, 0xe8, 0x7f, 0xbf, 0x84, 0x7f, 0x17, 0xf3, 0xa5,
0x60, 0xe1, 0xa3, 0xa6, 0x1d, 0xd5, 0xf4, 0x77, 0x55, 0x6d, 0x76, 0xb9, 0xdf, 0x0d, 0xd8, 0xbf,
0xc1, 0x59, 0x82, 0x5c, 0xae, 0x36, 0xe9, 0x82, 0x15, 0xae, 0x96, 0x52, 0x2d, 0x63, 0x8d, 0x23,
0x0e, 0xf4, 0x1a, 0x16, 0x95, 0x7b, 0x6d, 0x52, 0xe4, 0x08, 0x4c, 0x51, 0xde, 0xec, 0x29, 0xdf,
0xdb, 0xfe, 0x8a, 0xd0, 0x69, 0x29, 0x46, 0xd6, 0x0f, 0x4e, 0xa5, 0x45, 0xc1, 0x66, 0x5a, 0xb6,
0xd7, 0x93, 0x6b, 0x43, 0x77, 0x92, 0x33, 0xd5, 0xd3, 0xd1, 0x95, 0x12, 0x92, 0x63, 0xb0, 0x90,
0xd3, 0x49, 0x8c, 0xda, 0x79, 0xbb, 0xeb, 0x18, 0x83, 0x1d, 0xbf, 0xa7, 0x39, 0x35, 0x98, 0xfb,
0xc3, 0x68, 0x46, 0x6d, 0xe3, 0x2b, 0xfe, 0xd3, 0x51, 0xfb, 0x1f, 0xa0, 0x36, 0xa0, 0x0a, 0x5a,
0x83, 0x21, 0x27, 0x8d, 0x98, 0x05, 0x92, 0xce, 0xaa, 0x98, 0xed, 0xd6, 0xec, 0x2d, 0x9d, 0x89,
0x47, 0x89, 0xed, 0x3c, 0x4e, 0xec, 0xdb, 0xf3, 0x4f, 0x2f, 0x66, 0x4c, 0xce, 0xf3, 0x49, 0xf1,
0x92, 0x47, 0x7a, 0x8c, 0xe7, 0x2c, 0x2d, 0xbf, 0x46, 0x8c, 0x4b, 0xcc, 0x38, 0x8d, 0x47, 0x6a,
0xb2, 0x51, 0x91, 0xc8, 0xc5, 0x64, 0xd2, 0x51, 0xe8, 0xfc, 0x57, 0x00, 0x00, 0x00, 0xff, 0xff,
0x06, 0xbe, 0x60, 0xc9, 0xc9, 0x05, 0x00, 0x00,
}

View File

@ -59,12 +59,14 @@ message CreateCollectionRequest {
common.MsgBase base = 1;
string db_name = 2;
string collectionName = 3;
string partitionName = 4;
// `schema` is the serialized `schema.CollectionSchema`
int64 dbID = 4;
int64 collectionID = 5;
bytes schema = 6;
repeated string virtualChannelNames = 7;
repeated string physicalChannelNames = 8;
int64 dbID = 5;
int64 collectionID = 6;
int64 partitionID = 7;
bytes schema = 8;
repeated string virtualChannelNames = 9;
repeated string physicalChannelNames = 10;
}
message DropCollectionRequest {

View File

@ -476,12 +476,14 @@ type CreateCollectionRequest struct {
Base *commonpb.MsgBase `protobuf:"bytes,1,opt,name=base,proto3" json:"base,omitempty"`
DbName string `protobuf:"bytes,2,opt,name=db_name,json=dbName,proto3" json:"db_name,omitempty"`
CollectionName string `protobuf:"bytes,3,opt,name=collectionName,proto3" json:"collectionName,omitempty"`
PartitionName string `protobuf:"bytes,4,opt,name=partitionName,proto3" json:"partitionName,omitempty"`
// `schema` is the serialized `schema.CollectionSchema`
DbID int64 `protobuf:"varint,4,opt,name=dbID,proto3" json:"dbID,omitempty"`
CollectionID int64 `protobuf:"varint,5,opt,name=collectionID,proto3" json:"collectionID,omitempty"`
Schema []byte `protobuf:"bytes,6,opt,name=schema,proto3" json:"schema,omitempty"`
VirtualChannelNames []string `protobuf:"bytes,7,rep,name=virtualChannelNames,proto3" json:"virtualChannelNames,omitempty"`
PhysicalChannelNames []string `protobuf:"bytes,8,rep,name=physicalChannelNames,proto3" json:"physicalChannelNames,omitempty"`
DbID int64 `protobuf:"varint,5,opt,name=dbID,proto3" json:"dbID,omitempty"`
CollectionID int64 `protobuf:"varint,6,opt,name=collectionID,proto3" json:"collectionID,omitempty"`
PartitionID int64 `protobuf:"varint,7,opt,name=partitionID,proto3" json:"partitionID,omitempty"`
Schema []byte `protobuf:"bytes,8,opt,name=schema,proto3" json:"schema,omitempty"`
VirtualChannelNames []string `protobuf:"bytes,9,rep,name=virtualChannelNames,proto3" json:"virtualChannelNames,omitempty"`
PhysicalChannelNames []string `protobuf:"bytes,10,rep,name=physicalChannelNames,proto3" json:"physicalChannelNames,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
@ -533,6 +535,13 @@ func (m *CreateCollectionRequest) GetCollectionName() string {
return ""
}
func (m *CreateCollectionRequest) GetPartitionName() string {
if m != nil {
return m.PartitionName
}
return ""
}
func (m *CreateCollectionRequest) GetDbID() int64 {
if m != nil {
return m.DbID
@ -547,6 +556,13 @@ func (m *CreateCollectionRequest) GetCollectionID() int64 {
return 0
}
func (m *CreateCollectionRequest) GetPartitionID() int64 {
if m != nil {
return m.PartitionID
}
return 0
}
func (m *CreateCollectionRequest) GetSchema() []byte {
if m != nil {
return m.Schema
@ -2196,126 +2212,127 @@ func init() {
func init() { proto.RegisterFile("internal.proto", fileDescriptor_41f4a519b878ee3b) }
var fileDescriptor_41f4a519b878ee3b = []byte{
// 1927 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x59, 0xcd, 0x6f, 0x24, 0x47,
0x15, 0xa7, 0xa7, 0xc7, 0x9e, 0x99, 0x37, 0x6d, 0x7b, 0xb6, 0xd6, 0xbb, 0x69, 0x7b, 0x37, 0x9b,
0x49, 0x87, 0x0f, 0x93, 0x15, 0xeb, 0xc5, 0x01, 0x12, 0x21, 0xc4, 0x26, 0xf6, 0x84, 0x65, 0xb4,
0xb1, 0x31, 0xed, 0x4d, 0x24, 0xb8, 0xb4, 0x6a, 0xba, 0xcb, 0x33, 0x4d, 0xfa, 0x8b, 0xae, 0x1a,
0xef, 0x4e, 0x4e, 0x1c, 0xb8, 0x21, 0x38, 0x20, 0xf1, 0x6f, 0x70, 0xe5, 0xc4, 0x87, 0x72, 0x42,
0xe2, 0x2f, 0xe0, 0xaf, 0xe0, 0x08, 0xe2, 0x84, 0xea, 0x55, 0xf5, 0xc7, 0x8c, 0xc7, 0xc6, 0xeb,
0x15, 0x82, 0x88, 0xdc, 0xaa, 0x7e, 0xef, 0xd5, 0xc7, 0xfb, 0xbd, 0xf7, 0xaa, 0x5e, 0x57, 0xc3,
0x7a, 0x98, 0x08, 0x96, 0x27, 0x34, 0x7a, 0x90, 0xe5, 0xa9, 0x48, 0xc9, 0xad, 0x38, 0x8c, 0xce,
0xa6, 0x5c, 0xf5, 0x1e, 0x14, 0xc2, 0x6d, 0xcb, 0x4f, 0xe3, 0x38, 0x4d, 0x14, 0xbc, 0x6d, 0x71,
0x7f, 0xc2, 0x62, 0xaa, 0x7a, 0xce, 0x1f, 0x0c, 0x58, 0x3b, 0x48, 0xe3, 0x2c, 0x4d, 0x58, 0x22,
0x86, 0xc9, 0x69, 0x4a, 0x6e, 0xc3, 0x6a, 0x92, 0x06, 0x6c, 0x38, 0xb0, 0x8d, 0xbe, 0xb1, 0x63,
0xba, 0xba, 0x47, 0x08, 0x34, 0xf3, 0x34, 0x62, 0x76, 0xa3, 0x6f, 0xec, 0x74, 0x5c, 0x6c, 0x93,
0x47, 0x00, 0x5c, 0x50, 0xc1, 0x3c, 0x3f, 0x0d, 0x98, 0x6d, 0xf6, 0x8d, 0x9d, 0xf5, 0xbd, 0xfe,
0x83, 0xa5, 0xbb, 0x78, 0x70, 0x22, 0x15, 0x0f, 0xd2, 0x80, 0xb9, 0x1d, 0x5e, 0x34, 0xc9, 0xbb,
0x00, 0xec, 0xb9, 0xc8, 0xa9, 0x17, 0x26, 0xa7, 0xa9, 0xdd, 0xec, 0x9b, 0x3b, 0xdd, 0xbd, 0xd7,
0xe7, 0x27, 0xd0, 0x9b, 0x7f, 0xc2, 0x66, 0x1f, 0xd1, 0x68, 0xca, 0x8e, 0x69, 0x98, 0xbb, 0x1d,
0x1c, 0x24, 0xb7, 0xeb, 0xfc, 0xd5, 0x80, 0x8d, 0xd2, 0x00, 0x5c, 0x83, 0x93, 0x6f, 0xc3, 0x0a,
0x2e, 0x81, 0x16, 0x74, 0xf7, 0xbe, 0x78, 0xc1, 0x8e, 0xe6, 0xec, 0x76, 0xd5, 0x10, 0xf2, 0x21,
0xdc, 0xe4, 0xd3, 0x91, 0x5f, 0x88, 0x3c, 0x44, 0xb9, 0xdd, 0xc0, 0xad, 0x5d, 0x6d, 0x26, 0x52,
0x9f, 0x40, 0x6f, 0xe9, 0x2d, 0x58, 0x95, 0x33, 0x4d, 0x39, 0xb2, 0xd4, 0xdd, 0xbb, 0xb3, 0xd4,
0xc8, 0x13, 0x54, 0x71, 0xb5, 0xaa, 0x73, 0x07, 0xb6, 0x1e, 0x33, 0xb1, 0x60, 0x9d, 0xcb, 0x7e,
0x3a, 0x65, 0x5c, 0x68, 0xe1, 0xd3, 0x30, 0x66, 0x4f, 0x43, 0xff, 0xe3, 0x83, 0x09, 0x4d, 0x12,
0x16, 0x15, 0xc2, 0x57, 0xe1, 0xce, 0x63, 0x86, 0x03, 0x42, 0x2e, 0x42, 0x9f, 0x2f, 0x88, 0x6f,
0xc1, 0xcd, 0xc7, 0x4c, 0x0c, 0x82, 0x05, 0xf8, 0x23, 0x68, 0x1f, 0x49, 0x67, 0xcb, 0x30, 0xf8,
0x16, 0xb4, 0x68, 0x10, 0xe4, 0x8c, 0x73, 0xcd, 0xe2, 0xdd, 0xa5, 0x3b, 0x7e, 0x4f, 0xe9, 0xb8,
0x85, 0xf2, 0xb2, 0x30, 0x71, 0x7e, 0x02, 0x30, 0x4c, 0x42, 0x71, 0x4c, 0x73, 0x1a, 0xf3, 0x0b,
0x03, 0x6c, 0x00, 0x16, 0x17, 0x34, 0x17, 0x5e, 0x86, 0x7a, 0x9a, 0xf2, 0x2b, 0x44, 0x43, 0x17,
0x87, 0xa9, 0xd9, 0x9d, 0x1f, 0x01, 0x9c, 0x88, 0x3c, 0x4c, 0xc6, 0x1f, 0x84, 0x5c, 0xc8, 0xb5,
0xce, 0xa4, 0x9e, 0x34, 0xc2, 0xdc, 0xe9, 0xb8, 0xba, 0x57, 0x73, 0x47, 0xe3, 0xea, 0xee, 0x78,
0x04, 0xdd, 0x82, 0xee, 0x43, 0x3e, 0x26, 0x0f, 0xa1, 0x39, 0xa2, 0x9c, 0x5d, 0x4a, 0xcf, 0x21,
0x1f, 0xef, 0x53, 0xce, 0x5c, 0xd4, 0x74, 0x3e, 0x6d, 0xc0, 0x2b, 0x07, 0x39, 0xc3, 0xe0, 0x8f,
0x22, 0xe6, 0x8b, 0x30, 0x4d, 0x34, 0xf7, 0x2f, 0x3e, 0x1b, 0x79, 0x05, 0x5a, 0xc1, 0xc8, 0x4b,
0x68, 0x5c, 0x90, 0xbd, 0x1a, 0x8c, 0x8e, 0x68, 0xcc, 0xc8, 0x97, 0x61, 0xdd, 0x2f, 0xe7, 0x97,
0x08, 0xc6, 0x5c, 0xc7, 0x5d, 0x40, 0xa5, 0xab, 0x82, 0xd1, 0x70, 0x60, 0x37, 0xd1, 0x0d, 0xd8,
0x26, 0x0e, 0x58, 0x95, 0xd6, 0x70, 0x60, 0xaf, 0xa0, 0x6c, 0x0e, 0x93, 0xa4, 0xaa, 0x33, 0xc4,
0x5e, 0xed, 0x1b, 0x3b, 0x96, 0xab, 0x7b, 0xe4, 0x21, 0xdc, 0x3c, 0x0b, 0x73, 0x31, 0xa5, 0x91,
0x8e, 0x2b, 0xb9, 0x0a, 0xb7, 0x5b, 0xc8, 0xfc, 0x32, 0x11, 0xd9, 0x83, 0xcd, 0x6c, 0x32, 0xe3,
0xa1, 0xbf, 0x30, 0xa4, 0x8d, 0x43, 0x96, 0xca, 0x9c, 0x4f, 0x0d, 0xb8, 0x35, 0xc8, 0xd3, 0xec,
0xb3, 0x4c, 0xa1, 0xf3, 0xcb, 0x06, 0xdc, 0x56, 0x91, 0x70, 0x4c, 0x73, 0x11, 0xfe, 0x87, 0xac,
0xf8, 0x0a, 0x6c, 0x54, 0xab, 0x2a, 0x85, 0xe5, 0x66, 0x7c, 0x09, 0xd6, 0xb3, 0x62, 0x1f, 0x4a,
0xaf, 0x89, 0x7a, 0x6b, 0x25, 0x3a, 0x67, 0xed, 0xca, 0x25, 0xd6, 0xae, 0x2e, 0x09, 0x98, 0x3e,
0x74, 0xcb, 0x89, 0x86, 0x03, 0xbb, 0x85, 0x2a, 0x75, 0xc8, 0xf9, 0x45, 0x03, 0x36, 0xa5, 0x53,
0x3f, 0x67, 0x43, 0xb2, 0xf1, 0xc7, 0x06, 0x10, 0x15, 0x1d, 0xc3, 0x24, 0x60, 0xcf, 0xff, 0x9b,
0x5c, 0xbc, 0x0a, 0x70, 0x1a, 0xb2, 0x28, 0xa8, 0xf3, 0xd0, 0x41, 0xe4, 0xa5, 0x38, 0xb0, 0xa1,
0x85, 0x93, 0x94, 0xf6, 0x17, 0x5d, 0x79, 0x0b, 0xa8, 0x8a, 0x40, 0xdf, 0x02, 0xed, 0x2b, 0xdf,
0x02, 0x38, 0x4c, 0xdf, 0x02, 0xbf, 0x35, 0x61, 0x6d, 0x98, 0x70, 0x96, 0x8b, 0xff, 0xe7, 0x40,
0x22, 0x77, 0xa1, 0xc3, 0xd9, 0x38, 0x96, 0x85, 0xc9, 0xc0, 0x6e, 0xa3, 0xbc, 0x02, 0xa4, 0xd4,
0x57, 0x27, 0xeb, 0x70, 0x60, 0x77, 0x94, 0x6b, 0x4b, 0x80, 0xdc, 0x03, 0x10, 0x61, 0xcc, 0xb8,
0xa0, 0x71, 0xc6, 0x6d, 0xe8, 0x9b, 0x3b, 0x4d, 0xb7, 0x86, 0xc8, 0x5b, 0x20, 0x4f, 0x9f, 0x0d,
0x07, 0xdc, 0xee, 0xf6, 0x4d, 0x79, 0x8d, 0xab, 0x1e, 0xf9, 0x06, 0xb4, 0xf3, 0xf4, 0x99, 0x17,
0x50, 0x41, 0x6d, 0x0b, 0x9d, 0xb7, 0xb5, 0x94, 0xec, 0xfd, 0x28, 0x1d, 0xb9, 0xad, 0x3c, 0x7d,
0x36, 0xa0, 0x82, 0x3a, 0xff, 0x30, 0x61, 0xed, 0x84, 0xd1, 0xdc, 0x9f, 0x5c, 0xdf, 0x61, 0x5f,
0x85, 0x5e, 0xce, 0xf8, 0x34, 0x12, 0x5e, 0x65, 0x96, 0xf2, 0xdc, 0x86, 0xc2, 0x0f, 0x4a, 0xe3,
0x0a, 0xca, 0xcd, 0x4b, 0x28, 0x6f, 0x2e, 0xa1, 0xdc, 0x01, 0xab, 0xc6, 0x2f, 0xb7, 0x57, 0xd0,
0xf4, 0x39, 0x8c, 0xf4, 0xc0, 0x0c, 0x78, 0x84, 0x1e, 0xeb, 0xb8, 0xb2, 0x49, 0xee, 0xc3, 0x8d,
0x2c, 0xa2, 0x3e, 0x9b, 0xa4, 0x51, 0xc0, 0x72, 0x6f, 0x9c, 0xa7, 0xd3, 0x0c, 0xdd, 0x65, 0xb9,
0xbd, 0x9a, 0xe0, 0xb1, 0xc4, 0xc9, 0xdb, 0xd0, 0x0e, 0x78, 0xe4, 0x89, 0x59, 0xc6, 0xd0, 0x65,
0xeb, 0x17, 0xd8, 0x3e, 0xe0, 0xd1, 0xd3, 0x59, 0xc6, 0xdc, 0x56, 0xa0, 0x1a, 0xe4, 0x21, 0x6c,
0x72, 0x96, 0x87, 0x34, 0x0a, 0x3f, 0x61, 0x81, 0xc7, 0x9e, 0x67, 0xb9, 0x97, 0x45, 0x34, 0x41,
0xcf, 0x5a, 0x2e, 0xa9, 0x64, 0xef, 0x3f, 0xcf, 0xf2, 0xe3, 0x88, 0x26, 0x64, 0x07, 0x7a, 0xe9,
0x54, 0x64, 0x53, 0xe1, 0x61, 0xf6, 0x71, 0x2f, 0x0c, 0xd0, 0xd1, 0xa6, 0xbb, 0xae, 0xf0, 0xef,
0x21, 0x3c, 0x0c, 0x24, 0xb5, 0x22, 0xa7, 0x67, 0x2c, 0xf2, 0xca, 0x08, 0xb0, 0xbb, 0x7d, 0x63,
0xa7, 0xe9, 0x6e, 0x28, 0xfc, 0x69, 0x01, 0x93, 0x5d, 0xb8, 0x39, 0x9e, 0xd2, 0x9c, 0x26, 0x82,
0xb1, 0x9a, 0xb6, 0x85, 0xda, 0xa4, 0x14, 0x95, 0x03, 0x9c, 0xbf, 0xd5, 0x5c, 0x2f, 0xbd, 0xc4,
0xaf, 0xe1, 0xfa, 0xeb, 0xd4, 0x73, 0x4b, 0xe3, 0xc5, 0x5c, 0x1e, 0x2f, 0xaf, 0x41, 0x37, 0x66,
0x22, 0x0f, 0x7d, 0xe5, 0x17, 0x95, 0xc6, 0xa0, 0x20, 0x24, 0x9f, 0x40, 0x73, 0x12, 0x0a, 0x15,
0x10, 0x96, 0x8b, 0x6d, 0x39, 0x88, 0x47, 0xa1, 0xcf, 0x02, 0x6f, 0x14, 0xa5, 0x23, 0xed, 0x07,
0x50, 0x90, 0x8c, 0x7e, 0xc9, 0xbf, 0x56, 0x48, 0xa6, 0xb1, 0xe7, 0xa7, 0xd3, 0x44, 0xd8, 0x80,
0x51, 0xb7, 0xae, 0xf0, 0xa3, 0x69, 0x7c, 0x20, 0x51, 0xf2, 0x06, 0xac, 0x69, 0xcd, 0xf4, 0xf4,
0x94, 0x33, 0x81, 0xe4, 0x9b, 0xae, 0xa5, 0xc0, 0x1f, 0x20, 0x46, 0xbe, 0x03, 0xdb, 0x9c, 0xd1,
0x88, 0x05, 0x5e, 0x99, 0xe3, 0xdc, 0xe3, 0xc8, 0x2c, 0x0b, 0xec, 0x55, 0x74, 0xac, 0xad, 0x34,
0x4e, 0x4a, 0x85, 0x13, 0x2d, 0x97, 0x7e, 0x2b, 0x69, 0xa8, 0x0d, 0x53, 0xd5, 0x1b, 0xa9, 0x44,
0xe5, 0x80, 0x77, 0xc0, 0x1e, 0x47, 0xe9, 0x88, 0x46, 0xde, 0xb9, 0x55, 0xf1, 0xd4, 0x36, 0xdd,
0xdb, 0x4a, 0x7e, 0xb2, 0xb0, 0xa4, 0xf3, 0xf7, 0x06, 0x6c, 0xb8, 0x92, 0x3b, 0x76, 0xc6, 0x3e,
0xf3, 0xe9, 0xfe, 0x26, 0x98, 0x61, 0xc0, 0x31, 0xdd, 0xbb, 0x7b, 0xf6, 0xfc, 0xbe, 0xf5, 0xa7,
0xf6, 0x70, 0xc0, 0x5d, 0xa9, 0x24, 0xdd, 0x38, 0x97, 0x70, 0x9a, 0x5d, 0xab, 0x9e, 0x6d, 0x4b,
0x73, 0xad, 0xfd, 0x42, 0xb9, 0xd6, 0xb9, 0x30, 0xd7, 0x7e, 0x6f, 0xd6, 0x99, 0xff, 0x5f, 0xcd,
0x36, 0x4d, 0x69, 0xf3, 0x2a, 0x94, 0x3e, 0x82, 0xae, 0x3e, 0xbc, 0xf0, 0xc6, 0x59, 0xc1, 0x1b,
0xe7, 0xde, 0xd2, 0x31, 0xc8, 0xaf, 0xbc, 0x6d, 0x5c, 0x55, 0xd3, 0x70, 0xd9, 0x26, 0xdf, 0x85,
0x3b, 0xe7, 0xb3, 0x26, 0xd7, 0x1c, 0x15, 0x69, 0xb3, 0xb5, 0x98, 0x36, 0x05, 0x89, 0x01, 0xf9,
0x3a, 0x6c, 0xd6, 0xf2, 0xa6, 0x1a, 0xa8, 0x3f, 0x7b, 0x2a, 0x59, 0x35, 0xe4, 0xfa, 0x99, 0xf3,
0x17, 0x03, 0xd6, 0x06, 0x2c, 0x62, 0xe2, 0x25, 0xf2, 0x66, 0x49, 0xf9, 0xd2, 0x58, 0x5a, 0xbe,
0xcc, 0xd5, 0x07, 0xe6, 0xe5, 0xf5, 0x41, 0xf3, 0x5c, 0x7d, 0xf0, 0x3a, 0x58, 0x59, 0x1e, 0xc6,
0x34, 0x9f, 0x79, 0x1f, 0xb3, 0x59, 0x91, 0x3b, 0x5d, 0x8d, 0x3d, 0x61, 0x33, 0xee, 0x24, 0xb0,
0xfd, 0x41, 0x4a, 0x83, 0x7d, 0x1a, 0xd1, 0xc4, 0x67, 0xda, 0x4c, 0x7e, 0x7d, 0xcb, 0xee, 0x01,
0xd4, 0x98, 0x6c, 0xe0, 0x82, 0x35, 0xc4, 0xf9, 0xa7, 0x01, 0x1d, 0xb9, 0x20, 0x56, 0xd5, 0xd7,
0x98, 0x7f, 0xae, 0x9c, 0x6a, 0x2c, 0x29, 0xa7, 0xca, 0xc2, 0xb8, 0xa0, 0xab, 0xaa, 0x94, 0x6b,
0x15, 0x6f, 0x73, 0xbe, 0xe2, 0x7d, 0x0d, 0xba, 0xa1, 0xdc, 0x90, 0x97, 0x51, 0x31, 0x51, 0x3c,
0x75, 0x5c, 0x40, 0xe8, 0x58, 0x22, 0xb2, 0x24, 0x2e, 0x14, 0xb0, 0x24, 0x5e, 0xbd, 0x72, 0x49,
0xac, 0x27, 0xc1, 0x92, 0xf8, 0x4f, 0x0d, 0xb0, 0x35, 0xc5, 0xd5, 0xbb, 0xd0, 0x87, 0x59, 0x80,
0xcf, 0x53, 0x77, 0xa1, 0x53, 0x46, 0x99, 0x7e, 0x96, 0xa9, 0x00, 0xc9, 0xeb, 0x21, 0x8b, 0xd3,
0x7c, 0x76, 0x12, 0x7e, 0xc2, 0xb4, 0xe1, 0x35, 0x44, 0xda, 0x76, 0x34, 0x8d, 0xdd, 0xf4, 0x19,
0xd7, 0x27, 0x6c, 0xd1, 0x95, 0xb6, 0xf9, 0xf8, 0x21, 0x83, 0xa7, 0x13, 0x5a, 0xde, 0x74, 0x41,
0x41, 0xf2, 0x54, 0x22, 0x5b, 0xd0, 0x66, 0x49, 0xa0, 0xa4, 0x2b, 0x28, 0x6d, 0xb1, 0x24, 0x40,
0xd1, 0x10, 0xd6, 0xf5, 0x7b, 0x50, 0xca, 0xf1, 0xb4, 0xd5, 0x67, 0xac, 0x73, 0xc1, 0x23, 0xdc,
0x21, 0x1f, 0x1f, 0x6b, 0x4d, 0x77, 0x4d, 0x3d, 0x09, 0xe9, 0x2e, 0x79, 0x1f, 0x2c, 0xb9, 0x4a,
0x39, 0x51, 0xeb, 0xca, 0x13, 0x75, 0x59, 0x12, 0x14, 0x1d, 0xe7, 0xd7, 0x06, 0xdc, 0x38, 0x47,
0xe1, 0x35, 0xe2, 0xe8, 0x09, 0xb4, 0x4f, 0xd8, 0x58, 0x4e, 0x51, 0xbc, 0x72, 0xed, 0x5e, 0xf4,
0x68, 0x7a, 0x81, 0xc3, 0xdc, 0x72, 0x02, 0xe7, 0xe7, 0x06, 0x00, 0x06, 0x34, 0x76, 0xcf, 0x05,
0x8b, 0x71, 0x9d, 0x60, 0x91, 0xb5, 0xa4, 0x2c, 0x49, 0x72, 0x16, 0x51, 0x51, 0x9d, 0x4f, 0x5c,
0xfb, 0x9e, 0x24, 0xd3, 0xd8, 0x55, 0xa2, 0x22, 0x69, 0x9d, 0x5f, 0x19, 0x00, 0x78, 0xc0, 0xaa,
0x6d, 0x2c, 0xde, 0xae, 0xc6, 0xe5, 0x1f, 0x81, 0x8d, 0xf9, 0x94, 0xd8, 0x2f, 0x52, 0x82, 0x23,
0x47, 0xe6, 0x32, 0x1b, 0x4a, 0x8e, 0x2a, 0xe3, 0x75, 0xd6, 0x28, 0x5e, 0x7e, 0x63, 0x80, 0x55,
0xa3, 0x8f, 0xcf, 0x67, 0xaf, 0xb1, 0x98, 0xbd, 0x58, 0xe1, 0xc9, 0x88, 0xf6, 0x78, 0x2d, 0xc8,
0xe3, 0x2a, 0xc8, 0xb7, 0xa0, 0x8d, 0x94, 0xd4, 0xa2, 0x3c, 0xd1, 0x51, 0x7e, 0x1f, 0x6e, 0xe4,
0xcc, 0x67, 0x89, 0x88, 0x66, 0x5e, 0x9c, 0x06, 0xe1, 0x69, 0xc8, 0x02, 0x8c, 0xf5, 0xb6, 0xdb,
0x2b, 0x04, 0x87, 0x1a, 0x77, 0xfe, 0x6c, 0xc0, 0xfa, 0x0f, 0xa7, 0x2c, 0x9f, 0x1d, 0xa5, 0x01,
0x53, 0x3b, 0x7b, 0xf1, 0x08, 0x7a, 0x17, 0x6d, 0xd1, 0xf4, 0xa8, 0x10, 0x7a, 0xe3, 0xdf, 0x87,
0x10, 0x77, 0xdb, 0x5c, 0x87, 0x8d, 0xa4, 0x58, 0x7d, 0xd8, 0x5f, 0x85, 0xe2, 0xca, 0xb1, 0xfa,
0xea, 0x54, 0x14, 0xff, 0xcc, 0x80, 0x6e, 0x2d, 0x59, 0xe4, 0x91, 0xaf, 0xef, 0x07, 0x75, 0xad,
0x18, 0x78, 0x08, 0x76, 0xfd, 0xea, 0xf9, 0x8e, 0x6c, 0xc2, 0x4a, 0xcc, 0xc7, 0xda, 0xe3, 0x96,
0xab, 0x3a, 0x64, 0x1b, 0xda, 0x31, 0x1f, 0xe3, 0xf7, 0x8f, 0x3e, 0x39, 0xcb, 0xbe, 0x74, 0x5b,
0x55, 0xd9, 0xa8, 0x03, 0xa4, 0x02, 0x9c, 0xdf, 0x19, 0x40, 0x74, 0xe1, 0xf0, 0x52, 0x6f, 0xb3,
0x18, 0xb0, 0xf5, 0x27, 0xc8, 0x86, 0xaa, 0xcc, 0xea, 0xd8, 0xc2, 0x95, 0x67, 0x9e, 0xbb, 0xf2,
0xee, 0xc3, 0x8d, 0x80, 0x9d, 0x52, 0x59, 0xe3, 0x2c, 0x6e, 0xb9, 0xa7, 0x05, 0x65, 0x29, 0xf6,
0xe6, 0x3b, 0xd0, 0x29, 0x7f, 0x89, 0x90, 0x1e, 0x58, 0xc3, 0x24, 0x14, 0xf8, 0x81, 0x16, 0x26,
0xe3, 0xde, 0x17, 0x48, 0x17, 0x5a, 0xdf, 0x67, 0x34, 0x12, 0x93, 0x59, 0xcf, 0x20, 0x16, 0xb4,
0xdf, 0x1b, 0x25, 0x69, 0x1e, 0xd3, 0xa8, 0xd7, 0xd8, 0x7f, 0xfb, 0xc7, 0xdf, 0x1c, 0x87, 0x62,
0x32, 0x1d, 0x49, 0x4b, 0x76, 0x95, 0x69, 0x5f, 0x0b, 0x53, 0xdd, 0xda, 0x2d, 0xbc, 0xb6, 0x8b,
0xd6, 0x96, 0xdd, 0x6c, 0x34, 0x5a, 0x45, 0xe4, 0xad, 0x7f, 0x05, 0x00, 0x00, 0xff, 0xff, 0xa3,
0xab, 0x29, 0x99, 0x38, 0x1a, 0x00, 0x00,
// 1938 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x59, 0xcf, 0x73, 0x23, 0x47,
0xf5, 0xff, 0x8e, 0x46, 0xb6, 0xa4, 0xa7, 0xb1, 0xad, 0xed, 0xf5, 0x6e, 0xc6, 0xde, 0xcd, 0xc6,
0x99, 0xe4, 0x0b, 0x26, 0x5b, 0xac, 0x17, 0x07, 0x48, 0x8a, 0xa2, 0xd8, 0xc4, 0x56, 0x58, 0x54,
0x1b, 0x1b, 0xd3, 0xde, 0xa4, 0x0a, 0x2e, 0x53, 0xad, 0x99, 0xb6, 0x3c, 0x64, 0x7e, 0x31, 0xdd,
0xf2, 0xae, 0x72, 0xe2, 0xc0, 0x09, 0x0a, 0x0e, 0x54, 0xf1, 0x6f, 0x70, 0xe5, 0xc4, 0x8f, 0xe2,
0x44, 0x15, 0x7f, 0x01, 0x7f, 0x05, 0x47, 0x28, 0x4e, 0x54, 0xbf, 0xee, 0x19, 0x8d, 0x64, 0xd9,
0x78, 0xbd, 0x05, 0x84, 0x82, 0xdb, 0xf4, 0xe7, 0xbd, 0xfe, 0xf1, 0x3e, 0xef, 0x47, 0x3f, 0xb5,
0x60, 0x35, 0x4a, 0x25, 0x2f, 0x52, 0x16, 0x3f, 0xc8, 0x8b, 0x4c, 0x66, 0xe4, 0x56, 0x12, 0xc5,
0x67, 0x63, 0xa1, 0x47, 0x0f, 0x4a, 0xe1, 0xa6, 0x13, 0x64, 0x49, 0x92, 0xa5, 0x1a, 0xde, 0x74,
0x44, 0x70, 0xca, 0x13, 0xa6, 0x47, 0xde, 0x6f, 0x2c, 0x58, 0xd9, 0xcf, 0x92, 0x3c, 0x4b, 0x79,
0x2a, 0x07, 0xe9, 0x49, 0x46, 0x6e, 0xc3, 0x72, 0x9a, 0x85, 0x7c, 0xd0, 0x77, 0xad, 0x2d, 0x6b,
0xdb, 0xa6, 0x66, 0x44, 0x08, 0x34, 0x8b, 0x2c, 0xe6, 0x6e, 0x63, 0xcb, 0xda, 0xee, 0x50, 0xfc,
0x26, 0x8f, 0x00, 0x84, 0x64, 0x92, 0xfb, 0x41, 0x16, 0x72, 0xd7, 0xde, 0xb2, 0xb6, 0x57, 0x77,
0xb7, 0x1e, 0x2c, 0x3c, 0xc5, 0x83, 0x63, 0xa5, 0xb8, 0x9f, 0x85, 0x9c, 0x76, 0x44, 0xf9, 0x49,
0xde, 0x03, 0xe0, 0xcf, 0x65, 0xc1, 0xfc, 0x28, 0x3d, 0xc9, 0xdc, 0xe6, 0x96, 0xbd, 0xdd, 0xdd,
0x7d, 0x7d, 0x76, 0x01, 0x73, 0xf8, 0x27, 0x7c, 0xf2, 0x31, 0x8b, 0xc7, 0xfc, 0x88, 0x45, 0x05,
0xed, 0xe0, 0x24, 0x75, 0x5c, 0xef, 0x4f, 0x16, 0xac, 0x55, 0x06, 0xe0, 0x1e, 0x82, 0x7c, 0x0d,
0x96, 0x70, 0x0b, 0xb4, 0xa0, 0xbb, 0xfb, 0xe6, 0x05, 0x27, 0x9a, 0xb1, 0x9b, 0xea, 0x29, 0xe4,
0x23, 0xb8, 0x29, 0xc6, 0xc3, 0xa0, 0x14, 0xf9, 0x88, 0x0a, 0xb7, 0x81, 0x47, 0xbb, 0xda, 0x4a,
0xa4, 0xbe, 0x80, 0x39, 0xd2, 0xdb, 0xb0, 0xac, 0x56, 0x1a, 0x0b, 0x64, 0xa9, 0xbb, 0x7b, 0x67,
0xa1, 0x91, 0xc7, 0xa8, 0x42, 0x8d, 0xaa, 0x77, 0x07, 0x36, 0x1e, 0x73, 0x39, 0x67, 0x1d, 0xe5,
0x3f, 0x18, 0x73, 0x21, 0x8d, 0xf0, 0x69, 0x94, 0xf0, 0xa7, 0x51, 0xf0, 0xc9, 0xfe, 0x29, 0x4b,
0x53, 0x1e, 0x97, 0xc2, 0x57, 0xe1, 0xce, 0x63, 0x8e, 0x13, 0x22, 0x21, 0xa3, 0x40, 0xcc, 0x89,
0x6f, 0xc1, 0xcd, 0xc7, 0x5c, 0xf6, 0xc3, 0x39, 0xf8, 0x63, 0x68, 0x1f, 0x2a, 0x67, 0xab, 0x30,
0xf8, 0x2a, 0xb4, 0x58, 0x18, 0x16, 0x5c, 0x08, 0xc3, 0xe2, 0xdd, 0x85, 0x27, 0x7e, 0x5f, 0xeb,
0xd0, 0x52, 0x79, 0x51, 0x98, 0x78, 0xdf, 0x07, 0x18, 0xa4, 0x91, 0x3c, 0x62, 0x05, 0x4b, 0xc4,
0x85, 0x01, 0xd6, 0x07, 0x47, 0x48, 0x56, 0x48, 0x3f, 0x47, 0x3d, 0x43, 0xf9, 0x15, 0xa2, 0xa1,
0x8b, 0xd3, 0xf4, 0xea, 0xde, 0x77, 0x01, 0x8e, 0x65, 0x11, 0xa5, 0xa3, 0x0f, 0x23, 0x21, 0xd5,
0x5e, 0x67, 0x4a, 0x4f, 0x19, 0x61, 0x6f, 0x77, 0xa8, 0x19, 0xd5, 0xdc, 0xd1, 0xb8, 0xba, 0x3b,
0x1e, 0x41, 0xb7, 0xa4, 0xfb, 0x40, 0x8c, 0xc8, 0x43, 0x68, 0x0e, 0x99, 0xe0, 0x97, 0xd2, 0x73,
0x20, 0x46, 0x7b, 0x4c, 0x70, 0x8a, 0x9a, 0xde, 0x8f, 0x6d, 0x78, 0x65, 0xbf, 0xe0, 0x18, 0xfc,
0x71, 0xcc, 0x03, 0x19, 0x65, 0xa9, 0xe1, 0xfe, 0xc5, 0x57, 0x23, 0xaf, 0x40, 0x2b, 0x1c, 0xfa,
0x29, 0x4b, 0x4a, 0xb2, 0x97, 0xc3, 0xe1, 0x21, 0x4b, 0x38, 0xf9, 0x1c, 0xac, 0x06, 0xd5, 0xfa,
0x0a, 0xc1, 0x98, 0xeb, 0xd0, 0x39, 0x94, 0xbc, 0x09, 0x2b, 0x39, 0x2b, 0x64, 0x54, 0xa9, 0x35,
0x51, 0x6d, 0x16, 0x54, 0x0e, 0x0d, 0x87, 0x83, 0xbe, 0xbb, 0x84, 0xce, 0xc2, 0x6f, 0xe2, 0x81,
0x33, 0x5d, 0x6b, 0xd0, 0x77, 0x97, 0x51, 0x36, 0x83, 0x91, 0x2d, 0xe8, 0x56, 0x0b, 0x0d, 0xfa,
0x6e, 0x0b, 0x55, 0xea, 0x90, 0x72, 0x8e, 0xae, 0x45, 0x6e, 0x7b, 0xcb, 0xda, 0x76, 0xa8, 0x19,
0x91, 0x87, 0x70, 0xf3, 0x2c, 0x2a, 0xe4, 0x98, 0xc5, 0x26, 0x3e, 0xd5, 0x39, 0x84, 0xdb, 0x41,
0x0f, 0x2e, 0x12, 0x91, 0x5d, 0x58, 0xcf, 0x4f, 0x27, 0x22, 0x0a, 0xe6, 0xa6, 0x00, 0x4e, 0x59,
0x28, 0xf3, 0x7e, 0x6f, 0xc1, 0xad, 0x7e, 0x91, 0xe5, 0x9f, 0x09, 0x57, 0x94, 0x24, 0x37, 0x2f,
0x21, 0x79, 0xe9, 0x3c, 0xc9, 0xde, 0x4f, 0x1b, 0x70, 0x5b, 0x47, 0xd4, 0x51, 0x49, 0xec, 0x3f,
0xc1, 0x8a, 0xcf, 0xc3, 0xda, 0x74, 0x57, 0xad, 0xb0, 0xd8, 0x8c, 0xff, 0x87, 0xd5, 0xca, 0xc1,
0x5a, 0xef, 0x5f, 0x1b, 0x52, 0xde, 0x4f, 0x1a, 0xb0, 0xae, 0x9c, 0xfa, 0x3f, 0x36, 0x14, 0x1b,
0xbf, 0x6d, 0x00, 0xd1, 0xd1, 0x31, 0x48, 0x43, 0xfe, 0xfc, 0xdf, 0xc9, 0xc5, 0xab, 0x00, 0x27,
0x11, 0x8f, 0xc3, 0x3a, 0x0f, 0x1d, 0x44, 0x5e, 0x8a, 0x03, 0x17, 0x5a, 0xb8, 0x48, 0x65, 0x7f,
0x39, 0x54, 0xb7, 0x89, 0xee, 0x2c, 0xcc, 0x6d, 0xd2, 0xbe, 0xf2, 0x6d, 0x82, 0xd3, 0xcc, 0x6d,
0xf2, 0x4b, 0x1b, 0x56, 0x06, 0xa9, 0xe0, 0x85, 0xfc, 0x6f, 0x0e, 0x24, 0x72, 0x17, 0x3a, 0x82,
0x8f, 0x12, 0xd5, 0xe0, 0xf4, 0xb1, 0x58, 0xdb, 0x74, 0x0a, 0x28, 0x69, 0xa0, 0x2b, 0xeb, 0xa0,
0xef, 0x76, 0xb4, 0x6b, 0x2b, 0x80, 0xdc, 0x03, 0x90, 0x51, 0xc2, 0x85, 0x64, 0x49, 0xae, 0x2b,
0x72, 0x93, 0xd6, 0x10, 0x75, 0x0b, 0x14, 0xd9, 0xb3, 0x41, 0x5f, 0xb8, 0xdd, 0x2d, 0x5b, 0xb5,
0x03, 0x7a, 0x44, 0xbe, 0x0c, 0xed, 0x22, 0x7b, 0xe6, 0x87, 0x4c, 0x32, 0xd7, 0x41, 0xe7, 0x6d,
0x2c, 0x24, 0x7b, 0x2f, 0xce, 0x86, 0xb4, 0x55, 0x64, 0xcf, 0xfa, 0x4c, 0x32, 0xef, 0xaf, 0x36,
0xac, 0x1c, 0x73, 0x56, 0x04, 0xa7, 0xd7, 0x77, 0xd8, 0x17, 0xa0, 0x57, 0x70, 0x31, 0x8e, 0xa5,
0x3f, 0x35, 0x4b, 0x7b, 0x6e, 0x4d, 0xe3, 0xfb, 0x95, 0x71, 0x25, 0xe5, 0xf6, 0x25, 0x94, 0x37,
0x17, 0x50, 0xee, 0x81, 0x53, 0xe3, 0x57, 0xb8, 0x4b, 0x68, 0xfa, 0x0c, 0x46, 0x7a, 0x60, 0x87,
0x22, 0x46, 0x8f, 0x75, 0xa8, 0xfa, 0x24, 0xf7, 0xe1, 0x46, 0x1e, 0xb3, 0x80, 0x9f, 0x66, 0x71,
0xc8, 0x0b, 0x7f, 0x54, 0x64, 0xe3, 0x1c, 0xdd, 0xe5, 0xd0, 0x5e, 0x4d, 0xf0, 0x58, 0xe1, 0xe4,
0x1d, 0x68, 0x87, 0x22, 0xf6, 0xe5, 0x24, 0xe7, 0xe8, 0xb2, 0xd5, 0x0b, 0x6c, 0xef, 0x8b, 0xf8,
0xe9, 0x24, 0xe7, 0xb4, 0x15, 0xea, 0x0f, 0xf2, 0x10, 0xd6, 0x05, 0x2f, 0x22, 0x16, 0x47, 0x9f,
0xf2, 0xd0, 0xe7, 0xcf, 0xf3, 0xc2, 0xcf, 0x63, 0x96, 0xa2, 0x67, 0x1d, 0x4a, 0xa6, 0xb2, 0x0f,
0x9e, 0xe7, 0xc5, 0x51, 0xcc, 0x52, 0xb2, 0x0d, 0xbd, 0x6c, 0x2c, 0xf3, 0xb1, 0xf4, 0x31, 0xfb,
0x84, 0x1f, 0x85, 0xe8, 0x68, 0x9b, 0xae, 0x6a, 0xfc, 0x9b, 0x08, 0x0f, 0x42, 0x45, 0xad, 0x2c,
0xd8, 0x19, 0x8f, 0xfd, 0x2a, 0x02, 0xdc, 0xee, 0x96, 0xb5, 0xdd, 0xa4, 0x6b, 0x1a, 0x7f, 0x5a,
0xc2, 0x64, 0x07, 0x6e, 0x8e, 0xc6, 0xac, 0x60, 0xa9, 0xe4, 0xbc, 0xa6, 0xed, 0xa0, 0x36, 0xa9,
0x44, 0xd5, 0x04, 0xef, 0xcf, 0x35, 0xd7, 0x2b, 0x2f, 0x89, 0x6b, 0xb8, 0xfe, 0x3a, 0x7d, 0xe1,
0xc2, 0x78, 0xb1, 0x17, 0xc7, 0xcb, 0x6b, 0xd0, 0x4d, 0xb8, 0x2c, 0xa2, 0x40, 0xfb, 0x45, 0xa7,
0x31, 0x68, 0x08, 0xc9, 0x27, 0xd0, 0x3c, 0x8d, 0xa4, 0x0e, 0x08, 0x87, 0xe2, 0xb7, 0x9a, 0x24,
0xe2, 0x28, 0xe0, 0xa1, 0x3f, 0x8c, 0xb3, 0xa1, 0xf1, 0x03, 0x68, 0x48, 0x45, 0xbf, 0xe2, 0xdf,
0x28, 0xa4, 0xe3, 0xc4, 0x0f, 0xb2, 0x71, 0x2a, 0x5d, 0xc0, 0xa8, 0x5b, 0xd5, 0xf8, 0xe1, 0x38,
0xd9, 0x57, 0x28, 0x79, 0x03, 0x56, 0x8c, 0x66, 0x76, 0x72, 0x22, 0xb8, 0x44, 0xf2, 0x6d, 0xea,
0x68, 0xf0, 0xdb, 0x88, 0x91, 0xaf, 0xc3, 0xa6, 0xe0, 0x2c, 0xe6, 0xa1, 0x5f, 0xe5, 0xb8, 0xf0,
0x05, 0x32, 0xcb, 0x43, 0x77, 0x19, 0x1d, 0xeb, 0x6a, 0x8d, 0xe3, 0x4a, 0xe1, 0xd8, 0xc8, 0x95,
0xdf, 0x2a, 0x1a, 0x6a, 0xd3, 0x5a, 0xd8, 0x8a, 0x91, 0xa9, 0xa8, 0x9a, 0xf0, 0x2e, 0xb8, 0xa3,
0x38, 0x1b, 0xb2, 0xd8, 0x3f, 0xb7, 0x2b, 0x56, 0x6d, 0x9b, 0xde, 0xd6, 0xf2, 0xe3, 0xb9, 0x2d,
0xbd, 0xbf, 0x34, 0x60, 0x8d, 0x2a, 0xee, 0xf8, 0x19, 0xff, 0x8f, 0x4f, 0xf7, 0xb7, 0xc0, 0x8e,
0x42, 0x81, 0xe9, 0xde, 0xdd, 0x75, 0x67, 0xcf, 0x6d, 0x7e, 0xb2, 0x0f, 0xfa, 0x82, 0x2a, 0x25,
0xe5, 0xc6, 0x99, 0x84, 0x33, 0xec, 0x3a, 0xf5, 0x6c, 0x5b, 0x98, 0x6b, 0xed, 0x17, 0xca, 0xb5,
0xce, 0x85, 0xb9, 0xf6, 0x6b, 0xbb, 0xce, 0xfc, 0x67, 0x35, 0xdb, 0x0c, 0xa5, 0xcd, 0xab, 0x50,
0xfa, 0x08, 0xba, 0xa6, 0x78, 0xe1, 0x8d, 0xb3, 0x84, 0x37, 0xce, 0xbd, 0x85, 0x73, 0x90, 0x5f,
0x75, 0xdb, 0x50, 0xdd, 0xd3, 0x08, 0xf5, 0x4d, 0xbe, 0x01, 0x77, 0xce, 0x67, 0x4d, 0x61, 0x38,
0x2a, 0xd3, 0x66, 0x63, 0x3e, 0x6d, 0x4a, 0x12, 0x43, 0xf2, 0x25, 0x58, 0xaf, 0xe5, 0xcd, 0x74,
0xa2, 0x76, 0x6d, 0x2d, 0xa7, 0xa6, 0x53, 0xae, 0x9f, 0x39, 0x7f, 0xb4, 0x60, 0xa5, 0xcf, 0x63,
0x2e, 0x5f, 0x22, 0x6f, 0x16, 0xb4, 0x2f, 0x8d, 0x85, 0xed, 0xcb, 0x4c, 0x7f, 0x60, 0x5f, 0xde,
0x1f, 0x34, 0xcf, 0xf5, 0x07, 0xaf, 0x83, 0x93, 0x17, 0x51, 0xc2, 0x8a, 0x89, 0xff, 0x09, 0x9f,
0x94, 0xb9, 0xd3, 0x35, 0xd8, 0x13, 0x3e, 0x11, 0x5e, 0x0a, 0x9b, 0x1f, 0x66, 0x2c, 0xdc, 0x63,
0x31, 0x4b, 0x03, 0x6e, 0xcc, 0x14, 0xd7, 0xb7, 0xec, 0x1e, 0x40, 0x8d, 0xc9, 0x06, 0x6e, 0x58,
0x43, 0xbc, 0xbf, 0x59, 0xd0, 0x51, 0x1b, 0x62, 0x57, 0x7d, 0x8d, 0xf5, 0x67, 0xda, 0xa9, 0xc6,
0x82, 0x76, 0xaa, 0x6a, 0x8c, 0x4b, 0xba, 0xa6, 0x9d, 0x72, 0xad, 0xe3, 0x6d, 0xce, 0x76, 0xbc,
0xaf, 0x41, 0x37, 0x52, 0x07, 0xf2, 0x73, 0x26, 0x4f, 0x35, 0x4f, 0x1d, 0x0a, 0x08, 0x1d, 0x29,
0x44, 0xb5, 0xc4, 0xa5, 0x02, 0xb6, 0xc4, 0xcb, 0x57, 0x6e, 0x89, 0xcd, 0x22, 0xd8, 0x12, 0xff,
0xae, 0x01, 0xae, 0xa1, 0x78, 0xfa, 0xbe, 0xf4, 0x51, 0x1e, 0xe2, 0x33, 0xd7, 0x5d, 0xe8, 0x54,
0x51, 0x66, 0x9e, 0x77, 0xa6, 0x80, 0xe2, 0xf5, 0x80, 0x27, 0x59, 0x31, 0x39, 0x8e, 0x3e, 0xe5,
0xc6, 0xf0, 0x1a, 0xa2, 0x6c, 0x3b, 0x1c, 0x27, 0x34, 0x7b, 0x26, 0x4c, 0x85, 0x2d, 0x87, 0xca,
0xb6, 0x00, 0x7f, 0xc8, 0x60, 0x75, 0x42, 0xcb, 0x9b, 0x14, 0x34, 0xa4, 0xaa, 0x12, 0xd9, 0x80,
0x36, 0x4f, 0x43, 0x2d, 0x5d, 0x42, 0x69, 0x8b, 0xa7, 0x21, 0x8a, 0x06, 0xb0, 0x6a, 0xde, 0x95,
0x32, 0x81, 0xd5, 0xd6, 0xd4, 0x58, 0xef, 0x82, 0xc7, 0xbc, 0x03, 0x31, 0x3a, 0x32, 0x9a, 0x74,
0x45, 0x3f, 0x2d, 0x99, 0x21, 0xf9, 0x00, 0x1c, 0xb5, 0x4b, 0xb5, 0x50, 0xeb, 0xca, 0x0b, 0x75,
0x79, 0x1a, 0x96, 0x03, 0xef, 0xe7, 0x16, 0xdc, 0x38, 0x47, 0xe1, 0x35, 0xe2, 0xe8, 0x09, 0xb4,
0x8f, 0xf9, 0x48, 0x2d, 0x51, 0xbe, 0x96, 0xed, 0x5c, 0xf4, 0xf8, 0x7a, 0x81, 0xc3, 0x68, 0xb5,
0x80, 0xf7, 0x23, 0x0b, 0x00, 0x03, 0x1a, 0x87, 0xe7, 0x82, 0xc5, 0xba, 0x4e, 0xb0, 0xa8, 0x5e,
0x52, 0xb5, 0x24, 0x05, 0x8f, 0x99, 0x9c, 0xd6, 0x27, 0x61, 0x7c, 0x4f, 0xd2, 0x71, 0x42, 0xb5,
0xa8, 0x4c, 0x5a, 0xef, 0x67, 0x16, 0x00, 0x16, 0x58, 0x7d, 0x8c, 0xf9, 0xdb, 0xd5, 0xba, 0xfc,
0x47, 0x60, 0x63, 0x36, 0x25, 0xf6, 0xca, 0x94, 0x10, 0xc8, 0x91, 0xbd, 0xc8, 0x86, 0x8a, 0xa3,
0xa9, 0xf1, 0x26, 0x6b, 0x34, 0x2f, 0xbf, 0xb0, 0xc0, 0xa9, 0xd1, 0x27, 0x66, 0xb3, 0xd7, 0x9a,
0xcf, 0x5e, 0xec, 0xf0, 0x54, 0x44, 0xfb, 0xa2, 0x16, 0xe4, 0xc9, 0x34, 0xc8, 0x37, 0xa0, 0x8d,
0x94, 0xd4, 0xa2, 0x3c, 0x35, 0x51, 0x7e, 0x1f, 0x6e, 0x14, 0x3c, 0xe0, 0xa9, 0x8c, 0x27, 0x7e,
0x92, 0x85, 0xd1, 0x49, 0xc4, 0x43, 0x8c, 0xf5, 0x36, 0xed, 0x95, 0x82, 0x03, 0x83, 0x7b, 0x7f,
0xb0, 0x60, 0xf5, 0x3b, 0x63, 0x5e, 0x4c, 0x0e, 0xb3, 0x90, 0xeb, 0x93, 0xbd, 0x78, 0x04, 0xbd,
0x87, 0xb6, 0x18, 0x7a, 0x74, 0x08, 0xbd, 0xf1, 0x8f, 0x43, 0x48, 0xd0, 0xb6, 0x30, 0x61, 0xa3,
0x28, 0xd6, 0x3f, 0xec, 0xaf, 0x42, 0xf1, 0xd4, 0xb1, 0xe6, 0xea, 0xd4, 0x14, 0xff, 0xd0, 0x82,
0x6e, 0x2d, 0x59, 0x54, 0xc9, 0x37, 0xf7, 0x83, 0xbe, 0x56, 0x2c, 0x2c, 0x82, 0xdd, 0x60, 0xfa,
0x7c, 0x47, 0xd6, 0x61, 0x29, 0x11, 0x23, 0xe3, 0x71, 0x87, 0xea, 0x01, 0xd9, 0x84, 0x76, 0x22,
0x46, 0xf8, 0xfb, 0xc7, 0x54, 0xce, 0x6a, 0xac, 0xdc, 0x36, 0xed, 0x6c, 0x74, 0x01, 0x99, 0x02,
0xde, 0xaf, 0x2c, 0x20, 0xa6, 0x71, 0x78, 0xa9, 0x37, 0x5e, 0x0c, 0xd8, 0xfa, 0x13, 0x64, 0x43,
0x77, 0x66, 0x75, 0x6c, 0xee, 0xca, 0xb3, 0xcf, 0x5d, 0x79, 0xf7, 0xe1, 0x46, 0xc8, 0x4f, 0x98,
0xea, 0x71, 0xe6, 0x8f, 0xdc, 0x33, 0x82, 0xaa, 0x15, 0x7b, 0xeb, 0x5d, 0xe8, 0x54, 0x7f, 0xad,
0x90, 0x1e, 0x38, 0x83, 0x34, 0x92, 0xf8, 0x03, 0x2d, 0x4a, 0x47, 0xbd, 0xff, 0x23, 0x5d, 0x68,
0x7d, 0x8b, 0xb3, 0x58, 0x9e, 0x4e, 0x7a, 0x16, 0x71, 0xa0, 0xfd, 0xfe, 0x30, 0xcd, 0x8a, 0x84,
0xc5, 0xbd, 0xc6, 0xde, 0x3b, 0xdf, 0xfb, 0xca, 0x28, 0x92, 0xa7, 0xe3, 0xa1, 0xb2, 0x64, 0x47,
0x9b, 0xf6, 0xc5, 0x28, 0x33, 0x5f, 0x3b, 0xa5, 0xd7, 0x76, 0xd0, 0xda, 0x6a, 0x98, 0x0f, 0x87,
0xcb, 0x88, 0xbc, 0xfd, 0xf7, 0x00, 0x00, 0x00, 0xff, 0xff, 0x2f, 0x93, 0x3f, 0x71, 0x80, 0x1a,
0x00, 0x00,
}

View File

@ -101,6 +101,7 @@ func (ddNode *ddNode) Operate(in []flowgraph.Msg) []flowgraph.Msg {
func (ddNode *ddNode) createCollection(msg *msgstream.CreateCollectionMsg) {
collectionID := msg.CollectionID
partitionID := msg.PartitionID
hasCollection := ddNode.replica.hasCollection(collectionID)
if hasCollection {
@ -124,7 +125,7 @@ func (ddNode *ddNode) createCollection(msg *msgstream.CreateCollectionMsg) {
// add default partition
// TODO: allocate default partition id in master
err = ddNode.replica.addPartition(collectionID, UniqueID(2021))
err = ddNode.replica.addPartition(collectionID, partitionID)
if err != nil {
log.Error(err.Error())
return

View File

@ -12,7 +12,6 @@
package rootcoord
import (
"errors"
"fmt"
"path"
"strconv"
@ -222,12 +221,12 @@ func (mt *metaTable) AddProxy(po *pb.ProxyMeta) (typeutil.Timestamp, error) {
return ts, nil
}
func (mt *metaTable) AddCollection(coll *pb.CollectionInfo, partID typeutil.UniqueID, partName string, idx []*pb.IndexInfo, ddOpStr func(ts typeutil.Timestamp) (string, error)) (typeutil.Timestamp, error) {
func (mt *metaTable) AddCollection(coll *pb.CollectionInfo, idx []*pb.IndexInfo, ddOpStr func(ts typeutil.Timestamp) (string, error)) (typeutil.Timestamp, error) {
mt.ddLock.Lock()
defer mt.ddLock.Unlock()
if len(coll.PartitionIDs) != 0 || len(coll.PartitonNames) != 0 {
return 0, errors.New("partitions should be empty when creating collection")
if len(coll.PartitionIDs) != len(coll.PartitionNames) {
return 0, fmt.Errorf("PartitionIDs and PartitionNames' length mis-match when creating collection")
}
if _, ok := mt.collName2ID[coll.Schema.Name]; ok {
return 0, fmt.Errorf("collection %s exist", coll.Schema.Name)
@ -236,8 +235,6 @@ func (mt *metaTable) AddCollection(coll *pb.CollectionInfo, partID typeutil.Uniq
return 0, fmt.Errorf("incorrect index id when creating collection")
}
coll.PartitionIDs = append(coll.PartitionIDs, partID)
coll.PartitonNames = append(coll.PartitonNames, partName)
mt.collID2Meta[coll.ID] = *coll
mt.collName2ID[coll.Schema.Name] = coll.ID
for _, i := range idx {
@ -453,21 +450,21 @@ func (mt *metaTable) AddPartition(collID typeutil.UniqueID, partitionName string
return 0, fmt.Errorf("maximum partition's number should be limit to %d", Params.MaxPartitionNum)
}
if len(coll.PartitionIDs) != len(coll.PartitonNames) {
return 0, fmt.Errorf("len(coll.PartitionIDs)=%d, len(coll.PartitonNames)=%d", len(coll.PartitionIDs), len(coll.PartitonNames))
if len(coll.PartitionIDs) != len(coll.PartitionNames) {
return 0, fmt.Errorf("len(coll.PartitionIDs)=%d, len(coll.PartitionNames)=%d", len(coll.PartitionIDs), len(coll.PartitionNames))
}
for idx := range coll.PartitionIDs {
if coll.PartitionIDs[idx] == partitionID {
return 0, fmt.Errorf("partition id = %d already exists", partitionID)
}
if coll.PartitonNames[idx] == partitionName {
if coll.PartitionNames[idx] == partitionName {
return 0, fmt.Errorf("partition name = %s already exists", partitionName)
}
}
coll.PartitionIDs = append(coll.PartitionIDs, partitionID)
coll.PartitonNames = append(coll.PartitonNames, partitionName)
coll.PartitionNames = append(coll.PartitionNames, partitionName)
mt.collID2Meta[collID] = coll
k1 := fmt.Sprintf("%s/%d", CollectionMetaPrefix, collID)
@ -495,7 +492,7 @@ func (mt *metaTable) GetPartitionNameByID(collID, partitionID typeutil.UniqueID,
}
for idx := range collMeta.PartitionIDs {
if collMeta.PartitionIDs[idx] == partitionID {
return collMeta.PartitonNames[idx], nil
return collMeta.PartitionNames[idx], nil
}
}
return "", fmt.Errorf("partition %d does not exist", partitionID)
@ -512,7 +509,7 @@ func (mt *metaTable) GetPartitionNameByID(collID, partitionID typeutil.UniqueID,
}
for idx := range collMeta.PartitionIDs {
if collMeta.PartitionIDs[idx] == partitionID {
return collMeta.PartitonNames[idx], nil
return collMeta.PartitionNames[idx], nil
}
}
return "", fmt.Errorf("partition %d does not exist", partitionID)
@ -525,7 +522,7 @@ func (mt *metaTable) getPartitionByName(collID typeutil.UniqueID, partitionName
return 0, fmt.Errorf("can't find collection id = %d", collID)
}
for idx := range collMeta.PartitionIDs {
if collMeta.PartitonNames[idx] == partitionName {
if collMeta.PartitionNames[idx] == partitionName {
return collMeta.PartitionIDs[idx], nil
}
}
@ -542,7 +539,7 @@ func (mt *metaTable) getPartitionByName(collID typeutil.UniqueID, partitionName
return 0, err
}
for idx := range collMeta.PartitionIDs {
if collMeta.PartitonNames[idx] == partitionName {
if collMeta.PartitionNames[idx] == partitionName {
return collMeta.PartitionIDs[idx], nil
}
}
@ -580,22 +577,22 @@ func (mt *metaTable) DeletePartition(collID typeutil.UniqueID, partitionName str
exist := false
pd := make([]typeutil.UniqueID, 0, len(collMeta.PartitionIDs))
pn := make([]string, 0, len(collMeta.PartitonNames))
pn := make([]string, 0, len(collMeta.PartitionNames))
var partID typeutil.UniqueID
for idx := range collMeta.PartitionIDs {
if collMeta.PartitonNames[idx] == partitionName {
if collMeta.PartitionNames[idx] == partitionName {
partID = collMeta.PartitionIDs[idx]
exist = true
} else {
pd = append(pd, collMeta.PartitionIDs[idx])
pn = append(pn, collMeta.PartitonNames[idx])
pn = append(pn, collMeta.PartitionNames[idx])
}
}
if !exist {
return 0, 0, fmt.Errorf("partition %s does not exist", partitionName)
}
collMeta.PartitionIDs = pd
collMeta.PartitonNames = pn
collMeta.PartitionNames = pn
mt.collID2Meta[collID] = collMeta
// update segID2IndexMeta and partID2SegID

View File

@ -213,9 +213,9 @@ func TestMetaTable(t *testing.T) {
IndexID: indexID,
},
},
CreateTime: 0,
PartitionIDs: nil,
PartitonNames: nil,
CreateTime: 0,
PartitionIDs: []typeutil.UniqueID{partIDDefault},
PartitionNames: []string{Params.DefaultPartitionName},
}
idxInfo := []*pb.IndexInfo{
{
@ -239,15 +239,10 @@ func TestMetaTable(t *testing.T) {
}
t.Run("add collection", func(t *testing.T) {
collInfo.PartitionIDs = []int64{segID}
_, err = mt.AddCollection(collInfo, partIDDefault, Params.DefaultPartitionName, idxInfo, ddOp)
assert.NotNil(t, err)
collInfo.PartitionIDs = []int64{}
_, err = mt.AddCollection(collInfo, partIDDefault, Params.DefaultPartitionName, nil, ddOp)
_, err = mt.AddCollection(collInfo, nil, ddOp)
assert.NotNil(t, err)
_, err = mt.AddCollection(collInfo, partIDDefault, Params.DefaultPartitionName, idxInfo, ddOp)
_, err = mt.AddCollection(collInfo, idxInfo, ddOp)
assert.Nil(t, err)
collMeta, err := mt.GetCollectionByName("testColl", 0)
@ -449,8 +444,8 @@ func TestMetaTable(t *testing.T) {
return 0, fmt.Errorf("multi save error")
}
collInfo.PartitionIDs = nil
collInfo.PartitonNames = nil
_, err := mt.AddCollection(collInfo, partID, partName, idxInfo, nil)
collInfo.PartitionNames = nil
_, err := mt.AddCollection(collInfo, idxInfo, nil)
assert.NotNil(t, err)
assert.EqualError(t, err, "multi save error")
})
@ -460,16 +455,16 @@ func TestMetaTable(t *testing.T) {
return 0, nil
}
mockKV.multiSaveAndRemoveWithPrefix = func(save map[string]string, keys []string, addition func(ts typeutil.Timestamp) (string, string, error)) (typeutil.Timestamp, error) {
return 0, fmt.Errorf("milti save and remove with prefix error")
return 0, fmt.Errorf("multi save and remove with prefix error")
}
collInfo.PartitionIDs = nil
collInfo.PartitonNames = nil
_, err := mt.AddCollection(collInfo, partID, partName, idxInfo, nil)
collInfo.PartitionNames = nil
_, err := mt.AddCollection(collInfo, idxInfo, nil)
assert.Nil(t, err)
mt.indexID2Meta = make(map[int64]pb.IndexInfo)
_, err = mt.DeleteCollection(collInfo.ID, nil)
assert.NotNil(t, err)
assert.EqualError(t, err, "milti save and remove with prefix error")
assert.EqualError(t, err, "multi save and remove with prefix error")
})
t.Run("get collection failed", func(t *testing.T) {
@ -478,8 +473,8 @@ func TestMetaTable(t *testing.T) {
}
collInfo.PartitionIDs = nil
collInfo.PartitonNames = nil
_, err := mt.AddCollection(collInfo, partID, partName, idxInfo, nil)
collInfo.PartitionNames = nil
_, err := mt.AddCollection(collInfo, idxInfo, nil)
assert.Nil(t, err)
mt.collID2Meta = make(map[int64]pb.CollectionInfo)
@ -500,8 +495,8 @@ func TestMetaTable(t *testing.T) {
assert.Nil(t, err)
collInfo.PartitionIDs = nil
collInfo.PartitonNames = nil
_, err = mt.AddCollection(collInfo, partID, partName, idxInfo, nil)
collInfo.PartitionNames = nil
_, err = mt.AddCollection(collInfo, idxInfo, nil)
assert.Nil(t, err)
_, err = mt.AddPartition(2, "no-part", 22, nil)
@ -516,7 +511,7 @@ func TestMetaTable(t *testing.T) {
assert.EqualError(t, err, fmt.Sprintf("maximum partition's number should be limit to %d", Params.MaxPartitionNum))
coll.PartitionIDs = []int64{partID}
coll.PartitonNames = []string{partName}
coll.PartitionNames = []string{partName}
mt.collID2Meta[coll.ID] = coll
mockKV.multiSave = func(kvs map[string]string, addition func(ts typeutil.Timestamp) (string, string, error)) (typeutil.Timestamp, error) {
return 0, fmt.Errorf("multi save error")
@ -529,13 +524,14 @@ func TestMetaTable(t *testing.T) {
return 0, nil
}
collInfo.PartitionIDs = nil
collInfo.PartitonNames = nil
_, err = mt.AddCollection(collInfo, partID, partName, idxInfo, nil)
collInfo.PartitionNames = nil
_, err = mt.AddCollection(collInfo, idxInfo, nil)
assert.Nil(t, err)
_, err = mt.AddPartition(coll.ID, partName, partID, nil)
assert.Nil(t, err)
_, err = mt.AddPartition(coll.ID, partName, 22, nil)
assert.NotNil(t, err)
assert.EqualError(t, err, fmt.Sprintf("partition name = %s already exists", partName))
_, err = mt.AddPartition(coll.ID, "no-part", partID, nil)
assert.NotNil(t, err)
assert.EqualError(t, err, fmt.Sprintf("partition id = %d already exists", partID))
@ -552,8 +548,8 @@ func TestMetaTable(t *testing.T) {
assert.Nil(t, err)
collInfo.PartitionIDs = nil
collInfo.PartitonNames = nil
_, err = mt.AddCollection(collInfo, partID, partName, idxInfo, nil)
collInfo.PartitionNames = nil
_, err = mt.AddCollection(collInfo, idxInfo, nil)
assert.Nil(t, err)
assert.False(t, mt.HasPartition(collInfo.ID, "no-partName", 0))
@ -572,9 +568,9 @@ func TestMetaTable(t *testing.T) {
err := mt.reloadFromKV()
assert.Nil(t, err)
collInfo.PartitionIDs = nil
collInfo.PartitonNames = nil
_, err = mt.AddCollection(collInfo, partID, partName, idxInfo, nil)
collInfo.PartitionIDs = []int64{partID}
collInfo.PartitionNames = []string{partName}
_, err = mt.AddCollection(collInfo, idxInfo, nil)
assert.Nil(t, err)
_, _, err = mt.DeletePartition(collInfo.ID, Params.DefaultPartitionName, nil)
@ -612,8 +608,8 @@ func TestMetaTable(t *testing.T) {
assert.Nil(t, err)
collInfo.PartitionIDs = nil
collInfo.PartitonNames = nil
_, err = mt.AddCollection(collInfo, partID, partName, idxInfo, nil)
collInfo.PartitionNames = nil
_, err = mt.AddCollection(collInfo, idxInfo, nil)
assert.Nil(t, err)
segIdxInfo := pb.SegmentIndexInfo{
@ -637,8 +633,8 @@ func TestMetaTable(t *testing.T) {
assert.Nil(t, err)
collInfo.PartitionIDs = nil
collInfo.PartitonNames = nil
_, err = mt.AddCollection(collInfo, partID, partName, idxInfo, nil)
collInfo.PartitionNames = nil
_, err = mt.AddCollection(collInfo, idxInfo, nil)
assert.Nil(t, err)
segIdxInfo.IndexID = indexID
@ -664,8 +660,8 @@ func TestMetaTable(t *testing.T) {
assert.Nil(t, err)
collInfo.PartitionIDs = nil
collInfo.PartitonNames = nil
_, err = mt.AddCollection(collInfo, partID, partName, idxInfo, nil)
collInfo.PartitionNames = nil
_, err = mt.AddCollection(collInfo, idxInfo, nil)
assert.Nil(t, err)
_, _, _, err = mt.DropIndex("abc", "abc", "abc")
@ -702,8 +698,8 @@ func TestMetaTable(t *testing.T) {
err = mt.reloadFromKV()
assert.Nil(t, err)
collInfo.PartitionIDs = nil
collInfo.PartitonNames = nil
_, err = mt.AddCollection(collInfo, partID, partName, idxInfo, nil)
collInfo.PartitionNames = nil
_, err = mt.AddCollection(collInfo, idxInfo, nil)
assert.Nil(t, err)
mockKV.multiSaveAndRemoveWithPrefix = func(saves map[string]string, removals []string, addition func(ts typeutil.Timestamp) (string, string, error)) (typeutil.Timestamp, error) {
return 0, fmt.Errorf("multi save and remove with prefix error")
@ -727,8 +723,8 @@ func TestMetaTable(t *testing.T) {
assert.Nil(t, err)
collInfo.PartitionIDs = nil
collInfo.PartitonNames = nil
_, err = mt.AddCollection(collInfo, partID, partName, idxInfo, nil)
collInfo.PartitionNames = nil
_, err = mt.AddCollection(collInfo, idxInfo, nil)
assert.Nil(t, err)
seg, err := mt.GetSegmentIndexInfoByID(segID2, fieldID, "abc")
@ -774,8 +770,8 @@ func TestMetaTable(t *testing.T) {
assert.Nil(t, err)
collInfo.PartitionIDs = nil
collInfo.PartitonNames = nil
_, err = mt.AddCollection(collInfo, partID, partName, idxInfo, nil)
collInfo.PartitionNames = nil
_, err = mt.AddCollection(collInfo, idxInfo, nil)
assert.Nil(t, err)
mt.collID2Meta = make(map[int64]pb.CollectionInfo)
@ -844,8 +840,8 @@ func TestMetaTable(t *testing.T) {
assert.Nil(t, err)
collInfo.PartitionIDs = nil
collInfo.PartitonNames = nil
_, err = mt.AddCollection(collInfo, partID, partName, idxInfo, nil)
collInfo.PartitionNames = nil
_, err = mt.AddCollection(collInfo, idxInfo, nil)
assert.Nil(t, err)
_, _, err = mt.GetNotIndexedSegments(collInfo.Schema.Name, "no-field", idx, nil)
@ -870,8 +866,8 @@ func TestMetaTable(t *testing.T) {
return 0, nil
}
collInfo.PartitionIDs = nil
collInfo.PartitonNames = nil
_, err = mt.AddCollection(collInfo, partID, partName, idxInfo, nil)
collInfo.PartitionNames = nil
_, err = mt.AddCollection(collInfo, idxInfo, nil)
assert.Nil(t, err)
coll := mt.collID2Meta[collInfo.ID]
coll.FieldIndexes = append(coll.FieldIndexes, &pb.FieldIndexInfo{FiledID: coll.FieldIndexes[0].FiledID, IndexID: coll.FieldIndexes[0].IndexID + 1})
@ -919,8 +915,8 @@ func TestMetaTable(t *testing.T) {
assert.Nil(t, err)
collInfo.PartitionIDs = nil
collInfo.PartitonNames = nil
_, err = mt.AddCollection(collInfo, partID, partName, idxInfo, nil)
collInfo.PartitionNames = nil
_, err = mt.AddCollection(collInfo, idxInfo, nil)
assert.Nil(t, err)
mt.indexID2Meta = make(map[int64]pb.IndexInfo)
_, _, err = mt.GetIndexByName(collInfo.Schema.Name, idxInfo[0].IndexName)
@ -934,6 +930,16 @@ func TestMetaTable(t *testing.T) {
}
func TestMetaWithTimestamp(t *testing.T) {
const (
collID1 = typeutil.UniqueID(1)
collID2 = typeutil.UniqueID(2)
collName1 = "t1"
collName2 = "t2"
partID1 = 11
partID2 = 12
partName1 = "p1"
partName2 = "p2"
)
rand.Seed(time.Now().UnixNano())
randVal := rand.Int()
Params.Init()
@ -959,81 +965,83 @@ func TestMetaWithTimestamp(t *testing.T) {
collInfo := &pb.CollectionInfo{
ID: 1,
Schema: &schemapb.CollectionSchema{
Name: "t1",
Name: collName1,
},
}
t1, err := mt.AddCollection(collInfo, 11, "p1", nil, nil)
collInfo.PartitionIDs = []int64{partID1}
collInfo.PartitionNames = []string{partName1}
t1, err := mt.AddCollection(collInfo, nil, nil)
assert.Nil(t, err)
collInfo.ID = 2
collInfo.PartitionIDs = nil
collInfo.PartitonNames = nil
collInfo.Schema.Name = "t2"
collInfo.PartitionIDs = []int64{partID2}
collInfo.PartitionNames = []string{partName2}
collInfo.Schema.Name = collName2
t2, err := mt.AddCollection(collInfo, 12, "p2", nil, nil)
t2, err := mt.AddCollection(collInfo, nil, nil)
assert.Nil(t, err)
assert.True(t, mt.HasCollection(1, 0))
assert.True(t, mt.HasCollection(2, 0))
assert.True(t, mt.HasCollection(collID1, 0))
assert.True(t, mt.HasCollection(collID2, 0))
assert.True(t, mt.HasCollection(1, t2))
assert.True(t, mt.HasCollection(2, t2))
assert.True(t, mt.HasCollection(collID1, t2))
assert.True(t, mt.HasCollection(collID2, t2))
assert.True(t, mt.HasCollection(1, t1))
assert.False(t, mt.HasCollection(2, t1))
assert.True(t, mt.HasCollection(collID1, t1))
assert.False(t, mt.HasCollection(collID2, t1))
assert.False(t, mt.HasCollection(1, tsoStart))
assert.False(t, mt.HasCollection(2, tsoStart))
assert.False(t, mt.HasCollection(collID1, tsoStart))
assert.False(t, mt.HasCollection(collID2, tsoStart))
c1, err := mt.GetCollectionByID(1, 0)
c1, err := mt.GetCollectionByID(collID1, 0)
assert.Nil(t, err)
c2, err := mt.GetCollectionByID(2, 0)
c2, err := mt.GetCollectionByID(collID2, 0)
assert.Nil(t, err)
assert.Equal(t, collID1, c1.ID)
assert.Equal(t, collID2, c2.ID)
c1, err = mt.GetCollectionByID(collID1, t2)
assert.Nil(t, err)
c2, err = mt.GetCollectionByID(collID2, t2)
assert.Nil(t, err)
assert.Equal(t, collID1, c1.ID)
assert.Equal(t, collID2, c2.ID)
c1, err = mt.GetCollectionByID(collID1, t1)
assert.Nil(t, err)
c2, err = mt.GetCollectionByID(collID2, t1)
assert.NotNil(t, err)
assert.Equal(t, int64(1), c1.ID)
c1, err = mt.GetCollectionByID(collID1, tsoStart)
assert.NotNil(t, err)
c2, err = mt.GetCollectionByID(collID2, tsoStart)
assert.NotNil(t, err)
c1, err = mt.GetCollectionByName(collName1, 0)
assert.Nil(t, err)
c2, err = mt.GetCollectionByName(collName2, 0)
assert.Nil(t, err)
assert.Equal(t, int64(1), c1.ID)
assert.Equal(t, int64(2), c2.ID)
c1, err = mt.GetCollectionByID(1, t2)
c1, err = mt.GetCollectionByName(collName1, t2)
assert.Nil(t, err)
c2, err = mt.GetCollectionByID(2, t2)
c2, err = mt.GetCollectionByName(collName2, t2)
assert.Nil(t, err)
assert.Equal(t, int64(1), c1.ID)
assert.Equal(t, int64(2), c2.ID)
c1, err = mt.GetCollectionByID(1, t1)
c1, err = mt.GetCollectionByName(collName1, t1)
assert.Nil(t, err)
c2, err = mt.GetCollectionByID(2, t1)
c2, err = mt.GetCollectionByName(collName2, t1)
assert.NotNil(t, err)
assert.Equal(t, int64(1), c1.ID)
c1, err = mt.GetCollectionByID(1, tsoStart)
c1, err = mt.GetCollectionByName(collName1, tsoStart)
assert.NotNil(t, err)
c2, err = mt.GetCollectionByID(2, tsoStart)
assert.NotNil(t, err)
c1, err = mt.GetCollectionByName("t1", 0)
assert.Nil(t, err)
c2, err = mt.GetCollectionByName("t2", 0)
assert.Nil(t, err)
assert.Equal(t, int64(1), c1.ID)
assert.Equal(t, int64(2), c2.ID)
c1, err = mt.GetCollectionByName("t1", t2)
assert.Nil(t, err)
c2, err = mt.GetCollectionByName("t2", t2)
assert.Nil(t, err)
assert.Equal(t, int64(1), c1.ID)
assert.Equal(t, int64(2), c2.ID)
c1, err = mt.GetCollectionByName("t1", t1)
assert.Nil(t, err)
c2, err = mt.GetCollectionByName("t2", t1)
assert.NotNil(t, err)
assert.Equal(t, int64(1), c1.ID)
c1, err = mt.GetCollectionByName("t1", tsoStart)
assert.NotNil(t, err)
c2, err = mt.GetCollectionByName("t2", tsoStart)
c2, err = mt.GetCollectionByName(collName2, tsoStart)
assert.NotNil(t, err)
getKeys := func(m map[string]typeutil.UniqueID) []string {
@ -1047,45 +1055,45 @@ func TestMetaWithTimestamp(t *testing.T) {
s1, err := mt.ListCollections(0)
assert.Nil(t, err)
assert.Equal(t, 2, len(s1))
assert.ElementsMatch(t, getKeys(s1), []string{"t1", "t2"})
assert.ElementsMatch(t, getKeys(s1), []string{collName1, collName2})
s1, err = mt.ListCollections(t2)
assert.Nil(t, err)
assert.Equal(t, 2, len(s1))
assert.ElementsMatch(t, getKeys(s1), []string{"t1", "t2"})
assert.ElementsMatch(t, getKeys(s1), []string{collName1, collName2})
s1, err = mt.ListCollections(t1)
assert.Nil(t, err)
assert.Equal(t, 1, len(s1))
assert.ElementsMatch(t, getKeys(s1), []string{"t1"})
assert.ElementsMatch(t, getKeys(s1), []string{collName1})
s1, err = mt.ListCollections(tsoStart)
assert.Nil(t, err)
assert.Equal(t, 0, len(s1))
p1, err := mt.GetPartitionByName(1, "p1", 0)
p1, err := mt.GetPartitionByName(1, partName1, 0)
assert.Nil(t, err)
p2, err := mt.GetPartitionByName(2, "p2", 0)
p2, err := mt.GetPartitionByName(2, partName2, 0)
assert.Nil(t, err)
assert.Equal(t, int64(11), p1)
assert.Equal(t, int64(12), p2)
assert.Nil(t, err)
p1, err = mt.GetPartitionByName(1, "p1", t2)
p1, err = mt.GetPartitionByName(1, partName1, t2)
assert.Nil(t, err)
p2, err = mt.GetPartitionByName(2, "p2", t2)
p2, err = mt.GetPartitionByName(2, partName2, t2)
assert.Nil(t, err)
assert.Equal(t, int64(11), p1)
assert.Equal(t, int64(12), p2)
p1, err = mt.GetPartitionByName(1, "p1", t1)
p1, err = mt.GetPartitionByName(1, partName1, t1)
assert.Nil(t, err)
_, err = mt.GetPartitionByName(2, "p2", t1)
_, err = mt.GetPartitionByName(2, partName2, t1)
assert.NotNil(t, err)
assert.Equal(t, int64(11), p1)
_, err = mt.GetPartitionByName(1, "p1", tsoStart)
_, err = mt.GetPartitionByName(1, partName1, tsoStart)
assert.NotNil(t, err)
_, err = mt.GetPartitionByName(2, "p2", tsoStart)
_, err = mt.GetPartitionByName(2, partName2, tsoStart)
assert.NotNil(t, err)
}

View File

@ -52,9 +52,8 @@ import (
// DdOperation used to save ddMsg into ETCD
type DdOperation struct {
Body string `json:"body"`
Body1 string `json:"body1"` // used for CreateCollectionReq only
Type string `json:"type"`
Body string `json:"body"`
Type string `json:"type"`
}
const (
@ -989,23 +988,15 @@ func (c *Core) reSendDdMsg(ctx context.Context) error {
switch ddOp.Type {
case CreateCollectionDDType:
var ddCollReq = internalpb.CreateCollectionRequest{}
if err = proto.UnmarshalText(ddOp.Body, &ddCollReq); err != nil {
var ddReq = internalpb.CreateCollectionRequest{}
if err = proto.UnmarshalText(ddOp.Body, &ddReq); err != nil {
return err
}
// TODO: can optimize
var ddPartReq = internalpb.CreatePartitionRequest{}
if err = proto.UnmarshalText(ddOp.Body1, &ddPartReq); err != nil {
return err
}
collInfo, err := c.MetaTable.GetCollectionByName(ddCollReq.CollectionName, 0)
collInfo, err := c.MetaTable.GetCollectionByName(ddReq.CollectionName, 0)
if err != nil {
return err
}
if err = c.SendDdCreateCollectionReq(ctx, &ddCollReq, collInfo.PhysicalChannelNames); err != nil {
return err
}
if err = c.SendDdCreatePartitionReq(ctx, &ddPartReq, collInfo.PhysicalChannelNames); err != nil {
if err = c.SendDdCreateCollectionReq(ctx, &ddReq, collInfo.PhysicalChannelNames); err != nil {
return err
}
case DropCollectionDDType:

View File

@ -350,7 +350,7 @@ func TestRootCoord(t *testing.T) {
err = core.Start()
assert.Nil(t, err)
time.Sleep(time.Second)
time.Sleep(100 * time.Millisecond)
t.Run("time tick", func(t *testing.T) {
ttmsg, ok := <-timeTickStream.Chan()
@ -424,20 +424,15 @@ func TestRootCoord(t *testing.T) {
assert.Nil(t, err)
assert.Equal(t, createMeta.ID, createMsg.CollectionID)
assert.Equal(t, 1, len(createMeta.PartitionIDs))
assert.Equal(t, createMeta.PartitionIDs[0], createMsg.PartitionID)
assert.Equal(t, 1, len(createMeta.PartitionNames))
assert.Equal(t, createMeta.PartitionNames[0], createMsg.PartitionName)
assert.Equal(t, 2, len(createMeta.VirtualChannelNames))
assert.Equal(t, 2, len(createMeta.PhysicalChannelNames))
vChanName := createMeta.VirtualChannelNames[0]
assert.Equal(t, createMeta.PhysicalChannelNames[0], ToPhysicalChannel(vChanName))
// get CreatePartitionMsg
msgPack, ok = <-dmlStream.Chan()
assert.True(t, ok)
createPart, ok := (msgPack.Msgs[0]).(*msgstream.CreatePartitionMsg)
assert.True(t, ok)
assert.Equal(t, collName, createPart.CollectionName)
assert.Equal(t, createMeta.PartitionIDs[0], createPart.PartitionID)
// get TimeTickMsg
//msgPack, ok = <-dmlStream.Chan()
//assert.True(t, ok)
@ -457,7 +452,7 @@ func TestRootCoord(t *testing.T) {
assert.Equal(t, pt.in.Timestamps[0], pt.in.DefaultTimestamp)
assert.Equal(t, pt.timeTick[pt.in.ChannelNames[0]], pt.in.DefaultTimestamp)
assert.Equal(t, pt.timeTick[pt.in.ChannelNames[1]], pt.in.DefaultTimestamp)
assert.LessOrEqual(t, createPart.BeginTimestamp, pt.in.Timestamps[0])
assert.LessOrEqual(t, createMsg.BeginTimestamp, pt.in.Timestamps[0])
core.chanTimeTick.lock.Unlock()
// check DD operation info
@ -475,12 +470,7 @@ func TestRootCoord(t *testing.T) {
err = proto.UnmarshalText(ddOp.Body, &ddCollReq)
assert.Nil(t, err)
assert.Equal(t, createMeta.ID, ddCollReq.CollectionID)
var ddPartReq = internalpb.CreatePartitionRequest{}
err = proto.UnmarshalText(ddOp.Body1, &ddPartReq)
assert.Nil(t, err)
assert.Equal(t, createMeta.ID, ddPartReq.CollectionID)
assert.Equal(t, createMeta.PartitionIDs[0], ddPartReq.PartitionID)
assert.Equal(t, createMeta.PartitionIDs[0], ddCollReq.PartitionID)
// check invalid operation
req.Base.MsgID = 101
@ -738,7 +728,7 @@ func TestRootCoord(t *testing.T) {
rsp, err := core.CreateIndex(ctx, req)
assert.Nil(t, err)
assert.Equal(t, commonpb.ErrorCode_Success, rsp.ErrorCode)
time.Sleep(time.Second)
time.Sleep(100 * time.Millisecond)
files := im.getFileArray()
assert.Equal(t, 3, len(files))
assert.ElementsMatch(t, files, []string{"file0-100", "file1-100", "file2-100"})
@ -880,7 +870,7 @@ func TestRootCoord(t *testing.T) {
rsp, err := core.CreateIndex(ctx, req)
assert.Nil(t, err)
assert.Equal(t, commonpb.ErrorCode_Success, rsp.ErrorCode)
time.Sleep(time.Second)
time.Sleep(100 * time.Millisecond)
collMeta, err = core.MetaTable.GetCollectionByName(collName, 0)
assert.Nil(t, err)
@ -1010,7 +1000,7 @@ func TestRootCoord(t *testing.T) {
assert.Equal(t, 3, len(collArray))
assert.Equal(t, collName, collArray[2])
time.Sleep(time.Millisecond * 100)
time.Sleep(100 * time.Millisecond)
qm.mutex.Lock()
assert.Equal(t, 1, len(qm.collID))
assert.Equal(t, collMeta.ID, qm.collID[0])
@ -1029,7 +1019,7 @@ func TestRootCoord(t *testing.T) {
status, err = core.DropCollection(ctx, req)
assert.Nil(t, err)
assert.Equal(t, commonpb.ErrorCode_UnexpectedError, status.ErrorCode)
time.Sleep(time.Second)
time.Sleep(100 * time.Millisecond)
collArray = pnm.GetCollArray()
assert.Equal(t, 3, len(collArray))
assert.Equal(t, collName, collArray[2])
@ -1054,7 +1044,7 @@ func TestRootCoord(t *testing.T) {
t.Run("context_cancel", func(t *testing.T) {
ctx2, cancel2 := context.WithTimeout(ctx, time.Millisecond*100)
defer cancel2()
time.Sleep(time.Millisecond * 150)
time.Sleep(100 * time.Millisecond)
st, err := core.CreateCollection(ctx2, &milvuspb.CreateCollectionRequest{
Base: &commonpb.MsgBase{
MsgType: commonpb.MsgType_CreateCollection,
@ -1208,8 +1198,7 @@ func TestRootCoord(t *testing.T) {
})
assert.Nil(t, err)
assert.NotEqual(t, commonpb.ErrorCode_Success, rsp8.Status.ErrorCode)
time.Sleep(5 * time.Second)
time.Sleep(1 * time.Second)
})
t.Run("undefined req type", func(t *testing.T) {
@ -1439,7 +1428,7 @@ func TestRootCoord(t *testing.T) {
assert.Nil(t, err)
_, err = core.etcdCli.Put(ctx2, path.Join(sessKey, typeutil.ProxyRole)+"-2", string(s2))
assert.Nil(t, err)
time.Sleep(time.Second)
time.Sleep(100 * time.Millisecond)
core.dmlChannels.AddProducerChannels("c0", "c1", "c2")
@ -1478,7 +1467,7 @@ func TestRootCoord(t *testing.T) {
}
s, _ = core.UpdateChannelTimeTick(ctx, msgInvalid)
assert.Equal(t, commonpb.ErrorCode_UnexpectedError, s.ErrorCode)
time.Sleep(1 * time.Second)
time.Sleep(100 * time.Millisecond)
// 2 proxy, 1 rootcoord
assert.Equal(t, 3, core.chanTimeTick.GetProxyNum())
@ -1756,7 +1745,7 @@ func TestRootCoord2(t *testing.T) {
timeTickStream.AsConsumer([]string{Params.TimeTickChannel}, Params.MsgChannelSubName)
timeTickStream.Start()
time.Sleep(time.Second)
time.Sleep(100 * time.Millisecond)
t.Run("time tick", func(t *testing.T) {
ttmsg, ok := <-timeTickStream.Chan()
@ -1793,14 +1782,11 @@ func TestRootCoord2(t *testing.T) {
dmlStream.AsConsumer([]string{pChan[0]}, Params.MsgChannelSubName)
dmlStream.Start()
msgs := getNotTtMsg(ctx, 2, dmlStream.Chan())
assert.Equal(t, 2, len(msgs))
msgs := getNotTtMsg(ctx, 1, dmlStream.Chan())
assert.Equal(t, 1, len(msgs))
m1, ok := (msgs[0]).(*msgstream.CreateCollectionMsg)
assert.True(t, ok)
m2, ok := (msgs[1]).(*msgstream.CreatePartitionMsg)
assert.True(t, ok)
assert.Equal(t, m1.Base.Timestamp, m2.Base.Timestamp)
t.Log("time tick", m1.Base.Timestamp)
})
}

View File

@ -126,7 +126,7 @@ func (t *CreateCollectionReqTask) Execute(ctx context.Context) error {
log.Debug("collection name -> id",
zap.String("collection name", t.Req.CollectionName),
zap.Int64("colletion_id", collID),
zap.Int64("collection_id", collID),
zap.Int64("default partition id", partID))
vchanNames := make([]string, t.Req.ShardsNum)
@ -140,35 +140,14 @@ func (t *CreateCollectionReqTask) Execute(ctx context.Context) error {
ID: collID,
Schema: &schema,
CreateTime: collTs,
PartitionIDs: make([]typeutil.UniqueID, 0, 16),
PartitionIDs: []typeutil.UniqueID{partID},
PartitionNames: []string{Params.DefaultPartitionName},
FieldIndexes: make([]*etcdpb.FieldIndexInfo, 0, 16),
VirtualChannelNames: vchanNames,
PhysicalChannelNames: chanNames,
}
idxInfo := make([]*etcdpb.IndexInfo, 0, 16)
/////////////////////// ignore index param from create_collection /////////////////////////
//for _, field := range schema.Fields {
// if field.DataType == schemapb.DataType_VectorFloat || field.DataType == schemapb.DataType_VectorBinary {
// if len(field.IndexParams) > 0 {
// idxID, err := t.core.idAllocator.AllocOne()
// if err != nil {
// return err
// }
// filedIdx := &etcdpb.FieldIndexInfo{
// FiledID: field.FieldID,
// IndexID: idxID,
// }
// idx := &etcdpb.IndexInfo{
// IndexName: fmt.Sprintf("%s_index_%d", collMeta.Schema.Name, field.FieldID),
// IndexID: idxID,
// IndexParams: field.IndexParams,
// }
// idxInfo = append(idxInfo, idx)
// collMeta.FieldIndexes = append(collMeta.FieldIndexes, filedIdx)
// }
// }
//}
// schema is modified (add RowIDField and TimestampField),
// so need Marshal again
@ -181,37 +160,23 @@ func (t *CreateCollectionReqTask) Execute(ctx context.Context) error {
Base: t.Req.Base,
DbName: t.Req.DbName,
CollectionName: t.Req.CollectionName,
PartitionName: Params.DefaultPartitionName,
DbID: 0, //TODO,not used
CollectionID: collID,
PartitionID: partID,
Schema: schemaBytes,
VirtualChannelNames: vchanNames,
PhysicalChannelNames: chanNames,
}
ddPartReq := internalpb.CreatePartitionRequest{
Base: &commonpb.MsgBase{
MsgType: commonpb.MsgType_CreatePartition,
MsgID: t.Req.Base.MsgID, //TODO, msg id
Timestamp: t.Req.Base.Timestamp + 1,
SourceID: t.Req.Base.SourceID,
},
DbName: t.Req.DbName,
CollectionName: t.Req.CollectionName,
PartitionName: Params.DefaultPartitionName,
DbID: 0, //TODO, not used
CollectionID: collInfo.ID,
PartitionID: partID,
}
// build DdOperation and save it into etcd, when ddmsg send fail,
// system can restore ddmsg from etcd and re-send
ddOp := func(ts typeutil.Timestamp) (string, error) {
ddCollReq.Base.Timestamp = ts
ddPartReq.Base.Timestamp = ts
return EncodeDdOperation(&ddCollReq, &ddPartReq, CreateCollectionDDType)
return EncodeDdOperation(&ddCollReq, CreateCollectionDDType)
}
ts, err := t.core.MetaTable.AddCollection(&collInfo, partID, Params.DefaultPartitionName, idxInfo, ddOp)
ts, err := t.core.MetaTable.AddCollection(&collInfo, idxInfo, ddOp)
if err != nil {
return err
}
@ -223,10 +188,6 @@ func (t *CreateCollectionReqTask) Execute(ctx context.Context) error {
if err != nil {
return err
}
err = t.core.SendDdCreatePartitionReq(ctx, &ddPartReq, chanNames)
if err != nil {
return err
}
t.core.SendTimeTick(ts)
@ -265,7 +226,7 @@ func (t *DropCollectionReqTask) Execute(ctx context.Context) error {
// system can restore ddmsg from etcd and re-send
ddOp := func(ts typeutil.Timestamp) (string, error) {
ddReq.Base.Timestamp = ts
return EncodeDdOperation(&ddReq, nil, DropCollectionDDType)
return EncodeDdOperation(&ddReq, DropCollectionDDType)
}
ts, err := t.core.MetaTable.DeleteCollection(collMeta.ID, ddOp)
@ -435,7 +396,7 @@ func (t *CreatePartitionReqTask) Execute(ctx context.Context) error {
// system can restore ddmsg from etcd and re-send
ddOp := func(ts typeutil.Timestamp) (string, error) {
ddReq.Base.Timestamp = ts
return EncodeDdOperation(&ddReq, nil, CreatePartitionDDType)
return EncodeDdOperation(&ddReq, CreatePartitionDDType)
}
ts, err := t.core.MetaTable.AddPartition(collMeta.ID, t.Req.PartitionName, partID, ddOp)
@ -503,7 +464,7 @@ func (t *DropPartitionReqTask) Execute(ctx context.Context) error {
// system can restore ddmsg from etcd and re-send
ddOp := func(ts typeutil.Timestamp) (string, error) {
ddReq.Base.Timestamp = ts
return EncodeDdOperation(&ddReq, nil, DropPartitionDDType)
return EncodeDdOperation(&ddReq, DropPartitionDDType)
}
ts, _, err := t.core.MetaTable.DeletePartition(collInfo.ID, t.Req.PartitionName, ddOp)
@ -589,7 +550,7 @@ func (t *ShowPartitionReqTask) Execute(ctx context.Context) error {
return err
}
t.Rsp.PartitionIDs = coll.PartitionIDs
t.Rsp.PartitionNames = coll.PartitonNames
t.Rsp.PartitionNames = coll.PartitionNames
return nil
}

View File

@ -71,13 +71,11 @@ func GetFieldSchemaByIndexID(coll *etcdpb.CollectionInfo, idxID typeutil.UniqueI
}
// EncodeDdOperation serialize DdOperation into string
func EncodeDdOperation(m proto.Message, m1 proto.Message, ddType string) (string, error) {
func EncodeDdOperation(m proto.Message, ddType string) (string, error) {
mStr := proto.MarshalTextString(m)
m1Str := proto.MarshalTextString(m1)
ddOp := DdOperation{
Body: mStr,
Body1: m1Str, // used for DdCreateCollection only
Type: ddType,
Body: mStr,
Type: ddType,
}
ddOpByte, err := json.Marshal(ddOp)
if err != nil {