Fix travel timestamp and guarantee timestamp (#6234)

Signed-off-by: zhenshan.cao <zhenshan.cao@zilliz.com>
This commit is contained in:
zhenshan.cao 2021-06-30 21:02:13 +08:00 committed by GitHub
parent a7a9eeeffe
commit ff4c6c7ff4
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
13 changed files with 680 additions and 1213 deletions

View File

@ -1525,6 +1525,7 @@ const ::PROTOBUF_NAMESPACE_ID::uint32 TableStruct_milvus_2eproto::offsets[] PROT
PROTOBUF_FIELD_OFFSET(::milvus::proto::milvus::SearchRequest, output_fields_), PROTOBUF_FIELD_OFFSET(::milvus::proto::milvus::SearchRequest, output_fields_),
PROTOBUF_FIELD_OFFSET(::milvus::proto::milvus::SearchRequest, search_params_), PROTOBUF_FIELD_OFFSET(::milvus::proto::milvus::SearchRequest, search_params_),
PROTOBUF_FIELD_OFFSET(::milvus::proto::milvus::SearchRequest, travel_timestamp_), PROTOBUF_FIELD_OFFSET(::milvus::proto::milvus::SearchRequest, travel_timestamp_),
PROTOBUF_FIELD_OFFSET(::milvus::proto::milvus::SearchRequest, guarantee_timestamp_),
~0u, // no _has_bits_ ~0u, // no _has_bits_
PROTOBUF_FIELD_OFFSET(::milvus::proto::milvus::RetrieveRequest, _internal_metadata_), PROTOBUF_FIELD_OFFSET(::milvus::proto::milvus::RetrieveRequest, _internal_metadata_),
~0u, // no _extensions_ ~0u, // no _extensions_
@ -1537,6 +1538,7 @@ const ::PROTOBUF_NAMESPACE_ID::uint32 TableStruct_milvus_2eproto::offsets[] PROT
PROTOBUF_FIELD_OFFSET(::milvus::proto::milvus::RetrieveRequest, ids_), PROTOBUF_FIELD_OFFSET(::milvus::proto::milvus::RetrieveRequest, ids_),
PROTOBUF_FIELD_OFFSET(::milvus::proto::milvus::RetrieveRequest, output_fields_), PROTOBUF_FIELD_OFFSET(::milvus::proto::milvus::RetrieveRequest, output_fields_),
PROTOBUF_FIELD_OFFSET(::milvus::proto::milvus::RetrieveRequest, travel_timestamp_), PROTOBUF_FIELD_OFFSET(::milvus::proto::milvus::RetrieveRequest, travel_timestamp_),
PROTOBUF_FIELD_OFFSET(::milvus::proto::milvus::RetrieveRequest, guarantee_timestamp_),
~0u, // no _has_bits_ ~0u, // no _has_bits_
PROTOBUF_FIELD_OFFSET(::milvus::proto::milvus::RetrieveResults, _internal_metadata_), PROTOBUF_FIELD_OFFSET(::milvus::proto::milvus::RetrieveResults, _internal_metadata_),
~0u, // no _extensions_ ~0u, // no _extensions_
@ -1721,25 +1723,25 @@ static const ::PROTOBUF_NAMESPACE_ID::internal::MigrationSchema schemas[] PROTOB
{ 326, -1, sizeof(::milvus::proto::milvus::PlaceholderValue)}, { 326, -1, sizeof(::milvus::proto::milvus::PlaceholderValue)},
{ 334, -1, sizeof(::milvus::proto::milvus::PlaceholderGroup)}, { 334, -1, sizeof(::milvus::proto::milvus::PlaceholderGroup)},
{ 340, -1, sizeof(::milvus::proto::milvus::SearchRequest)}, { 340, -1, sizeof(::milvus::proto::milvus::SearchRequest)},
{ 355, -1, sizeof(::milvus::proto::milvus::RetrieveRequest)}, { 356, -1, sizeof(::milvus::proto::milvus::RetrieveRequest)},
{ 367, -1, sizeof(::milvus::proto::milvus::RetrieveResults)}, { 369, -1, sizeof(::milvus::proto::milvus::RetrieveResults)},
{ 375, -1, sizeof(::milvus::proto::milvus::Hits)}, { 377, -1, sizeof(::milvus::proto::milvus::Hits)},
{ 383, -1, sizeof(::milvus::proto::milvus::SearchResults)}, { 385, -1, sizeof(::milvus::proto::milvus::SearchResults)},
{ 390, -1, sizeof(::milvus::proto::milvus::FlushRequest)}, { 392, -1, sizeof(::milvus::proto::milvus::FlushRequest)},
{ 398, 405, sizeof(::milvus::proto::milvus::FlushResponse_CollSegIDsEntry_DoNotUse)}, { 400, 407, sizeof(::milvus::proto::milvus::FlushResponse_CollSegIDsEntry_DoNotUse)},
{ 407, -1, sizeof(::milvus::proto::milvus::FlushResponse)}, { 409, -1, sizeof(::milvus::proto::milvus::FlushResponse)},
{ 415, -1, sizeof(::milvus::proto::milvus::QueryRequest)}, { 417, -1, sizeof(::milvus::proto::milvus::QueryRequest)},
{ 426, -1, sizeof(::milvus::proto::milvus::QueryResults)}, { 428, -1, sizeof(::milvus::proto::milvus::QueryResults)},
{ 433, -1, sizeof(::milvus::proto::milvus::PersistentSegmentInfo)}, { 435, -1, sizeof(::milvus::proto::milvus::PersistentSegmentInfo)},
{ 443, -1, sizeof(::milvus::proto::milvus::GetPersistentSegmentInfoRequest)}, { 445, -1, sizeof(::milvus::proto::milvus::GetPersistentSegmentInfoRequest)},
{ 451, -1, sizeof(::milvus::proto::milvus::GetPersistentSegmentInfoResponse)}, { 453, -1, sizeof(::milvus::proto::milvus::GetPersistentSegmentInfoResponse)},
{ 458, -1, sizeof(::milvus::proto::milvus::QuerySegmentInfo)}, { 460, -1, sizeof(::milvus::proto::milvus::QuerySegmentInfo)},
{ 470, -1, sizeof(::milvus::proto::milvus::GetQuerySegmentInfoRequest)}, { 472, -1, sizeof(::milvus::proto::milvus::GetQuerySegmentInfoRequest)},
{ 478, -1, sizeof(::milvus::proto::milvus::GetQuerySegmentInfoResponse)}, { 480, -1, sizeof(::milvus::proto::milvus::GetQuerySegmentInfoResponse)},
{ 485, -1, sizeof(::milvus::proto::milvus::DummyRequest)}, { 487, -1, sizeof(::milvus::proto::milvus::DummyRequest)},
{ 491, -1, sizeof(::milvus::proto::milvus::DummyResponse)}, { 493, -1, sizeof(::milvus::proto::milvus::DummyResponse)},
{ 497, -1, sizeof(::milvus::proto::milvus::RegisterLinkRequest)}, { 499, -1, sizeof(::milvus::proto::milvus::RegisterLinkRequest)},
{ 502, -1, sizeof(::milvus::proto::milvus::RegisterLinkResponse)}, { 504, -1, sizeof(::milvus::proto::milvus::RegisterLinkResponse)},
}; };
static ::PROTOBUF_NAMESPACE_ID::Message const * const file_default_instances[] = { static ::PROTOBUF_NAMESPACE_ID::Message const * const file_default_instances[] = {
@ -1938,7 +1940,7 @@ const char descriptor_table_protodef_milvus_2eproto[] PROTOBUF_SECTION_VARIABLE(
"milvus.proto.milvus.PlaceholderType\022\016\n\006v" "milvus.proto.milvus.PlaceholderType\022\016\n\006v"
"alues\030\003 \003(\014\"O\n\020PlaceholderGroup\022;\n\014place" "alues\030\003 \003(\014\"O\n\020PlaceholderGroup\022;\n\014place"
"holders\030\001 \003(\0132%.milvus.proto.milvus.Plac" "holders\030\001 \003(\0132%.milvus.proto.milvus.Plac"
"eholderValue\"\301\002\n\rSearchRequest\022*\n\004base\030\001" "eholderValue\"\336\002\n\rSearchRequest\022*\n\004base\030\001"
" \001(\0132\034.milvus.proto.common.MsgBase\022\017\n\007db" " \001(\0132\034.milvus.proto.common.MsgBase\022\017\n\007db"
"_name\030\002 \001(\t\022\027\n\017collection_name\030\003 \001(\t\022\027\n\017" "_name\030\002 \001(\t\022\027\n\017collection_name\030\003 \001(\t\022\027\n\017"
"partition_names\030\004 \003(\t\022\013\n\003dsl\030\005 \001(\t\022\031\n\021pl" "partition_names\030\004 \003(\t\022\013\n\003dsl\030\005 \001(\t\022\031\n\021pl"
@ -1946,143 +1948,145 @@ const char descriptor_table_protodef_milvus_2eproto[] PROTOBUF_SECTION_VARIABLE(
"\034.milvus.proto.common.DslType\022\025\n\routput_" "\034.milvus.proto.common.DslType\022\025\n\routput_"
"fields\030\010 \003(\t\0228\n\rsearch_params\030\t \003(\0132!.mi" "fields\030\010 \003(\t\0228\n\rsearch_params\030\t \003(\0132!.mi"
"lvus.proto.common.KeyValuePair\022\030\n\020travel" "lvus.proto.common.KeyValuePair\022\030\n\020travel"
"_timestamp\030\n \001(\004\"\330\001\n\017RetrieveRequest\022*\n\004" "_timestamp\030\n \001(\004\022\033\n\023guarantee_timestamp\030"
"base\030\001 \001(\0132\034.milvus.proto.common.MsgBase" "\013 \001(\004\"\365\001\n\017RetrieveRequest\022*\n\004base\030\001 \001(\0132"
"\022\017\n\007db_name\030\002 \001(\t\022\027\n\017collection_name\030\003 \001" "\034.milvus.proto.common.MsgBase\022\017\n\007db_name"
"(\t\022\027\n\017partition_names\030\004 \003(\t\022%\n\003ids\030\005 \001(\013" "\030\002 \001(\t\022\027\n\017collection_name\030\003 \001(\t\022\027\n\017parti"
"2\030.milvus.proto.schema.IDs\022\025\n\routput_fie" "tion_names\030\004 \003(\t\022%\n\003ids\030\005 \001(\0132\030.milvus.p"
"lds\030\006 \003(\t\022\030\n\020travel_timestamp\030\007 \001(\004\"\232\001\n\017" "roto.schema.IDs\022\025\n\routput_fields\030\006 \003(\t\022\030"
"RetrieveResults\022+\n\006status\030\001 \001(\0132\033.milvus" "\n\020travel_timestamp\030\007 \001(\004\022\033\n\023guarantee_ti"
".proto.common.Status\022%\n\003ids\030\002 \001(\0132\030.milv" "mestamp\030\010 \001(\004\"\232\001\n\017RetrieveResults\022+\n\006sta"
"us.proto.schema.IDs\0223\n\013fields_data\030\003 \003(\013" "tus\030\001 \001(\0132\033.milvus.proto.common.Status\022%"
"2\036.milvus.proto.schema.FieldData\"5\n\004Hits" "\n\003ids\030\002 \001(\0132\030.milvus.proto.schema.IDs\0223\n"
"\022\013\n\003IDs\030\001 \003(\003\022\020\n\010row_data\030\002 \003(\014\022\016\n\006score" "\013fields_data\030\003 \003(\0132\036.milvus.proto.schema"
"s\030\003 \003(\002\"t\n\rSearchResults\022+\n\006status\030\001 \001(\013" ".FieldData\"5\n\004Hits\022\013\n\003IDs\030\001 \003(\003\022\020\n\010row_d"
"2\033.milvus.proto.common.Status\0226\n\007results" "ata\030\002 \003(\014\022\016\n\006scores\030\003 \003(\002\"t\n\rSearchResul"
"\030\002 \001(\0132%.milvus.proto.schema.SearchResul" "ts\022+\n\006status\030\001 \001(\0132\033.milvus.proto.common"
"tData\"e\n\014FlushRequest\022*\n\004base\030\001 \001(\0132\034.mi" ".Status\0226\n\007results\030\002 \001(\0132%.milvus.proto."
"lvus.proto.common.MsgBase\022\017\n\007db_name\030\002 \001" "schema.SearchResultData\"e\n\014FlushRequest\022"
"(\t\022\030\n\020collection_names\030\003 \003(\t\"\351\001\n\rFlushRe" "*\n\004base\030\001 \001(\0132\034.milvus.proto.common.MsgB"
"sponse\022+\n\006status\030\001 \001(\0132\033.milvus.proto.co" "ase\022\017\n\007db_name\030\002 \001(\t\022\030\n\020collection_names"
"mmon.Status\022\017\n\007db_name\030\002 \001(\t\022G\n\013coll_seg" "\030\003 \003(\t\"\351\001\n\rFlushResponse\022+\n\006status\030\001 \001(\013"
"IDs\030\003 \003(\01322.milvus.proto.milvus.FlushRes" "2\033.milvus.proto.common.Status\022\017\n\007db_name"
"ponse.CollSegIDsEntry\032Q\n\017CollSegIDsEntry" "\030\002 \001(\t\022G\n\013coll_segIDs\030\003 \003(\01322.milvus.pro"
"\022\013\n\003key\030\001 \001(\t\022-\n\005value\030\002 \001(\0132\036.milvus.pr" "to.milvus.FlushResponse.CollSegIDsEntry\032"
"oto.schema.LongArray:\0028\001\"\242\001\n\014QueryReques" "Q\n\017CollSegIDsEntry\022\013\n\003key\030\001 \001(\t\022-\n\005value"
"t\022*\n\004base\030\001 \001(\0132\034.milvus.proto.common.Ms" "\030\002 \001(\0132\036.milvus.proto.schema.LongArray:\002"
"gBase\022\017\n\007db_name\030\002 \001(\t\022\027\n\017collection_nam" "8\001\"\242\001\n\014QueryRequest\022*\n\004base\030\001 \001(\0132\034.milv"
"e\030\003 \001(\t\022\014\n\004expr\030\004 \001(\t\022\025\n\routput_fields\030\005" "us.proto.common.MsgBase\022\017\n\007db_name\030\002 \001(\t"
" \003(\t\022\027\n\017partition_names\030\006 \003(\t\"p\n\014QueryRe" "\022\027\n\017collection_name\030\003 \001(\t\022\014\n\004expr\030\004 \001(\t\022"
"sults\022+\n\006status\030\001 \001(\0132\033.milvus.proto.com" "\025\n\routput_fields\030\005 \003(\t\022\027\n\017partition_name"
"mon.Status\0223\n\013fields_data\030\002 \003(\0132\036.milvus" "s\030\006 \003(\t\"p\n\014QueryResults\022+\n\006status\030\001 \001(\0132"
".proto.schema.FieldData\"\231\001\n\025PersistentSe" "\033.milvus.proto.common.Status\0223\n\013fields_d"
"gmentInfo\022\021\n\tsegmentID\030\001 \001(\003\022\024\n\014collecti" "ata\030\002 \003(\0132\036.milvus.proto.schema.FieldDat"
"onID\030\002 \001(\003\022\023\n\013partitionID\030\003 \001(\003\022\020\n\010num_r" "a\"\231\001\n\025PersistentSegmentInfo\022\021\n\tsegmentID"
"ows\030\004 \001(\003\0220\n\005state\030\005 \001(\0162!.milvus.proto." "\030\001 \001(\003\022\024\n\014collectionID\030\002 \001(\003\022\023\n\013partitio"
"common.SegmentState\"u\n\037GetPersistentSegm" "nID\030\003 \001(\003\022\020\n\010num_rows\030\004 \001(\003\0220\n\005state\030\005 \001"
"entInfoRequest\022*\n\004base\030\001 \001(\0132\034.milvus.pr" "(\0162!.milvus.proto.common.SegmentState\"u\n"
"oto.common.MsgBase\022\016\n\006dbName\030\002 \001(\t\022\026\n\016co" "\037GetPersistentSegmentInfoRequest\022*\n\004base"
"llectionName\030\003 \001(\t\"\212\001\n GetPersistentSegm" "\030\001 \001(\0132\034.milvus.proto.common.MsgBase\022\016\n\006"
"entInfoResponse\022+\n\006status\030\001 \001(\0132\033.milvus" "dbName\030\002 \001(\t\022\026\n\016collectionName\030\003 \001(\t\"\212\001\n"
".proto.common.Status\0229\n\005infos\030\002 \003(\0132*.mi" " GetPersistentSegmentInfoResponse\022+\n\006sta"
"lvus.proto.milvus.PersistentSegmentInfo\"" "tus\030\001 \001(\0132\033.milvus.proto.common.Status\0229"
"\231\001\n\020QuerySegmentInfo\022\021\n\tsegmentID\030\001 \001(\003\022" "\n\005infos\030\002 \003(\0132*.milvus.proto.milvus.Pers"
"\024\n\014collectionID\030\002 \001(\003\022\023\n\013partitionID\030\003 \001" "istentSegmentInfo\"\231\001\n\020QuerySegmentInfo\022\021"
"(\003\022\020\n\010mem_size\030\004 \001(\003\022\020\n\010num_rows\030\005 \001(\003\022\022" "\n\tsegmentID\030\001 \001(\003\022\024\n\014collectionID\030\002 \001(\003\022"
"\n\nindex_name\030\006 \001(\t\022\017\n\007indexID\030\007 \001(\003\"p\n\032G" "\023\n\013partitionID\030\003 \001(\003\022\020\n\010mem_size\030\004 \001(\003\022\020"
"etQuerySegmentInfoRequest\022*\n\004base\030\001 \001(\0132" "\n\010num_rows\030\005 \001(\003\022\022\n\nindex_name\030\006 \001(\t\022\017\n\007"
"\034.milvus.proto.common.MsgBase\022\016\n\006dbName\030" "indexID\030\007 \001(\003\"p\n\032GetQuerySegmentInfoRequ"
"\002 \001(\t\022\026\n\016collectionName\030\003 \001(\t\"\200\001\n\033GetQue" "est\022*\n\004base\030\001 \001(\0132\034.milvus.proto.common."
"rySegmentInfoResponse\022+\n\006status\030\001 \001(\0132\033." "MsgBase\022\016\n\006dbName\030\002 \001(\t\022\026\n\016collectionNam"
"milvus.proto.common.Status\0224\n\005infos\030\002 \003(" "e\030\003 \001(\t\"\200\001\n\033GetQuerySegmentInfoResponse\022"
"\0132%.milvus.proto.milvus.QuerySegmentInfo" "+\n\006status\030\001 \001(\0132\033.milvus.proto.common.St"
"\"$\n\014DummyRequest\022\024\n\014request_type\030\001 \001(\t\"!" "atus\0224\n\005infos\030\002 \003(\0132%.milvus.proto.milvu"
"\n\rDummyResponse\022\020\n\010response\030\001 \001(\t\"\025\n\023Reg" "s.QuerySegmentInfo\"$\n\014DummyRequest\022\024\n\014re"
"isterLinkRequest\"r\n\024RegisterLinkResponse" "quest_type\030\001 \001(\t\"!\n\rDummyResponse\022\020\n\010res"
"\022-\n\007address\030\001 \001(\0132\034.milvus.proto.common." "ponse\030\001 \001(\t\"\025\n\023RegisterLinkRequest\"r\n\024Re"
"Address\022+\n\006status\030\002 \001(\0132\033.milvus.proto.c" "gisterLinkResponse\022-\n\007address\030\001 \001(\0132\034.mi"
"ommon.Status*,\n\023ShowCollectionsType\022\007\n\003A" "lvus.proto.common.Address\022+\n\006status\030\002 \001("
"ll\020\000\022\014\n\010InMemory\020\001*>\n\017PlaceholderType\022\010\n" "\0132\033.milvus.proto.common.Status*,\n\023ShowCo"
"\004None\020\000\022\020\n\014BinaryVector\020d\022\017\n\013FloatVector" "llectionsType\022\007\n\003All\020\000\022\014\n\010InMemory\020\001*>\n\017"
"\020e2\224\027\n\rMilvusService\022_\n\020CreateCollection" "PlaceholderType\022\010\n\004None\020\000\022\020\n\014BinaryVecto"
"\022,.milvus.proto.milvus.CreateCollectionR" "r\020d\022\017\n\013FloatVector\020e2\224\027\n\rMilvusService\022_"
"equest\032\033.milvus.proto.common.Status\"\000\022[\n" "\n\020CreateCollection\022,.milvus.proto.milvus"
"\016DropCollection\022*.milvus.proto.milvus.Dr" ".CreateCollectionRequest\032\033.milvus.proto."
"opCollectionRequest\032\033.milvus.proto.commo" "common.Status\"\000\022[\n\016DropCollection\022*.milv"
"n.Status\"\000\022_\n\rHasCollection\022).milvus.pro" "us.proto.milvus.DropCollectionRequest\032\033."
"to.milvus.HasCollectionRequest\032!.milvus." "milvus.proto.common.Status\"\000\022_\n\rHasColle"
"proto.milvus.BoolResponse\"\000\022[\n\016LoadColle" "ction\022).milvus.proto.milvus.HasCollectio"
"ction\022*.milvus.proto.milvus.LoadCollecti" "nRequest\032!.milvus.proto.milvus.BoolRespo"
"onRequest\032\033.milvus.proto.common.Status\"\000" "nse\"\000\022[\n\016LoadCollection\022*.milvus.proto.m"
"\022a\n\021ReleaseCollection\022-.milvus.proto.mil" "ilvus.LoadCollectionRequest\032\033.milvus.pro"
"vus.ReleaseCollectionRequest\032\033.milvus.pr" "to.common.Status\"\000\022a\n\021ReleaseCollection\022"
"oto.common.Status\"\000\022w\n\022DescribeCollectio" "-.milvus.proto.milvus.ReleaseCollectionR"
"n\022..milvus.proto.milvus.DescribeCollecti" "equest\032\033.milvus.proto.common.Status\"\000\022w\n"
"onRequest\032/.milvus.proto.milvus.Describe" "\022DescribeCollection\022..milvus.proto.milvu"
"CollectionResponse\"\000\022\206\001\n\027GetCollectionSt" "s.DescribeCollectionRequest\032/.milvus.pro"
"atistics\0223.milvus.proto.milvus.GetCollec" "to.milvus.DescribeCollectionResponse\"\000\022\206"
"tionStatisticsRequest\0324.milvus.proto.mil" "\001\n\027GetCollectionStatistics\0223.milvus.prot"
"vus.GetCollectionStatisticsResponse\"\000\022n\n" "o.milvus.GetCollectionStatisticsRequest\032"
"\017ShowCollections\022+.milvus.proto.milvus.S" "4.milvus.proto.milvus.GetCollectionStati"
"howCollectionsRequest\032,.milvus.proto.mil" "sticsResponse\"\000\022n\n\017ShowCollections\022+.mil"
"vus.ShowCollectionsResponse\"\000\022]\n\017CreateP" "vus.proto.milvus.ShowCollectionsRequest\032"
"artition\022+.milvus.proto.milvus.CreatePar" ",.milvus.proto.milvus.ShowCollectionsRes"
"titionRequest\032\033.milvus.proto.common.Stat" "ponse\"\000\022]\n\017CreatePartition\022+.milvus.prot"
"us\"\000\022Y\n\rDropPartition\022).milvus.proto.mil" "o.milvus.CreatePartitionRequest\032\033.milvus"
"vus.DropPartitionRequest\032\033.milvus.proto." ".proto.common.Status\"\000\022Y\n\rDropPartition\022"
"common.Status\"\000\022]\n\014HasPartition\022(.milvus" ").milvus.proto.milvus.DropPartitionReque"
".proto.milvus.HasPartitionRequest\032!.milv" "st\032\033.milvus.proto.common.Status\"\000\022]\n\014Has"
"us.proto.milvus.BoolResponse\"\000\022[\n\016LoadPa" "Partition\022(.milvus.proto.milvus.HasParti"
"rtitions\022*.milvus.proto.milvus.LoadParti" "tionRequest\032!.milvus.proto.milvus.BoolRe"
"tionsRequest\032\033.milvus.proto.common.Statu" "sponse\"\000\022[\n\016LoadPartitions\022*.milvus.prot"
"s\"\000\022a\n\021ReleasePartitions\022-.milvus.proto." "o.milvus.LoadPartitionsRequest\032\033.milvus."
"milvus.ReleasePartitionsRequest\032\033.milvus" "proto.common.Status\"\000\022a\n\021ReleasePartitio"
".proto.common.Status\"\000\022\203\001\n\026GetPartitionS" "ns\022-.milvus.proto.milvus.ReleasePartitio"
"tatistics\0222.milvus.proto.milvus.GetParti" "nsRequest\032\033.milvus.proto.common.Status\"\000"
"tionStatisticsRequest\0323.milvus.proto.mil" "\022\203\001\n\026GetPartitionStatistics\0222.milvus.pro"
"vus.GetPartitionStatisticsResponse\"\000\022k\n\016" "to.milvus.GetPartitionStatisticsRequest\032"
"ShowPartitions\022*.milvus.proto.milvus.Sho" "3.milvus.proto.milvus.GetPartitionStatis"
"wPartitionsRequest\032+.milvus.proto.milvus" "ticsResponse\"\000\022k\n\016ShowPartitions\022*.milvu"
".ShowPartitionsResponse\"\000\022U\n\013CreateIndex" "s.proto.milvus.ShowPartitionsRequest\032+.m"
"\022\'.milvus.proto.milvus.CreateIndexReques" "ilvus.proto.milvus.ShowPartitionsRespons"
"t\032\033.milvus.proto.common.Status\"\000\022h\n\rDesc" "e\"\000\022U\n\013CreateIndex\022\'.milvus.proto.milvus"
"ribeIndex\022).milvus.proto.milvus.Describe" ".CreateIndexRequest\032\033.milvus.proto.commo"
"IndexRequest\032*.milvus.proto.milvus.Descr" "n.Status\"\000\022h\n\rDescribeIndex\022).milvus.pro"
"ibeIndexResponse\"\000\022h\n\rGetIndexState\022).mi" "to.milvus.DescribeIndexRequest\032*.milvus."
"lvus.proto.milvus.GetIndexStateRequest\032*" "proto.milvus.DescribeIndexResponse\"\000\022h\n\r"
".milvus.proto.milvus.GetIndexStateRespon" "GetIndexState\022).milvus.proto.milvus.GetI"
"se\"\000\022\200\001\n\025GetIndexBuildProgress\0221.milvus." "ndexStateRequest\032*.milvus.proto.milvus.G"
"proto.milvus.GetIndexBuildProgressReques" "etIndexStateResponse\"\000\022\200\001\n\025GetIndexBuild"
"t\0322.milvus.proto.milvus.GetIndexBuildPro" "Progress\0221.milvus.proto.milvus.GetIndexB"
"gressResponse\"\000\022Q\n\tDropIndex\022%.milvus.pr" "uildProgressRequest\0322.milvus.proto.milvu"
"oto.milvus.DropIndexRequest\032\033.milvus.pro" "s.GetIndexBuildProgressResponse\"\000\022Q\n\tDro"
"to.common.Status\"\000\022S\n\006Insert\022\".milvus.pr" "pIndex\022%.milvus.proto.milvus.DropIndexRe"
"oto.milvus.InsertRequest\032#.milvus.proto." "quest\032\033.milvus.proto.common.Status\"\000\022S\n\006"
"milvus.MutationResult\"\000\022R\n\006Search\022\".milv" "Insert\022\".milvus.proto.milvus.InsertReque"
"us.proto.milvus.SearchRequest\032\".milvus.p" "st\032#.milvus.proto.milvus.MutationResult\""
"roto.milvus.SearchResults\"\000\022X\n\010Retrieve\022" "\000\022R\n\006Search\022\".milvus.proto.milvus.Search"
"$.milvus.proto.milvus.RetrieveRequest\032$." "Request\032\".milvus.proto.milvus.SearchResu"
"milvus.proto.milvus.RetrieveResults\"\000\022P\n" "lts\"\000\022X\n\010Retrieve\022$.milvus.proto.milvus."
"\005Flush\022!.milvus.proto.milvus.FlushReques" "RetrieveRequest\032$.milvus.proto.milvus.Re"
"t\032\".milvus.proto.milvus.FlushResponse\"\000\022" "trieveResults\"\000\022P\n\005Flush\022!.milvus.proto."
"O\n\005Query\022!.milvus.proto.milvus.QueryRequ" "milvus.FlushRequest\032\".milvus.proto.milvu"
"est\032!.milvus.proto.milvus.QueryResults\"\000" "s.FlushResponse\"\000\022O\n\005Query\022!.milvus.prot"
"\022\211\001\n\030GetPersistentSegmentInfo\0224.milvus.p" "o.milvus.QueryRequest\032!.milvus.proto.mil"
"roto.milvus.GetPersistentSegmentInfoRequ" "vus.QueryResults\"\000\022\211\001\n\030GetPersistentSegm"
"est\0325.milvus.proto.milvus.GetPersistentS" "entInfo\0224.milvus.proto.milvus.GetPersist"
"egmentInfoResponse\"\000\022z\n\023GetQuerySegmentI" "entSegmentInfoRequest\0325.milvus.proto.mil"
"nfo\022/.milvus.proto.milvus.GetQuerySegmen" "vus.GetPersistentSegmentInfoResponse\"\000\022z"
"tInfoRequest\0320.milvus.proto.milvus.GetQu" "\n\023GetQuerySegmentInfo\022/.milvus.proto.mil"
"erySegmentInfoResponse\"\000\022P\n\005Dummy\022!.milv" "vus.GetQuerySegmentInfoRequest\0320.milvus."
"us.proto.milvus.DummyRequest\032\".milvus.pr" "proto.milvus.GetQuerySegmentInfoResponse"
"oto.milvus.DummyResponse\"\000\022e\n\014RegisterLi" "\"\000\022P\n\005Dummy\022!.milvus.proto.milvus.DummyR"
"nk\022(.milvus.proto.milvus.RegisterLinkReq" "equest\032\".milvus.proto.milvus.DummyRespon"
"uest\032).milvus.proto.milvus.RegisterLinkR" "se\"\000\022e\n\014RegisterLink\022(.milvus.proto.milv"
"esponse\"\0002u\n\014ProxyService\022e\n\014RegisterLin" "us.RegisterLinkRequest\032).milvus.proto.mi"
"k\022(.milvus.proto.milvus.RegisterLinkRequ" "lvus.RegisterLinkResponse\"\0002u\n\014ProxyServ"
"est\032).milvus.proto.milvus.RegisterLinkRe" "ice\022e\n\014RegisterLink\022(.milvus.proto.milvu"
"sponse\"\000B5Z3github.com/milvus-io/milvus/" "s.RegisterLinkRequest\032).milvus.proto.mil"
"internal/proto/milvuspbb\006proto3" "vus.RegisterLinkResponse\"\000B5Z3github.com"
"/milvus-io/milvus/internal/proto/milvusp"
"bb\006proto3"
; ;
static const ::PROTOBUF_NAMESPACE_ID::internal::DescriptorTable*const descriptor_table_milvus_2eproto_deps[2] = { static const ::PROTOBUF_NAMESPACE_ID::internal::DescriptorTable*const descriptor_table_milvus_2eproto_deps[2] = {
&::descriptor_table_common_2eproto, &::descriptor_table_common_2eproto,
@ -2152,7 +2156,7 @@ static ::PROTOBUF_NAMESPACE_ID::internal::SCCInfoBase*const descriptor_table_mil
static ::PROTOBUF_NAMESPACE_ID::internal::once_flag descriptor_table_milvus_2eproto_once; static ::PROTOBUF_NAMESPACE_ID::internal::once_flag descriptor_table_milvus_2eproto_once;
static bool descriptor_table_milvus_2eproto_initialized = false; static bool descriptor_table_milvus_2eproto_initialized = false;
const ::PROTOBUF_NAMESPACE_ID::internal::DescriptorTable descriptor_table_milvus_2eproto = { const ::PROTOBUF_NAMESPACE_ID::internal::DescriptorTable descriptor_table_milvus_2eproto = {
&descriptor_table_milvus_2eproto_initialized, descriptor_table_protodef_milvus_2eproto, "milvus.proto", 11111, &descriptor_table_milvus_2eproto_initialized, descriptor_table_protodef_milvus_2eproto, "milvus.proto", 11169,
&descriptor_table_milvus_2eproto_once, descriptor_table_milvus_2eproto_sccs, descriptor_table_milvus_2eproto_deps, 59, 2, &descriptor_table_milvus_2eproto_once, descriptor_table_milvus_2eproto_sccs, descriptor_table_milvus_2eproto_deps, 59, 2,
schemas, file_default_instances, TableStruct_milvus_2eproto::offsets, schemas, file_default_instances, TableStruct_milvus_2eproto::offsets,
file_level_metadata_milvus_2eproto, 59, file_level_enum_descriptors_milvus_2eproto, file_level_service_descriptors_milvus_2eproto, file_level_metadata_milvus_2eproto, 59, file_level_enum_descriptors_milvus_2eproto, file_level_service_descriptors_milvus_2eproto,
@ -19135,6 +19139,13 @@ const char* SearchRequest::_InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_
CHK_(ptr); CHK_(ptr);
} else goto handle_unusual; } else goto handle_unusual;
continue; continue;
// uint64 guarantee_timestamp = 11;
case 11:
if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 88)) {
guarantee_timestamp_ = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint(&ptr);
CHK_(ptr);
} else goto handle_unusual;
continue;
default: { default: {
handle_unusual: handle_unusual:
if ((tag & 7) == 4 || tag == 0) { if ((tag & 7) == 4 || tag == 0) {
@ -19302,6 +19313,19 @@ bool SearchRequest::MergePartialFromCodedStream(
break; break;
} }
// uint64 guarantee_timestamp = 11;
case 11: {
if (static_cast< ::PROTOBUF_NAMESPACE_ID::uint8>(tag) == (88 & 0xFF)) {
DO_((::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::ReadPrimitive<
::PROTOBUF_NAMESPACE_ID::uint64, ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::TYPE_UINT64>(
input, &guarantee_timestamp_)));
} else {
goto handle_unusual;
}
break;
}
default: { default: {
handle_unusual: handle_unusual:
if (tag == 0) { if (tag == 0) {
@ -19411,6 +19435,11 @@ void SearchRequest::SerializeWithCachedSizes(
::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::WriteUInt64(10, this->travel_timestamp(), output); ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::WriteUInt64(10, this->travel_timestamp(), output);
} }
// uint64 guarantee_timestamp = 11;
if (this->guarantee_timestamp() != 0) {
::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::WriteUInt64(11, this->guarantee_timestamp(), output);
}
if (_internal_metadata_.have_unknown_fields()) { if (_internal_metadata_.have_unknown_fields()) {
::PROTOBUF_NAMESPACE_ID::internal::WireFormat::SerializeUnknownFields( ::PROTOBUF_NAMESPACE_ID::internal::WireFormat::SerializeUnknownFields(
_internal_metadata_.unknown_fields(), output); _internal_metadata_.unknown_fields(), output);
@ -19510,6 +19539,11 @@ void SearchRequest::SerializeWithCachedSizes(
target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::WriteUInt64ToArray(10, this->travel_timestamp(), target); target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::WriteUInt64ToArray(10, this->travel_timestamp(), target);
} }
// uint64 guarantee_timestamp = 11;
if (this->guarantee_timestamp() != 0) {
target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::WriteUInt64ToArray(11, this->guarantee_timestamp(), target);
}
if (_internal_metadata_.have_unknown_fields()) { if (_internal_metadata_.have_unknown_fields()) {
target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormat::SerializeUnknownFieldsToArray( target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormat::SerializeUnknownFieldsToArray(
_internal_metadata_.unknown_fields(), target); _internal_metadata_.unknown_fields(), target);
@ -19600,6 +19634,13 @@ size_t SearchRequest::ByteSizeLong() const {
this->travel_timestamp()); this->travel_timestamp());
} }
// uint64 guarantee_timestamp = 11;
if (this->guarantee_timestamp() != 0) {
total_size += 1 +
::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::UInt64Size(
this->guarantee_timestamp());
}
// .milvus.proto.common.DslType dsl_type = 7; // .milvus.proto.common.DslType dsl_type = 7;
if (this->dsl_type() != 0) { if (this->dsl_type() != 0) {
total_size += 1 + total_size += 1 +
@ -19658,6 +19699,9 @@ void SearchRequest::MergeFrom(const SearchRequest& from) {
if (from.travel_timestamp() != 0) { if (from.travel_timestamp() != 0) {
set_travel_timestamp(from.travel_timestamp()); set_travel_timestamp(from.travel_timestamp());
} }
if (from.guarantee_timestamp() != 0) {
set_guarantee_timestamp(from.guarantee_timestamp());
}
if (from.dsl_type() != 0) { if (from.dsl_type() != 0) {
set_dsl_type(from.dsl_type()); set_dsl_type(from.dsl_type());
} }
@ -19697,6 +19741,7 @@ void SearchRequest::InternalSwap(SearchRequest* other) {
GetArenaNoVirtual()); GetArenaNoVirtual());
swap(base_, other->base_); swap(base_, other->base_);
swap(travel_timestamp_, other->travel_timestamp_); swap(travel_timestamp_, other->travel_timestamp_);
swap(guarantee_timestamp_, other->guarantee_timestamp_);
swap(dsl_type_, other->dsl_type_); swap(dsl_type_, other->dsl_type_);
} }
@ -19768,7 +19813,9 @@ RetrieveRequest::RetrieveRequest(const RetrieveRequest& from)
} else { } else {
ids_ = nullptr; ids_ = nullptr;
} }
travel_timestamp_ = from.travel_timestamp_; ::memcpy(&travel_timestamp_, &from.travel_timestamp_,
static_cast<size_t>(reinterpret_cast<char*>(&guarantee_timestamp_) -
reinterpret_cast<char*>(&travel_timestamp_)) + sizeof(guarantee_timestamp_));
// @@protoc_insertion_point(copy_constructor:milvus.proto.milvus.RetrieveRequest) // @@protoc_insertion_point(copy_constructor:milvus.proto.milvus.RetrieveRequest)
} }
@ -19777,8 +19824,8 @@ void RetrieveRequest::SharedCtor() {
db_name_.UnsafeSetDefault(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited()); db_name_.UnsafeSetDefault(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited());
collection_name_.UnsafeSetDefault(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited()); collection_name_.UnsafeSetDefault(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited());
::memset(&base_, 0, static_cast<size_t>( ::memset(&base_, 0, static_cast<size_t>(
reinterpret_cast<char*>(&travel_timestamp_) - reinterpret_cast<char*>(&guarantee_timestamp_) -
reinterpret_cast<char*>(&base_)) + sizeof(travel_timestamp_)); reinterpret_cast<char*>(&base_)) + sizeof(guarantee_timestamp_));
} }
RetrieveRequest::~RetrieveRequest() { RetrieveRequest::~RetrieveRequest() {
@ -19820,7 +19867,9 @@ void RetrieveRequest::Clear() {
delete ids_; delete ids_;
} }
ids_ = nullptr; ids_ = nullptr;
travel_timestamp_ = PROTOBUF_ULONGLONG(0); ::memset(&travel_timestamp_, 0, static_cast<size_t>(
reinterpret_cast<char*>(&guarantee_timestamp_) -
reinterpret_cast<char*>(&travel_timestamp_)) + sizeof(guarantee_timestamp_));
_internal_metadata_.Clear(); _internal_metadata_.Clear();
} }
@ -19891,6 +19940,13 @@ const char* RetrieveRequest::_InternalParse(const char* ptr, ::PROTOBUF_NAMESPAC
CHK_(ptr); CHK_(ptr);
} else goto handle_unusual; } else goto handle_unusual;
continue; continue;
// uint64 guarantee_timestamp = 8;
case 8:
if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 64)) {
guarantee_timestamp_ = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint(&ptr);
CHK_(ptr);
} else goto handle_unusual;
continue;
default: { default: {
handle_unusual: handle_unusual:
if ((tag & 7) == 4 || tag == 0) { if ((tag & 7) == 4 || tag == 0) {
@ -20018,6 +20074,19 @@ bool RetrieveRequest::MergePartialFromCodedStream(
break; break;
} }
// uint64 guarantee_timestamp = 8;
case 8: {
if (static_cast< ::PROTOBUF_NAMESPACE_ID::uint8>(tag) == (64 & 0xFF)) {
DO_((::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::ReadPrimitive<
::PROTOBUF_NAMESPACE_ID::uint64, ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::TYPE_UINT64>(
input, &guarantee_timestamp_)));
} else {
goto handle_unusual;
}
break;
}
default: { default: {
handle_unusual: handle_unusual:
if (tag == 0) { if (tag == 0) {
@ -20102,6 +20171,11 @@ void RetrieveRequest::SerializeWithCachedSizes(
::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::WriteUInt64(7, this->travel_timestamp(), output); ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::WriteUInt64(7, this->travel_timestamp(), output);
} }
// uint64 guarantee_timestamp = 8;
if (this->guarantee_timestamp() != 0) {
::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::WriteUInt64(8, this->guarantee_timestamp(), output);
}
if (_internal_metadata_.have_unknown_fields()) { if (_internal_metadata_.have_unknown_fields()) {
::PROTOBUF_NAMESPACE_ID::internal::WireFormat::SerializeUnknownFields( ::PROTOBUF_NAMESPACE_ID::internal::WireFormat::SerializeUnknownFields(
_internal_metadata_.unknown_fields(), output); _internal_metadata_.unknown_fields(), output);
@ -20176,6 +20250,11 @@ void RetrieveRequest::SerializeWithCachedSizes(
target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::WriteUInt64ToArray(7, this->travel_timestamp(), target); target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::WriteUInt64ToArray(7, this->travel_timestamp(), target);
} }
// uint64 guarantee_timestamp = 8;
if (this->guarantee_timestamp() != 0) {
target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::WriteUInt64ToArray(8, this->guarantee_timestamp(), target);
}
if (_internal_metadata_.have_unknown_fields()) { if (_internal_metadata_.have_unknown_fields()) {
target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormat::SerializeUnknownFieldsToArray( target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormat::SerializeUnknownFieldsToArray(
_internal_metadata_.unknown_fields(), target); _internal_metadata_.unknown_fields(), target);
@ -20248,6 +20327,13 @@ size_t RetrieveRequest::ByteSizeLong() const {
this->travel_timestamp()); this->travel_timestamp());
} }
// uint64 guarantee_timestamp = 8;
if (this->guarantee_timestamp() != 0) {
total_size += 1 +
::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::UInt64Size(
this->guarantee_timestamp());
}
int cached_size = ::PROTOBUF_NAMESPACE_ID::internal::ToCachedSize(total_size); int cached_size = ::PROTOBUF_NAMESPACE_ID::internal::ToCachedSize(total_size);
SetCachedSize(cached_size); SetCachedSize(cached_size);
return total_size; return total_size;
@ -20294,6 +20380,9 @@ void RetrieveRequest::MergeFrom(const RetrieveRequest& from) {
if (from.travel_timestamp() != 0) { if (from.travel_timestamp() != 0) {
set_travel_timestamp(from.travel_timestamp()); set_travel_timestamp(from.travel_timestamp());
} }
if (from.guarantee_timestamp() != 0) {
set_guarantee_timestamp(from.guarantee_timestamp());
}
} }
void RetrieveRequest::CopyFrom(const ::PROTOBUF_NAMESPACE_ID::Message& from) { void RetrieveRequest::CopyFrom(const ::PROTOBUF_NAMESPACE_ID::Message& from) {
@ -20326,6 +20415,7 @@ void RetrieveRequest::InternalSwap(RetrieveRequest* other) {
swap(base_, other->base_); swap(base_, other->base_);
swap(ids_, other->ids_); swap(ids_, other->ids_);
swap(travel_timestamp_, other->travel_timestamp_); swap(travel_timestamp_, other->travel_timestamp_);
swap(guarantee_timestamp_, other->guarantee_timestamp_);
} }
::PROTOBUF_NAMESPACE_ID::Metadata RetrieveRequest::GetMetadata() const { ::PROTOBUF_NAMESPACE_ID::Metadata RetrieveRequest::GetMetadata() const {

View File

@ -6976,6 +6976,7 @@ class SearchRequest :
kPlaceholderGroupFieldNumber = 6, kPlaceholderGroupFieldNumber = 6,
kBaseFieldNumber = 1, kBaseFieldNumber = 1,
kTravelTimestampFieldNumber = 10, kTravelTimestampFieldNumber = 10,
kGuaranteeTimestampFieldNumber = 11,
kDslTypeFieldNumber = 7, kDslTypeFieldNumber = 7,
}; };
// repeated string partition_names = 4; // repeated string partition_names = 4;
@ -7080,6 +7081,11 @@ class SearchRequest :
::PROTOBUF_NAMESPACE_ID::uint64 travel_timestamp() const; ::PROTOBUF_NAMESPACE_ID::uint64 travel_timestamp() const;
void set_travel_timestamp(::PROTOBUF_NAMESPACE_ID::uint64 value); void set_travel_timestamp(::PROTOBUF_NAMESPACE_ID::uint64 value);
// uint64 guarantee_timestamp = 11;
void clear_guarantee_timestamp();
::PROTOBUF_NAMESPACE_ID::uint64 guarantee_timestamp() const;
void set_guarantee_timestamp(::PROTOBUF_NAMESPACE_ID::uint64 value);
// .milvus.proto.common.DslType dsl_type = 7; // .milvus.proto.common.DslType dsl_type = 7;
void clear_dsl_type(); void clear_dsl_type();
::milvus::proto::common::DslType dsl_type() const; ::milvus::proto::common::DslType dsl_type() const;
@ -7099,6 +7105,7 @@ class SearchRequest :
::PROTOBUF_NAMESPACE_ID::internal::ArenaStringPtr placeholder_group_; ::PROTOBUF_NAMESPACE_ID::internal::ArenaStringPtr placeholder_group_;
::milvus::proto::common::MsgBase* base_; ::milvus::proto::common::MsgBase* base_;
::PROTOBUF_NAMESPACE_ID::uint64 travel_timestamp_; ::PROTOBUF_NAMESPACE_ID::uint64 travel_timestamp_;
::PROTOBUF_NAMESPACE_ID::uint64 guarantee_timestamp_;
int dsl_type_; int dsl_type_;
mutable ::PROTOBUF_NAMESPACE_ID::internal::CachedSize _cached_size_; mutable ::PROTOBUF_NAMESPACE_ID::internal::CachedSize _cached_size_;
friend struct ::TableStruct_milvus_2eproto; friend struct ::TableStruct_milvus_2eproto;
@ -7225,6 +7232,7 @@ class RetrieveRequest :
kBaseFieldNumber = 1, kBaseFieldNumber = 1,
kIdsFieldNumber = 5, kIdsFieldNumber = 5,
kTravelTimestampFieldNumber = 7, kTravelTimestampFieldNumber = 7,
kGuaranteeTimestampFieldNumber = 8,
}; };
// repeated string partition_names = 4; // repeated string partition_names = 4;
int partition_names_size() const; int partition_names_size() const;
@ -7303,6 +7311,11 @@ class RetrieveRequest :
::PROTOBUF_NAMESPACE_ID::uint64 travel_timestamp() const; ::PROTOBUF_NAMESPACE_ID::uint64 travel_timestamp() const;
void set_travel_timestamp(::PROTOBUF_NAMESPACE_ID::uint64 value); void set_travel_timestamp(::PROTOBUF_NAMESPACE_ID::uint64 value);
// uint64 guarantee_timestamp = 8;
void clear_guarantee_timestamp();
::PROTOBUF_NAMESPACE_ID::uint64 guarantee_timestamp() const;
void set_guarantee_timestamp(::PROTOBUF_NAMESPACE_ID::uint64 value);
// @@protoc_insertion_point(class_scope:milvus.proto.milvus.RetrieveRequest) // @@protoc_insertion_point(class_scope:milvus.proto.milvus.RetrieveRequest)
private: private:
class _Internal; class _Internal;
@ -7315,6 +7328,7 @@ class RetrieveRequest :
::milvus::proto::common::MsgBase* base_; ::milvus::proto::common::MsgBase* base_;
::milvus::proto::schema::IDs* ids_; ::milvus::proto::schema::IDs* ids_;
::PROTOBUF_NAMESPACE_ID::uint64 travel_timestamp_; ::PROTOBUF_NAMESPACE_ID::uint64 travel_timestamp_;
::PROTOBUF_NAMESPACE_ID::uint64 guarantee_timestamp_;
mutable ::PROTOBUF_NAMESPACE_ID::internal::CachedSize _cached_size_; mutable ::PROTOBUF_NAMESPACE_ID::internal::CachedSize _cached_size_;
friend struct ::TableStruct_milvus_2eproto; friend struct ::TableStruct_milvus_2eproto;
}; };
@ -16580,6 +16594,20 @@ inline void SearchRequest::set_travel_timestamp(::PROTOBUF_NAMESPACE_ID::uint64
// @@protoc_insertion_point(field_set:milvus.proto.milvus.SearchRequest.travel_timestamp) // @@protoc_insertion_point(field_set:milvus.proto.milvus.SearchRequest.travel_timestamp)
} }
// uint64 guarantee_timestamp = 11;
inline void SearchRequest::clear_guarantee_timestamp() {
guarantee_timestamp_ = PROTOBUF_ULONGLONG(0);
}
inline ::PROTOBUF_NAMESPACE_ID::uint64 SearchRequest::guarantee_timestamp() const {
// @@protoc_insertion_point(field_get:milvus.proto.milvus.SearchRequest.guarantee_timestamp)
return guarantee_timestamp_;
}
inline void SearchRequest::set_guarantee_timestamp(::PROTOBUF_NAMESPACE_ID::uint64 value) {
guarantee_timestamp_ = value;
// @@protoc_insertion_point(field_set:milvus.proto.milvus.SearchRequest.guarantee_timestamp)
}
// ------------------------------------------------------------------- // -------------------------------------------------------------------
// RetrieveRequest // RetrieveRequest
@ -16920,6 +16948,20 @@ inline void RetrieveRequest::set_travel_timestamp(::PROTOBUF_NAMESPACE_ID::uint6
// @@protoc_insertion_point(field_set:milvus.proto.milvus.RetrieveRequest.travel_timestamp) // @@protoc_insertion_point(field_set:milvus.proto.milvus.RetrieveRequest.travel_timestamp)
} }
// uint64 guarantee_timestamp = 8;
inline void RetrieveRequest::clear_guarantee_timestamp() {
guarantee_timestamp_ = PROTOBUF_ULONGLONG(0);
}
inline ::PROTOBUF_NAMESPACE_ID::uint64 RetrieveRequest::guarantee_timestamp() const {
// @@protoc_insertion_point(field_get:milvus.proto.milvus.RetrieveRequest.guarantee_timestamp)
return guarantee_timestamp_;
}
inline void RetrieveRequest::set_guarantee_timestamp(::PROTOBUF_NAMESPACE_ID::uint64 value) {
guarantee_timestamp_ = value;
// @@protoc_insertion_point(field_set:milvus.proto.milvus.RetrieveRequest.guarantee_timestamp)
}
// ------------------------------------------------------------------- // -------------------------------------------------------------------
// RetrieveResults // RetrieveResults

View File

@ -284,6 +284,14 @@ func (st *SearchMsg) SourceID() int64 {
return st.Base.SourceID return st.Base.SourceID
} }
func (st *SearchMsg) GuaranteeTs() Timestamp {
return st.GetGuaranteeTimestamp()
}
func (st *SearchMsg) TravelTs() Timestamp {
return st.GetTravelTimestamp()
}
func (st *SearchMsg) Marshal(input TsMsg) (MarshalType, error) { func (st *SearchMsg) Marshal(input TsMsg) (MarshalType, error) {
searchTask := input.(*SearchMsg) searchTask := input.(*SearchMsg)
searchRequest := &searchTask.SearchRequest searchRequest := &searchTask.SearchRequest
@ -390,6 +398,14 @@ func (rm *RetrieveMsg) SourceID() int64 {
return rm.Base.SourceID return rm.Base.SourceID
} }
func (rm *RetrieveMsg) GuaranteeTs() Timestamp {
return rm.GetGuaranteeTimestamp()
}
func (rm *RetrieveMsg) TravelTs() Timestamp {
return rm.GetTravelTimestamp()
}
func (rm *RetrieveMsg) Marshal(input TsMsg) (MarshalType, error) { func (rm *RetrieveMsg) Marshal(input TsMsg) (MarshalType, error) {
retrieveTask := input.(*RetrieveMsg) retrieveTask := input.(*RetrieveMsg)
retrieveRequest := &retrieveTask.RetrieveRequest retrieveRequest := &retrieveTask.RetrieveRequest

View File

@ -134,6 +134,7 @@ message SearchRequest {
bytes serialized_expr_plan = 9; bytes serialized_expr_plan = 9;
repeated int64 output_fields_id = 10; repeated int64 output_fields_id = 10;
uint64 travel_timestamp = 11; uint64 travel_timestamp = 11;
uint64 guarantee_timestamp = 12;
} }
message SearchResults { message SearchResults {
@ -163,6 +164,7 @@ message RetrieveRequest {
schema.IDs ids = 6; schema.IDs ids = 6;
repeated string output_fields = 7; repeated string output_fields = 7;
uint64 travel_timestamp = 8; uint64 travel_timestamp = 8;
uint64 guarantee_timestamp = 9;
} }
message RetrieveResults { message RetrieveResults {

View File

@ -1048,6 +1048,7 @@ type SearchRequest struct {
SerializedExprPlan []byte `protobuf:"bytes,9,opt,name=serialized_expr_plan,json=serializedExprPlan,proto3" json:"serialized_expr_plan,omitempty"` SerializedExprPlan []byte `protobuf:"bytes,9,opt,name=serialized_expr_plan,json=serializedExprPlan,proto3" json:"serialized_expr_plan,omitempty"`
OutputFieldsId []int64 `protobuf:"varint,10,rep,packed,name=output_fields_id,json=outputFieldsId,proto3" json:"output_fields_id,omitempty"` OutputFieldsId []int64 `protobuf:"varint,10,rep,packed,name=output_fields_id,json=outputFieldsId,proto3" json:"output_fields_id,omitempty"`
TravelTimestamp uint64 `protobuf:"varint,11,opt,name=travel_timestamp,json=travelTimestamp,proto3" json:"travel_timestamp,omitempty"` TravelTimestamp uint64 `protobuf:"varint,11,opt,name=travel_timestamp,json=travelTimestamp,proto3" json:"travel_timestamp,omitempty"`
GuaranteeTimestamp uint64 `protobuf:"varint,12,opt,name=guarantee_timestamp,json=guaranteeTimestamp,proto3" json:"guarantee_timestamp,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"` XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"` XXX_sizecache int32 `json:"-"`
@ -1155,6 +1156,13 @@ func (m *SearchRequest) GetTravelTimestamp() uint64 {
return 0 return 0
} }
func (m *SearchRequest) GetGuaranteeTimestamp() uint64 {
if m != nil {
return m.GuaranteeTimestamp
}
return 0
}
type SearchResults struct { type SearchResults struct {
Base *commonpb.MsgBase `protobuf:"bytes,1,opt,name=base,proto3" json:"base,omitempty"` Base *commonpb.MsgBase `protobuf:"bytes,1,opt,name=base,proto3" json:"base,omitempty"`
Status *commonpb.Status `protobuf:"bytes,2,opt,name=status,proto3" json:"status,omitempty"` Status *commonpb.Status `protobuf:"bytes,2,opt,name=status,proto3" json:"status,omitempty"`
@ -1284,6 +1292,7 @@ type RetrieveRequest struct {
Ids *schemapb.IDs `protobuf:"bytes,6,opt,name=ids,proto3" json:"ids,omitempty"` Ids *schemapb.IDs `protobuf:"bytes,6,opt,name=ids,proto3" json:"ids,omitempty"`
OutputFields []string `protobuf:"bytes,7,rep,name=output_fields,json=outputFields,proto3" json:"output_fields,omitempty"` OutputFields []string `protobuf:"bytes,7,rep,name=output_fields,json=outputFields,proto3" json:"output_fields,omitempty"`
TravelTimestamp uint64 `protobuf:"varint,8,opt,name=travel_timestamp,json=travelTimestamp,proto3" json:"travel_timestamp,omitempty"` TravelTimestamp uint64 `protobuf:"varint,8,opt,name=travel_timestamp,json=travelTimestamp,proto3" json:"travel_timestamp,omitempty"`
GuaranteeTimestamp uint64 `protobuf:"varint,9,opt,name=guarantee_timestamp,json=guaranteeTimestamp,proto3" json:"guarantee_timestamp,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"` XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"` XXX_sizecache int32 `json:"-"`
@ -1370,6 +1379,13 @@ func (m *RetrieveRequest) GetTravelTimestamp() uint64 {
return 0 return 0
} }
func (m *RetrieveRequest) GetGuaranteeTimestamp() uint64 {
if m != nil {
return m.GuaranteeTimestamp
}
return 0
}
type RetrieveResults struct { type RetrieveResults struct {
Base *commonpb.MsgBase `protobuf:"bytes,1,opt,name=base,proto3" json:"base,omitempty"` Base *commonpb.MsgBase `protobuf:"bytes,1,opt,name=base,proto3" json:"base,omitempty"`
Status *commonpb.Status `protobuf:"bytes,2,opt,name=status,proto3" json:"status,omitempty"` Status *commonpb.Status `protobuf:"bytes,2,opt,name=status,proto3" json:"status,omitempty"`
@ -2228,126 +2244,127 @@ func init() {
func init() { proto.RegisterFile("internal.proto", fileDescriptor_41f4a519b878ee3b) } func init() { proto.RegisterFile("internal.proto", fileDescriptor_41f4a519b878ee3b) }
var fileDescriptor_41f4a519b878ee3b = []byte{ var fileDescriptor_41f4a519b878ee3b = []byte{
// 1927 bytes of a gzipped FileDescriptorProto // 1950 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x59, 0xcd, 0x73, 0x23, 0x47, 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x59, 0x5b, 0x73, 0x23, 0x47,
0x15, 0x67, 0x34, 0xb2, 0x25, 0x3d, 0xc9, 0xb6, 0xb6, 0xd7, 0xbb, 0x19, 0x7b, 0x37, 0x1b, 0x65, 0xf5, 0xff, 0x8f, 0x24, 0x5b, 0xd2, 0xd1, 0xd8, 0xd6, 0xf6, 0x7a, 0x37, 0x63, 0xef, 0x66, 0xa3,
0xc2, 0x87, 0xc9, 0x16, 0xeb, 0xc5, 0x01, 0x92, 0xa2, 0x28, 0x36, 0xb1, 0x95, 0x2c, 0xaa, 0x8d, 0x4c, 0xfe, 0x80, 0xc9, 0x16, 0xeb, 0xc5, 0x01, 0x92, 0xa2, 0x28, 0x36, 0xb1, 0x95, 0x2c, 0xaa,
0x8d, 0x19, 0x6f, 0x52, 0x05, 0x97, 0xa9, 0xd6, 0x4c, 0x5b, 0x9a, 0x64, 0xbe, 0x98, 0x6e, 0x79, 0x8d, 0x8d, 0x19, 0x6f, 0x52, 0x05, 0x2f, 0x53, 0xad, 0x99, 0xb6, 0x34, 0xc9, 0xdc, 0x98, 0xee,
0x57, 0x39, 0x71, 0xe0, 0x46, 0xc1, 0x81, 0x2a, 0xfe, 0x0d, 0xae, 0x9c, 0xf8, 0xa8, 0x1c, 0x80, 0xf1, 0xae, 0xf2, 0xc4, 0x03, 0x6f, 0x14, 0x3c, 0x50, 0xc5, 0xd7, 0xe0, 0x95, 0x27, 0x2e, 0x95,
0x2a, 0xfe, 0x02, 0xfe, 0x0a, 0xee, 0x9c, 0xa8, 0x7e, 0xdd, 0xf3, 0x21, 0x79, 0x6c, 0x1c, 0x6f, 0x27, 0xaa, 0xf8, 0x04, 0x7c, 0x0a, 0x1e, 0xa1, 0x78, 0xa2, 0xfa, 0x74, 0xcf, 0x45, 0xb2, 0x6c,
0x51, 0x90, 0x22, 0xb7, 0xe9, 0xdf, 0x7b, 0xfd, 0xf1, 0x7e, 0xef, 0xbd, 0x7e, 0x4f, 0x2d, 0x58, 0xbc, 0xde, 0xa2, 0x20, 0x05, 0x6f, 0xd3, 0xbf, 0x73, 0xfa, 0x72, 0x7e, 0xe7, 0xd2, 0x47, 0x2d,
0x0f, 0x62, 0xc1, 0xb2, 0x98, 0x86, 0x0f, 0xd2, 0x2c, 0x11, 0x09, 0xb9, 0x15, 0x05, 0xe1, 0xd9, 0x58, 0x0f, 0x62, 0xc1, 0xb2, 0x98, 0x86, 0x0f, 0xd2, 0x2c, 0x11, 0x09, 0xb9, 0x15, 0x05, 0xe1,
0x8c, 0xab, 0xd1, 0x83, 0x5c, 0xb8, 0xdd, 0xf3, 0x92, 0x28, 0x4a, 0x62, 0x05, 0x6f, 0xf7, 0xb8, 0x59, 0xce, 0xd5, 0xe8, 0x41, 0x21, 0xdc, 0x36, 0xbd, 0x24, 0x8a, 0x92, 0x58, 0xc1, 0xdb, 0x26,
0x37, 0x65, 0x11, 0x55, 0x23, 0xfb, 0x0f, 0x06, 0xac, 0x1d, 0x24, 0x51, 0x9a, 0xc4, 0x2c, 0x16, 0xf7, 0xa6, 0x2c, 0xa2, 0x6a, 0x64, 0xff, 0xce, 0x80, 0xb5, 0x83, 0x24, 0x4a, 0x93, 0x98, 0xc5,
0xa3, 0xf8, 0x34, 0x21, 0xb7, 0x61, 0x35, 0x4e, 0x7c, 0x36, 0x1a, 0x5a, 0xc6, 0xc0, 0xd8, 0x31, 0x62, 0x14, 0x9f, 0x26, 0xe4, 0x36, 0xac, 0xc6, 0x89, 0xcf, 0x46, 0x43, 0xcb, 0x18, 0x18, 0x3b,
0x1d, 0x3d, 0x22, 0x04, 0x9a, 0x59, 0x12, 0x32, 0xab, 0x31, 0x30, 0x76, 0x3a, 0x0e, 0x7e, 0x93, 0x4d, 0x47, 0x8f, 0x08, 0x81, 0x56, 0x96, 0x84, 0xcc, 0x6a, 0x0c, 0x8c, 0x9d, 0xae, 0x83, 0xdf,
0x47, 0x00, 0x5c, 0x50, 0xc1, 0x5c, 0x2f, 0xf1, 0x99, 0x65, 0x0e, 0x8c, 0x9d, 0xf5, 0xbd, 0xc1, 0xe4, 0x11, 0x00, 0x17, 0x54, 0x30, 0xd7, 0x4b, 0x7c, 0x66, 0x35, 0x07, 0xc6, 0xce, 0xfa, 0xde,
0x83, 0xda, 0x53, 0x3c, 0x38, 0x91, 0x8a, 0x07, 0x89, 0xcf, 0x9c, 0x0e, 0xcf, 0x3f, 0xc9, 0xdb, 0xe0, 0xc1, 0xd2, 0x53, 0x3c, 0x38, 0x91, 0x8a, 0x07, 0x89, 0xcf, 0x9c, 0x2e, 0x2f, 0x3e, 0xc9,
0x00, 0xec, 0xb9, 0xc8, 0xa8, 0x1b, 0xc4, 0xa7, 0x89, 0xd5, 0x1c, 0x98, 0x3b, 0xdd, 0xbd, 0x57, 0xbb, 0x00, 0xec, 0xb9, 0xc8, 0xa8, 0x1b, 0xc4, 0xa7, 0x89, 0xd5, 0x1a, 0x34, 0x77, 0x7a, 0x7b,
0x17, 0x17, 0xd0, 0x87, 0x7f, 0xc2, 0xe6, 0x1f, 0xd2, 0x70, 0xc6, 0x8e, 0x69, 0x90, 0x39, 0x1d, 0xaf, 0xcf, 0x2f, 0xa0, 0x0f, 0xff, 0x84, 0xcd, 0x3e, 0xa6, 0x61, 0xce, 0x8e, 0x69, 0x90, 0x39,
0x9c, 0x24, 0x8f, 0x6b, 0xff, 0xdd, 0x80, 0x8d, 0xc2, 0x00, 0xdc, 0x83, 0x93, 0xef, 0xc2, 0x0a, 0x5d, 0x9c, 0x24, 0x8f, 0x6b, 0xff, 0xd9, 0x80, 0x8d, 0xd2, 0x00, 0xdc, 0x83, 0x93, 0x6f, 0xc3,
0x6e, 0x81, 0x16, 0x74, 0xf7, 0xbe, 0x7c, 0xc1, 0x89, 0x16, 0xec, 0x76, 0xd4, 0x14, 0xf2, 0x01, 0x0a, 0x6e, 0x81, 0x16, 0xf4, 0xf6, 0xfe, 0xff, 0x82, 0x13, 0xcd, 0xd9, 0xed, 0xa8, 0x29, 0xe4,
0xdc, 0xe4, 0xb3, 0xb1, 0x97, 0x8b, 0x5c, 0x44, 0xb9, 0xd5, 0xc0, 0xa3, 0x5d, 0x6d, 0x25, 0x52, 0x23, 0xb8, 0xc9, 0xf3, 0xb1, 0x57, 0x88, 0x5c, 0x44, 0xb9, 0xd5, 0xc0, 0xa3, 0x5d, 0x6d, 0x25,
0x5d, 0x40, 0x1f, 0xe9, 0x0d, 0x58, 0x95, 0x2b, 0xcd, 0x38, 0xb2, 0xd4, 0xdd, 0xbb, 0x53, 0x6b, 0x52, 0x5f, 0x40, 0x1f, 0xe9, 0x2d, 0x58, 0x95, 0x2b, 0xe5, 0x1c, 0x59, 0xea, 0xed, 0xdd, 0x59,
0xe4, 0x09, 0xaa, 0x38, 0x5a, 0xd5, 0xbe, 0x03, 0x5b, 0x8f, 0x99, 0x58, 0xb2, 0xce, 0x61, 0x3f, 0x6a, 0xe4, 0x09, 0xaa, 0x38, 0x5a, 0xd5, 0xbe, 0x03, 0x5b, 0x8f, 0x99, 0x58, 0xb0, 0xce, 0x61,
0x9d, 0x31, 0x2e, 0xb4, 0xf0, 0x69, 0x10, 0xb1, 0xa7, 0x81, 0xf7, 0xf1, 0xc1, 0x94, 0xc6, 0x31, 0x3f, 0xce, 0x19, 0x17, 0x5a, 0xf8, 0x34, 0x88, 0xd8, 0xd3, 0xc0, 0xfb, 0xf4, 0x60, 0x4a, 0xe3,
0x0b, 0x73, 0xe1, 0xcb, 0x70, 0xe7, 0x31, 0xc3, 0x09, 0x01, 0x17, 0x81, 0xc7, 0x97, 0xc4, 0xb7, 0x98, 0x85, 0x85, 0xf0, 0x55, 0xb8, 0xf3, 0x98, 0xe1, 0x84, 0x80, 0x8b, 0xc0, 0xe3, 0x0b, 0xe2,
0xe0, 0xe6, 0x63, 0x26, 0x86, 0xfe, 0x12, 0xfc, 0x21, 0xb4, 0x8f, 0xa4, 0xb3, 0x65, 0x18, 0x7c, 0x5b, 0x70, 0xf3, 0x31, 0x13, 0x43, 0x7f, 0x01, 0xfe, 0x18, 0x3a, 0x47, 0xd2, 0xd9, 0x32, 0x0c,
0x07, 0x5a, 0xd4, 0xf7, 0x33, 0xc6, 0xb9, 0x66, 0xf1, 0x6e, 0xed, 0x89, 0xdf, 0x51, 0x3a, 0x4e, 0xbe, 0x05, 0x6d, 0xea, 0xfb, 0x19, 0xe3, 0x5c, 0xb3, 0x78, 0x77, 0xe9, 0x89, 0xdf, 0x53, 0x3a,
0xae, 0x5c, 0x17, 0x26, 0xf6, 0x47, 0x00, 0xa3, 0x38, 0x10, 0xc7, 0x34, 0xa3, 0x11, 0xbf, 0x30, 0x4e, 0xa1, 0xbc, 0x2c, 0x4c, 0xec, 0x4f, 0x00, 0x46, 0x71, 0x20, 0x8e, 0x69, 0x46, 0x23, 0x7e,
0xc0, 0x86, 0xd0, 0xe3, 0x82, 0x66, 0xc2, 0x4d, 0x51, 0x4f, 0x53, 0x7e, 0x85, 0x68, 0xe8, 0xe2, 0x61, 0x80, 0x0d, 0xc1, 0xe4, 0x82, 0x66, 0xc2, 0x4d, 0x51, 0x4f, 0x53, 0x7e, 0x85, 0x68, 0xe8,
0x34, 0xb5, 0xba, 0xfd, 0x63, 0x80, 0x13, 0x91, 0x05, 0xf1, 0xe4, 0xfd, 0x80, 0x0b, 0xb9, 0xd7, 0xe1, 0x34, 0xb5, 0xba, 0xfd, 0x43, 0x80, 0x13, 0x91, 0x05, 0xf1, 0xe4, 0xc3, 0x80, 0x0b, 0xb9,
0x99, 0xd4, 0x93, 0x46, 0x98, 0x3b, 0x1d, 0x47, 0x8f, 0x2a, 0xee, 0x68, 0x5c, 0xdd, 0x1d, 0x8f, 0xd7, 0x99, 0xd4, 0x93, 0x46, 0x34, 0x77, 0xba, 0x8e, 0x1e, 0xd5, 0xdc, 0xd1, 0xb8, 0xba, 0x3b,
0xa0, 0x9b, 0xd3, 0x7d, 0xc8, 0x27, 0xe4, 0x21, 0x34, 0xc7, 0x94, 0xb3, 0x4b, 0xe9, 0x39, 0xe4, 0x1e, 0x41, 0xaf, 0xa0, 0xfb, 0x90, 0x4f, 0xc8, 0x43, 0x68, 0x8d, 0x29, 0x67, 0x97, 0xd2, 0x73,
0x93, 0x7d, 0xca, 0x99, 0x83, 0x9a, 0xf6, 0xa7, 0x0d, 0x78, 0xe9, 0x20, 0x63, 0x18, 0xfc, 0x61, 0xc8, 0x27, 0xfb, 0x94, 0x33, 0x07, 0x35, 0xed, 0xcf, 0x1b, 0xf0, 0xca, 0x41, 0xc6, 0x30, 0xf8,
0xc8, 0x3c, 0x11, 0x24, 0xb1, 0xe6, 0xfe, 0xb3, 0xaf, 0x46, 0x5e, 0x82, 0x96, 0x3f, 0x76, 0x63, 0xc3, 0x90, 0x79, 0x22, 0x48, 0x62, 0xcd, 0xfd, 0x8b, 0xaf, 0x46, 0x5e, 0x81, 0xb6, 0x3f, 0x76,
0x1a, 0xe5, 0x64, 0xaf, 0xfa, 0xe3, 0x23, 0x1a, 0x31, 0xf2, 0x55, 0x58, 0xf7, 0x8a, 0xf5, 0x25, 0x63, 0x1a, 0x15, 0x64, 0xaf, 0xfa, 0xe3, 0x23, 0x1a, 0x31, 0xf2, 0x65, 0x58, 0xf7, 0xca, 0xf5,
0x82, 0x31, 0xd7, 0x71, 0x96, 0x50, 0xe9, 0x2a, 0x7f, 0x3c, 0x1a, 0x5a, 0x4d, 0x74, 0x03, 0x7e, 0x25, 0x82, 0x31, 0xd7, 0x75, 0x16, 0x50, 0xe9, 0x2a, 0x7f, 0x3c, 0x1a, 0x5a, 0x2d, 0x74, 0x03,
0x13, 0x1b, 0x7a, 0xa5, 0xd6, 0x68, 0x68, 0xad, 0xa0, 0x6c, 0x01, 0x93, 0xa4, 0xaa, 0x3b, 0xc4, 0x7e, 0x13, 0x1b, 0xcc, 0x4a, 0x6b, 0x34, 0xb4, 0x56, 0x50, 0x36, 0x87, 0x49, 0x52, 0x55, 0x0d,
0x5a, 0x1d, 0x18, 0x3b, 0x3d, 0x47, 0x8f, 0xc8, 0x43, 0xb8, 0x79, 0x16, 0x64, 0x62, 0x46, 0x43, 0xb1, 0x56, 0x07, 0xc6, 0x8e, 0xe9, 0xe8, 0x11, 0x79, 0x08, 0x37, 0xcf, 0x82, 0x4c, 0xe4, 0x34,
0x1d, 0x57, 0x72, 0x17, 0x6e, 0xb5, 0x90, 0xf9, 0x3a, 0x11, 0xd9, 0x83, 0xcd, 0x74, 0x3a, 0xe7, 0xd4, 0x71, 0x25, 0x77, 0xe1, 0x56, 0x1b, 0x99, 0x5f, 0x26, 0x22, 0x7b, 0xb0, 0x99, 0x4e, 0x67,
0x81, 0xb7, 0x34, 0xa5, 0x8d, 0x53, 0x6a, 0x65, 0xf6, 0xa7, 0x06, 0xdc, 0x1a, 0x66, 0x49, 0xfa, 0x3c, 0xf0, 0x16, 0xa6, 0x74, 0x70, 0xca, 0x52, 0x99, 0xfd, 0xb9, 0x01, 0xb7, 0x86, 0x59, 0x92,
0x79, 0xa6, 0xd0, 0xfe, 0x65, 0x03, 0x6e, 0xab, 0x48, 0x38, 0xa6, 0x99, 0x08, 0xfe, 0x43, 0x56, 0x7e, 0x91, 0x29, 0xb4, 0x7f, 0xde, 0x80, 0xdb, 0x2a, 0x12, 0x8e, 0x69, 0x26, 0x82, 0x7f, 0x91,
0x7c, 0x0d, 0x36, 0xca, 0x5d, 0x95, 0x42, 0xbd, 0x19, 0x5f, 0x81, 0xf5, 0x34, 0x3f, 0x87, 0xd2, 0x15, 0x5f, 0x81, 0x8d, 0x6a, 0x57, 0xa5, 0xb0, 0xdc, 0x8c, 0x2f, 0xc1, 0x7a, 0x5a, 0x9c, 0x43,
0x6b, 0xa2, 0xde, 0x5a, 0x81, 0x2e, 0x58, 0xbb, 0x72, 0x89, 0xb5, 0xab, 0x35, 0x01, 0x33, 0x80, 0xe9, 0xb5, 0x50, 0x6f, 0xad, 0x44, 0xe7, 0xac, 0x5d, 0xb9, 0xc4, 0xda, 0xd5, 0x25, 0x01, 0x33,
0x6e, 0xb1, 0xd0, 0x68, 0x68, 0xb5, 0x50, 0xa5, 0x0a, 0xd9, 0xbf, 0x68, 0xc0, 0xa6, 0x74, 0xea, 0x80, 0x5e, 0xb9, 0xd0, 0x68, 0x68, 0xb5, 0x51, 0xa5, 0x0e, 0xd9, 0x3f, 0x6b, 0xc0, 0xa6, 0x74,
0x17, 0x6c, 0x48, 0x36, 0xfe, 0xd8, 0x00, 0xa2, 0xa2, 0x63, 0x14, 0xfb, 0xec, 0xf9, 0x7f, 0x93, 0xea, 0xff, 0xd8, 0x90, 0x6c, 0xfc, 0xbe, 0x01, 0x44, 0x45, 0xc7, 0x28, 0xf6, 0xd9, 0xf3, 0x7f,
0x8b, 0x97, 0x01, 0x4e, 0x03, 0x16, 0xfa, 0x55, 0x1e, 0x3a, 0x88, 0xbc, 0x10, 0x07, 0x16, 0xb4, 0x27, 0x17, 0xaf, 0x02, 0x9c, 0x06, 0x2c, 0xf4, 0xeb, 0x3c, 0x74, 0x11, 0x79, 0x29, 0x0e, 0x2c,
0x70, 0x91, 0xc2, 0xfe, 0x7c, 0x28, 0xab, 0x80, 0xea, 0x08, 0x74, 0x15, 0x68, 0x5f, 0xb9, 0x0a, 0x68, 0xe3, 0x22, 0xa5, 0xfd, 0xc5, 0x50, 0xde, 0x02, 0xaa, 0x23, 0xd0, 0xb7, 0x40, 0xe7, 0xca,
0xe0, 0x34, 0x5d, 0x05, 0x7e, 0x6b, 0xc2, 0xda, 0x28, 0xe6, 0x2c, 0x13, 0xff, 0xcf, 0x81, 0x44, 0xb7, 0x00, 0x4e, 0xd3, 0xb7, 0xc0, 0xaf, 0x9b, 0xb0, 0x36, 0x8a, 0x39, 0xcb, 0xc4, 0x7f, 0x73,
0xee, 0x42, 0x87, 0xb3, 0x49, 0x24, 0x1b, 0x93, 0xa1, 0xd5, 0x46, 0x79, 0x09, 0x48, 0xa9, 0xa7, 0x20, 0x91, 0xbb, 0xd0, 0xe5, 0x6c, 0x12, 0xc9, 0xc6, 0x64, 0x68, 0x75, 0x50, 0x5e, 0x01, 0x52,
0x6e, 0xd6, 0xd1, 0xd0, 0xea, 0x28, 0xd7, 0x16, 0x00, 0xb9, 0x07, 0x20, 0x82, 0x88, 0x71, 0x41, 0xea, 0xa9, 0xca, 0x3a, 0x1a, 0x5a, 0x5d, 0xe5, 0xda, 0x12, 0x20, 0xf7, 0x00, 0x44, 0x10, 0x31,
0xa3, 0x94, 0x5b, 0x30, 0x30, 0x77, 0x9a, 0x4e, 0x05, 0x91, 0x55, 0x20, 0x4b, 0x9e, 0x8d, 0x86, 0x2e, 0x68, 0x94, 0x72, 0x0b, 0x06, 0xcd, 0x9d, 0x96, 0x53, 0x43, 0xe4, 0x2d, 0x90, 0x25, 0xcf,
0xdc, 0xea, 0x0e, 0x4c, 0x59, 0xc6, 0xd5, 0x88, 0x7c, 0x0b, 0xda, 0x59, 0xf2, 0xcc, 0xf5, 0xa9, 0x46, 0x43, 0x6e, 0xf5, 0x06, 0x4d, 0x79, 0x8d, 0xab, 0x11, 0xf9, 0x06, 0x74, 0xb2, 0xe4, 0x99,
0xa0, 0x56, 0x0f, 0x9d, 0xb7, 0x55, 0x4b, 0xf6, 0x7e, 0x98, 0x8c, 0x9d, 0x56, 0x96, 0x3c, 0x1b, 0xeb, 0x53, 0x41, 0x2d, 0x13, 0x9d, 0xb7, 0xb5, 0x94, 0xec, 0xfd, 0x30, 0x19, 0x3b, 0xed, 0x2c,
0x52, 0x41, 0xed, 0xbf, 0x98, 0xb0, 0x76, 0xc2, 0x68, 0xe6, 0x4d, 0xaf, 0xef, 0xb0, 0xaf, 0x43, 0x79, 0x36, 0xa4, 0x82, 0xda, 0x7f, 0x6b, 0xc2, 0xda, 0x09, 0xa3, 0x99, 0x37, 0xbd, 0xbe, 0xc3,
0x3f, 0x63, 0x7c, 0x16, 0x0a, 0xb7, 0x34, 0x4b, 0x79, 0x6e, 0x43, 0xe1, 0x07, 0x85, 0x71, 0x39, 0xbe, 0x0a, 0xfd, 0x8c, 0xf1, 0x3c, 0x14, 0x6e, 0x65, 0x96, 0xf2, 0xdc, 0x86, 0xc2, 0x0f, 0x4a,
0xe5, 0xe6, 0x25, 0x94, 0x37, 0x6b, 0x28, 0xb7, 0xa1, 0x57, 0xe1, 0x97, 0x5b, 0x2b, 0x68, 0xfa, 0xe3, 0x0a, 0xca, 0x9b, 0x97, 0x50, 0xde, 0x5a, 0x42, 0xb9, 0x0d, 0x66, 0x8d, 0x5f, 0x6e, 0xad,
0x02, 0x46, 0xfa, 0x60, 0xfa, 0x3c, 0x44, 0x8f, 0x75, 0x1c, 0xf9, 0x49, 0xee, 0xc3, 0x8d, 0x34, 0xa0, 0xe9, 0x73, 0x18, 0xe9, 0x43, 0xd3, 0xe7, 0x21, 0x7a, 0xac, 0xeb, 0xc8, 0x4f, 0x72, 0x1f,
0xa4, 0x1e, 0x9b, 0x26, 0xa1, 0xcf, 0x32, 0x77, 0x92, 0x25, 0xb3, 0x14, 0xdd, 0xd5, 0x73, 0xfa, 0x6e, 0xa4, 0x21, 0xf5, 0xd8, 0x34, 0x09, 0x7d, 0x96, 0xb9, 0x93, 0x2c, 0xc9, 0x53, 0x74, 0x97,
0x15, 0xc1, 0x63, 0x89, 0x93, 0x37, 0xa1, 0xed, 0xf3, 0xd0, 0x15, 0xf3, 0x94, 0xa1, 0xcb, 0xd6, 0xe9, 0xf4, 0x6b, 0x82, 0xc7, 0x12, 0x27, 0x6f, 0x43, 0xc7, 0xe7, 0xa1, 0x2b, 0x66, 0x29, 0x43,
0x2f, 0xb0, 0x7d, 0xc8, 0xc3, 0xa7, 0xf3, 0x94, 0x39, 0x2d, 0x5f, 0x7d, 0x90, 0x87, 0xb0, 0xc9, 0x97, 0xad, 0x5f, 0x60, 0xfb, 0x90, 0x87, 0x4f, 0x67, 0x29, 0x73, 0xda, 0xbe, 0xfa, 0x20, 0x0f,
0x59, 0x16, 0xd0, 0x30, 0xf8, 0x84, 0xf9, 0x2e, 0x7b, 0x9e, 0x66, 0x6e, 0x1a, 0xd2, 0x18, 0x3d, 0x61, 0x93, 0xb3, 0x2c, 0xa0, 0x61, 0xf0, 0x19, 0xf3, 0x5d, 0xf6, 0x3c, 0xcd, 0xdc, 0x34, 0xa4,
0xdb, 0x73, 0x48, 0x29, 0x7b, 0xf7, 0x79, 0x9a, 0x1d, 0x87, 0x34, 0x26, 0x3b, 0xd0, 0x4f, 0x66, 0x31, 0x7a, 0xd6, 0x74, 0x48, 0x25, 0x7b, 0xff, 0x79, 0x9a, 0x1d, 0x87, 0x34, 0x26, 0x3b, 0xd0,
0x22, 0x9d, 0x09, 0x17, 0xb3, 0x8f, 0xbb, 0x81, 0x8f, 0x8e, 0x36, 0x9d, 0x75, 0x85, 0xbf, 0x87, 0x4f, 0x72, 0x91, 0xe6, 0xc2, 0xc5, 0xec, 0xe3, 0x6e, 0xe0, 0xa3, 0xa3, 0x9b, 0xce, 0xba, 0xc2,
0xf0, 0xc8, 0x97, 0xd4, 0x8a, 0x8c, 0x9e, 0xb1, 0xd0, 0x2d, 0x22, 0xc0, 0xea, 0x0e, 0x8c, 0x9d, 0x3f, 0x40, 0x78, 0xe4, 0x4b, 0x6a, 0x45, 0x46, 0xcf, 0x58, 0xe8, 0x96, 0x11, 0x60, 0xf5, 0x06,
0xa6, 0xb3, 0xa1, 0xf0, 0xa7, 0x39, 0x6c, 0xff, 0xa3, 0xe2, 0x49, 0x49, 0x3a, 0xbf, 0x86, 0x27, 0xc6, 0x4e, 0xcb, 0xd9, 0x50, 0xf8, 0xd3, 0x02, 0x26, 0xbb, 0x70, 0x73, 0x92, 0xd3, 0x8c, 0xc6,
0xaf, 0xd3, 0x9e, 0xd5, 0xba, 0xdf, 0xac, 0x77, 0xff, 0x2b, 0xd0, 0x8d, 0x98, 0xc8, 0x02, 0x4f, 0x82, 0xb1, 0x9a, 0xb6, 0x89, 0xda, 0xa4, 0x14, 0x95, 0x13, 0xec, 0xbf, 0xd4, 0x5c, 0x2f, 0xbd,
0xd1, 0xac, 0xb2, 0x12, 0x14, 0x84, 0x5c, 0x12, 0x68, 0x4e, 0x03, 0xa1, 0xfc, 0xdb, 0x73, 0xf0, 0xc4, 0xaf, 0xe1, 0xfa, 0xeb, 0xf4, 0x73, 0x4b, 0xe3, 0xa5, 0xb9, 0x3c, 0x5e, 0x5e, 0x83, 0x5e,
0x5b, 0x4e, 0xe2, 0x61, 0xe0, 0x31, 0xdf, 0x1d, 0x87, 0xc9, 0x58, 0xd3, 0x0a, 0x0a, 0x92, 0xc1, 0xc4, 0x44, 0x16, 0x78, 0xca, 0x2f, 0x2a, 0x8d, 0x41, 0x41, 0x48, 0x3e, 0x81, 0xd6, 0x34, 0x10,
0x2c, 0xe9, 0xd4, 0x0a, 0xf1, 0x2c, 0x72, 0xbd, 0x64, 0x16, 0x0b, 0x0b, 0x30, 0x88, 0xd6, 0x15, 0x2a, 0x20, 0x4c, 0x07, 0xbf, 0xe5, 0x24, 0x1e, 0x06, 0x1e, 0xf3, 0xdd, 0x71, 0x98, 0x8c, 0xb5,
0x7e, 0x34, 0x8b, 0x0e, 0x24, 0x4a, 0x5e, 0x83, 0x35, 0xad, 0x99, 0x9c, 0x9e, 0x72, 0x26, 0x90, 0x1f, 0x40, 0x41, 0x32, 0xfa, 0x25, 0xff, 0x5a, 0x21, 0xce, 0x23, 0xd7, 0x4b, 0xf2, 0x58, 0x58,
0x4b, 0xd3, 0xe9, 0x29, 0xf0, 0x87, 0x88, 0x91, 0xef, 0xc1, 0x36, 0x67, 0x34, 0x64, 0xbe, 0x5b, 0x80, 0x51, 0xb7, 0xae, 0xf0, 0xa3, 0x3c, 0x3a, 0x90, 0x28, 0x79, 0x03, 0xd6, 0xb4, 0x66, 0x72,
0xa4, 0x2c, 0x77, 0x39, 0x32, 0xcb, 0x7c, 0x6b, 0x15, 0xfd, 0x64, 0x29, 0x8d, 0x93, 0x42, 0xe1, 0x7a, 0xca, 0x99, 0x40, 0xf2, 0x9b, 0x8e, 0xa9, 0xc0, 0xef, 0x23, 0x46, 0xbe, 0x03, 0xdb, 0x9c,
0x44, 0xcb, 0xc9, 0x2e, 0xdc, 0x2c, 0x68, 0xa8, 0x4c, 0x53, 0xcd, 0x18, 0x29, 0x45, 0xc5, 0x84, 0xd1, 0x90, 0xf9, 0x6e, 0x99, 0xe3, 0xdc, 0xe5, 0xc8, 0x2c, 0xf3, 0xad, 0x55, 0x74, 0xac, 0xa5,
0xb7, 0xc0, 0x9a, 0x84, 0xc9, 0x98, 0x86, 0xee, 0xb9, 0x5d, 0xf1, 0x12, 0x36, 0x9d, 0xdb, 0x4a, 0x34, 0x4e, 0x4a, 0x85, 0x13, 0x2d, 0x97, 0x7e, 0x2b, 0x69, 0xa8, 0x4d, 0x53, 0xdd, 0x1b, 0xa9,
0x7e, 0xb2, 0xb4, 0xa5, 0xfd, 0xe7, 0x06, 0x6c, 0x38, 0x92, 0x3b, 0x76, 0xc6, 0x3e, 0xf7, 0xd9, 0x44, 0xe5, 0x84, 0x77, 0xc0, 0x9a, 0x84, 0xc9, 0x98, 0x86, 0xee, 0xb9, 0x5d, 0xb1, 0x6a, 0x37,
0xfb, 0x3a, 0x98, 0x81, 0xcf, 0x31, 0x7b, 0xbb, 0x7b, 0xd6, 0xe2, 0xb9, 0xf5, 0x2f, 0xe7, 0xd1, 0x9d, 0xdb, 0x4a, 0x7e, 0xb2, 0xb0, 0xa5, 0xfd, 0xd7, 0x06, 0x6c, 0x38, 0x92, 0x3b, 0x76, 0xc6,
0x90, 0x3b, 0x52, 0x49, 0xba, 0x71, 0x21, 0x7f, 0x34, 0xbb, 0xbd, 0x6a, 0xf2, 0xd4, 0xa6, 0x4e, 0xbe, 0xf0, 0xe9, 0xfe, 0x26, 0x34, 0x03, 0x9f, 0x63, 0xba, 0xf7, 0xf6, 0xac, 0xf9, 0x73, 0xeb,
0xbb, 0x3e, 0x75, 0x7e, 0x6f, 0x56, 0x89, 0xfc, 0x5f, 0x4d, 0x1e, 0xcd, 0x50, 0xf3, 0x2a, 0x0c, 0x9f, 0xda, 0xa3, 0x21, 0x77, 0xa4, 0x92, 0x74, 0xe3, 0x5c, 0xc2, 0x69, 0x76, 0xcd, 0x7a, 0xb6,
0x3d, 0x82, 0xae, 0xbe, 0x5a, 0xb0, 0x1e, 0xac, 0x60, 0x3d, 0xb8, 0x57, 0x3b, 0x07, 0xe9, 0x92, 0x2d, 0xcd, 0xb5, 0xce, 0x0b, 0xe5, 0x5a, 0xf7, 0xc2, 0x5c, 0xfb, 0x6d, 0xb3, 0xce, 0xfc, 0x7f,
0xb5, 0xc0, 0x51, 0x1d, 0x07, 0x97, 0xdf, 0xe4, 0xfb, 0x70, 0xe7, 0x7c, 0x12, 0x64, 0x9a, 0xa3, 0x6a, 0xb6, 0x69, 0x4a, 0x5b, 0x57, 0xa1, 0xf4, 0x11, 0xf4, 0x74, 0xf1, 0xc2, 0x1b, 0x67, 0x05,
0x3c, 0x0b, 0xb6, 0x96, 0xb3, 0x20, 0x27, 0xd1, 0x27, 0xdf, 0x84, 0xcd, 0x4a, 0x1a, 0x94, 0x13, 0x6f, 0x9c, 0x7b, 0x4b, 0xe7, 0x20, 0xbf, 0xf2, 0xb6, 0x71, 0x54, 0x4f, 0xc3, 0xe5, 0x37, 0xf9,
0xf5, 0x8f, 0x92, 0x52, 0x56, 0x4e, 0xb9, 0x7e, 0x22, 0xfc, 0xcd, 0x80, 0xb5, 0x21, 0x0b, 0x99, 0x2e, 0xdc, 0x39, 0x9f, 0x35, 0x99, 0xe6, 0xa8, 0x48, 0x9b, 0xad, 0xc5, 0xb4, 0x29, 0x48, 0xf4,
0x78, 0x81, 0x34, 0xa8, 0x69, 0x2e, 0x1a, 0xb5, 0xcd, 0xc5, 0x42, 0xf5, 0x36, 0x2f, 0xaf, 0xde, 0xc9, 0xd7, 0x61, 0xb3, 0x96, 0x37, 0xd5, 0x44, 0xfd, 0xb3, 0xa7, 0x92, 0x55, 0x53, 0xae, 0x9f,
0xcd, 0x73, 0xd5, 0xfb, 0x55, 0xe8, 0xa5, 0x59, 0x10, 0xd1, 0x6c, 0xee, 0x7e, 0xcc, 0xe6, 0x79, 0x39, 0x7f, 0x32, 0x60, 0x6d, 0xc8, 0x42, 0x26, 0x5e, 0x22, 0x6f, 0x96, 0xb4, 0x2f, 0x8d, 0xa5,
0x2a, 0x74, 0x35, 0xf6, 0x84, 0xcd, 0xb9, 0x1d, 0xc3, 0xf6, 0xfb, 0x09, 0xf5, 0xf7, 0x69, 0x48, 0xed, 0xcb, 0x5c, 0x7f, 0xd0, 0xbc, 0xbc, 0x3f, 0x68, 0x9d, 0xeb, 0x0f, 0x5e, 0x07, 0x33, 0xcd,
0x63, 0x8f, 0x69, 0x33, 0xf9, 0xf5, 0x2d, 0xbb, 0x07, 0x50, 0x61, 0xb2, 0x81, 0x1b, 0x56, 0x10, 0x82, 0x88, 0x66, 0x33, 0xf7, 0x53, 0x36, 0x2b, 0x72, 0xa7, 0xa7, 0xb1, 0x27, 0x6c, 0xc6, 0xed,
0xfb, 0x9f, 0x06, 0x74, 0xe4, 0x86, 0xd8, 0xf3, 0x5e, 0x63, 0xfd, 0x85, 0x66, 0xa7, 0x51, 0xd3, 0x18, 0xb6, 0x3f, 0x4c, 0xa8, 0xbf, 0x4f, 0x43, 0x1a, 0x7b, 0x4c, 0x9b, 0xc9, 0xaf, 0x6f, 0xd9,
0xec, 0x14, 0x6d, 0x6b, 0x4e, 0x57, 0xd9, 0xc7, 0x56, 0xfa, 0xd1, 0xe6, 0x62, 0x3f, 0xfa, 0x0a, 0x3d, 0x80, 0x1a, 0x93, 0x0d, 0xdc, 0xb0, 0x86, 0xd8, 0x7f, 0x37, 0xa0, 0x2b, 0x37, 0xc4, 0xae,
0x74, 0x03, 0x79, 0x20, 0x37, 0xa5, 0x62, 0xaa, 0x78, 0xea, 0x38, 0x80, 0xd0, 0xb1, 0x44, 0x64, 0xfa, 0x1a, 0xeb, 0xcf, 0xb5, 0x53, 0x8d, 0x25, 0xed, 0x54, 0xd9, 0x18, 0x17, 0x74, 0x55, 0x9d,
0xc3, 0x9a, 0x2b, 0x60, 0xc3, 0xba, 0x7a, 0xe5, 0x86, 0x55, 0x2f, 0x82, 0x0d, 0xeb, 0x9f, 0x1a, 0x72, 0xad, 0xe3, 0x6d, 0xcd, 0x77, 0xbc, 0xaf, 0x41, 0x2f, 0x90, 0x07, 0x72, 0x53, 0x2a, 0xa6,
0x60, 0x69, 0x8a, 0xcb, 0x57, 0x9b, 0x0f, 0x52, 0x1f, 0x1f, 0x8f, 0xee, 0x42, 0xa7, 0x88, 0x32, 0x8a, 0xa7, 0xae, 0x03, 0x08, 0x1d, 0x4b, 0x44, 0xb6, 0xc4, 0x85, 0x02, 0xb6, 0xc4, 0xab, 0x57,
0xfd, 0x68, 0x52, 0x02, 0x92, 0xd7, 0x43, 0x16, 0x25, 0xd9, 0xfc, 0x24, 0xf8, 0x84, 0x69, 0xc3, 0x6e, 0x89, 0xf5, 0x22, 0xd8, 0x12, 0xff, 0xa1, 0x01, 0x96, 0xa6, 0xb8, 0x7a, 0x17, 0xfa, 0x28,
0x2b, 0x88, 0xb4, 0xed, 0x68, 0x16, 0x39, 0xc9, 0x33, 0xae, 0x2f, 0xcc, 0x7c, 0x28, 0x6d, 0xf3, 0xf5, 0xf1, 0x79, 0xea, 0x2e, 0x74, 0xcb, 0x28, 0xd3, 0xcf, 0x32, 0x15, 0x20, 0x79, 0x3d, 0x64,
0xf0, 0x67, 0x06, 0x5e, 0x4d, 0x68, 0x79, 0xd3, 0x01, 0x05, 0xc9, 0x5b, 0x89, 0x6c, 0x41, 0x9b, 0x51, 0x92, 0xcd, 0x4e, 0x82, 0xcf, 0x98, 0x36, 0xbc, 0x86, 0x48, 0xdb, 0x8e, 0xf2, 0xc8, 0x49,
0xc5, 0xbe, 0x92, 0xae, 0xa0, 0xb4, 0xc5, 0x62, 0x1f, 0x45, 0x23, 0x58, 0xd7, 0xaf, 0x35, 0x09, 0x9e, 0x71, 0x5d, 0x61, 0x8b, 0xa1, 0xb4, 0xcd, 0xc3, 0x1f, 0x32, 0x58, 0x9d, 0xd0, 0xf2, 0x96,
0xc7, 0xcb, 0x53, 0x5f, 0x99, 0xf6, 0x05, 0x4f, 0x64, 0x87, 0x7c, 0x72, 0xac, 0x35, 0x9d, 0x35, 0x03, 0x0a, 0x92, 0x55, 0x89, 0x6c, 0x41, 0x87, 0xc5, 0xbe, 0x92, 0xae, 0xa0, 0xb4, 0xcd, 0x62,
0xf5, 0x60, 0xa3, 0x87, 0xe4, 0x5d, 0xe8, 0xc9, 0x5d, 0x8a, 0x85, 0x5a, 0x57, 0x5e, 0xa8, 0xcb, 0x1f, 0x45, 0x23, 0x58, 0xd7, 0xef, 0x41, 0x09, 0xc7, 0x6a, 0xab, 0x6b, 0xac, 0x7d, 0xc1, 0x23,
0x62, 0x3f, 0x1f, 0xd8, 0xbf, 0x36, 0xe0, 0xc6, 0x39, 0x0a, 0xaf, 0x11, 0x47, 0x4f, 0xa0, 0x7d, 0xdc, 0x21, 0x9f, 0x1c, 0x6b, 0x4d, 0x67, 0x4d, 0x3d, 0x09, 0xe9, 0x21, 0x79, 0x1f, 0x4c, 0xb9,
0xc2, 0x26, 0x72, 0x89, 0xfc, 0x0d, 0x6a, 0xf7, 0xa2, 0x27, 0xcd, 0x0b, 0x1c, 0xe6, 0x14, 0x0b, 0x4b, 0xb9, 0x50, 0xfb, 0xca, 0x0b, 0xf5, 0x58, 0xec, 0x17, 0x03, 0xfb, 0x97, 0x06, 0xdc, 0x38,
0xd8, 0x1f, 0x15, 0x6e, 0x7d, 0x2f, 0x9c, 0xf1, 0xe9, 0x41, 0x12, 0xa5, 0xf2, 0x7e, 0xf0, 0xaf, 0x47, 0xe1, 0x35, 0xe2, 0xe8, 0x09, 0x74, 0x4e, 0xd8, 0x44, 0x2e, 0x51, 0xbc, 0x72, 0xed, 0x5e,
0xf5, 0x80, 0x74, 0x79, 0x88, 0xdb, 0x3f, 0x37, 0x00, 0x30, 0x79, 0x70, 0xeb, 0x73, 0x81, 0x69, 0xf4, 0x68, 0x7a, 0x81, 0xc3, 0x9c, 0x72, 0x01, 0xfb, 0x93, 0xd2, 0xad, 0x1f, 0x84, 0x39, 0x9f,
0x5c, 0x27, 0x30, 0x65, 0x57, 0x29, 0xbb, 0x99, 0x8c, 0x85, 0x54, 0x94, 0x77, 0x21, 0xd7, 0xbb, 0x1e, 0x24, 0x51, 0x2a, 0xeb, 0x83, 0x7f, 0xad, 0x27, 0xaa, 0xcb, 0x43, 0xdc, 0xfe, 0xa9, 0x01,
0x93, 0x78, 0x16, 0x39, 0x4a, 0x94, 0x5f, 0x10, 0xf6, 0xaf, 0x0c, 0x00, 0xbc, 0xcc, 0xd5, 0x31, 0x80, 0xc9, 0x83, 0x5b, 0x9f, 0x0b, 0x4c, 0xe3, 0x3a, 0x81, 0x29, 0xfb, 0x56, 0xd9, 0xfe, 0x64,
0x96, 0x0b, 0xb3, 0x71, 0xf9, 0xcf, 0xc1, 0xc6, 0x62, 0xfa, 0xed, 0xe7, 0xe9, 0xc7, 0xd1, 0x1f, 0x2c, 0xa4, 0xa2, 0xaa, 0x85, 0x5c, 0xef, 0x4e, 0xe2, 0x3c, 0x72, 0x94, 0xa8, 0x28, 0x10, 0xf6,
0x66, 0x9d, 0x0d, 0x85, 0x3f, 0x4a, 0xe3, 0x75, 0x86, 0x2a, 0x1f, 0xfc, 0xc6, 0x80, 0x5e, 0xc5, 0x2f, 0x0c, 0x00, 0x2c, 0xe6, 0xea, 0x18, 0x8b, 0x37, 0xb9, 0x71, 0xf9, 0x0f, 0xce, 0xc6, 0x7c,
0x55, 0x7c, 0x91, 0x46, 0x63, 0xf9, 0xa6, 0xc0, 0xe6, 0x50, 0x66, 0x8f, 0xcb, 0x2b, 0x09, 0x15, 0xfa, 0xed, 0x17, 0xe9, 0xc7, 0xd1, 0x1f, 0xcd, 0x65, 0x36, 0x94, 0xfe, 0xa8, 0x8c, 0xd7, 0x19,
0x95, 0x09, 0xb5, 0x05, 0x6d, 0xa4, 0xa4, 0x92, 0x51, 0xb1, 0xce, 0xa8, 0xfb, 0x70, 0x23, 0x63, 0xaa, 0x7c, 0xf0, 0x2b, 0x03, 0xcc, 0x9a, 0xab, 0xf8, 0x3c, 0x8d, 0xc6, 0x62, 0xa5, 0xc0, 0x6e,
0x1e, 0x8b, 0x45, 0x38, 0x77, 0xa3, 0xc4, 0x0f, 0x4e, 0x03, 0xe6, 0x63, 0x5e, 0xb5, 0x9d, 0x7e, 0x52, 0x66, 0x8f, 0xcb, 0x6b, 0x09, 0x15, 0x55, 0x09, 0xb5, 0x05, 0x1d, 0xa4, 0xa4, 0x96, 0x51,
0x2e, 0x38, 0xd4, 0xb8, 0xfd, 0x57, 0x03, 0xd6, 0x7f, 0x34, 0x63, 0xd9, 0xfc, 0x28, 0xf1, 0x99, 0xb1, 0xce, 0xa8, 0xfb, 0x70, 0x23, 0x63, 0x1e, 0x8b, 0x45, 0x38, 0x73, 0xa3, 0xc4, 0x0f, 0x4e,
0x3a, 0xd9, 0x67, 0x0f, 0x89, 0xb7, 0xd1, 0x16, 0x4d, 0x8f, 0x0a, 0xd7, 0xd7, 0xfe, 0x7d, 0xb8, 0x03, 0xe6, 0x63, 0x5e, 0x75, 0x9c, 0x7e, 0x21, 0x38, 0xd4, 0xb8, 0xfd, 0x47, 0x03, 0xd6, 0x7f,
0x72, 0xa7, 0xcd, 0x75, 0x88, 0x4a, 0x8a, 0xd5, 0x4f, 0xfc, 0xab, 0x50, 0x5c, 0x3a, 0x56, 0x97, 0x90, 0xb3, 0x6c, 0x76, 0x94, 0xf8, 0x4c, 0x9d, 0xec, 0xc5, 0x43, 0xe2, 0x5d, 0xb4, 0x45, 0xd3,
0x69, 0x45, 0xf1, 0xcf, 0x0c, 0xe8, 0x56, 0x12, 0x53, 0x96, 0x17, 0x5d, 0x8b, 0x54, 0x09, 0x33, 0xa3, 0xc2, 0xf5, 0x8d, 0x7f, 0x1e, 0xae, 0xdc, 0xe9, 0x70, 0x1d, 0xa2, 0x92, 0x62, 0xf5, 0x88,
0xf0, 0xc2, 0xed, 0x7a, 0xe5, 0x43, 0x1e, 0xd9, 0x84, 0x95, 0x88, 0x4f, 0xb4, 0xc7, 0x7b, 0x8e, 0x70, 0x15, 0x8a, 0x2b, 0xc7, 0xea, 0x6b, 0x5a, 0x51, 0xfc, 0x13, 0x03, 0x7a, 0xb5, 0xc4, 0x94,
0x1a, 0x90, 0x6d, 0x68, 0x47, 0x7c, 0x82, 0xbf, 0x84, 0xf4, 0x2d, 0x5d, 0x8c, 0xa5, 0xdb, 0xca, 0xd7, 0x8b, 0xbe, 0x8b, 0xd4, 0x15, 0x66, 0x60, 0xc1, 0xed, 0x79, 0xd5, 0x53, 0x21, 0xd9, 0x84,
0x16, 0x4a, 0x5d, 0x56, 0x25, 0x60, 0xff, 0xce, 0x00, 0xa2, 0x9b, 0x94, 0x17, 0x7a, 0xa5, 0xc5, 0x95, 0x88, 0x4f, 0xb4, 0xc7, 0x4d, 0x47, 0x0d, 0xc8, 0x36, 0x74, 0x22, 0x3e, 0xc1, 0xdf, 0x5a,
0x80, 0xad, 0x3e, 0x46, 0x36, 0x54, 0x53, 0x57, 0xc5, 0x96, 0xca, 0xab, 0x79, 0xae, 0xbc, 0xde, 0xba, 0x4a, 0x97, 0x63, 0xe9, 0xb6, 0xaa, 0x8b, 0x52, 0xc5, 0xaa, 0x02, 0xec, 0xdf, 0x18, 0x40,
0x87, 0x1b, 0x3e, 0x3b, 0xa5, 0xb2, 0x9f, 0x5a, 0x3e, 0x72, 0x5f, 0x0b, 0x8a, 0xb6, 0xef, 0xf5, 0x74, 0x93, 0xf2, 0x52, 0xef, 0xc0, 0x18, 0xb0, 0xf5, 0xe7, 0xce, 0x86, 0xea, 0x02, 0xeb, 0xd8,
0xb7, 0xa0, 0x53, 0xfc, 0x39, 0x42, 0xfa, 0xd0, 0x1b, 0xc5, 0x81, 0xc0, 0x9f, 0x6a, 0x41, 0x3c, 0xc2, 0xf5, 0xda, 0x3c, 0x77, 0xbd, 0xde, 0x87, 0x1b, 0x3e, 0x3b, 0xa5, 0xb2, 0x9f, 0x5a, 0x3c,
0xe9, 0x7f, 0x89, 0x74, 0xa1, 0xf5, 0x03, 0x46, 0x43, 0x31, 0x9d, 0xf7, 0x0d, 0xd2, 0x83, 0xf6, 0x72, 0x5f, 0x0b, 0xca, 0xb6, 0xef, 0xcd, 0x77, 0xa0, 0x5b, 0xfe, 0xfd, 0x42, 0xfa, 0x60, 0x8e,
0x3b, 0xe3, 0x38, 0xc9, 0x22, 0x1a, 0xf6, 0x1b, 0xfb, 0x6f, 0xfe, 0xe4, 0xdb, 0x93, 0x40, 0x4c, 0xe2, 0x40, 0xe0, 0x8f, 0xc1, 0x20, 0x9e, 0xf4, 0xff, 0x8f, 0xf4, 0xa0, 0xfd, 0x3d, 0x46, 0x43,
0x67, 0x63, 0x69, 0xc9, 0xae, 0x32, 0xed, 0x1b, 0x41, 0xa2, 0xbf, 0x76, 0x73, 0xaf, 0xed, 0xa2, 0x31, 0x9d, 0xf5, 0x0d, 0x62, 0x42, 0xe7, 0xbd, 0x71, 0x9c, 0x64, 0x11, 0x0d, 0xfb, 0x8d, 0xfd,
0xb5, 0xc5, 0x30, 0x1d, 0x8f, 0x57, 0x11, 0x79, 0xe3, 0x5f, 0x01, 0x00, 0x00, 0xff, 0xff, 0x41, 0xb7, 0x7f, 0xf4, 0xcd, 0x49, 0x20, 0xa6, 0xf9, 0x58, 0x5a, 0xb2, 0xab, 0x4c, 0xfb, 0x5a, 0x90,
0xd9, 0x70, 0x5f, 0x42, 0x1a, 0x00, 0x00, 0xe8, 0xaf, 0xdd, 0xc2, 0x6b, 0xbb, 0x68, 0x6d, 0x39, 0x4c, 0xc7, 0xe3, 0x55, 0x44, 0xde, 0xfa,
0x47, 0x00, 0x00, 0x00, 0xff, 0xff, 0xab, 0xa3, 0xdc, 0x3d, 0xa4, 0x1a, 0x00, 0x00,
} }

View File

@ -332,6 +332,7 @@ message SearchRequest {
repeated string output_fields = 8; repeated string output_fields = 8;
repeated common.KeyValuePair search_params = 9; // must repeated common.KeyValuePair search_params = 9; // must
uint64 travel_timestamp = 10; uint64 travel_timestamp = 10;
uint64 guarantee_timestamp = 11; // guarantee_timestamp
} }
message RetrieveRequest { message RetrieveRequest {
@ -342,6 +343,7 @@ message RetrieveRequest {
schema.IDs ids = 5; // must schema.IDs ids = 5; // must
repeated string output_fields = 6; // must repeated string output_fields = 6; // must
uint64 travel_timestamp = 7; uint64 travel_timestamp = 7;
uint64 guarantee_timestamp = 8; // guarantee_timestamp
} }
message RetrieveResults { message RetrieveResults {

View File

@ -2462,6 +2462,7 @@ type SearchRequest struct {
OutputFields []string `protobuf:"bytes,8,rep,name=output_fields,json=outputFields,proto3" json:"output_fields,omitempty"` OutputFields []string `protobuf:"bytes,8,rep,name=output_fields,json=outputFields,proto3" json:"output_fields,omitempty"`
SearchParams []*commonpb.KeyValuePair `protobuf:"bytes,9,rep,name=search_params,json=searchParams,proto3" json:"search_params,omitempty"` SearchParams []*commonpb.KeyValuePair `protobuf:"bytes,9,rep,name=search_params,json=searchParams,proto3" json:"search_params,omitempty"`
TravelTimestamp uint64 `protobuf:"varint,10,opt,name=travel_timestamp,json=travelTimestamp,proto3" json:"travel_timestamp,omitempty"` TravelTimestamp uint64 `protobuf:"varint,10,opt,name=travel_timestamp,json=travelTimestamp,proto3" json:"travel_timestamp,omitempty"`
GuaranteeTimestamp uint64 `protobuf:"varint,11,opt,name=guarantee_timestamp,json=guaranteeTimestamp,proto3" json:"guarantee_timestamp,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"` XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"` XXX_sizecache int32 `json:"-"`
@ -2562,6 +2563,13 @@ func (m *SearchRequest) GetTravelTimestamp() uint64 {
return 0 return 0
} }
func (m *SearchRequest) GetGuaranteeTimestamp() uint64 {
if m != nil {
return m.GuaranteeTimestamp
}
return 0
}
type RetrieveRequest struct { type RetrieveRequest struct {
Base *commonpb.MsgBase `protobuf:"bytes,1,opt,name=base,proto3" json:"base,omitempty"` Base *commonpb.MsgBase `protobuf:"bytes,1,opt,name=base,proto3" json:"base,omitempty"`
DbName string `protobuf:"bytes,2,opt,name=db_name,json=dbName,proto3" json:"db_name,omitempty"` DbName string `protobuf:"bytes,2,opt,name=db_name,json=dbName,proto3" json:"db_name,omitempty"`
@ -2570,6 +2578,7 @@ type RetrieveRequest struct {
Ids *schemapb.IDs `protobuf:"bytes,5,opt,name=ids,proto3" json:"ids,omitempty"` Ids *schemapb.IDs `protobuf:"bytes,5,opt,name=ids,proto3" json:"ids,omitempty"`
OutputFields []string `protobuf:"bytes,6,rep,name=output_fields,json=outputFields,proto3" json:"output_fields,omitempty"` OutputFields []string `protobuf:"bytes,6,rep,name=output_fields,json=outputFields,proto3" json:"output_fields,omitempty"`
TravelTimestamp uint64 `protobuf:"varint,7,opt,name=travel_timestamp,json=travelTimestamp,proto3" json:"travel_timestamp,omitempty"` TravelTimestamp uint64 `protobuf:"varint,7,opt,name=travel_timestamp,json=travelTimestamp,proto3" json:"travel_timestamp,omitempty"`
GuaranteeTimestamp uint64 `protobuf:"varint,8,opt,name=guarantee_timestamp,json=guaranteeTimestamp,proto3" json:"guarantee_timestamp,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"` XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"` XXX_sizecache int32 `json:"-"`
@ -2649,6 +2658,13 @@ func (m *RetrieveRequest) GetTravelTimestamp() uint64 {
return 0 return 0
} }
func (m *RetrieveRequest) GetGuaranteeTimestamp() uint64 {
if m != nil {
return m.GuaranteeTimestamp
}
return 0
}
type RetrieveResults struct { type RetrieveResults struct {
Status *commonpb.Status `protobuf:"bytes,1,opt,name=status,proto3" json:"status,omitempty"` Status *commonpb.Status `protobuf:"bytes,1,opt,name=status,proto3" json:"status,omitempty"`
Ids *schemapb.IDs `protobuf:"bytes,2,opt,name=ids,proto3" json:"ids,omitempty"` Ids *schemapb.IDs `protobuf:"bytes,2,opt,name=ids,proto3" json:"ids,omitempty"`
@ -3627,171 +3643,173 @@ func init() {
func init() { proto.RegisterFile("milvus.proto", fileDescriptor_02345ba45cc0e303) } func init() { proto.RegisterFile("milvus.proto", fileDescriptor_02345ba45cc0e303) }
var fileDescriptor_02345ba45cc0e303 = []byte{ var fileDescriptor_02345ba45cc0e303 = []byte{
// 2621 bytes of a gzipped FileDescriptorProto // 2643 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x3a, 0xcd, 0x6f, 0x1c, 0x49, 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x3a, 0xcd, 0x6f, 0xdc, 0xc6,
0xf5, 0xae, 0x19, 0xcf, 0xd7, 0x9b, 0x1e, 0x7b, 0x52, 0xfe, 0x9a, 0x4c, 0x3e, 0xd6, 0xee, 0xdd, 0xf5, 0x9a, 0x5d, 0xed, 0xd7, 0x5b, 0xae, 0xb4, 0x19, 0x7d, 0x6d, 0xd6, 0x1f, 0x91, 0x98, 0xf8,
0xfc, 0xd6, 0x71, 0xb2, 0xce, 0xae, 0x93, 0xfc, 0x76, 0xf9, 0x5c, 0x92, 0x98, 0x24, 0x56, 0x3e, 0x17, 0x59, 0x76, 0xa4, 0x44, 0xb6, 0x7f, 0x49, 0x3f, 0x53, 0xdb, 0xaa, 0x6d, 0xc1, 0x1f, 0x55,
0xf0, 0xf6, 0x84, 0x15, 0xcb, 0x2a, 0x1a, 0xb5, 0xa7, 0x2b, 0x33, 0x2d, 0xf7, 0x74, 0x0f, 0x5d, 0xb8, 0x6e, 0xd0, 0x34, 0x30, 0x16, 0xd4, 0x72, 0xbc, 0x4b, 0x88, 0x4b, 0x6e, 0x39, 0xa4, 0xe4,
0xdd, 0x76, 0x26, 0x27, 0xa4, 0x2c, 0x48, 0x08, 0xc8, 0x0a, 0xb1, 0x42, 0x82, 0x03, 0x42, 0xa0, 0xf5, 0xa9, 0x80, 0xd3, 0x02, 0x45, 0x5b, 0x07, 0x45, 0x83, 0x02, 0xed, 0xa1, 0x28, 0x5a, 0xe4,
0x3d, 0xc0, 0x05, 0xd0, 0x22, 0x21, 0x21, 0x0e, 0x1c, 0xf6, 0xc0, 0x01, 0x09, 0xc4, 0xdf, 0x00, 0xd0, 0x53, 0x5b, 0xa4, 0x40, 0x81, 0x9e, 0x7a, 0xc8, 0xa1, 0x87, 0x02, 0x2d, 0x7a, 0xed, 0xb5,
0x47, 0xfe, 0x07, 0xd4, 0x55, 0xdd, 0x3d, 0xdd, 0xed, 0xea, 0xf1, 0x38, 0xb3, 0xc1, 0xf6, 0xad, 0x3d, 0xe6, 0x7f, 0x28, 0x38, 0x43, 0x72, 0x49, 0x6a, 0xb8, 0x5a, 0x79, 0xe3, 0x4a, 0xba, 0x91,
0xfb, 0xd5, 0x7b, 0x55, 0xef, 0xbb, 0x5e, 0xbd, 0x2a, 0x90, 0xba, 0xba, 0xb1, 0xe3, 0xd2, 0xd5, 0x6f, 0xde, 0x9b, 0x79, 0xdf, 0xf3, 0xe6, 0xcd, 0x80, 0xd4, 0xd5, 0x8d, 0x5d, 0x97, 0xae, 0xf6,
0x9e, 0x6d, 0x39, 0x16, 0x9e, 0x89, 0xfe, 0xad, 0xf2, 0x9f, 0xba, 0xd4, 0xb2, 0xba, 0x5d, 0xcb, 0x6c, 0xcb, 0xb1, 0xf0, 0x4c, 0xf4, 0x6f, 0x95, 0xff, 0xd4, 0xa5, 0x96, 0xd5, 0xed, 0x5a, 0x26,
0xe4, 0xc0, 0xba, 0x44, 0x5b, 0x1d, 0xd2, 0x55, 0xf9, 0x9f, 0xfc, 0x29, 0x82, 0x85, 0x1b, 0x36, 0x07, 0xd6, 0x25, 0xda, 0xea, 0x90, 0xae, 0xca, 0xff, 0xe4, 0x4f, 0x11, 0x2c, 0x5c, 0xb7, 0x89,
0x51, 0x1d, 0x72, 0xc3, 0x32, 0x0c, 0xd2, 0x72, 0x74, 0xcb, 0x54, 0xc8, 0xb7, 0x5c, 0x42, 0x1d, 0xea, 0x90, 0xeb, 0x96, 0x61, 0x90, 0x96, 0xa3, 0x5b, 0xa6, 0x42, 0xbe, 0xe3, 0x12, 0xea, 0xe0,
0xfc, 0x3a, 0x4c, 0x6e, 0xa9, 0x94, 0xd4, 0xd0, 0x22, 0x5a, 0x2e, 0xaf, 0x9d, 0x5e, 0x8d, 0xcd, 0xd7, 0x61, 0x72, 0x5b, 0xa5, 0xa4, 0x86, 0x16, 0xd1, 0x72, 0x79, 0xfd, 0xf4, 0x6a, 0x6c, 0x6e,
0xed, 0xcf, 0x79, 0x8f, 0xb6, 0xaf, 0xab, 0x94, 0x28, 0x0c, 0x13, 0x2f, 0x40, 0x41, 0xdb, 0x6a, 0x7f, 0xce, 0xbb, 0xb4, 0x7d, 0x4d, 0xa5, 0x44, 0x61, 0x98, 0x78, 0x01, 0x0a, 0xda, 0x76, 0xd3,
0x9a, 0x6a, 0x97, 0xd4, 0x32, 0x8b, 0x68, 0xb9, 0xa4, 0xe4, 0xb5, 0xad, 0xfb, 0x6a, 0x97, 0xe0, 0x54, 0xbb, 0xa4, 0x96, 0x59, 0x44, 0xcb, 0x25, 0x25, 0xaf, 0x6d, 0xdf, 0x53, 0xbb, 0x04, 0xbf,
0x57, 0x61, 0xba, 0x15, 0xce, 0xcf, 0x11, 0xb2, 0x0c, 0x61, 0x6a, 0x00, 0x66, 0x88, 0xf3, 0x90, 0x0a, 0xd3, 0xad, 0x70, 0x7e, 0x8e, 0x90, 0x65, 0x08, 0x53, 0x03, 0x30, 0x43, 0x9c, 0x87, 0x3c,
0xe7, 0xfc, 0xd5, 0x26, 0x17, 0xd1, 0xb2, 0xa4, 0xf8, 0x7f, 0xf8, 0x0c, 0x00, 0xed, 0xa8, 0xb6, 0xe7, 0xaf, 0x36, 0xb9, 0x88, 0x96, 0x25, 0xc5, 0xff, 0xc3, 0x67, 0x00, 0x68, 0x47, 0xb5, 0x35,
0x46, 0x9b, 0xa6, 0xdb, 0xad, 0xe5, 0x16, 0xd1, 0x72, 0x4e, 0x29, 0x71, 0xc8, 0x7d, 0xb7, 0x2b, 0xda, 0x34, 0xdd, 0x6e, 0x2d, 0xb7, 0x88, 0x96, 0x73, 0x4a, 0x89, 0x43, 0xee, 0xb9, 0x5d, 0xf9,
0x7f, 0x1f, 0xc1, 0xdc, 0xba, 0x6d, 0xf5, 0x8e, 0x84, 0x10, 0xf2, 0xaf, 0x11, 0xcc, 0xde, 0x56, 0x87, 0x08, 0xe6, 0x36, 0x6c, 0xab, 0x77, 0x2c, 0x84, 0x90, 0x7f, 0x8b, 0x60, 0xf6, 0x96, 0x4a,
0xe9, 0xd1, 0xd0, 0xe8, 0x19, 0x00, 0x47, 0xef, 0x92, 0x26, 0x75, 0xd4, 0x6e, 0x8f, 0x69, 0x75, 0x8f, 0x87, 0x46, 0xcf, 0x00, 0x38, 0x7a, 0x97, 0x34, 0xa9, 0xa3, 0x76, 0x7b, 0x4c, 0xab, 0x93,
0x52, 0x29, 0x79, 0x90, 0x86, 0x07, 0x90, 0xdf, 0x03, 0xe9, 0xba, 0x65, 0x19, 0x0a, 0xa1, 0x3d, 0x4a, 0xc9, 0x83, 0x34, 0x3c, 0x80, 0xfc, 0x1e, 0x48, 0xd7, 0x2c, 0xcb, 0x50, 0x08, 0xed, 0x59,
0xcb, 0xa4, 0x04, 0x5f, 0x86, 0x3c, 0x75, 0x54, 0xc7, 0xa5, 0x3e, 0x93, 0xa7, 0x84, 0x4c, 0x36, 0x26, 0x25, 0xf8, 0x12, 0xe4, 0xa9, 0xa3, 0x3a, 0x2e, 0xf5, 0x99, 0x3c, 0x25, 0x64, 0xb2, 0xc1,
0x18, 0x8a, 0xe2, 0xa3, 0xe2, 0x59, 0xc8, 0xed, 0xa8, 0x86, 0xcb, 0x79, 0x2c, 0x2a, 0xfc, 0x47, 0x50, 0x14, 0x1f, 0x15, 0xcf, 0x42, 0x6e, 0x57, 0x35, 0x5c, 0xce, 0x63, 0x51, 0xe1, 0x3f, 0xf2,
0x7e, 0x1f, 0xa6, 0x1a, 0x8e, 0xad, 0x9b, 0xed, 0xcf, 0x70, 0xf2, 0x52, 0x30, 0xf9, 0x3f, 0x11, 0xfb, 0x30, 0xd5, 0x70, 0x6c, 0xdd, 0x6c, 0x7f, 0x8e, 0x93, 0x97, 0x82, 0xc9, 0xff, 0x89, 0xe0,
0x9c, 0x5c, 0x27, 0xb4, 0x65, 0xeb, 0x5b, 0x47, 0xc4, 0x75, 0x65, 0x90, 0x06, 0x90, 0x8d, 0x75, 0xc5, 0x0d, 0x42, 0x5b, 0xb6, 0xbe, 0x7d, 0x4c, 0x5c, 0x57, 0x06, 0x69, 0x00, 0xd9, 0xdc, 0x60,
0xa6, 0xea, 0xac, 0x12, 0x83, 0x25, 0x8c, 0x91, 0x4b, 0x1a, 0xe3, 0xe7, 0x19, 0xa8, 0x8b, 0x84, 0xaa, 0xce, 0x2a, 0x31, 0x58, 0xc2, 0x18, 0xb9, 0xa4, 0x31, 0x7e, 0x99, 0x81, 0xba, 0x48, 0xa8,
0x1a, 0x47, 0x7d, 0x5f, 0x0a, 0x23, 0x2a, 0xc3, 0x88, 0xce, 0xc5, 0x89, 0xfc, 0x6c, 0x30, 0x58, 0x71, 0xd4, 0xf7, 0x95, 0x30, 0xa2, 0x32, 0x8c, 0xe8, 0x5c, 0x9c, 0xc8, 0xcf, 0x06, 0x83, 0xd5,
0xad, 0xc1, 0x00, 0x61, 0xe0, 0x25, 0xa5, 0xca, 0x0a, 0xa4, 0x5a, 0x83, 0xb9, 0x1d, 0xdd, 0x76, 0x1a, 0x0c, 0x10, 0x06, 0x5e, 0x52, 0xaa, 0xac, 0x40, 0xaa, 0x75, 0x98, 0xdb, 0xd5, 0x6d, 0xc7,
0x5c, 0xd5, 0x68, 0xb6, 0x3a, 0xaa, 0x69, 0x12, 0x83, 0xe9, 0x89, 0xd6, 0x26, 0x17, 0xb3, 0xcb, 0x55, 0x8d, 0x66, 0xab, 0xa3, 0x9a, 0x26, 0x31, 0x98, 0x9e, 0x68, 0x6d, 0x72, 0x31, 0xbb, 0x5c,
0x25, 0x65, 0xc6, 0x1f, 0xbc, 0xc1, 0xc7, 0x3c, 0x65, 0x51, 0x7c, 0x05, 0xe6, 0x7b, 0x9d, 0x3e, 0x52, 0x66, 0xfc, 0xc1, 0xeb, 0x7c, 0xcc, 0x53, 0x16, 0xc5, 0x97, 0x61, 0xbe, 0xd7, 0xe9, 0x53,
0xd5, 0x5b, 0x7b, 0x88, 0x72, 0x8c, 0x68, 0x36, 0x18, 0x8d, 0x52, 0xb1, 0x38, 0xbf, 0x6b, 0xa9, 0xbd, 0xb5, 0x8f, 0x28, 0xc7, 0x88, 0x66, 0x83, 0xd1, 0x28, 0x15, 0x8b, 0xf3, 0x3b, 0x96, 0xaa,
0xda, 0xd1, 0x88, 0xf3, 0x67, 0x08, 0x6a, 0x0a, 0x31, 0x88, 0x4a, 0x8f, 0x86, 0x0b, 0xca, 0x1f, 0x1d, 0x8f, 0x38, 0x7f, 0x8a, 0xa0, 0xa6, 0x10, 0x83, 0xa8, 0xf4, 0x78, 0xb8, 0xa0, 0xfc, 0x11,
0x21, 0x38, 0x7b, 0x8b, 0x38, 0x11, 0x63, 0x3a, 0xaa, 0xa3, 0x53, 0x47, 0x6f, 0xd1, 0xc3, 0x64, 0x82, 0xb3, 0x37, 0x89, 0x13, 0x31, 0xa6, 0xa3, 0x3a, 0x3a, 0x75, 0xf4, 0x16, 0x3d, 0x4a, 0xb6,
0xeb, 0x43, 0x04, 0x2f, 0xa5, 0xb2, 0x35, 0x8e, 0x6f, 0xbf, 0x09, 0x39, 0xef, 0x8b, 0xd6, 0x32, 0x3e, 0x44, 0xf0, 0x52, 0x2a, 0x5b, 0xe3, 0xf8, 0xf6, 0x9b, 0x90, 0xf3, 0xbe, 0x68, 0x2d, 0xb3,
0x8b, 0xd9, 0xe5, 0xf2, 0xda, 0x92, 0x90, 0xe6, 0x0e, 0xe9, 0xbf, 0xeb, 0xa5, 0x8c, 0x4d, 0x55, 0x98, 0x5d, 0x2e, 0xaf, 0x2f, 0x09, 0x69, 0x6e, 0x93, 0xfe, 0xbb, 0x5e, 0xca, 0xd8, 0x52, 0x75,
0xb7, 0x15, 0x8e, 0x2f, 0xff, 0x05, 0xc1, 0x7c, 0xa3, 0x63, 0xed, 0x0e, 0x58, 0x7a, 0x11, 0x0a, 0x5b, 0xe1, 0xf8, 0xf2, 0x5f, 0x10, 0xcc, 0x37, 0x3a, 0xd6, 0xde, 0x80, 0xa5, 0xe7, 0xa1, 0xa0,
0x8a, 0x47, 0x7b, 0x36, 0x11, 0xed, 0xf8, 0x8b, 0x30, 0xe9, 0xf4, 0x7b, 0x84, 0x25, 0x8a, 0xa9, 0x78, 0xb4, 0x67, 0x13, 0xd1, 0x8e, 0xbf, 0x0c, 0x93, 0x4e, 0xbf, 0x47, 0x58, 0xa2, 0x98, 0x5a,
0xb5, 0xe5, 0x55, 0xc1, 0xde, 0xbd, 0x9a, 0x60, 0xf2, 0x41, 0xbf, 0x47, 0x14, 0x46, 0x25, 0xff, 0x5f, 0x5e, 0x15, 0xec, 0xdd, 0xab, 0x09, 0x26, 0xef, 0xf7, 0x7b, 0x44, 0x61, 0x54, 0xf2, 0xaf,
0x02, 0xc1, 0xc2, 0x1e, 0x11, 0xc6, 0x51, 0xe6, 0x79, 0xa8, 0x26, 0xcc, 0xc9, 0xf5, 0x5a, 0x52, 0x10, 0x2c, 0xec, 0x13, 0x61, 0x1c, 0x65, 0x9e, 0x87, 0x6a, 0xc2, 0x9c, 0x5c, 0xaf, 0x25, 0x65,
0xa6, 0xe3, 0xf6, 0xa4, 0xf8, 0x1c, 0x44, 0x4c, 0xdc, 0xd4, 0x35, 0x5a, 0xcb, 0x2e, 0x66, 0x97, 0x3a, 0x6e, 0x4f, 0x8a, 0xcf, 0x41, 0xc4, 0xc4, 0x4d, 0x5d, 0xa3, 0xb5, 0xec, 0x62, 0x76, 0x39,
0xb3, 0x4a, 0x25, 0x92, 0x16, 0x34, 0x2a, 0x7f, 0x82, 0x60, 0x9e, 0x17, 0x17, 0x9b, 0xaa, 0xed, 0xab, 0x54, 0x22, 0x69, 0x41, 0xa3, 0xf2, 0x27, 0x08, 0xe6, 0x79, 0x71, 0xb1, 0xa5, 0xda, 0x8e,
0xe8, 0x87, 0x9d, 0xa0, 0xcf, 0xc1, 0x54, 0x2f, 0xe0, 0x83, 0xe3, 0x4d, 0x32, 0xbc, 0x4a, 0x08, 0x7e, 0xd4, 0x09, 0xfa, 0x1c, 0x4c, 0xf5, 0x02, 0x3e, 0x38, 0xde, 0x24, 0xc3, 0xab, 0x84, 0x50,
0x65, 0xde, 0xfa, 0x7b, 0x04, 0xb3, 0x5e, 0x2d, 0x71, 0x9c, 0x78, 0xfe, 0x1d, 0x82, 0x99, 0xdb, 0xe6, 0xad, 0x7f, 0x40, 0x30, 0xeb, 0xd5, 0x12, 0x27, 0x89, 0xe7, 0xdf, 0x23, 0x98, 0xb9, 0xa5,
0x2a, 0x3d, 0x4e, 0x2c, 0xff, 0xc1, 0x4f, 0xe5, 0x21, 0xcf, 0x87, 0x99, 0xa2, 0x3c, 0xc4, 0x38, 0xd2, 0x93, 0xc4, 0xf2, 0x1f, 0xfd, 0x54, 0x1e, 0xf2, 0x7c, 0x94, 0x29, 0xca, 0x43, 0x8c, 0x33,
0xd3, 0xc1, 0xe6, 0x35, 0x15, 0xe3, 0x9a, 0xca, 0x7f, 0x1c, 0xe4, 0xfc, 0x63, 0xc6, 0xf9, 0x9f, 0x1d, 0x6c, 0x5e, 0x53, 0x31, 0xae, 0xa9, 0xfc, 0xa7, 0x41, 0xce, 0x3f, 0x61, 0x9c, 0xff, 0x19,
0x10, 0x9c, 0xb9, 0x45, 0x9c, 0x90, 0xeb, 0x23, 0xb1, 0x37, 0x8c, 0xea, 0x2d, 0xcf, 0xf8, 0xce, 0xc1, 0x99, 0x9b, 0xc4, 0x09, 0xb9, 0x3e, 0x16, 0x7b, 0xc3, 0xa8, 0xde, 0xf2, 0x94, 0xef, 0x6c,
0x26, 0x64, 0xfe, 0x50, 0x76, 0x90, 0xdf, 0x22, 0x98, 0xf3, 0xd2, 0xef, 0xd1, 0x70, 0x82, 0x11, 0x42, 0xe6, 0x8f, 0x64, 0x07, 0xf9, 0x1d, 0x82, 0x39, 0x2f, 0xfd, 0x1e, 0x0f, 0x27, 0x18, 0xa1,
0x6a, 0x4f, 0xf9, 0x67, 0xfe, 0x9e, 0x17, 0xe5, 0x78, 0x1c, 0xd5, 0x09, 0x1c, 0x2f, 0x23, 0x72, 0xf6, 0x94, 0x7f, 0xe1, 0xef, 0x79, 0x51, 0x8e, 0xc7, 0x51, 0x9d, 0xc0, 0xf1, 0x32, 0x22, 0xc7,
0x3c, 0x8f, 0xb9, 0x10, 0xb2, 0xb1, 0x1e, 0xec, 0x15, 0x31, 0x98, 0xfc, 0x03, 0x04, 0xf3, 0x41, 0xf3, 0x98, 0x0b, 0x21, 0x9b, 0x1b, 0xc1, 0x5e, 0x11, 0x83, 0xc9, 0x3f, 0x42, 0x30, 0x1f, 0x54,
0xe5, 0xdb, 0x20, 0xed, 0x2e, 0x31, 0x9d, 0xe7, 0xd7, 0x67, 0x52, 0x1b, 0x19, 0x41, 0xcd, 0x7a, 0xbe, 0x0d, 0xd2, 0xee, 0x12, 0xd3, 0x79, 0x76, 0x7d, 0x26, 0xb5, 0x91, 0x11, 0xd4, 0xac, 0xa7,
0x1a, 0x4a, 0x94, 0xaf, 0x13, 0x16, 0xb5, 0x03, 0x80, 0xfc, 0x31, 0x82, 0x85, 0x3d, 0xec, 0x8c, 0xa1, 0x44, 0xf9, 0x3a, 0x61, 0x51, 0x3b, 0x00, 0xc8, 0x1f, 0x23, 0x58, 0xd8, 0xc7, 0xce, 0x38,
0xa3, 0xac, 0x1a, 0x14, 0x74, 0x53, 0x23, 0x8f, 0x43, 0x6e, 0x82, 0x5f, 0x6f, 0x64, 0xcb, 0xd5, 0xca, 0xaa, 0x41, 0x41, 0x37, 0x35, 0xf2, 0x28, 0xe4, 0x26, 0xf8, 0xf5, 0x46, 0xb6, 0x5d, 0xdd,
0x0d, 0x2d, 0x64, 0x23, 0xf8, 0xc5, 0x4b, 0x20, 0x11, 0x53, 0xdd, 0x32, 0x48, 0x93, 0xe1, 0x32, 0xd0, 0x42, 0x36, 0x82, 0x5f, 0xbc, 0x04, 0x12, 0x31, 0xd5, 0x6d, 0x83, 0x34, 0x19, 0x2e, 0x33,
0xa3, 0x16, 0x95, 0x32, 0x87, 0x6d, 0x78, 0x20, 0xf9, 0x87, 0x08, 0x66, 0x3c, 0x9b, 0xfa, 0x3c, 0x6a, 0x51, 0x29, 0x73, 0xd8, 0xa6, 0x07, 0x92, 0x7f, 0x8c, 0x60, 0xc6, 0xb3, 0xa9, 0xcf, 0x23,
0xd2, 0x17, 0xab, 0xb3, 0x45, 0x28, 0x47, 0x8c, 0xe6, 0xb3, 0x1b, 0x05, 0xc9, 0xdb, 0x30, 0x1b, 0x7d, 0xbe, 0x3a, 0x5b, 0x84, 0x72, 0xc4, 0x68, 0x3e, 0xbb, 0x51, 0x90, 0xbc, 0x03, 0xb3, 0x71,
0x67, 0x67, 0x1c, 0x9d, 0x9d, 0x05, 0x08, 0x2d, 0xc2, 0x7d, 0x2b, 0xab, 0x44, 0x20, 0xf2, 0x7f, 0x76, 0xc6, 0xd1, 0xd9, 0x59, 0x80, 0xd0, 0x22, 0xdc, 0xb7, 0xb2, 0x4a, 0x04, 0x22, 0x7f, 0x86,
0x10, 0x60, 0x5e, 0x5e, 0x30, 0x65, 0x1c, 0xf2, 0x21, 0xfb, 0x91, 0x4e, 0x0c, 0x2d, 0x9a, 0xc1, 0x00, 0xf3, 0xf2, 0x82, 0x29, 0xe3, 0x88, 0x0f, 0xd9, 0x0f, 0x75, 0x62, 0x68, 0xd1, 0x0c, 0x56,
0x4a, 0x0c, 0xc2, 0x86, 0xd7, 0x41, 0x22, 0x8f, 0x1d, 0x5b, 0x6d, 0xf6, 0x54, 0x5b, 0xed, 0xf2, 0x62, 0x10, 0x36, 0xbc, 0x01, 0x12, 0x79, 0xe4, 0xd8, 0x6a, 0xb3, 0xa7, 0xda, 0x6a, 0x97, 0x1f,
0x23, 0xce, 0x48, 0xc9, 0xa6, 0xcc, 0xc8, 0x36, 0x19, 0x95, 0xfc, 0x57, 0xaf, 0x30, 0xf1, 0x9d, 0x71, 0x46, 0x4a, 0x36, 0x65, 0x46, 0xb6, 0xc5, 0xa8, 0xe4, 0xbf, 0x7a, 0x85, 0x89, 0xef, 0x94,
0xf2, 0xa8, 0x4b, 0x7c, 0x06, 0x80, 0x39, 0x2d, 0x1f, 0xce, 0xf1, 0x61, 0x06, 0x61, 0xe9, 0xfc, 0xc7, 0x5d, 0xe2, 0x33, 0x00, 0xcc, 0x69, 0xf9, 0x70, 0x8e, 0x0f, 0x33, 0x08, 0x4b, 0xe7, 0x1f,
0x63, 0x04, 0x55, 0x26, 0x02, 0x97, 0xa7, 0xe7, 0x4d, 0x9b, 0xa0, 0x41, 0x09, 0x9a, 0x21, 0x21, 0x23, 0xa8, 0x32, 0x11, 0xb8, 0x3c, 0x3d, 0x6f, 0xda, 0x04, 0x0d, 0x4a, 0xd0, 0x0c, 0x09, 0xa1,
0xf4, 0x39, 0xc8, 0xfb, 0x8a, 0xcd, 0x8e, 0xaa, 0x58, 0x9f, 0x60, 0x1f, 0x31, 0xe4, 0x5f, 0x22, 0x2f, 0x40, 0xde, 0x57, 0x6c, 0x76, 0x54, 0xc5, 0xfa, 0x04, 0x07, 0x88, 0x21, 0xff, 0x1a, 0xc1,
0x98, 0x4b, 0xa8, 0x7c, 0x1c, 0x8f, 0x7e, 0x00, 0x98, 0x4b, 0xa8, 0x0d, 0xc4, 0x0e, 0xb6, 0x9e, 0x5c, 0x42, 0xe5, 0xe3, 0x78, 0xf4, 0x7d, 0xc0, 0x5c, 0x42, 0x6d, 0x20, 0x76, 0xb0, 0xf5, 0x9c,
0x73, 0xc2, 0xfa, 0x3f, 0xa9, 0x24, 0xe5, 0x84, 0x9e, 0x80, 0x50, 0xf9, 0x1f, 0x08, 0x4e, 0xdf, 0x13, 0xd6, 0xff, 0x49, 0x25, 0x29, 0x2f, 0xe8, 0x09, 0x08, 0x95, 0xff, 0x81, 0xe0, 0xf4, 0x4d,
0x22, 0x0e, 0x43, 0xbd, 0xee, 0xe5, 0x8e, 0x4d, 0xdb, 0x6a, 0xdb, 0x84, 0xd2, 0xe3, 0xeb, 0x1f, 0xe2, 0x30, 0xd4, 0x6b, 0x5e, 0xee, 0xd8, 0xb2, 0xad, 0xb6, 0x4d, 0x28, 0x3d, 0xb9, 0xfe, 0xf1,
0x3f, 0xe1, 0xb5, 0x8a, 0x48, 0xa4, 0x71, 0xf4, 0xbf, 0x04, 0x12, 0x5b, 0x83, 0x68, 0x4d, 0xdb, 0x33, 0x5e, 0xab, 0x88, 0x44, 0x1a, 0x47, 0xff, 0x4b, 0x20, 0xb1, 0x35, 0x88, 0xd6, 0xb4, 0xad,
0xda, 0xa5, 0xbe, 0x1f, 0x95, 0x7d, 0x98, 0x62, 0xed, 0x32, 0x87, 0x70, 0x2c, 0x47, 0x35, 0x38, 0x3d, 0xea, 0xfb, 0x51, 0xd9, 0x87, 0x29, 0xd6, 0x1e, 0x73, 0x08, 0xc7, 0x72, 0x54, 0x83, 0x23,
0x82, 0xbf, 0x31, 0x30, 0x88, 0x37, 0xcc, 0x62, 0x30, 0x60, 0xcc, 0x9b, 0x9c, 0x1c, 0x5f, 0x1d, 0xf8, 0x1b, 0x03, 0x83, 0x78, 0xc3, 0x2c, 0x06, 0x03, 0xc6, 0xbc, 0xc9, 0xc9, 0xc9, 0xd5, 0xf1,
0x3f, 0x45, 0x30, 0x97, 0x10, 0x65, 0x1c, 0xdd, 0x5e, 0xe5, 0x95, 0x14, 0x17, 0x66, 0x6a, 0xed, 0x13, 0x04, 0x73, 0x09, 0x51, 0xc6, 0xd1, 0xed, 0x15, 0x5e, 0x49, 0x71, 0x61, 0xa6, 0xd6, 0x5f,
0x25, 0x21, 0x4d, 0x64, 0x31, 0x8e, 0x2d, 0x7f, 0x8a, 0xa0, 0xea, 0x9d, 0xb6, 0x8e, 0x79, 0x42, 0x12, 0xd2, 0x44, 0x16, 0xe3, 0xd8, 0xf2, 0xa7, 0x08, 0xaa, 0xde, 0x69, 0xeb, 0x84, 0x27, 0xb4,
0xfb, 0x55, 0x06, 0x2a, 0x1b, 0x26, 0x25, 0xb6, 0x73, 0xf4, 0x8b, 0x69, 0xfc, 0x36, 0x94, 0x99, 0xdf, 0x64, 0xa0, 0xb2, 0x69, 0x52, 0x62, 0x3b, 0xc7, 0xbf, 0x98, 0xc6, 0x6f, 0x43, 0x99, 0x09,
0x60, 0xb4, 0xa9, 0xa9, 0x8e, 0xea, 0xef, 0x46, 0x67, 0x85, 0x7d, 0xc1, 0x9b, 0x1e, 0xde, 0xba, 0x46, 0x9b, 0x9a, 0xea, 0xa8, 0xfe, 0x6e, 0x74, 0x56, 0xd8, 0x17, 0xbc, 0xe1, 0xe1, 0x6d, 0xa8,
0xea, 0xa8, 0x0a, 0xd7, 0x0e, 0xf5, 0xbe, 0xf1, 0x29, 0x28, 0x75, 0x54, 0xda, 0x69, 0x6e, 0x93, 0x8e, 0xaa, 0x70, 0xed, 0x50, 0xef, 0x1b, 0x9f, 0x82, 0x52, 0x47, 0xa5, 0x9d, 0xe6, 0x0e, 0xe9,
0x3e, 0xad, 0xe5, 0x17, 0xb3, 0xcb, 0x15, 0xa5, 0xe8, 0x01, 0xee, 0x90, 0x3e, 0xc5, 0x27, 0xa1, 0xd3, 0x5a, 0x7e, 0x31, 0xbb, 0x5c, 0x51, 0x8a, 0x1e, 0xe0, 0x36, 0xe9, 0x53, 0xfc, 0x22, 0x14,
0x68, 0xba, 0x5d, 0x1e, 0x3f, 0x85, 0x45, 0xb4, 0x5c, 0x51, 0x0a, 0xa6, 0xdb, 0x65, 0xd1, 0xf3, 0x4d, 0xb7, 0xcb, 0xe3, 0xa7, 0xb0, 0x88, 0x96, 0x2b, 0x4a, 0xc1, 0x74, 0xbb, 0x2c, 0x7a, 0xfe,
0xb7, 0x0c, 0x4c, 0xdd, 0x73, 0xbd, 0xd2, 0x9d, 0x75, 0x35, 0x5d, 0xc3, 0x79, 0x3e, 0x5f, 0x5b, 0x96, 0x81, 0xa9, 0xbb, 0xae, 0x57, 0xba, 0xb3, 0xae, 0xa6, 0x6b, 0x38, 0xcf, 0xe6, 0x6b, 0x2b,
0x81, 0x2c, 0x2f, 0x09, 0x3c, 0x8a, 0x9a, 0x90, 0xf1, 0x8d, 0x75, 0xaa, 0x78, 0x48, 0xec, 0xe6, 0x90, 0xe5, 0x25, 0x81, 0x47, 0x51, 0x13, 0x32, 0xbe, 0xb9, 0x41, 0x15, 0x0f, 0x89, 0xdd, 0x1c,
0xc0, 0x6d, 0xb5, 0xfc, 0x1a, 0x2a, 0xcb, 0x98, 0x2d, 0x79, 0x10, 0xe6, 0x71, 0x9e, 0x28, 0xc4, 0xb8, 0xad, 0x96, 0x5f, 0x43, 0x65, 0x19, 0xb3, 0x25, 0x0f, 0xc2, 0x3c, 0xce, 0x13, 0x85, 0xd8,
0xb6, 0xc3, 0x0a, 0x8b, 0x89, 0x42, 0x6c, 0x9b, 0x0f, 0xca, 0x20, 0xa9, 0xad, 0x6d, 0xd3, 0xda, 0x76, 0x58, 0x61, 0x31, 0x51, 0x88, 0x6d, 0xf3, 0x41, 0x19, 0x24, 0xb5, 0xb5, 0x63, 0x5a, 0x7b,
0x35, 0x88, 0xd6, 0x26, 0x1a, 0x33, 0x7b, 0x51, 0x89, 0xc1, 0xb8, 0x63, 0x78, 0x86, 0x6f, 0xb6, 0x06, 0xd1, 0xda, 0x44, 0x63, 0x66, 0x2f, 0x2a, 0x31, 0x18, 0x77, 0x0c, 0xcf, 0xf0, 0xcd, 0x96,
0x4c, 0xa7, 0x96, 0xe7, 0x09, 0x83, 0x43, 0x6e, 0x98, 0x8e, 0x37, 0xac, 0x11, 0x83, 0x38, 0x84, 0xe9, 0xd4, 0xf2, 0x3c, 0x61, 0x70, 0xc8, 0x75, 0xd3, 0xf1, 0x86, 0x35, 0x62, 0x10, 0x87, 0xb0,
0x0d, 0x17, 0xf8, 0x30, 0x87, 0xf8, 0xc3, 0x6e, 0x2f, 0xa4, 0x2e, 0xf2, 0x61, 0x0e, 0xf1, 0x86, 0xe1, 0x02, 0x1f, 0xe6, 0x10, 0x7f, 0xd8, 0xed, 0x85, 0xd4, 0x45, 0x3e, 0xcc, 0x21, 0xde, 0xf0,
0x4f, 0x03, 0xeb, 0x17, 0xf1, 0x06, 0x52, 0x69, 0xd0, 0x40, 0x62, 0x00, 0x79, 0x07, 0xaa, 0x9b, 0x69, 0x60, 0xfd, 0x22, 0xde, 0x40, 0x2a, 0x0d, 0x1a, 0x48, 0x0c, 0x20, 0xef, 0x42, 0x75, 0xcb,
0x86, 0xda, 0x22, 0x1d, 0xcb, 0xd0, 0x88, 0xcd, 0x36, 0x37, 0x5c, 0x85, 0xac, 0xa3, 0xb6, 0xfd, 0x50, 0x5b, 0xa4, 0x63, 0x19, 0x1a, 0xb1, 0xd9, 0xe6, 0x86, 0xab, 0x90, 0x75, 0xd4, 0xb6, 0xbf,
0xdd, 0xd3, 0xfb, 0xc4, 0x6f, 0xf9, 0x6d, 0x26, 0x1e, 0x97, 0xaf, 0x08, 0xb7, 0x99, 0xc8, 0x34, 0x7b, 0x7a, 0x9f, 0xf8, 0x2d, 0xbf, 0xcd, 0xc4, 0xe3, 0xf2, 0x15, 0xe1, 0x36, 0x13, 0x99, 0x66,
0x83, 0x16, 0x13, 0x9e, 0x87, 0x3c, 0x6b, 0xb6, 0xf3, 0x7d, 0x55, 0x52, 0xfc, 0x3f, 0xf9, 0x61, 0xd0, 0x62, 0xc2, 0xf3, 0x90, 0x67, 0xcd, 0x76, 0xbe, 0xaf, 0x4a, 0x8a, 0xff, 0x27, 0x3f, 0x88,
0x6c, 0xdd, 0x5b, 0xb6, 0xe5, 0xf6, 0xf0, 0x06, 0x48, 0xbd, 0x01, 0xcc, 0xb3, 0x66, 0xfa, 0xa6, 0xad, 0x7b, 0xd3, 0xb6, 0xdc, 0x1e, 0xde, 0x04, 0xa9, 0x37, 0x80, 0x79, 0xd6, 0x4c, 0xdf, 0xd4,
0x96, 0x64, 0x5a, 0x89, 0x91, 0xca, 0x7f, 0xce, 0x42, 0xa5, 0x41, 0x54, 0xbb, 0xd5, 0x39, 0x0e, 0x92, 0x4c, 0x2b, 0x31, 0x52, 0xf9, 0xb3, 0x2c, 0x54, 0x1a, 0x44, 0xb5, 0x5b, 0x9d, 0x93, 0x70,
0xe7, 0x6a, 0x4f, 0xe3, 0x1a, 0x35, 0xfc, 0x94, 0xe0, 0x7d, 0xe2, 0x0b, 0x70, 0x22, 0x22, 0x50, 0xae, 0xf6, 0x34, 0xae, 0x51, 0xc3, 0x4f, 0x09, 0xde, 0x27, 0xbe, 0x00, 0x2f, 0x44, 0x04, 0x6a,
0xb3, 0xed, 0x29, 0x88, 0x79, 0x86, 0xa4, 0x54, 0x7b, 0x49, 0xc5, 0xbd, 0x09, 0x45, 0x8d, 0x1a, 0xb6, 0x3d, 0x05, 0x31, 0xcf, 0x90, 0x94, 0x6a, 0x2f, 0xa9, 0xb8, 0x37, 0xa1, 0xa8, 0x51, 0xa3,
0x4d, 0x66, 0xa2, 0x02, 0x33, 0x91, 0x58, 0xbe, 0x75, 0x6a, 0x30, 0xd3, 0x14, 0x34, 0xfe, 0x81, 0xc9, 0x4c, 0x54, 0x60, 0x26, 0x12, 0xcb, 0xb7, 0x41, 0x0d, 0x66, 0x9a, 0x82, 0xc6, 0x3f, 0xf0,
0x5f, 0x86, 0x8a, 0xe5, 0x3a, 0x3d, 0xd7, 0x69, 0xf2, 0xc8, 0xac, 0x15, 0x19, 0x7b, 0x12, 0x07, 0xcb, 0x50, 0xb1, 0x5c, 0xa7, 0xe7, 0x3a, 0x4d, 0x1e, 0x99, 0xb5, 0x22, 0x63, 0x4f, 0xe2, 0x40,
0xb2, 0xc0, 0xa5, 0xf8, 0x26, 0x54, 0x28, 0x53, 0x65, 0x50, 0x7a, 0x96, 0x46, 0xad, 0x90, 0x24, 0x16, 0xb8, 0x14, 0xdf, 0x80, 0x0a, 0x65, 0xaa, 0x0c, 0x4a, 0xcf, 0xd2, 0xa8, 0x15, 0x92, 0xc4,
0x4e, 0xc7, 0x6b, 0x4f, 0x7c, 0x1e, 0xaa, 0x8e, 0xad, 0xee, 0x10, 0xa3, 0x39, 0xf0, 0x47, 0x60, 0xe9, 0x78, 0xed, 0x89, 0xcf, 0x43, 0xd5, 0xb1, 0xd5, 0x5d, 0x62, 0x34, 0x07, 0xfe, 0x08, 0xcc,
0xfe, 0x38, 0xcd, 0xe1, 0x0f, 0x42, 0xaf, 0xfc, 0x4d, 0x06, 0xa6, 0x15, 0xe2, 0xd8, 0x3a, 0xd9, 0x1f, 0xa7, 0x39, 0xfc, 0x7e, 0x00, 0xc6, 0x6b, 0x30, 0xd3, 0x76, 0x55, 0x5b, 0x35, 0x1d, 0x42,
0x21, 0xc7, 0xc2, 0x80, 0x2b, 0x90, 0xd5, 0x35, 0xca, 0x0c, 0x38, 0x34, 0x9b, 0xe8, 0x1a, 0xdd, 0x22, 0xd8, 0x65, 0x86, 0x8d, 0xc3, 0xa1, 0x90, 0x40, 0xfe, 0x57, 0x06, 0xa6, 0x15, 0xe2, 0xd8,
0xab, 0xf4, 0xbc, 0x40, 0xe9, 0x22, 0x65, 0x15, 0xc4, 0xca, 0xfa, 0x04, 0x45, 0x95, 0xe5, 0x65, 0x3a, 0xd9, 0x25, 0x27, 0xc2, 0xe2, 0x2b, 0x90, 0xd5, 0x35, 0xca, 0x2c, 0x3e, 0x34, 0xfd, 0xe8,
0x44, 0xfa, 0xdc, 0x29, 0xd1, 0x13, 0x22, 0x33, 0x8a, 0x10, 0x89, 0xfc, 0x9f, 0x3d, 0x68, 0xfe, 0x1a, 0xdd, 0x6f, 0xa5, 0xbc, 0xc0, 0x4a, 0x22, 0xed, 0x16, 0x0e, 0xa5, 0xdd, 0x62, 0xaa, 0x76,
0x97, 0xef, 0xc0, 0xe4, 0x6d, 0xdd, 0x61, 0xae, 0xef, 0xe5, 0x61, 0xc4, 0x8e, 0x66, 0x2c, 0xdb, 0x3f, 0x41, 0x51, 0xed, 0x7a, 0x39, 0x97, 0x3e, 0x73, 0xd2, 0xf5, 0xa4, 0xce, 0x8c, 0x22, 0x75,
0x9e, 0x84, 0xa2, 0x6d, 0xed, 0xf2, 0x79, 0x33, 0x2c, 0x69, 0x14, 0x6c, 0x6b, 0x97, 0x6d, 0x1a, 0x62, 0x87, 0xc9, 0x1e, 0x76, 0x87, 0x91, 0x6f, 0xc3, 0xe4, 0x2d, 0xdd, 0x61, 0xc1, 0xe5, 0x65,
0xec, 0x6a, 0xd7, 0xb2, 0xfd, 0x6c, 0x92, 0x51, 0xfc, 0x3f, 0xf9, 0x3b, 0x68, 0x10, 0xee, 0x63, 0x7a, 0xc4, 0x0e, 0x7f, 0x2c, 0x9f, 0xbf, 0x08, 0x45, 0xdb, 0xda, 0xe3, 0xf3, 0x66, 0x58, 0x5a,
0x28, 0xe0, 0x6d, 0x28, 0xd8, 0x9c, 0x7e, 0xe8, 0x45, 0x57, 0x74, 0x25, 0x26, 0x57, 0x40, 0x25, 0x2a, 0xd8, 0xd6, 0x1e, 0xdb, 0x96, 0xd8, 0xe5, 0xb1, 0x65, 0xfb, 0xf9, 0x2a, 0xa3, 0xf8, 0x7f,
0x7f, 0x80, 0x40, 0xba, 0x69, 0xb8, 0xf4, 0x45, 0x64, 0x1d, 0x51, 0x6f, 0x3d, 0x2b, 0xec, 0xad, 0xf2, 0xf7, 0xd0, 0x20, 0xa1, 0x8c, 0xa1, 0x80, 0xb7, 0xa1, 0x60, 0x73, 0xfa, 0xa1, 0x57, 0x69,
0xcb, 0x3f, 0xca, 0x40, 0xc5, 0x67, 0x63, 0x9c, 0x72, 0x2c, 0x95, 0x95, 0x06, 0x94, 0xbd, 0x25, 0xd1, 0x95, 0x98, 0x5c, 0x01, 0x95, 0xfc, 0x01, 0x02, 0xe9, 0x86, 0xe1, 0xd2, 0xe7, 0x91, 0xd7,
0x9b, 0x94, 0xb4, 0x83, 0x66, 0x4c, 0x79, 0x6d, 0x4d, 0x98, 0xa7, 0x63, 0x6c, 0xb0, 0x2b, 0xc2, 0x44, 0xdd, 0xfb, 0xac, 0xb0, 0x7b, 0x2f, 0xff, 0x24, 0x03, 0x15, 0x9f, 0x8d, 0x71, 0x0a, 0xbe,
0x06, 0x23, 0xfa, 0xaa, 0xe9, 0xd8, 0x7d, 0x05, 0x5a, 0x21, 0xa0, 0xfe, 0x10, 0xa6, 0x13, 0xc3, 0x54, 0x56, 0x1a, 0x50, 0xf6, 0x96, 0x6c, 0x52, 0xd2, 0x0e, 0xda, 0x3d, 0xe5, 0xf5, 0x75, 0xe1,
0x9e, 0x6f, 0x6c, 0x93, 0x7e, 0xb0, 0x11, 0x6d, 0x93, 0x3e, 0xbe, 0x12, 0xbd, 0xc8, 0x4d, 0x73, 0x4e, 0x10, 0x63, 0x83, 0x5d, 0x42, 0x36, 0x18, 0xd1, 0xd7, 0x4d, 0xc7, 0xee, 0x2b, 0xd0, 0x0a,
0xb8, 0xbb, 0x96, 0xd9, 0xbe, 0x66, 0xdb, 0x6a, 0xdf, 0xbf, 0xe8, 0xfd, 0x7c, 0xe6, 0x2d, 0x24, 0x01, 0xf5, 0x07, 0x30, 0x9d, 0x18, 0xf6, 0x7c, 0x63, 0x87, 0xf4, 0x83, 0xad, 0x6e, 0x87, 0xf4,
0xff, 0x0b, 0x81, 0xf4, 0x8e, 0x4b, 0xec, 0xfe, 0x61, 0xe6, 0x13, 0x0c, 0x93, 0xe4, 0x71, 0xcf, 0xf1, 0xe5, 0xe8, 0x55, 0x71, 0x9a, 0xc3, 0xdd, 0xb1, 0xcc, 0xf6, 0x55, 0xdb, 0x56, 0xfb, 0xfe,
0xf6, 0x4b, 0x2a, 0xf6, 0xbd, 0x37, 0x1d, 0xe4, 0x04, 0xe9, 0x40, 0x90, 0x88, 0xf2, 0xc2, 0x0e, 0x55, 0xf2, 0x17, 0x33, 0x6f, 0x21, 0xf9, 0xdf, 0x08, 0xa4, 0x77, 0x5c, 0x62, 0xf7, 0x8f, 0x32,
0xed, 0x07, 0x03, 0x31, 0xc7, 0x0a, 0x84, 0x58, 0x74, 0x67, 0x0e, 0x1c, 0xdd, 0x7f, 0x47, 0x30, 0x01, 0x61, 0x98, 0x24, 0x8f, 0x7a, 0xb6, 0x5f, 0xb4, 0xb1, 0xef, 0xfd, 0xf9, 0x23, 0x27, 0xc8,
0xb7, 0x49, 0x6c, 0xaa, 0x53, 0x87, 0x98, 0x8e, 0xdf, 0xcb, 0xd9, 0x30, 0x1f, 0x59, 0xf1, 0xa6, 0x1f, 0x82, 0xcc, 0x95, 0x17, 0xf6, 0x80, 0x3f, 0x18, 0x88, 0x39, 0x56, 0x20, 0xc4, 0xa2, 0x3b,
0x19, 0x4a, 0x34, 0xcd, 0x3e, 0x9b, 0x16, 0x52, 0xac, 0x7c, 0xe4, 0x6d, 0xcc, 0xa0, 0x7c, 0x0c, 0x73, 0xe8, 0xe8, 0xfe, 0x3b, 0x82, 0xb9, 0x2d, 0x62, 0x53, 0x9d, 0x3a, 0xc4, 0x74, 0xfc, 0x6e,
0x9a, 0xb5, 0xbc, 0xfc, 0x9e, 0x4a, 0xd9, 0xc4, 0x7c, 0x7e, 0x63, 0x87, 0x8c, 0x1f, 0xf3, 0x0b, 0xd1, 0xa6, 0xf9, 0xd0, 0x8a, 0xb7, 0xe5, 0x50, 0xa2, 0x2d, 0xf7, 0xf9, 0x34, 0xa9, 0x62, 0x05,
0x48, 0xa1, 0x50, 0xcf, 0xef, 0x52, 0xf3, 0xe0, 0xfb, 0x50, 0xc2, 0xa3, 0xfe, 0x0f, 0x12, 0xae, 0x2a, 0x6f, 0x94, 0x06, 0x05, 0x6a, 0xd0, 0x0e, 0xe6, 0x05, 0xfe, 0x54, 0xca, 0x36, 0xe9, 0xf3,
0x93, 0x72, 0x2d, 0xfa, 0x53, 0x04, 0x8b, 0xe9, 0x5c, 0x8d, 0x13, 0xfc, 0x5f, 0x81, 0x9c, 0x6e, 0x1b, 0x3b, 0xc6, 0xfc, 0x94, 0x5f, 0x71, 0x0a, 0x85, 0x7a, 0x76, 0x97, 0x9a, 0x07, 0xdf, 0x87,
0x3e, 0xb2, 0x82, 0xd6, 0xc2, 0x8a, 0xb8, 0x0a, 0x13, 0xae, 0xcb, 0x09, 0xe5, 0x7f, 0x23, 0xa8, 0x12, 0x1e, 0xf5, 0x7f, 0x90, 0x70, 0x9d, 0x94, 0x8b, 0xd7, 0x9f, 0x23, 0x58, 0x4c, 0xe7, 0x6a,
0x32, 0x57, 0x3c, 0x04, 0xf3, 0x77, 0x49, 0xb7, 0x49, 0xf5, 0x27, 0x24, 0x30, 0x7f, 0x97, 0x74, 0x9c, 0xe0, 0xff, 0x1a, 0xe4, 0x74, 0xf3, 0xa1, 0x15, 0x34, 0x2f, 0x56, 0xc4, 0x75, 0x9e, 0x70,
0x1b, 0xfa, 0x13, 0x12, 0xf3, 0x8c, 0x5c, 0xdc, 0x33, 0xe2, 0xa7, 0xb3, 0xfc, 0x90, 0xd6, 0x51, 0x5d, 0x4e, 0x28, 0xff, 0x07, 0x41, 0x95, 0xb9, 0xe2, 0x11, 0x98, 0xbf, 0x4b, 0xba, 0x4d, 0xaa,
0x21, 0xd6, 0x3a, 0x92, 0x9f, 0x21, 0xa8, 0xdf, 0x22, 0x4e, 0x52, 0xd4, 0xc3, 0x73, 0x8a, 0x0f, 0x3f, 0x26, 0x81, 0xf9, 0xbb, 0xa4, 0xdb, 0xd0, 0x1f, 0x93, 0x98, 0x67, 0xe4, 0xe2, 0x9e, 0x11,
0x11, 0x9c, 0x12, 0x32, 0x34, 0x8e, 0x3f, 0x7c, 0x21, 0xee, 0x0f, 0xe2, 0xaa, 0x7c, 0xcf, 0x92, 0x3f, 0xff, 0xe5, 0x87, 0x34, 0xa7, 0x0a, 0xb1, 0xe6, 0x94, 0xfc, 0x14, 0x41, 0xfd, 0x26, 0x71,
0xbe, 0x2b, 0xbc, 0x01, 0xd2, 0xba, 0xdb, 0xed, 0x86, 0xb9, 0x77, 0x09, 0x24, 0x9b, 0x7f, 0xf2, 0x92, 0xa2, 0x1e, 0x9d, 0x53, 0x7c, 0x88, 0xe0, 0x94, 0x90, 0xa1, 0x71, 0xfc, 0xe1, 0x4b, 0x71,
0xa2, 0x95, 0x67, 0xf8, 0xb2, 0x0f, 0xf3, 0x4a, 0x53, 0xf9, 0x02, 0x54, 0x7c, 0x12, 0x9f, 0xeb, 0x7f, 0x10, 0xd7, 0xfd, 0xfb, 0x96, 0xf4, 0x5d, 0xe1, 0x0d, 0x90, 0x36, 0xdc, 0x6e, 0x37, 0xcc,
0x3a, 0x14, 0x6d, 0xff, 0xdb, 0xc7, 0x0f, 0xff, 0xe5, 0x39, 0x98, 0x51, 0x48, 0xdb, 0xf3, 0x44, 0xbd, 0x4b, 0x20, 0xd9, 0xfc, 0x93, 0x97, 0xc5, 0x3c, 0xc3, 0x97, 0x7d, 0x98, 0x57, 0xfc, 0xca,
0xfb, 0xae, 0x6e, 0x6e, 0xfb, 0xcb, 0xc8, 0x4f, 0x11, 0xcc, 0xc6, 0xe1, 0xfe, 0x5c, 0xff, 0x0f, 0x17, 0xa0, 0xe2, 0x93, 0xf8, 0x5c, 0xd7, 0xa1, 0x68, 0xfb, 0xdf, 0x3e, 0x7e, 0xf8, 0x2f, 0xcf,
0x05, 0x55, 0xd3, 0x6c, 0x42, 0xe9, 0x50, 0xb3, 0x5c, 0xe3, 0x38, 0x4a, 0x80, 0x1c, 0xd1, 0x5c, 0xc1, 0x8c, 0x42, 0xda, 0x9e, 0x27, 0xda, 0x77, 0x74, 0x73, 0xc7, 0x5f, 0x46, 0x7e, 0x82, 0x60,
0x66, 0x64, 0xcd, 0xad, 0x5c, 0xe4, 0xfd, 0xf5, 0xc4, 0x15, 0x3c, 0x2e, 0x40, 0xf6, 0x9a, 0x61, 0x36, 0x0e, 0xf7, 0xe7, 0xfa, 0x7f, 0x28, 0xa8, 0x9a, 0x66, 0x13, 0x4a, 0x87, 0x9a, 0xe5, 0x2a,
0x54, 0x27, 0xb0, 0x04, 0xc5, 0x0d, 0xf3, 0x1e, 0xe9, 0x5a, 0x76, 0xbf, 0x8a, 0x56, 0xbe, 0x0c, 0xc7, 0x51, 0x02, 0xe4, 0x88, 0xe6, 0x32, 0x23, 0x6b, 0x6e, 0xe5, 0x22, 0xef, 0xe0, 0x27, 0x2e,
0xd3, 0x89, 0x93, 0x14, 0x2e, 0xc2, 0xe4, 0x7d, 0xcb, 0x24, 0xd5, 0x09, 0x5c, 0x05, 0xe9, 0xba, 0xf9, 0x71, 0x01, 0xb2, 0x57, 0x0d, 0xa3, 0x3a, 0x81, 0x25, 0x28, 0x6e, 0x9a, 0x77, 0x49, 0xd7,
0x6e, 0xaa, 0x76, 0xff, 0x5d, 0xd2, 0x72, 0x2c, 0xbb, 0xaa, 0xe1, 0x69, 0x28, 0xdf, 0x34, 0x2c, 0xb2, 0xfb, 0x55, 0xb4, 0xf2, 0x55, 0x98, 0x4e, 0x9c, 0xd5, 0x70, 0x11, 0x26, 0xef, 0x59, 0x26,
0xd5, 0xf1, 0x01, 0x64, 0xed, 0xa3, 0x05, 0xa8, 0xdc, 0x63, 0x4c, 0x35, 0x88, 0xbd, 0xa3, 0xb7, 0xa9, 0x4e, 0xe0, 0x2a, 0x48, 0xd7, 0x74, 0x53, 0xb5, 0xfb, 0xef, 0x92, 0x96, 0x63, 0xd9, 0x55,
0x08, 0x6e, 0x42, 0x35, 0xf9, 0x3c, 0x0f, 0x5f, 0x14, 0x9a, 0x2f, 0xe5, 0x15, 0x5f, 0x7d, 0x98, 0x0d, 0x4f, 0x43, 0xf9, 0x86, 0x61, 0xa9, 0x8e, 0x0f, 0x20, 0xeb, 0x1f, 0x2d, 0x40, 0xe5, 0x2e,
0x98, 0xf2, 0x04, 0x7e, 0x1f, 0xa6, 0xe2, 0x0f, 0xe7, 0xb0, 0x38, 0x5b, 0x08, 0x5f, 0xd7, 0xed, 0x63, 0xaa, 0x41, 0xec, 0x5d, 0xbd, 0x45, 0x70, 0x13, 0xaa, 0xc9, 0x07, 0x80, 0xf8, 0xa2, 0xd0,
0x37, 0x79, 0x13, 0x2a, 0xb1, 0x77, 0x70, 0xf8, 0xbc, 0x70, 0x6e, 0xd1, 0x5b, 0xb9, 0xfa, 0x92, 0x7c, 0x29, 0xef, 0x04, 0xeb, 0xc3, 0xc4, 0x94, 0x27, 0xf0, 0xfb, 0x30, 0x15, 0x7f, 0x9a, 0x87,
0x10, 0x35, 0xfa, 0x56, 0x8d, 0x73, 0x1f, 0x7f, 0x0e, 0x94, 0xc2, 0xbd, 0xf0, 0xcd, 0xd0, 0x7e, 0xc5, 0xd9, 0x42, 0xf8, 0x7e, 0xef, 0xa0, 0xc9, 0x9b, 0x50, 0x89, 0xbd, 0xb4, 0xc3, 0xe7, 0x85,
0xdc, 0xab, 0x70, 0x62, 0xcf, 0xeb, 0x1e, 0xfc, 0x9a, 0x70, 0xfe, 0xb4, 0x57, 0x40, 0xfb, 0x2d, 0x73, 0x8b, 0x5e, 0xe3, 0xd5, 0x97, 0x84, 0xa8, 0xd1, 0xd7, 0x70, 0x9c, 0xfb, 0xf8, 0x83, 0xa3,
0xb1, 0x0b, 0x78, 0xef, 0x7b, 0x2f, 0xbc, 0x2a, 0xb6, 0x40, 0xda, 0x6b, 0xb7, 0xfa, 0xa5, 0x91, 0x14, 0xee, 0x85, 0xaf, 0x92, 0x0e, 0xe2, 0x5e, 0x85, 0x17, 0xf6, 0xbd, 0x1f, 0xc2, 0xaf, 0x09,
0xf1, 0x43, 0xc5, 0x7d, 0x17, 0xc1, 0x42, 0xca, 0x93, 0x1c, 0x7c, 0x59, 0x38, 0xdd, 0xf0, 0x77, 0xe7, 0x4f, 0x7b, 0x67, 0x74, 0xd0, 0x12, 0x7b, 0x80, 0xf7, 0xbf, 0x28, 0xc3, 0xab, 0x62, 0x0b,
0x45, 0xf5, 0x2b, 0x07, 0x23, 0x0a, 0x19, 0x31, 0x61, 0x3a, 0x11, 0x60, 0xf8, 0xc2, 0x28, 0x2f, 0xa4, 0xbd, 0xa7, 0xab, 0xaf, 0x8d, 0x8c, 0x1f, 0x2a, 0xee, 0xfb, 0x08, 0x16, 0x52, 0x1e, 0xfd,
0x61, 0x82, 0x75, 0x2f, 0x8e, 0x86, 0x1c, 0xae, 0xe7, 0x55, 0xaa, 0xf1, 0x27, 0x29, 0x29, 0xeb, 0xe0, 0x4b, 0xc2, 0xe9, 0x86, 0xbf, 0x5c, 0xaa, 0x5f, 0x3e, 0x1c, 0x51, 0xc8, 0x88, 0x09, 0xd3,
0x89, 0x1f, 0xae, 0xec, 0x67, 0xd0, 0xf7, 0xa0, 0x12, 0x7b, 0x3b, 0x92, 0xe2, 0xf1, 0xa2, 0xf7, 0x89, 0x00, 0xc3, 0x17, 0x46, 0x79, 0x6b, 0x13, 0xac, 0x7b, 0x71, 0x34, 0xe4, 0x70, 0x3d, 0xaf,
0x25, 0xfb, 0x4d, 0xfd, 0x10, 0xa4, 0xe8, 0x13, 0x0f, 0xbc, 0x9c, 0x16, 0x4b, 0x7b, 0x26, 0x3e, 0x52, 0x8d, 0x3f, 0x7a, 0x49, 0x59, 0x4f, 0xfc, 0x34, 0xe6, 0x20, 0x83, 0xbe, 0x07, 0x95, 0xd8,
0x48, 0x28, 0x0d, 0x6e, 0x87, 0x87, 0x84, 0xd2, 0x9e, 0x4b, 0xef, 0xd1, 0x43, 0x29, 0x32, 0xff, 0xeb, 0x94, 0x14, 0x8f, 0x17, 0xbd, 0x60, 0x39, 0x68, 0xea, 0x07, 0x20, 0x45, 0x1f, 0x91, 0xe0,
0xd0, 0x50, 0x3a, 0xf0, 0x12, 0x4f, 0x11, 0xcc, 0x8b, 0x5f, 0x08, 0xe0, 0xb5, 0x34, 0xdf, 0x4c, 0xe5, 0xb4, 0x58, 0xda, 0x37, 0xf1, 0x61, 0x42, 0x69, 0x70, 0xff, 0x3c, 0x24, 0x94, 0xf6, 0x5d,
0x7f, 0x0b, 0x51, 0xbf, 0x7c, 0x20, 0x9a, 0x50, 0x8b, 0xdb, 0x30, 0x15, 0xbf, 0x63, 0x4f, 0xd1, 0xab, 0x8f, 0x1e, 0x4a, 0x91, 0xf9, 0x87, 0x86, 0xd2, 0xa1, 0x97, 0x78, 0x82, 0x60, 0x5e, 0xfc,
0xa2, 0xf0, 0xe9, 0x40, 0xfd, 0xc2, 0x48, 0xb8, 0xe1, 0x62, 0x5f, 0x87, 0x72, 0xe4, 0xfe, 0x13, 0x06, 0x01, 0xaf, 0xa7, 0xf9, 0x66, 0xfa, 0x6b, 0x8b, 0xfa, 0xa5, 0x43, 0xd1, 0x84, 0x5a, 0xdc,
0xbf, 0x3a, 0xc4, 0x8f, 0xa3, 0xed, 0xf5, 0xfd, 0x34, 0xd9, 0x81, 0x4a, 0xec, 0xce, 0x2b, 0xcd, 0x81, 0xa9, 0xf8, 0x2d, 0x7e, 0x8a, 0x16, 0x85, 0x8f, 0x13, 0xea, 0x17, 0x46, 0xc2, 0x0d, 0x17,
0x87, 0x05, 0x57, 0x91, 0xf5, 0x95, 0x51, 0x50, 0x43, 0x01, 0x3a, 0x50, 0x89, 0xdd, 0x40, 0xa4, 0xfb, 0x26, 0x94, 0x23, 0x37, 0xac, 0xf8, 0xd5, 0x21, 0x7e, 0x1c, 0x6d, 0xe0, 0x1f, 0xa4, 0xc9,
0xac, 0x24, 0xba, 0x70, 0x49, 0x59, 0x49, 0x78, 0xa1, 0x21, 0x4f, 0xe0, 0x6f, 0x47, 0x2e, 0x3b, 0x0e, 0x54, 0x62, 0xb7, 0x6a, 0x69, 0x3e, 0x2c, 0xb8, 0xec, 0xac, 0xaf, 0x8c, 0x82, 0x1a, 0x0a,
0x62, 0x17, 0x4a, 0xf8, 0x8d, 0xa1, 0xf3, 0x88, 0xee, 0xd3, 0xea, 0x6b, 0x07, 0x21, 0x09, 0x59, 0xd0, 0x81, 0x4a, 0xec, 0x8e, 0x23, 0x65, 0x25, 0xd1, 0x95, 0x4e, 0xca, 0x4a, 0xc2, 0x2b, 0x13,
0x78, 0x07, 0x4a, 0xe1, 0x45, 0x07, 0x3e, 0x97, 0x9a, 0x16, 0x0e, 0x62, 0xa9, 0x06, 0xe4, 0xf9, 0x79, 0x02, 0x7f, 0x37, 0x72, 0x9d, 0x12, 0xbb, 0xb2, 0xc2, 0x6f, 0x0c, 0x9d, 0x47, 0x74, 0x63,
0xa5, 0x03, 0x96, 0x53, 0x6e, 0x0f, 0x23, 0x37, 0x12, 0xf5, 0x97, 0x85, 0x38, 0xf1, 0x7e, 0xbc, 0x57, 0x5f, 0x3f, 0x0c, 0x49, 0xc8, 0xc2, 0x3b, 0x50, 0x0a, 0xaf, 0x52, 0xf0, 0xb9, 0xd4, 0xb4,
0x3c, 0x81, 0x15, 0xc8, 0xf3, 0x26, 0x49, 0xca, 0xa4, 0xb1, 0xd6, 0x6c, 0x7d, 0x38, 0x0e, 0xef, 0x70, 0x18, 0x4b, 0x35, 0x20, 0xcf, 0xaf, 0x35, 0xb0, 0x9c, 0x72, 0x3f, 0x19, 0xb9, 0xf3, 0xa8,
0xac, 0x4c, 0xe0, 0x6f, 0x40, 0x31, 0xe8, 0x72, 0xe1, 0x57, 0x52, 0xc2, 0x3e, 0xd6, 0x31, 0xac, 0xbf, 0x2c, 0xc4, 0x89, 0x77, 0xfc, 0xe5, 0x09, 0xac, 0x40, 0x9e, 0x37, 0x49, 0x52, 0x26, 0x8d,
0xef, 0x87, 0x15, 0xcc, 0xbc, 0x09, 0x39, 0xd6, 0xa6, 0xc0, 0x4b, 0xc3, 0x5a, 0x18, 0xc3, 0x78, 0x35, 0x7f, 0xeb, 0xc3, 0x71, 0x78, 0x67, 0x65, 0x02, 0x7f, 0x0b, 0x8a, 0x41, 0x97, 0x0b, 0xbf,
0x8d, 0x75, 0x39, 0xe4, 0x09, 0xfc, 0x35, 0xc8, 0xb1, 0x52, 0x38, 0x65, 0xc6, 0x68, 0x1f, 0xa2, 0x92, 0x12, 0xf6, 0xb1, 0x16, 0x63, 0xfd, 0x20, 0xac, 0x60, 0xe6, 0x2d, 0xc8, 0xb1, 0x36, 0x05,
0x3e, 0x14, 0x25, 0x60, 0xf1, 0x7b, 0x08, 0x6a, 0x69, 0xe7, 0x3c, 0x9c, 0xba, 0x6f, 0x0e, 0x3b, 0x5e, 0x1a, 0xd6, 0xc2, 0x18, 0xc6, 0x6b, 0xac, 0xcb, 0x21, 0x4f, 0xe0, 0x6f, 0x40, 0x8e, 0x95,
0xac, 0xd6, 0xaf, 0x1e, 0x90, 0x2a, 0x14, 0xee, 0x09, 0xcc, 0x08, 0x4e, 0x17, 0xf8, 0x52, 0xda, 0xc2, 0x29, 0x33, 0x46, 0xfb, 0x10, 0xf5, 0xa1, 0x28, 0x01, 0x8b, 0x3f, 0x40, 0x50, 0x4b, 0x3b,
0x7c, 0x29, 0x07, 0xa3, 0xfa, 0xeb, 0xa3, 0x13, 0x84, 0x6b, 0x6f, 0x42, 0x8e, 0x9d, 0x0a, 0x52, 0xe7, 0xe1, 0xd4, 0x7d, 0x73, 0xd8, 0x61, 0xb5, 0x7e, 0xe5, 0x90, 0x54, 0xa1, 0x70, 0x8f, 0x61,
0x14, 0x1b, 0x3d, 0x64, 0xa4, 0x98, 0x2a, 0x76, 0xa8, 0x90, 0x27, 0x30, 0x01, 0x29, 0x7a, 0x44, 0x46, 0x70, 0xba, 0xc0, 0x6b, 0x69, 0xf3, 0xa5, 0x1c, 0x8c, 0xea, 0xaf, 0x8f, 0x4e, 0x10, 0xae,
0x48, 0xd9, 0x12, 0x05, 0xa7, 0x8b, 0xfa, 0xf9, 0x11, 0x30, 0x83, 0x65, 0xd6, 0x5c, 0x90, 0x36, 0xbd, 0x05, 0x39, 0x76, 0x2a, 0x48, 0x51, 0x6c, 0xf4, 0x90, 0x91, 0x62, 0xaa, 0xd8, 0xa1, 0x42,
0x6d, 0xeb, 0x71, 0x3f, 0x28, 0xca, 0xff, 0x37, 0xcb, 0x5e, 0xbf, 0xfa, 0xcd, 0xcb, 0x6d, 0xdd, 0x9e, 0xc0, 0x04, 0xa4, 0xe8, 0x11, 0x21, 0x65, 0x4b, 0x14, 0x9c, 0x2e, 0xea, 0xe7, 0x47, 0xc0,
0xe9, 0xb8, 0x5b, 0x5e, 0xdc, 0x5f, 0xe2, 0xb8, 0xaf, 0xe9, 0x96, 0xff, 0x75, 0x49, 0x37, 0x1d, 0x0c, 0x96, 0x59, 0x77, 0x41, 0xda, 0xb2, 0xad, 0x47, 0xfd, 0xa0, 0x28, 0xff, 0xdf, 0x2c, 0x7b,
0x62, 0x9b, 0xaa, 0x71, 0x89, 0xcd, 0xe5, 0x43, 0x7b, 0x5b, 0x5b, 0x79, 0xf6, 0x7f, 0xf9, 0xbf, 0xed, 0xca, 0xb7, 0x2f, 0xb5, 0x75, 0xa7, 0xe3, 0x6e, 0x7b, 0x71, 0xbf, 0xc6, 0x71, 0x5f, 0xd3,
0x01, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0x05, 0x2f, 0x1a, 0x34, 0x00, 0x00, 0x2d, 0xff, 0x6b, 0x4d, 0x37, 0x1d, 0x62, 0x9b, 0xaa, 0xb1, 0xc6, 0xe6, 0xf2, 0xa1, 0xbd, 0xed,
0xed, 0x3c, 0xfb, 0xbf, 0xf4, 0xdf, 0x00, 0x00, 0x00, 0xff, 0xff, 0x10, 0x05, 0x53, 0xed, 0x7c,
0x34, 0x00, 0x00,
} }
// Reference imports to suppress errors if they are not otherwise used. // Reference imports to suppress errors if they are not otherwise used.

View File

@ -1317,7 +1317,12 @@ func (st *SearchTask) PreExecute(ctx context.Context) error {
if travelTimestamp == 0 { if travelTimestamp == 0 {
travelTimestamp = st.BeginTs() travelTimestamp = st.BeginTs()
} }
guaranteeTimestamp := st.query.GuaranteeTimestamp
if guaranteeTimestamp == 0 {
guaranteeTimestamp = st.BeginTs()
}
st.SearchRequest.TravelTimestamp = travelTimestamp st.SearchRequest.TravelTimestamp = travelTimestamp
st.SearchRequest.GuaranteeTimestamp = guaranteeTimestamp
st.SearchRequest.ResultChannelID = Params.SearchResultChannelNames[0] st.SearchRequest.ResultChannelID = Params.SearchResultChannelNames[0]
st.SearchRequest.DbID = 0 // todo st.SearchRequest.DbID = 0 // todo
@ -2090,7 +2095,12 @@ func (rt *RetrieveTask) PreExecute(ctx context.Context) error {
if travelTimestamp == 0 { if travelTimestamp == 0 {
travelTimestamp = rt.BeginTs() travelTimestamp = rt.BeginTs()
} }
guaranteeTimestamp := rt.retrieve.GuaranteeTimestamp
if guaranteeTimestamp == 0 {
guaranteeTimestamp = rt.BeginTs()
}
rt.RetrieveRequest.TravelTimestamp = travelTimestamp rt.RetrieveRequest.TravelTimestamp = travelTimestamp
rt.RetrieveRequest.GuaranteeTimestamp = guaranteeTimestamp
rt.ResultChannelID = Params.RetrieveResultChannelNames[0] rt.ResultChannelID = Params.RetrieveResultChannelNames[0]
rt.DbID = 0 // todo(yukun) rt.DbID = 0 // todo(yukun)

View File

@ -36,6 +36,12 @@ import (
"github.com/milvus-io/milvus/internal/util/typeutil" "github.com/milvus-io/milvus/internal/util/typeutil"
) )
type queryMsg interface {
msgstream.TsMsg
GuaranteeTs() Timestamp
TravelTs() Timestamp
}
type queryCollection struct { type queryCollection struct {
releaseCtx context.Context releaseCtx context.Context
cancel context.CancelFunc cancel context.CancelFunc
@ -45,7 +51,7 @@ type queryCollection struct {
streaming *streaming streaming *streaming
unsolvedMsgMu sync.Mutex // guards unsolvedMsg unsolvedMsgMu sync.Mutex // guards unsolvedMsg
unsolvedMsg []msgstream.TsMsg unsolvedMsg []queryMsg
tSafeWatchers map[Channel]*tSafeWatcher tSafeWatchers map[Channel]*tSafeWatcher
watcherSelectCase []reflect.SelectCase watcherSelectCase []reflect.SelectCase
@ -66,7 +72,7 @@ func newQueryCollection(releaseCtx context.Context,
streaming *streaming, streaming *streaming,
factory msgstream.Factory) *queryCollection { factory msgstream.Factory) *queryCollection {
unsolvedMsg := make([]msgstream.TsMsg, 0) unsolvedMsg := make([]queryMsg, 0)
queryStream, _ := factory.NewQueryMsgStream(releaseCtx) queryStream, _ := factory.NewQueryMsgStream(releaseCtx)
queryResultStream, _ := factory.NewQueryMsgStream(releaseCtx) queryResultStream, _ := factory.NewQueryMsgStream(releaseCtx)
@ -130,13 +136,13 @@ func (q *queryCollection) register() {
} }
} }
func (q *queryCollection) addToUnsolvedMsg(msg msgstream.TsMsg) { func (q *queryCollection) addToUnsolvedMsg(msg queryMsg) {
q.unsolvedMsgMu.Lock() q.unsolvedMsgMu.Lock()
defer q.unsolvedMsgMu.Unlock() defer q.unsolvedMsgMu.Unlock()
q.unsolvedMsg = append(q.unsolvedMsg, msg) q.unsolvedMsg = append(q.unsolvedMsg, msg)
} }
func (q *queryCollection) popAllUnsolvedMsg() []msgstream.TsMsg { func (q *queryCollection) popAllUnsolvedMsg() []queryMsg {
q.unsolvedMsgMu.Lock() q.unsolvedMsgMu.Lock()
defer q.unsolvedMsgMu.Unlock() defer q.unsolvedMsgMu.Unlock()
tmp := q.unsolvedMsg tmp := q.unsolvedMsg
@ -250,7 +256,7 @@ func (q *queryCollection) loadBalance(msg *msgstream.LoadBalanceSegmentsMsg) {
// zap.Int("num of segment", len(msg.Infos))) // zap.Int("num of segment", len(msg.Infos)))
} }
func (q *queryCollection) receiveQueryMsg(msg msgstream.TsMsg) { func (q *queryCollection) receiveQueryMsg(msg queryMsg) {
msgType := msg.Type() msgType := msg.Type()
var collectionID UniqueID var collectionID UniqueID
var msgTypeStr string var msgTypeStr string
@ -304,7 +310,8 @@ func (q *queryCollection) receiveQueryMsg(msg msgstream.TsMsg) {
} }
return return
} }
if msg.BeginTs() >= collection.getReleaseTime() { guaranteeTs := msg.GuaranteeTs()
if guaranteeTs >= collection.getReleaseTime() {
err = fmt.Errorf("retrieve failed, collection has been released, msgID = %d, collectionID = %d", msg.ID(), collectionID) err = fmt.Errorf("retrieve failed, collection has been released, msgID = %d, collectionID = %d", msg.ID(), collectionID)
log.Error(err.Error()) log.Error(err.Error())
err = q.publishFailedQueryResult(msg, err.Error()) err = q.publishFailedQueryResult(msg, err.Error())
@ -321,23 +328,23 @@ func (q *queryCollection) receiveQueryMsg(msg msgstream.TsMsg) {
} }
serviceTime := q.getServiceableTime() serviceTime := q.getServiceableTime()
if msg.BeginTs() > serviceTime { if guaranteeTs > serviceTime {
bt, _ := tsoutil.ParseTS(msg.BeginTs()) gt, _ := tsoutil.ParseTS(guaranteeTs)
st, _ := tsoutil.ParseTS(serviceTime) st, _ := tsoutil.ParseTS(serviceTime)
log.Debug("query node::receiveQueryMsg: add to unsolvedMsg", log.Debug("query node::receiveQueryMsg: add to unsolvedMsg",
zap.Any("collectionID", q.collectionID), zap.Any("collectionID", q.collectionID),
zap.Any("sm.BeginTs", bt), zap.Any("sm.GuaranteeTimestamp", gt),
zap.Any("serviceTime", st), zap.Any("serviceTime", st),
zap.Any("delta seconds", (msg.BeginTs()-serviceTime)/(1000*1000*1000)), zap.Any("delta seconds", (guaranteeTs-serviceTime)/(1000*1000*1000)),
zap.Any("msgID", msg.ID()), zap.Any("msgID", msg.ID()),
zap.String("msgType", msgTypeStr), zap.String("msgType", msgTypeStr),
) )
q.addToUnsolvedMsg(msg) q.addToUnsolvedMsg(msg)
sp.LogFields( sp.LogFields(
oplog.String("send to unsolved buffer", "send to unsolved buffer"), oplog.String("send to unsolved buffer", "send to unsolved buffer"),
oplog.Object("begin ts", bt), oplog.Object("guarantee ts", gt),
oplog.Object("serviceTime", st), oplog.Object("serviceTime", st),
oplog.Float64("delta seconds", float64(msg.BeginTs()-serviceTime)/(1000.0*1000.0*1000.0)), oplog.Float64("delta seconds", float64(guaranteeTs-serviceTime)/(1000.0*1000.0*1000.0)),
) )
sp.Finish() sp.Finish()
return return
@ -401,29 +408,30 @@ func (q *queryCollection) doUnsolvedQueryMsg() {
q.setServiceableTime(serviceTime) q.setServiceableTime(serviceTime)
//log.Debug("query node::doUnsolvedMsg: setServiceableTime", zap.Any("serviceTime", st)) //log.Debug("query node::doUnsolvedMsg: setServiceableTime", zap.Any("serviceTime", st))
unSolvedMsg := make([]msgstream.TsMsg, 0) unSolvedMsg := make([]queryMsg, 0)
tempMsg := q.popAllUnsolvedMsg() tempMsg := q.popAllUnsolvedMsg()
for _, m := range tempMsg { for _, m := range tempMsg {
bt, _ := tsoutil.ParseTS(m.EndTs()) guaranteeTs := m.GuaranteeTs()
gt, _ := tsoutil.ParseTS(guaranteeTs)
st, _ = tsoutil.ParseTS(serviceTime) st, _ = tsoutil.ParseTS(serviceTime)
log.Debug("get query message from unsolvedMsg", log.Debug("get query message from unsolvedMsg",
zap.Int64("collectionID", q.collectionID), zap.Int64("collectionID", q.collectionID),
zap.Int64("msgID", m.ID()), zap.Int64("msgID", m.ID()),
zap.Any("reqTime_p", bt), zap.Any("reqTime_p", gt),
zap.Any("serviceTime_p", st), zap.Any("serviceTime_p", st),
zap.Any("reqTime_l", m.EndTs()), zap.Any("guaranteeTime_l", guaranteeTs),
zap.Any("serviceTime_l", serviceTime), zap.Any("serviceTime_l", serviceTime),
) )
if m.EndTs() <= serviceTime { if guaranteeTs <= serviceTime {
unSolvedMsg = append(unSolvedMsg, m) unSolvedMsg = append(unSolvedMsg, m)
continue continue
} }
log.Debug("query node::doUnsolvedMsg: add to unsolvedMsg", log.Debug("query node::doUnsolvedMsg: add to unsolvedMsg",
zap.Any("collectionID", q.collectionID), zap.Any("collectionID", q.collectionID),
zap.Any("sm.BeginTs", bt), zap.Any("sm.BeginTs", gt),
zap.Any("serviceTime", st), zap.Any("serviceTime", st),
zap.Any("delta seconds", (m.BeginTs()-serviceTime)/(1000*1000*1000)), zap.Any("delta seconds", (guaranteeTs-serviceTime)/(1000*1000*1000)),
zap.Any("msgID", m.ID()), zap.Any("msgID", m.ID()),
) )
q.addToUnsolvedMsg(m) q.addToUnsolvedMsg(m)
@ -699,12 +707,13 @@ func translateHits(schema *typeutil.SchemaHelper, fieldIDs []int64, rawHits [][]
// TODO:: cache map[dsl]plan // TODO:: cache map[dsl]plan
// TODO: reBatched search requests // TODO: reBatched search requests
func (q *queryCollection) search(msg msgstream.TsMsg) error { func (q *queryCollection) search(msg queryMsg) error {
searchMsg := msg.(*msgstream.SearchMsg) searchMsg := msg.(*msgstream.SearchMsg)
sp, ctx := trace.StartSpanFromContext(searchMsg.TraceCtx()) sp, ctx := trace.StartSpanFromContext(searchMsg.TraceCtx())
defer sp.Finish() defer sp.Finish()
searchMsg.SetTraceCtx(ctx) searchMsg.SetTraceCtx(ctx)
searchTimestamp := searchMsg.BeginTs() searchTimestamp := searchMsg.BeginTs()
travelTimestamp := searchMsg.TravelTimestamp
collectionID := searchMsg.CollectionID collectionID := searchMsg.CollectionID
collection, err := q.streaming.replica.getCollectionByID(collectionID) collection, err := q.streaming.replica.getCollectionByID(collectionID)
@ -763,7 +772,7 @@ func (q *queryCollection) search(msg msgstream.TsMsg) error {
sealedSegmentSearched := make([]UniqueID, 0) sealedSegmentSearched := make([]UniqueID, 0)
// historical search // historical search
hisSearchResults, hisSegmentResults, err1 := q.historical.search(searchRequests, collectionID, searchMsg.PartitionIDs, plan, searchTimestamp) hisSearchResults, hisSegmentResults, err1 := q.historical.search(searchRequests, collectionID, searchMsg.PartitionIDs, plan, travelTimestamp)
if err1 != nil { if err1 != nil {
log.Error(err1.Error()) log.Error(err1.Error())
return err1 return err1
@ -780,7 +789,7 @@ func (q *queryCollection) search(msg msgstream.TsMsg) error {
for _, channel := range collection.getVChannels() { for _, channel := range collection.getVChannels() {
var strSearchResults []*SearchResult var strSearchResults []*SearchResult
var strSegmentResults []*Segment var strSegmentResults []*Segment
strSearchResults, strSegmentResults, err2 = q.streaming.search(searchRequests, collectionID, searchMsg.PartitionIDs, channel, plan, searchTimestamp) strSearchResults, strSegmentResults, err2 = q.streaming.search(searchRequests, collectionID, searchMsg.PartitionIDs, channel, plan, travelTimestamp)
if err2 != nil { if err2 != nil {
log.Error(err2.Error()) log.Error(err2.Error())
return err2 return err2
@ -986,7 +995,7 @@ func (q *queryCollection) search(msg msgstream.TsMsg) error {
return nil return nil
} }
func (q *queryCollection) retrieve(msg msgstream.TsMsg) error { func (q *queryCollection) retrieve(msg queryMsg) error {
// TODO(yukun) // TODO(yukun)
// step 1: get retrieve object and defer destruction // step 1: get retrieve object and defer destruction
// step 2: for each segment, call retrieve to get ids proto buffer // step 2: for each segment, call retrieve to get ids proto buffer

View File

@ -1,502 +0,0 @@
// Copyright (C) 2019-2020 Zilliz. All rights reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance
// with the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software distributed under the License
// is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
// or implied. See the License for the specific language governing permissions and limitations under the License.
package querynode
import (
"context"
"errors"
"math"
"reflect"
"sync"
oplog "github.com/opentracing/opentracing-go/log"
"go.uber.org/zap"
"github.com/milvus-io/milvus/internal/log"
"github.com/milvus-io/milvus/internal/msgstream"
"github.com/milvus-io/milvus/internal/proto/commonpb"
"github.com/milvus-io/milvus/internal/proto/internalpb"
"github.com/milvus-io/milvus/internal/proto/segcorepb"
"github.com/milvus-io/milvus/internal/util/trace"
"github.com/milvus-io/milvus/internal/util/tsoutil"
)
type retrieveCollection struct {
releaseCtx context.Context
cancel context.CancelFunc
collectionID UniqueID
historical *historical
streaming *streaming
msgBuffer chan *msgstream.RetrieveMsg
unsolvedMsgMu sync.Mutex
unsolvedMsg []*msgstream.RetrieveMsg
tSafeWatchers map[Channel]*tSafeWatcher
watcherSelectCase []reflect.SelectCase
serviceableTimeMutex sync.Mutex
serviceableTime Timestamp
retrieveResultMsgStream msgstream.MsgStream
}
func newRetrieveCollection(releaseCtx context.Context,
cancel context.CancelFunc,
collectionID UniqueID,
historical *historical,
streaming *streaming,
retrieveResultStream msgstream.MsgStream) *retrieveCollection {
receiveBufSize := Params.RetrieveReceiveBufSize
msgBuffer := make(chan *msgstream.RetrieveMsg, receiveBufSize)
unsolvedMsg := make([]*msgstream.RetrieveMsg, 0)
rc := &retrieveCollection{
releaseCtx: releaseCtx,
cancel: cancel,
collectionID: collectionID,
historical: historical,
streaming: streaming,
tSafeWatchers: make(map[Channel]*tSafeWatcher),
msgBuffer: msgBuffer,
unsolvedMsg: unsolvedMsg,
retrieveResultMsgStream: retrieveResultStream,
}
rc.register()
return rc
}
func (rc *retrieveCollection) getServiceableTime() Timestamp {
rc.serviceableTimeMutex.Lock()
defer rc.serviceableTimeMutex.Unlock()
return rc.serviceableTime
}
func (rc *retrieveCollection) setServiceableTime(t Timestamp) {
rc.serviceableTimeMutex.Lock()
defer rc.serviceableTimeMutex.Unlock()
if t < rc.serviceableTime {
return
}
gracefulTimeInMilliSecond := Params.GracefulTime
if gracefulTimeInMilliSecond > 0 {
gracefulTime := tsoutil.ComposeTS(gracefulTimeInMilliSecond, 0)
rc.serviceableTime = t + gracefulTime
} else {
rc.serviceableTime = t
}
}
func (rc *retrieveCollection) waitNewTSafe() Timestamp {
// block until any vChannel updating tSafe
_, _, recvOK := reflect.Select(rc.watcherSelectCase)
if !recvOK {
log.Error("tSafe has been closed")
return invalidTimestamp
}
t := Timestamp(math.MaxInt64)
for channel := range rc.tSafeWatchers {
ts := rc.streaming.tSafeReplica.getTSafe(channel)
if ts <= t {
t = ts
}
}
return t
}
func (rc *retrieveCollection) start() {
go rc.receiveRetrieveMsg()
go rc.doUnsolvedMsgRetrieve()
}
func (rc *retrieveCollection) register() {
// register tSafe watcher and init watcher select case
collection, err := rc.streaming.replica.getCollectionByID(rc.collectionID)
if err != nil {
log.Error(err.Error())
return
}
rc.watcherSelectCase = make([]reflect.SelectCase, 0)
for _, channel := range collection.getVChannels() {
rc.streaming.tSafeReplica.addTSafe(channel)
rc.tSafeWatchers[channel] = newTSafeWatcher()
rc.streaming.tSafeReplica.registerTSafeWatcher(channel, rc.tSafeWatchers[channel])
rc.watcherSelectCase = append(rc.watcherSelectCase, reflect.SelectCase{
Dir: reflect.SelectRecv,
Chan: reflect.ValueOf(rc.tSafeWatchers[channel].watcherChan()),
})
}
}
func (rc *retrieveCollection) addToUnsolvedMsg(msg *msgstream.RetrieveMsg) {
rc.unsolvedMsgMu.Lock()
defer rc.unsolvedMsgMu.Unlock()
rc.unsolvedMsg = append(rc.unsolvedMsg, msg)
}
func (rc *retrieveCollection) receiveRetrieveMsg() {
for {
select {
case <-rc.releaseCtx.Done():
log.Debug("stop retrieveCollection's receiveRetrieveMsg", zap.Int64("collectionID", rc.collectionID))
return
case rm := <-rc.msgBuffer:
log.Info("RetrieveCollection get retrieve message from msgBuffer",
zap.Int64("collectionID", rm.CollectionID),
zap.Int64("requestID", rm.ID()),
zap.Any("requestType", "retrieve"),
)
sp, ctx := trace.StartSpanFromContext(rm.TraceCtx())
rm.SetTraceCtx(ctx)
serviceTime := rc.getServiceableTime()
if rm.BeginTs() > serviceTime {
bt, _ := tsoutil.ParseTS(rm.BeginTs())
st, _ := tsoutil.ParseTS(serviceTime)
log.Debug("Timestamp of retrieve request great than serviceTime, add to unsolvedMsgs",
zap.Any("sm.BeginTs", bt),
zap.Any("serviceTime", st),
zap.Any("delta seconds", (rm.BeginTs()-serviceTime)/(1000*1000*1000)),
zap.Any("collectionID", rc.collectionID),
zap.Int64("collectionID", rm.CollectionID),
zap.Int64("requestID", rm.ID()),
zap.Any("requestType", "retrieve"),
)
rc.addToUnsolvedMsg(rm)
sp.LogFields(
oplog.String("send to unsolved retrieve buffer", "send to unsolved buffer"),
oplog.Object("begin ts", bt),
oplog.Object("serviceTime", st),
oplog.Float64("delta seconds", float64(rm.BeginTs()-serviceTime)/(1000.0*1000.0*1000.0)),
)
sp.Finish()
continue
}
log.Info("Doing retrieve in receiveRetrieveMsg...",
zap.Int64("collectionID", rm.CollectionID),
zap.Int64("requestID", rm.ID()),
zap.Any("requestType", "retrieve"),
)
err := rc.retrieve(rm)
if err != nil {
log.Error(err.Error(),
zap.Int64("requestID", rm.ID()),
zap.Any("requestType", "retrieve"),
)
log.Debug("Failed to execute retrieve, prepare to publish failed retrieve result",
zap.Int64("collectionID", rm.CollectionID),
zap.Int64("requestID", rm.ID()),
zap.Any("requestType", "retrieve"),
)
err2 := rc.publishFailedRetrieveResult(rm, err.Error())
if err2 != nil {
log.Error("Failed to publish FailedRetrieveResult",
zap.Error(err2),
zap.Int64("requestID", rm.ID()),
zap.Any("requestType", "retrieve"),
)
}
}
log.Debug("Do retrieve done in retrieveRetrieveMsg",
zap.Int64("msgID", rm.ID()),
zap.Int64("collectionID", rm.CollectionID),
zap.Int64("requestID", rm.ID()),
zap.Any("requestType", "retrieve"),
)
sp.Finish()
}
}
}
func (rc *retrieveCollection) doUnsolvedMsgRetrieve() {
for {
select {
case <-rc.releaseCtx.Done():
log.Debug("stop retrieveCollection's doUnsolvedMsgRetrieve", zap.Int64("collectionID", rc.collectionID))
return
default:
serviceTime := rc.waitNewTSafe()
rc.setServiceableTime(serviceTime)
log.Debug("Update serviceTime",
zap.Any("serviceTime", serviceTime),
zap.Uint64("tSafe", serviceTime),
zap.Int64("collectionID", rc.collectionID),
)
retrieveMsg := make([]*msgstream.RetrieveMsg, 0)
rc.unsolvedMsgMu.Lock()
tmpMsg := rc.unsolvedMsg
rc.unsolvedMsg = rc.unsolvedMsg[:0]
rc.unsolvedMsgMu.Unlock()
for _, rm := range tmpMsg {
log.Debug("Get retrieve message from unsolvedMsg",
zap.Int64("collectionID", rm.CollectionID),
zap.Int64("requestID", rm.ID()),
zap.Any("requestType", "retrieve"),
)
if rm.EndTs() <= serviceTime {
retrieveMsg = append(retrieveMsg, rm)
continue
}
rc.addToUnsolvedMsg(rm)
}
if len(retrieveMsg) <= 0 {
continue
}
for _, rm := range retrieveMsg {
sp, ctx := trace.StartSpanFromContext(rm.TraceCtx())
rm.SetTraceCtx(ctx)
log.Debug("Doing retrieve in doUnsolvedMsgRetrieve...",
zap.Int64("collectionID", rm.CollectionID),
zap.Int64("requestID", rm.ID()),
zap.Any("requestType", "retrieve"),
)
err := rc.retrieve(rm)
if err != nil {
log.Error(err.Error(),
zap.Int64("requestID", rm.ID()),
zap.Any("requestType", "retrieve"),
)
log.Debug("Failed to do retrieve in doUnsolvedMsgRetrieve, prepare to publish failed retrieve result",
zap.Int64("collectionID", rm.CollectionID),
zap.Int64("requestID", rm.ID()),
zap.Any("requestType", "retrieve"),
)
err2 := rc.publishFailedRetrieveResult(rm, err.Error())
if err2 != nil {
log.Error("Failed to publish FailedRetrieveResult",
zap.Error(err2),
zap.Int64("requestID", rm.ID()),
zap.Any("requestType", "retrieve"),
)
}
}
sp.Finish()
log.Debug("Do retrieve done in doUnsolvedMsgRetrieve",
zap.Int64("collectionID", rm.CollectionID),
zap.Int64("requestID", rm.ID()),
zap.Any("requestType", "retrieve"),
)
}
log.Debug("doUnsolvedMsgRetrieve, do retrieve done", zap.Int("num of retrieveMsg", len(retrieveMsg)))
}
}
}
func (rc *retrieveCollection) retrieve(retrieveMsg *msgstream.RetrieveMsg) error {
// TODO(yukun)
// step 1: get retrieve object and defer destruction
// step 2: for each segment, call retrieve to get ids proto buffer
// step 3: merge all proto in go
// step 4: publish results
// retrieveProtoBlob, err := proto.Marshal(&retrieveMsg.RetrieveRequest)
sp, ctx := trace.StartSpanFromContext(retrieveMsg.TraceCtx())
defer sp.Finish()
retrieveMsg.SetTraceCtx(ctx)
timestamp := retrieveMsg.RetrieveRequest.TravelTimestamp
collectionID := retrieveMsg.CollectionID
collection, err := rc.streaming.replica.getCollectionByID(collectionID)
if err != nil {
return err
}
req := &segcorepb.RetrieveRequest{
Ids: retrieveMsg.Ids,
OutputFields: retrieveMsg.OutputFields,
}
plan, err := createRetrievePlan(collection, req, timestamp)
if err != nil {
return err
}
defer plan.delete()
var partitionIDsInHistorical []UniqueID
var partitionIDsInStreaming []UniqueID
partitionIDsInQuery := retrieveMsg.PartitionIDs
if len(partitionIDsInQuery) == 0 {
partitionIDsInHistoricalCol, err1 := rc.historical.replica.getPartitionIDs(collectionID)
partitionIDsInStreamingCol, err2 := rc.streaming.replica.getPartitionIDs(collectionID)
if err1 != nil && err2 != nil {
return err2
}
if len(partitionIDsInHistoricalCol) == 0 {
return errors.New("none of this collection's partition has been loaded")
}
partitionIDsInHistorical = partitionIDsInHistoricalCol
partitionIDsInStreaming = partitionIDsInStreamingCol
} else {
for _, id := range partitionIDsInQuery {
_, err1 := rc.historical.replica.getPartitionByID(id)
if err1 == nil {
partitionIDsInHistorical = append(partitionIDsInHistorical, id)
}
_, err2 := rc.streaming.replica.getPartitionByID(id)
if err2 == nil {
partitionIDsInStreaming = append(partitionIDsInStreaming, id)
}
if err1 != nil && err2 != nil {
return err2
}
}
}
sealedSegmentRetrieved := make([]UniqueID, 0)
var mergeList []*segcorepb.RetrieveResults
for _, partitionID := range partitionIDsInHistorical {
segmentIDs, err := rc.historical.replica.getSegmentIDs(partitionID)
if err != nil {
return err
}
for _, segmentID := range segmentIDs {
segment, err := rc.historical.replica.getSegmentByID(segmentID)
if err != nil {
return err
}
result, err := segment.segmentGetEntityByIds(plan)
if err != nil {
return err
}
mergeList = append(mergeList, result)
sealedSegmentRetrieved = append(sealedSegmentRetrieved, segmentID)
}
}
for _, partitionID := range partitionIDsInStreaming {
segmentIDs, err := rc.streaming.replica.getSegmentIDs(partitionID)
if err != nil {
return err
}
for _, segmentID := range segmentIDs {
segment, err := rc.streaming.replica.getSegmentByID(segmentID)
if err != nil {
return err
}
result, err := segment.segmentGetEntityByIds(plan)
if err != nil {
return err
}
mergeList = append(mergeList, result)
}
}
result, err := mergeRetrieveResults(mergeList)
if err != nil {
return err
}
resultChannelInt := 0
retrieveResultMsg := &msgstream.RetrieveResultMsg{
BaseMsg: msgstream.BaseMsg{Ctx: retrieveMsg.Ctx, HashValues: []uint32{uint32(resultChannelInt)}},
RetrieveResults: internalpb.RetrieveResults{
Base: &commonpb.MsgBase{
MsgType: commonpb.MsgType_RetrieveResult,
MsgID: retrieveMsg.Base.MsgID,
SourceID: retrieveMsg.Base.SourceID,
},
Status: &commonpb.Status{ErrorCode: commonpb.ErrorCode_Success},
Ids: result.Ids,
FieldsData: result.FieldsData,
ResultChannelID: retrieveMsg.ResultChannelID,
SealedSegmentIDsRetrieved: sealedSegmentRetrieved,
ChannelIDsRetrieved: collection.getVChannels(),
//TODO(yukun):: get global sealed segment from etcd
GlobalSealedSegmentIDs: sealedSegmentRetrieved,
},
}
log.Debug("QueryNode RetrieveResultMsg",
zap.Any("vChannels", collection.getVChannels()),
zap.Any("collectionID", collection.ID()),
zap.Any("sealedSegmentRetrieved", sealedSegmentRetrieved),
)
err3 := rc.publishRetrieveResult(retrieveResultMsg, retrieveMsg.CollectionID)
if err3 != nil {
return err3
}
return nil
}
func (rc *retrieveCollection) publishRetrieveResult(msg msgstream.TsMsg, collectionID UniqueID) error {
log.Debug("publishing retrieve result...",
zap.Int64("msgID", msg.ID()),
zap.Int64("collectionID", collectionID))
span, ctx := trace.StartSpanFromContext(msg.TraceCtx())
defer span.Finish()
msg.SetTraceCtx(ctx)
msgPack := msgstream.MsgPack{}
msgPack.Msgs = append(msgPack.Msgs, msg)
err := rc.retrieveResultMsgStream.Produce(&msgPack)
if err != nil {
log.Error(err.Error())
} else {
log.Debug("publish retrieve result done",
zap.Int64("msgID", msg.ID()),
zap.Int64("collectionID", collectionID))
}
return err
}
func (rc *retrieveCollection) publishFailedRetrieveResult(retrieveMsg *msgstream.RetrieveMsg, errMsg string) error {
span, ctx := trace.StartSpanFromContext(retrieveMsg.TraceCtx())
defer span.Finish()
retrieveMsg.SetTraceCtx(ctx)
msgPack := msgstream.MsgPack{}
resultChannelInt := 0
retrieveResultMsg := &msgstream.RetrieveResultMsg{
BaseMsg: msgstream.BaseMsg{HashValues: []uint32{uint32(resultChannelInt)}},
RetrieveResults: internalpb.RetrieveResults{
Base: &commonpb.MsgBase{
MsgType: commonpb.MsgType_RetrieveResult,
MsgID: retrieveMsg.Base.MsgID,
Timestamp: retrieveMsg.Base.Timestamp,
SourceID: retrieveMsg.Base.SourceID,
},
Status: &commonpb.Status{ErrorCode: commonpb.ErrorCode_UnexpectedError, Reason: errMsg},
ResultChannelID: retrieveMsg.ResultChannelID,
Ids: nil,
FieldsData: nil,
},
}
msgPack.Msgs = append(msgPack.Msgs, retrieveResultMsg)
err := rc.retrieveResultMsgStream.Produce(&msgPack)
if err != nil {
return err
}
return nil
}

View File

@ -1,54 +0,0 @@
package querynode
import (
"testing"
"github.com/stretchr/testify/assert"
"github.com/milvus-io/milvus/internal/proto/schemapb"
"github.com/milvus-io/milvus/internal/proto/segcorepb"
)
func TestRetrieve_Merge(t *testing.T) {
col1 := &schemapb.FieldData{
Field: &schemapb.FieldData_Scalars{
Scalars: &schemapb.ScalarField{
Data: &schemapb.ScalarField_IntData{
IntData: &schemapb.IntArray{
Data: []int32{1, 2, 3},
},
},
},
},
}
col2 := &schemapb.FieldData{
Field: &schemapb.FieldData_Vectors{
Vectors: &schemapb.VectorField{
Data: &schemapb.VectorField_FloatVector{
FloatVector: &schemapb.FloatArray{
Data: []float32{1, 1, 2, 2, 3, 3},
},
},
},
},
}
subRes := &segcorepb.RetrieveResults{
Ids: &schemapb.IDs{
IdField: &schemapb.IDs_IntId{
IntId: &schemapb.LongArray{
Data: []int64{1, 2, 3},
},
},
},
FieldsData: []*schemapb.FieldData{
col1,
col2,
},
}
finalRes, err := mergeRetrieveResults([]*segcorepb.RetrieveResults{subRes, subRes})
assert.NoError(t, err)
println(finalRes.String())
}

View File

@ -1,183 +0,0 @@
// Copyright (C) 2019-2020 Zilliz. All rights reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance
// with the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software distributed under the License
// is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
// or implied. See the License for the specific language governing permissions and limitations under the License.
package querynode
import (
"context"
"errors"
"strconv"
"go.uber.org/zap"
"github.com/milvus-io/milvus/internal/log"
"github.com/milvus-io/milvus/internal/msgstream"
"github.com/milvus-io/milvus/internal/util/trace"
)
type retrieveService struct {
ctx context.Context
cancel context.CancelFunc
historical *historical
streaming *streaming
retrieveMsgStream msgstream.MsgStream
retrieveResultMsgStream msgstream.MsgStream
queryNodeID UniqueID
retrieveCollections map[UniqueID]*retrieveCollection
}
func newRetrieveService(ctx context.Context,
historical *historical,
streaming *streaming,
factory msgstream.Factory) *retrieveService {
retrieveStream, _ := factory.NewQueryMsgStream(ctx)
retrieveResultStream, _ := factory.NewQueryMsgStream(ctx)
if len(Params.SearchChannelNames) > 0 && len(Params.SearchResultChannelNames) > 0 {
consumeChannels := Params.SearchChannelNames
consumeSubName := "RetrieveSubName"
retrieveStream.AsConsumer(consumeChannels, consumeSubName)
log.Debug("query node AsConsumer", zap.Any("retrieveChannels", consumeChannels), zap.Any("consumeSubName", consumeSubName))
producerChannels := Params.SearchResultChannelNames
retrieveResultStream.AsProducer(producerChannels)
log.Debug("query node AsProducer", zap.Any("retrieveResultChannels", producerChannels))
}
retrieveServiceCtx, retrieveServiceCancel := context.WithCancel(ctx)
return &retrieveService{
ctx: retrieveServiceCtx,
cancel: retrieveServiceCancel,
historical: historical,
streaming: streaming,
retrieveMsgStream: retrieveStream,
retrieveResultMsgStream: retrieveResultStream,
queryNodeID: Params.QueryNodeID,
retrieveCollections: make(map[UniqueID]*retrieveCollection),
}
}
func (rs *retrieveService) start() {
rs.retrieveMsgStream.Start()
rs.retrieveResultMsgStream.Start()
rs.consumeRetrieve()
}
func (rs *retrieveService) collectionCheck(collectionID UniqueID) error {
if ok := rs.historical.replica.hasCollection(collectionID); !ok {
err := errors.New("no collection found, collectionID = " + strconv.FormatInt(collectionID, 10))
log.Error(err.Error())
return err
}
return nil
}
func (rs *retrieveService) consumeRetrieve() {
for {
select {
case <-rs.ctx.Done():
return
default:
msgPack := rs.retrieveMsgStream.Consume()
if msgPack == nil || len(msgPack.Msgs) <= 0 {
continue
}
for _, msg := range msgPack.Msgs {
rm, ok := msg.(*msgstream.RetrieveMsg)
if !ok {
// Not a retrieve request, discard
continue
}
log.Info("RetrieveService consume retrieve message",
zap.Int64("collectionID", rm.CollectionID),
zap.Int64("requestID", msg.ID()),
zap.Any("requestType", "retrieve"),
)
sp, ctx := trace.StartSpanFromContext(rm.TraceCtx())
rm.SetTraceCtx(ctx)
err := rs.collectionCheck(rm.CollectionID)
if err != nil {
log.Debug("Failed to check collection exist, discard.",
zap.Int64("collectionID", rm.CollectionID),
zap.Int64("requestID", msg.ID()),
zap.Any("requestType", "retrieve"),
)
continue
}
_, ok = rs.retrieveCollections[rm.CollectionID]
if !ok {
rs.startRetrieveCollection(rm.CollectionID)
log.Debug("Receive retrieve request on new collection, start an new retrieve collection service",
zap.Int64("collectionID", rm.CollectionID),
zap.Int64("requestID", msg.ID()),
zap.Any("requestType", "retrieve"),
)
}
rs.retrieveCollections[rm.CollectionID].msgBuffer <- rm
log.Info("Put retrieve msg into msgBuffer",
zap.Any("requestID", msg.ID),
zap.Any("requestType", "retrieve"),
)
sp.Finish()
}
}
}
}
func (rs *retrieveService) close() {
if rs.retrieveMsgStream != nil {
rs.retrieveMsgStream.Close()
}
if rs.retrieveResultMsgStream != nil {
rs.retrieveResultMsgStream.Close()
}
for collectionID := range rs.retrieveCollections {
rs.stopRetrieveCollection(collectionID)
}
rs.retrieveCollections = make(map[UniqueID]*retrieveCollection)
rs.cancel()
}
func (rs *retrieveService) startRetrieveCollection(collectionID UniqueID) {
ctx1, cancel := context.WithCancel(rs.ctx)
rc := newRetrieveCollection(ctx1,
cancel,
collectionID,
rs.historical,
rs.streaming,
rs.retrieveResultMsgStream)
rs.retrieveCollections[collectionID] = rc
rc.start()
}
func (rs *retrieveService) hasRetrieveCollection(collectionID UniqueID) bool {
_, ok := rs.retrieveCollections[collectionID]
return ok
}
func (rs *retrieveService) stopRetrieveCollection(collectionID UniqueID) {
rc, ok := rs.retrieveCollections[collectionID]
if !ok {
log.Error("stopRetrieveCollection failed, collection doesn't exist", zap.Int64("collectionID", collectionID))
}
rc.cancel()
delete(rs.retrieveCollections, collectionID)
}

View File

@ -425,7 +425,7 @@ func TestSegment_segmentSearch(t *testing.T) {
log.Print("marshal placeholderGroup failed") log.Print("marshal placeholderGroup failed")
} }
searchTimestamp := Timestamp(1020) travelTimestamp := Timestamp(1020)
plan, err := createPlan(collection, dslString) plan, err := createPlan(collection, dslString)
assert.NoError(t, err) assert.NoError(t, err)
holder, err := parseSearchRequest(plan, placeHolderGroupBlob) holder, err := parseSearchRequest(plan, placeHolderGroupBlob)
@ -436,7 +436,7 @@ func TestSegment_segmentSearch(t *testing.T) {
searchResults := make([]*SearchResult, 0) searchResults := make([]*SearchResult, 0)
matchedSegments := make([]*Segment, 0) matchedSegments := make([]*Segment, 0)
searchResult, err := segment.segmentSearch(plan, placeholderGroups, []Timestamp{searchTimestamp}) searchResult, err := segment.segmentSearch(plan, placeholderGroups, []Timestamp{travelTimestamp})
assert.Nil(t, err) assert.Nil(t, err)
searchResults = append(searchResults, searchResult) searchResults = append(searchResults, searchResult)