From d3784c65156ff7468764eb4f5e6b832ea07bba58 Mon Sep 17 00:00:00 2001 From: Gao Date: Fri, 19 Sep 2025 20:20:02 +0800 Subject: [PATCH] enhance: add storage resource usage for vector search (#44308) issue: #44212 Implement search/query storage usage statistics in go side(result reduce), only record storage usage in vector search C++ path. Need to be implemented in query c++ path in next prs. --------- Signed-off-by: chasingegg Signed-off-by: marcelo.chen Co-authored-by: marcelo.chen --- internal/core/src/common/QueryResult.h | 62 ++ .../src/common/VectorArrayStorageV2Test.cpp | 6 +- .../src/exec/operator/VectorSearchNode.cpp | 6 + internal/core/src/index/SkipIndex.cpp | 2 +- internal/core/src/index/SkipIndex.h | 7 + internal/core/src/index/VectorDiskIndex.cpp | 7 +- internal/core/src/index/VectorDiskIndex.h | 1 + internal/core/src/index/VectorIndex.h | 2 + internal/core/src/index/VectorMemIndex.cpp | 6 +- internal/core/src/index/VectorMemIndex.h | 1 + .../core/src/indexbuilder/VecIndexCreator.cpp | 6 +- .../core/src/indexbuilder/VecIndexCreator.h | 3 +- internal/core/src/mmap/ChunkedColumn.h | 52 +- internal/core/src/mmap/ChunkedColumnGroup.h | 6 +- .../core/src/query/ExecPlanNodeVisitor.cpp | 42 - internal/core/src/query/SearchBruteForce.cpp | 33 +- internal/core/src/query/SearchBruteForce.h | 4 +- .../src/query/SearchBruteForceSparseTest.cpp | 9 +- .../core/src/query/SearchBruteForceTest.cpp | 3 +- internal/core/src/query/SearchOnGrowing.cpp | 24 +- internal/core/src/query/SearchOnGrowing.h | 2 + internal/core/src/query/SearchOnIndex.cpp | 3 +- internal/core/src/query/SearchOnIndex.h | 1 + internal/core/src/query/SearchOnSealed.cpp | 11 +- internal/core/src/query/SearchOnSealed.h | 2 + .../src/segcore/ChunkedSegmentSealedImpl.cpp | 16 +- .../src/segcore/ChunkedSegmentSealedImpl.h | 3 +- .../src/segcore/ChunkedSegmentSealedTest.cpp | 4 +- internal/core/src/segcore/ReduceCTest.cpp | 98 ++ .../core/src/segcore/SegmentGrowingImpl.cpp | 2 + .../core/src/segcore/SegmentGrowingImpl.h | 1 + internal/core/src/segcore/SegmentInterface.h | 2 + internal/core/src/segcore/SegmentSealed.h | 2 +- .../core/src/segcore/load_index_c_test.cpp | 30 +- internal/core/src/segcore/reduce/Reduce.cpp | 32 +- internal/core/src/segcore/reduce/Reduce.h | 12 +- .../core/src/segcore/reduce/StreamReduce.cpp | 23 +- .../core/src/segcore/reduce/StreamReduce.h | 10 +- internal/core/src/segcore/reduce_c.cpp | 6 + internal/core/src/segcore/reduce_c.h | 2 + internal/core/src/segcore/segment_c_test.cpp | 6 +- .../storagev1translator/ChunkTranslator.h | 7 + .../DefaultValueChunkTranslator.h | 7 + .../InterimSealedIndexTranslator.cpp | 16 +- .../InterimSealedIndexTranslator.h | 7 + .../SealedIndexTranslator.cpp | 9 +- .../SealedIndexTranslator.h | 7 + .../V1SealedIndexTranslator.h | 7 + .../GroupChunkTranslator.h | 6 + .../core/thirdparty/knowhere/CMakeLists.txt | 2 +- .../thirdparty/milvus-common/CMakeLists.txt | 2 +- internal/core/unittest/test_index_wrapper.cpp | 6 +- internal/core/unittest/test_indexing.cpp | 24 +- internal/core/unittest/test_sealed.cpp | 6 +- internal/core/unittest/test_string_expr.cpp | 3 +- .../test_utils/cachinglayer_test_utils.h | 15 + internal/mocks/util/mock_segcore/mock_data.go | 2 +- internal/proxy/impl.go | 58 +- internal/proxy/search_pipeline.go | 52 +- internal/proxy/search_pipeline_test.go | 36 +- internal/proxy/task_query.go | 6 + internal/proxy/task_search.go | 8 +- internal/proxy/task_search_test.go | 13 +- internal/proxy/task_upsert.go | 3 +- internal/proxy/task_upsert_test.go | 5 +- internal/proxy/util.go | 18 + .../querynodev2/segments/count_reducer.go | 12 + internal/querynodev2/segments/result.go | 18 +- internal/querynodev2/segments/result_test.go | 58 +- internal/querynodev2/segments/retrieve.go | 2 + internal/querynodev2/tasks/query_task.go | 6 +- internal/querynodev2/tasks/search_task.go | 10 +- internal/util/segcore/reduce.go | 15 +- internal/util/streamrpc/streamer.go | 4 + pkg/metrics/proxy_metrics.go | 42 + pkg/proto/internal.proto | 4 + pkg/proto/internalpb/internal.pb.go | 902 +++++++++--------- pkg/proto/segcore.proto | 2 + pkg/proto/segcorepb/segcore.pb.go | 148 +-- tests/python_client/requirements.txt | 4 +- 80 files changed, 1363 insertions(+), 739 deletions(-) diff --git a/internal/core/src/common/QueryResult.h b/internal/core/src/common/QueryResult.h index d95667c105..78eb4a48af 100644 --- a/internal/core/src/common/QueryResult.h +++ b/internal/core/src/common/QueryResult.h @@ -33,6 +33,64 @@ namespace milvus { +// scan cost in each search/query +struct StorageCost { + int64_t scanned_remote_bytes = 0; + int64_t scanned_total_bytes = 0; + + StorageCost() = default; + + StorageCost(int64_t scanned_remote_bytes, int64_t scanned_total_bytes) + : scanned_remote_bytes(scanned_remote_bytes), + scanned_total_bytes(scanned_total_bytes) { + } + + StorageCost + operator+(const StorageCost& rhs) const { + return {scanned_remote_bytes + rhs.scanned_remote_bytes, + scanned_total_bytes + rhs.scanned_total_bytes}; + } + + void + operator+=(const StorageCost& rhs) { + scanned_remote_bytes += rhs.scanned_remote_bytes; + scanned_total_bytes += rhs.scanned_total_bytes; + } + + StorageCost + operator*(const double factor) const { + return {static_cast(scanned_remote_bytes * factor), + static_cast(scanned_total_bytes * factor)}; + } + + void + operator*=(const double factor) { + scanned_remote_bytes = + static_cast(scanned_remote_bytes * factor); + scanned_total_bytes = + static_cast(scanned_total_bytes * factor); + } + + void + operator=(const StorageCost& rhs) { + scanned_remote_bytes = rhs.scanned_remote_bytes; + scanned_total_bytes = rhs.scanned_total_bytes; + } + + std::string + ToString() const { + return fmt::format("scanned_remote_bytes: {}, scanned_total_bytes: {}", + scanned_remote_bytes, + scanned_total_bytes); + } +}; + +inline std::ostream& +operator<<(std::ostream& os, const StorageCost& cost) { + os << cost.ToString(); + return os; +} + struct OffsetDisPair { private: std::pair off_dis_; @@ -215,6 +273,8 @@ struct SearchResult { //Vector iterators, used for group by std::optional>> vector_iterators_; + // record the storage usage in search + StorageCost search_storage_cost_; }; using SearchResultPtr = std::shared_ptr; @@ -229,6 +289,8 @@ struct RetrieveResult { std::vector result_offsets_; std::vector field_data_; bool has_more_result = true; + // record the storage usage in retrieve + StorageCost retrieve_storage_cost_; }; using RetrieveResultPtr = std::shared_ptr; diff --git a/internal/core/src/common/VectorArrayStorageV2Test.cpp b/internal/core/src/common/VectorArrayStorageV2Test.cpp index 66422cc00a..46a1485af2 100644 --- a/internal/core/src/common/VectorArrayStorageV2Test.cpp +++ b/internal/core/src/common/VectorArrayStorageV2Test.cpp @@ -342,10 +342,14 @@ TEST_F(TestVectorArrayStorageV2, BuildEmbListHNSWIndex) { searchInfo.metric_type_ = knowhere::metric::MAX_SIM; searchInfo.search_params_ = search_conf; SearchResult result; - vec_index->Query(query_dataset, searchInfo, nullptr, result); + milvus::OpContext op_context; + vec_index->Query( + query_dataset, searchInfo, nullptr, &op_context, result); auto ref_result = SearchResultToJson(result); std::cout << ref_result.dump(1) << std::endl; EXPECT_EQ(result.total_nq_, 2); EXPECT_EQ(result.distances_.size(), 2 * searchInfo.topk_); + EXPECT_EQ(op_context.storage_usage.scanned_cold_bytes, 0); + EXPECT_EQ(op_context.storage_usage.scanned_total_bytes, 0); } } diff --git a/internal/core/src/exec/operator/VectorSearchNode.cpp b/internal/core/src/exec/operator/VectorSearchNode.cpp index f08eec39da..f97dd1ba20 100644 --- a/internal/core/src/exec/operator/VectorSearchNode.cpp +++ b/internal/core/src/exec/operator/VectorSearchNode.cpp @@ -84,15 +84,21 @@ PhyVectorSearchNode::GetOutput() { // TODO: uniform knowhere BitsetView and milvus BitsetView milvus::BitsetView final_view((uint8_t*)col_input->GetRawData(), col_input->size()); + milvus::OpContext op_context; segment_->vector_search(search_info_, src_data, src_lims, num_queries, query_timestamp_, final_view, + &op_context, search_result); search_result.total_data_cnt_ = final_view.size(); + search_result.search_storage_cost_.scanned_remote_bytes = + op_context.storage_usage.scanned_cold_bytes.load(); + search_result.search_storage_cost_.scanned_total_bytes = + op_context.storage_usage.scanned_total_bytes.load(); query_context_->set_search_result(std::move(search_result)); std::chrono::high_resolution_clock::time_point vector_end = std::chrono::high_resolution_clock::now(); diff --git a/internal/core/src/index/SkipIndex.cpp b/internal/core/src/index/SkipIndex.cpp index 92d8b59cdc..28bde089cb 100644 --- a/internal/core/src/index/SkipIndex.cpp +++ b/internal/core/src/index/SkipIndex.cpp @@ -25,7 +25,7 @@ SkipIndex::GetFieldChunkMetrics(milvus::FieldId field_id, int chunk_id) const { if (field_metrics != fieldChunkMetrics_.end()) { auto& field_chunk_metrics = field_metrics->second; auto ca = cachinglayer::SemiInlineGet( - field_chunk_metrics->PinCells({chunk_id})); + field_chunk_metrics->PinCells(nullptr, {chunk_id})); auto metrics = ca->get_cell_of(chunk_id); return cachinglayer::PinWrapper(ca, metrics); } diff --git a/internal/core/src/index/SkipIndex.h b/internal/core/src/index/SkipIndex.h index 304fbf38df..d791c31944 100644 --- a/internal/core/src/index/SkipIndex.h +++ b/internal/core/src/index/SkipIndex.h @@ -11,6 +11,7 @@ #pragma once +#include #include #include "cachinglayer/CacheSlot.h" @@ -112,6 +113,12 @@ class FieldChunkMetricsTranslator return &meta_; } + int64_t + cells_storage_bytes( + const std::vector& cids) const override { + return 0; + } + private: // todo: support some null_count_ skip diff --git a/internal/core/src/index/VectorDiskIndex.cpp b/internal/core/src/index/VectorDiskIndex.cpp index e3410dcfa3..1a89283f86 100644 --- a/internal/core/src/index/VectorDiskIndex.cpp +++ b/internal/core/src/index/VectorDiskIndex.cpp @@ -245,6 +245,7 @@ void VectorDiskAnnIndex::Query(const DatasetPtr dataset, const SearchInfo& search_info, const BitsetView& bitset, + milvus::OpContext* op_context, SearchResult& search_result) const { AssertInfo(GetMetricType() == search_info.metric_type_, "Metric type of field index isn't the same with search info"); @@ -272,7 +273,8 @@ VectorDiskAnnIndex::Query(const DatasetPtr dataset, auto final = [&] { if (CheckAndUpdateKnowhereRangeSearchParam( search_info, topk, GetMetricType(), search_config)) { - auto res = index_.RangeSearch(dataset, search_config, bitset); + auto res = + index_.RangeSearch(dataset, search_config, bitset, op_context); if (!res.has_value()) { ThrowInfo(ErrorCode::UnexpectedError, fmt::format("failed to range search: {}: {}", @@ -282,7 +284,8 @@ VectorDiskAnnIndex::Query(const DatasetPtr dataset, return ReGenRangeSearchResult( res.value(), topk, num_rows, GetMetricType()); } else { - auto res = index_.Search(dataset, search_config, bitset); + auto res = + index_.Search(dataset, search_config, bitset, op_context); if (!res.has_value()) { ThrowInfo(ErrorCode::UnexpectedError, fmt::format("failed to search: {}: {}", diff --git a/internal/core/src/index/VectorDiskIndex.h b/internal/core/src/index/VectorDiskIndex.h index 305a432515..52b39c2023 100644 --- a/internal/core/src/index/VectorDiskIndex.h +++ b/internal/core/src/index/VectorDiskIndex.h @@ -72,6 +72,7 @@ class VectorDiskAnnIndex : public VectorIndex { Query(const DatasetPtr dataset, const SearchInfo& search_info, const BitsetView& bitset, + milvus::OpContext* op_context, SearchResult& search_result) const override; const bool diff --git a/internal/core/src/index/VectorIndex.h b/internal/core/src/index/VectorIndex.h index ea6f168ab3..95e7cdb6af 100644 --- a/internal/core/src/index/VectorIndex.h +++ b/internal/core/src/index/VectorIndex.h @@ -29,6 +29,7 @@ #include "common/BitsetView.h" #include "common/QueryResult.h" #include "common/QueryInfo.h" +#include "common/OpContext.h" #include "knowhere/version.h" namespace milvus::index { @@ -58,6 +59,7 @@ class VectorIndex : public IndexBase { Query(const DatasetPtr dataset, const SearchInfo& search_info, const BitsetView& bitset, + milvus::OpContext* op_context, SearchResult& search_result) const = 0; virtual knowhere::expected> diff --git a/internal/core/src/index/VectorMemIndex.cpp b/internal/core/src/index/VectorMemIndex.cpp index 68fdc0c2d7..a2f399f871 100644 --- a/internal/core/src/index/VectorMemIndex.cpp +++ b/internal/core/src/index/VectorMemIndex.cpp @@ -473,6 +473,7 @@ void VectorMemIndex::Query(const DatasetPtr dataset, const SearchInfo& search_info, const BitsetView& bitset, + milvus::OpContext* op_context, SearchResult& search_result) const { // AssertInfo(GetMetricType() == search_info.metric_type_, // "Metric type of field index isn't the same with search info"); @@ -486,7 +487,8 @@ VectorMemIndex::Query(const DatasetPtr dataset, if (CheckAndUpdateKnowhereRangeSearchParam( search_info, topk, GetMetricType(), search_conf)) { milvus::tracer::AddEvent("start_knowhere_index_range_search"); - auto res = index_.RangeSearch(dataset, search_conf, bitset); + auto res = + index_.RangeSearch(dataset, search_conf, bitset, op_context); milvus::tracer::AddEvent("finish_knowhere_index_range_search"); if (!res.has_value()) { ThrowInfo(ErrorCode::UnexpectedError, @@ -500,7 +502,7 @@ VectorMemIndex::Query(const DatasetPtr dataset, return result; } else { milvus::tracer::AddEvent("start_knowhere_index_search"); - auto res = index_.Search(dataset, search_conf, bitset); + auto res = index_.Search(dataset, search_conf, bitset, op_context); milvus::tracer::AddEvent("finish_knowhere_index_search"); if (!res.has_value()) { ThrowInfo( diff --git a/internal/core/src/index/VectorMemIndex.h b/internal/core/src/index/VectorMemIndex.h index d6975a7236..c51bd47856 100644 --- a/internal/core/src/index/VectorMemIndex.h +++ b/internal/core/src/index/VectorMemIndex.h @@ -79,6 +79,7 @@ class VectorMemIndex : public VectorIndex { Query(const DatasetPtr dataset, const SearchInfo& search_info, const BitsetView& bitset, + milvus::OpContext* op_context, SearchResult& search_result) const override; const bool diff --git a/internal/core/src/indexbuilder/VecIndexCreator.cpp b/internal/core/src/indexbuilder/VecIndexCreator.cpp index 124dc4cd39..de3bd2ddd0 100644 --- a/internal/core/src/indexbuilder/VecIndexCreator.cpp +++ b/internal/core/src/indexbuilder/VecIndexCreator.cpp @@ -84,10 +84,12 @@ VecIndexCreator::Load(const milvus::BinarySet& binary_set) { std::unique_ptr VecIndexCreator::Query(const milvus::DatasetPtr& dataset, const SearchInfo& search_info, - const BitsetView& bitset) { + const BitsetView& bitset, + milvus::OpContext* op_context) { auto vector_index = dynamic_cast(index_.get()); auto search_result = std::make_unique(); - vector_index->Query(dataset, search_info, bitset, *search_result); + vector_index->Query( + dataset, search_info, bitset, op_context, *search_result); return search_result; } diff --git a/internal/core/src/indexbuilder/VecIndexCreator.h b/internal/core/src/indexbuilder/VecIndexCreator.h index d9cb2ac054..6f89c273a3 100644 --- a/internal/core/src/indexbuilder/VecIndexCreator.h +++ b/internal/core/src/indexbuilder/VecIndexCreator.h @@ -56,7 +56,8 @@ class VecIndexCreator : public IndexCreatorBase { std::unique_ptr Query(const milvus::DatasetPtr& dataset, const SearchInfo& search_info, - const BitsetView& bitset); + const BitsetView& bitset, + milvus::OpContext* op_context); index::IndexStatsPtr Upload() override; diff --git a/internal/core/src/mmap/ChunkedColumn.h b/internal/core/src/mmap/ChunkedColumn.h index 396e70ca3f..c176bf77ed 100644 --- a/internal/core/src/mmap/ChunkedColumn.h +++ b/internal/core/src/mmap/ChunkedColumn.h @@ -135,7 +135,7 @@ class ChunkedColumnBase : public ChunkedColumnInterface { PinWrapper DataOfChunk(int chunk_id) const override { - auto ca = SemiInlineGet(slot_->PinCells({chunk_id})); + auto ca = SemiInlineGet(slot_->PinCells(nullptr, {chunk_id})); auto chunk = ca->get_cell_of(chunk_id); return PinWrapper(ca, chunk->Data()); } @@ -146,8 +146,8 @@ class ChunkedColumnBase : public ChunkedColumnInterface { return true; } auto [chunk_id, offset_in_chunk] = GetChunkIDByOffset(offset); - auto ca = - SemiInlineGet(slot_->PinCells({static_cast(chunk_id)})); + auto ca = SemiInlineGet( + slot_->PinCells(nullptr, {static_cast(chunk_id)})); auto chunk = ca->get_cell_of(chunk_id); return chunk->isValid(offset_in_chunk); } @@ -169,7 +169,7 @@ class ChunkedColumnBase : public ChunkedColumnInterface { } // nullable: if (offsets == nullptr) { - auto ca = SemiInlineGet(slot_->PinAllCells()); + auto ca = SemiInlineGet(slot_->PinAllCells(nullptr)); for (int64_t i = 0; i < num_rows_; i++) { auto [cid, offset_in_chunk] = GetChunkIDByOffset(i); auto chunk = ca->get_cell_of(cid); @@ -178,7 +178,7 @@ class ChunkedColumnBase : public ChunkedColumnInterface { } } else { auto [cids, offsets_in_chunk] = ToChunkIdAndOffset(offsets, count); - auto ca = SemiInlineGet(slot_->PinCells(cids)); + auto ca = SemiInlineGet(slot_->PinCells(nullptr, cids)); for (int64_t i = 0; i < count; i++) { auto chunk = ca->get_cell_of(cids[i]); auto valid = chunk->isValid(offsets_in_chunk[i]); @@ -322,14 +322,14 @@ class ChunkedColumnBase : public ChunkedColumnInterface { PinWrapper GetChunk(int64_t chunk_id) const override { - auto ca = SemiInlineGet(slot_->PinCells({chunk_id})); + auto ca = SemiInlineGet(slot_->PinCells(nullptr, {chunk_id})); auto chunk = ca->get_cell_of(chunk_id); return PinWrapper(ca, chunk); } std::vector> GetAllChunks() const override { - auto ca = SemiInlineGet(slot_->PinAllCells()); + auto ca = SemiInlineGet(slot_->PinAllCells(nullptr)); std::vector> ret; ret.reserve(num_chunks_); for (size_t i = 0; i < num_chunks_; i++) { @@ -373,7 +373,7 @@ class ChunkedColumn : public ChunkedColumnBase { const int64_t* offsets, int64_t count) override { auto [cids, offsets_in_chunk] = ToChunkIdAndOffset(offsets, count); - auto ca = SemiInlineGet(slot_->PinCells(cids)); + auto ca = SemiInlineGet(slot_->PinCells(nullptr, cids)); for (int64_t i = 0; i < count; i++) { fn(ca->get_cell_of(cids[i])->ValueAt(offsets_in_chunk[i]), i); } @@ -384,7 +384,7 @@ class ChunkedColumn : public ChunkedColumnBase { BulkPrimitiveValueAtImpl(void* dst, const int64_t* offsets, int64_t count) { static_assert(std::is_fundamental_v && std::is_fundamental_v); auto [cids, offsets_in_chunk] = ToChunkIdAndOffset(offsets, count); - auto ca = SemiInlineGet(slot_->PinCells(cids)); + auto ca = SemiInlineGet(slot_->PinCells(nullptr, cids)); auto typed_dst = static_cast(dst); for (int64_t i = 0; i < count; i++) { auto chunk = ca->get_cell_of(cids[i]); @@ -443,7 +443,7 @@ class ChunkedColumn : public ChunkedColumnBase { int64_t element_sizeof, int64_t count) override { auto [cids, offsets_in_chunk] = ToChunkIdAndOffset(offsets, count); - auto ca = SemiInlineGet(slot_->PinCells(cids)); + auto ca = SemiInlineGet(slot_->PinCells(nullptr, cids)); auto dst_vec = reinterpret_cast(dst); for (int64_t i = 0; i < count; i++) { auto chunk = ca->get_cell_of(cids[i]); @@ -454,7 +454,7 @@ class ChunkedColumn : public ChunkedColumnBase { PinWrapper Span(int64_t chunk_id) const override { - auto ca = SemiInlineGet(slot_->PinCells({chunk_id})); + auto ca = SemiInlineGet(slot_->PinCells(nullptr, {chunk_id})); auto chunk = ca->get_cell_of(chunk_id); return PinWrapper( ca, static_cast(chunk)->Span()); @@ -479,7 +479,7 @@ class ChunkedVariableColumn : public ChunkedColumnBase { StringViews(int64_t chunk_id, std::optional> offset_len = std::nullopt) const override { - auto ca = SemiInlineGet(slot_->PinCells({chunk_id})); + auto ca = SemiInlineGet(slot_->PinCells(nullptr, {chunk_id})); auto chunk = ca->get_cell_of(chunk_id); return PinWrapper< std::pair, FixedVector>>( @@ -489,7 +489,7 @@ class ChunkedVariableColumn : public ChunkedColumnBase { PinWrapper, FixedVector>> StringViewsByOffsets(int64_t chunk_id, const FixedVector& offsets) const override { - auto ca = SemiInlineGet(slot_->PinCells({chunk_id})); + auto ca = SemiInlineGet(slot_->PinCells(nullptr, {chunk_id})); auto chunk = ca->get_cell_of(chunk_id); return PinWrapper< std::pair, FixedVector>>( @@ -507,7 +507,7 @@ class ChunkedVariableColumn : public ChunkedColumnBase { } std::shared_ptr> ca{nullptr}; if (offsets == nullptr) { - ca = SemiInlineGet(slot_->PinAllCells()); + auto ca = SemiInlineGet(slot_->PinAllCells(nullptr)); for (int64_t i = 0; i < num_rows_; i++) { auto [cid, offset_in_chunk] = GetChunkIDByOffset(i); auto chunk = ca->get_cell_of(cid); @@ -519,7 +519,7 @@ class ChunkedVariableColumn : public ChunkedColumnBase { } } else { auto [cids, offsets_in_chunk] = ToChunkIdAndOffset(offsets, count); - ca = SemiInlineGet(slot_->PinCells(cids)); + auto ca = SemiInlineGet(slot_->PinCells(nullptr, cids)); for (int64_t i = 0; i < count; i++) { auto chunk = ca->get_cell_of(cids[i]); auto valid = @@ -545,7 +545,7 @@ class ChunkedVariableColumn : public ChunkedColumnBase { return; } auto [cids, offsets_in_chunk] = ToChunkIdAndOffset(offsets, count); - auto ca = SemiInlineGet(slot_->PinCells(cids)); + auto ca = SemiInlineGet(slot_->PinCells(nullptr, cids)); for (int64_t i = 0; i < count; i++) { auto chunk = ca->get_cell_of(cids[i]); auto valid = nullable_ ? chunk->isValid(offsets_in_chunk[i]) : true; @@ -567,7 +567,7 @@ class ChunkedVariableColumn : public ChunkedColumnBase { "row_offsets and value_offsets must be provided"); auto [cids, offsets_in_chunk] = ToChunkIdAndOffset(row_offsets, count); - auto ca = SemiInlineGet(slot_->PinCells(cids)); + auto ca = SemiInlineGet(slot_->PinCells(nullptr, cids)); for (int64_t i = 0; i < count; i++) { auto chunk = ca->get_cell_of(cids[i]); auto str_view = static_cast(chunk)->operator[]( @@ -593,7 +593,7 @@ class ChunkedArrayColumn : public ChunkedColumnBase { const int64_t* offsets, int64_t count) const override { auto [cids, offsets_in_chunk] = ToChunkIdAndOffset(offsets, count); - auto ca = SemiInlineGet(slot_->PinCells(cids)); + auto ca = SemiInlineGet(slot_->PinCells(nullptr, cids)); for (int64_t i = 0; i < count; i++) { auto array = static_cast(ca->get_cell_of(cids[i])) ->View(offsets_in_chunk[i]) @@ -606,8 +606,8 @@ class ChunkedArrayColumn : public ChunkedColumnBase { ArrayViews(int64_t chunk_id, std::optional> offset_len = std::nullopt) const override { - auto ca = - SemiInlineGet(slot_->PinCells({static_cast(chunk_id)})); + auto ca = SemiInlineGet( + slot_->PinCells(nullptr, {static_cast(chunk_id)})); auto chunk = ca->get_cell_of(chunk_id); return PinWrapper, FixedVector>>( ca, static_cast(chunk)->Views(offset_len)); @@ -616,7 +616,7 @@ class ChunkedArrayColumn : public ChunkedColumnBase { PinWrapper, FixedVector>> ArrayViewsByOffsets(int64_t chunk_id, const FixedVector& offsets) const override { - auto ca = SemiInlineGet(slot_->PinCells({chunk_id})); + auto ca = SemiInlineGet(slot_->PinCells(nullptr, {chunk_id})); auto chunk = ca->get_cell_of(chunk_id); return PinWrapper, FixedVector>>( ca, static_cast(chunk)->ViewsByOffsets(offsets)); @@ -636,7 +636,7 @@ class ChunkedVectorArrayColumn : public ChunkedColumnBase { const int64_t* offsets, int64_t count) const override { auto [cids, offsets_in_chunk] = ToChunkIdAndOffset(offsets, count); - auto ca = SemiInlineGet(slot_->PinCells(cids)); + auto ca = SemiInlineGet(slot_->PinCells(nullptr, cids)); for (int64_t i = 0; i < count; i++) { auto array = static_cast(ca->get_cell_of(cids[i])) @@ -650,8 +650,8 @@ class ChunkedVectorArrayColumn : public ChunkedColumnBase { VectorArrayViews(int64_t chunk_id, std::optional> offset_len = std::nullopt) const override { - auto ca = - SemiInlineGet(slot_->PinCells({static_cast(chunk_id)})); + auto ca = SemiInlineGet( + slot_->PinCells(nullptr, {static_cast(chunk_id)})); auto chunk = ca->get_cell_of(chunk_id); return PinWrapper< std::pair, FixedVector>>( @@ -660,8 +660,8 @@ class ChunkedVectorArrayColumn : public ChunkedColumnBase { PinWrapper VectorArrayLims(int64_t chunk_id) const override { - auto ca = - SemiInlineGet(slot_->PinCells({static_cast(chunk_id)})); + auto ca = SemiInlineGet( + slot_->PinCells(nullptr, {static_cast(chunk_id)})); auto chunk = ca->get_cell_of(chunk_id); return PinWrapper( ca, static_cast(chunk)->Lims()); diff --git a/internal/core/src/mmap/ChunkedColumnGroup.h b/internal/core/src/mmap/ChunkedColumnGroup.h index 0681550623..7a5fabf18f 100644 --- a/internal/core/src/mmap/ChunkedColumnGroup.h +++ b/internal/core/src/mmap/ChunkedColumnGroup.h @@ -67,20 +67,20 @@ class ChunkedColumnGroup { PinWrapper GetGroupChunk(int64_t chunk_id) const { - auto ca = SemiInlineGet(slot_->PinCells({chunk_id})); + auto ca = SemiInlineGet(slot_->PinCells(nullptr, {chunk_id})); auto chunk = ca->get_cell_of(chunk_id); return PinWrapper(ca, chunk); } std::shared_ptr> GetGroupChunks(std::vector chunk_ids) { - return SemiInlineGet(slot_->PinCells(chunk_ids)); + return SemiInlineGet(slot_->PinCells(nullptr, chunk_ids)); } // std::shared_ptr> std::vector> GetAllGroupChunks() { - auto ca = SemiInlineGet(slot_->PinAllCells()); + auto ca = SemiInlineGet(slot_->PinAllCells(nullptr)); std::vector> ret; ret.reserve(num_chunks_); for (size_t i = 0; i < num_chunks_; i++) { diff --git a/internal/core/src/query/ExecPlanNodeVisitor.cpp b/internal/core/src/query/ExecPlanNodeVisitor.cpp index c275a8ddda..a2b27cc7e6 100644 --- a/internal/core/src/query/ExecPlanNodeVisitor.cpp +++ b/internal/core/src/query/ExecPlanNodeVisitor.cpp @@ -27,48 +27,6 @@ #include "common/Tracer.h" namespace milvus::query { -namespace impl { - -class ExecPlanNodeVisitor : PlanNodeVisitor { - public: - ExecPlanNodeVisitor(const segcore::SegmentInterface& segment, - Timestamp timestamp, - const PlaceholderGroup& placeholder_group, - int32_t consystency_level, - Timestamp collection_ttl) - : segment_(segment), - timestamp_(timestamp), - placeholder_group_(placeholder_group), - consystency_level_(consystency_level), - collection_ttl_timestamp_(collection_ttl_timestamp_) { - } - - SearchResult - get_moved_result(PlanNode& node) { - assert(!search_result_opt_.has_value()); - node.accept(*this); - assert(search_result_opt_.has_value()); - auto ret = std::move(search_result_opt_).value(); - search_result_opt_ = std::nullopt; - return ret; - } - - private: - template - void - VectorVisitorImpl(VectorPlanNode& node); - - private: - const segcore::SegmentInterface& segment_; - Timestamp timestamp_; - Timestamp collection_ttl_timestamp_; - const PlaceholderGroup& placeholder_group_; - - SearchResultOpt search_result_opt_; - int32_t consystency_level_ = 0; -}; -} // namespace impl - static SearchResult empty_search_result(int64_t num_queries) { SearchResult final_result; diff --git a/internal/core/src/query/SearchBruteForce.cpp b/internal/core/src/query/SearchBruteForce.cpp index e94f137b79..099801457b 100644 --- a/internal/core/src/query/SearchBruteForce.cpp +++ b/internal/core/src/query/SearchBruteForce.cpp @@ -121,7 +121,8 @@ BruteForceSearch(const dataset::SearchDataset& query_ds, const std::map& index_info, const BitsetView& bitset, DataType data_type, - DataType element_type) { + DataType element_type, + milvus::OpContext* op_context) { SubSearchResult sub_result(query_ds.num_queries, query_ds.topk, query_ds.metric_type, @@ -158,23 +159,23 @@ BruteForceSearch(const dataset::SearchDataset& query_ds, knowhere::expected res; if (data_type == DataType::VECTOR_FLOAT) { res = knowhere::BruteForce::RangeSearch( - base_dataset, query_dataset, search_cfg, bitset); + base_dataset, query_dataset, search_cfg, bitset, op_context); } else if (data_type == DataType::VECTOR_FLOAT16) { res = knowhere::BruteForce::RangeSearch( - base_dataset, query_dataset, search_cfg, bitset); + base_dataset, query_dataset, search_cfg, bitset, op_context); } else if (data_type == DataType::VECTOR_BFLOAT16) { res = knowhere::BruteForce::RangeSearch( - base_dataset, query_dataset, search_cfg, bitset); + base_dataset, query_dataset, search_cfg, bitset, op_context); } else if (data_type == DataType::VECTOR_BINARY) { res = knowhere::BruteForce::RangeSearch( - base_dataset, query_dataset, search_cfg, bitset); + base_dataset, query_dataset, search_cfg, bitset, op_context); } else if (data_type == DataType::VECTOR_SPARSE_U32_F32) { res = knowhere::BruteForce::RangeSearch< knowhere::sparse::SparseRow>( - base_dataset, query_dataset, search_cfg, bitset); + base_dataset, query_dataset, search_cfg, bitset, op_context); } else if (data_type == DataType::VECTOR_INT8) { res = knowhere::BruteForce::RangeSearch( - base_dataset, query_dataset, search_cfg, bitset); + base_dataset, query_dataset, search_cfg, bitset, op_context); } else { ThrowInfo( ErrorCode::Unsupported, @@ -204,7 +205,8 @@ BruteForceSearch(const dataset::SearchDataset& query_ds, sub_result.mutable_seg_offsets().data(), sub_result.mutable_distances().data(), search_cfg, - bitset); + bitset, + op_context); } else if (data_type == DataType::VECTOR_FLOAT16) { stat = knowhere::BruteForce::SearchWithBuf( base_dataset, @@ -212,7 +214,8 @@ BruteForceSearch(const dataset::SearchDataset& query_ds, sub_result.mutable_seg_offsets().data(), sub_result.mutable_distances().data(), search_cfg, - bitset); + bitset, + op_context); } else if (data_type == DataType::VECTOR_BFLOAT16) { stat = knowhere::BruteForce::SearchWithBuf( base_dataset, @@ -220,7 +223,8 @@ BruteForceSearch(const dataset::SearchDataset& query_ds, sub_result.mutable_seg_offsets().data(), sub_result.mutable_distances().data(), search_cfg, - bitset); + bitset, + op_context); } else if (data_type == DataType::VECTOR_BINARY) { stat = knowhere::BruteForce::SearchWithBuf( base_dataset, @@ -228,7 +232,8 @@ BruteForceSearch(const dataset::SearchDataset& query_ds, sub_result.mutable_seg_offsets().data(), sub_result.mutable_distances().data(), search_cfg, - bitset); + bitset, + op_context); } else if (data_type == DataType::VECTOR_SPARSE_U32_F32) { stat = knowhere::BruteForce::SearchSparseWithBuf( base_dataset, @@ -236,7 +241,8 @@ BruteForceSearch(const dataset::SearchDataset& query_ds, sub_result.mutable_seg_offsets().data(), sub_result.mutable_distances().data(), search_cfg, - bitset); + bitset, + op_context); } else if (data_type == DataType::VECTOR_INT8) { stat = knowhere::BruteForce::SearchWithBuf( base_dataset, @@ -244,7 +250,8 @@ BruteForceSearch(const dataset::SearchDataset& query_ds, sub_result.mutable_seg_offsets().data(), sub_result.mutable_distances().data(), search_cfg, - bitset); + bitset, + op_context); } else { ThrowInfo(ErrorCode::Unsupported, "Unsupported dataType for chunk brute force search:{}", diff --git a/internal/core/src/query/SearchBruteForce.h b/internal/core/src/query/SearchBruteForce.h index 05389db4e5..2be6929325 100644 --- a/internal/core/src/query/SearchBruteForce.h +++ b/internal/core/src/query/SearchBruteForce.h @@ -14,6 +14,7 @@ #include "common/BitsetView.h" #include "common/FieldMeta.h" #include "common/QueryInfo.h" +#include "common/OpContext.h" #include "query/SubSearchResult.h" #include "query/helper.h" @@ -30,7 +31,8 @@ BruteForceSearch(const dataset::SearchDataset& query_ds, const std::map& index_info, const BitsetView& bitset, DataType data_type, - DataType element_type); + DataType element_type, + milvus::OpContext* op_context); knowhere::expected> GetBruteForceSearchIterators( diff --git a/internal/core/src/query/SearchBruteForceSparseTest.cpp b/internal/core/src/query/SearchBruteForceSparseTest.cpp index 6b6b6d528e..d338235b11 100644 --- a/internal/core/src/query/SearchBruteForceSparseTest.cpp +++ b/internal/core/src/query/SearchBruteForceSparseTest.cpp @@ -115,7 +115,8 @@ class TestSparseFloatSearchBruteForce : public ::testing::Test { index_info, bitset_view, DataType::VECTOR_SPARSE_U32_F32, - DataType::NONE)); + DataType::NONE, + nullptr)); return; } auto result = BruteForceSearch(query_dataset, @@ -124,7 +125,8 @@ class TestSparseFloatSearchBruteForce : public ::testing::Test { index_info, bitset_view, DataType::VECTOR_SPARSE_U32_F32, - DataType::NONE); + DataType::NONE, + nullptr); for (int i = 0; i < nq; i++) { auto ref = SearchRef(base.get(), *(query.get() + i), nb, topk); auto ans = result.get_seg_offsets() + i * topk; @@ -139,7 +141,8 @@ class TestSparseFloatSearchBruteForce : public ::testing::Test { index_info, bitset_view, DataType::VECTOR_SPARSE_U32_F32, - DataType::NONE); + DataType::NONE, + nullptr); for (int i = 0; i < nq; i++) { auto ref = RangeSearchRef( base.get(), *(query.get() + i), nb, 0.1, 0.5, topk); diff --git a/internal/core/src/query/SearchBruteForceTest.cpp b/internal/core/src/query/SearchBruteForceTest.cpp index 6588824c0b..78d06a4ea0 100644 --- a/internal/core/src/query/SearchBruteForceTest.cpp +++ b/internal/core/src/query/SearchBruteForceTest.cpp @@ -142,7 +142,8 @@ class TestFloatSearchBruteForce : public ::testing::Test { index_info, bitset_view, DataType::VECTOR_FLOAT, - DataType::NONE); + DataType::NONE, + nullptr); for (int i = 0; i < nq; i++) { auto ref = Ref(base.data(), query.data() + i * dim, diff --git a/internal/core/src/query/SearchOnGrowing.cpp b/internal/core/src/query/SearchOnGrowing.cpp index d001d94478..8499e6aa65 100644 --- a/internal/core/src/query/SearchOnGrowing.cpp +++ b/internal/core/src/query/SearchOnGrowing.cpp @@ -31,6 +31,7 @@ FloatSegmentIndexSearch(const segcore::SegmentGrowingImpl& segment, const void* query_data, int64_t num_queries, const BitsetView& bitset, + milvus::OpContext* op_context, SearchResult& search_result) { auto& schema = segment.get_schema(); auto& indexing_record = segment.get_indexing_record(); @@ -62,6 +63,7 @@ FloatSegmentIndexSearch(const segcore::SegmentGrowingImpl& segment, *vec_index, search_conf, bitset, + op_context, search_result, is_sparse); } @@ -75,6 +77,7 @@ SearchOnGrowing(const segcore::SegmentGrowingImpl& segment, int64_t num_queries, Timestamp timestamp, const BitsetView& bitset, + milvus::OpContext* op_context, SearchResult& search_result) { auto& schema = segment.get_schema(); auto& record = segment.get_insert_record(); @@ -103,8 +106,13 @@ SearchOnGrowing(const segcore::SegmentGrowingImpl& segment, "vector array(embedding list) is not supported for growing segment " "indexing search"); - FloatSegmentIndexSearch( - segment, info, query_data, num_queries, bitset, search_result); + FloatSegmentIndexSearch(segment, + info, + query_data, + num_queries, + bitset, + op_context, + search_result); } else { std::shared_lock read_chunk_mutex( segment.get_chunk_mutex()); @@ -114,8 +122,13 @@ SearchOnGrowing(const segcore::SegmentGrowingImpl& segment, "vector array(embedding list) is not supported for " "growing segment indexing search"); - return FloatSegmentIndexSearch( - segment, info, query_data, num_queries, bitset, search_result); + return FloatSegmentIndexSearch(segment, + info, + query_data, + num_queries, + bitset, + op_context, + search_result); } SubSearchResult final_qr(num_queries, topk, metric_type, round_decimal); // TODO(SPARSE): see todo in PlanImpl.h::PlaceHolder. @@ -233,7 +246,8 @@ SearchOnGrowing(const segcore::SegmentGrowingImpl& segment, index_info, bitset, data_type, - element_type); + element_type, + op_context); final_qr.merge(sub_qr); } } diff --git a/internal/core/src/query/SearchOnGrowing.h b/internal/core/src/query/SearchOnGrowing.h index c487c9532e..99fc3cdad3 100644 --- a/internal/core/src/query/SearchOnGrowing.h +++ b/internal/core/src/query/SearchOnGrowing.h @@ -12,6 +12,7 @@ #pragma once #include "common/BitsetView.h" +#include "common/OpContext.h" #include "segcore/SegmentGrowingImpl.h" namespace milvus::query { @@ -24,6 +25,7 @@ SearchOnGrowing(const segcore::SegmentGrowingImpl& segment, int64_t num_queries, Timestamp timestamp, const BitsetView& bitset, + milvus::OpContext* op_context, SearchResult& search_result); } // namespace milvus::query diff --git a/internal/core/src/query/SearchOnIndex.cpp b/internal/core/src/query/SearchOnIndex.cpp index f6963e9bf4..fe70ef292b 100644 --- a/internal/core/src/query/SearchOnIndex.cpp +++ b/internal/core/src/query/SearchOnIndex.cpp @@ -19,6 +19,7 @@ SearchOnIndex(const dataset::SearchDataset& search_dataset, const index::VectorIndex& indexing, const SearchInfo& search_conf, const BitsetView& bitset, + milvus::OpContext* op_context, SearchResult& search_result, bool is_sparse) { auto num_queries = search_dataset.num_queries; @@ -43,7 +44,7 @@ SearchOnIndex(const dataset::SearchDataset& search_dataset, return; } - indexing.Query(dataset, search_conf, bitset, search_result); + indexing.Query(dataset, search_conf, bitset, op_context, search_result); } } // namespace milvus::query diff --git a/internal/core/src/query/SearchOnIndex.h b/internal/core/src/query/SearchOnIndex.h index 3913cd3cd4..065bd3cff4 100644 --- a/internal/core/src/query/SearchOnIndex.h +++ b/internal/core/src/query/SearchOnIndex.h @@ -24,6 +24,7 @@ SearchOnIndex(const dataset::SearchDataset& search_dataset, const index::VectorIndex& indexing, const SearchInfo& search_conf, const BitsetView& bitset, + milvus::OpContext* op_context, SearchResult& search_result, bool is_sparse = false); diff --git a/internal/core/src/query/SearchOnSealed.cpp b/internal/core/src/query/SearchOnSealed.cpp index 715a2948ca..b1fb8dec0d 100644 --- a/internal/core/src/query/SearchOnSealed.cpp +++ b/internal/core/src/query/SearchOnSealed.cpp @@ -34,6 +34,7 @@ SearchOnSealedIndex(const Schema& schema, const size_t* query_lims, int64_t num_queries, const BitsetView& bitset, + milvus::OpContext* op_context, SearchResult& search_result) { auto topK = search_info.topk_; auto round_decimal = search_info.round_decimal_; @@ -66,7 +67,8 @@ SearchOnSealedIndex(const Schema& schema, } dataset->SetIsSparse(is_sparse); - auto accessor = SemiInlineGet(field_indexing->indexing_->PinCells({0})); + auto accessor = + SemiInlineGet(field_indexing->indexing_->PinCells(nullptr, {0})); auto vec_index = dynamic_cast(accessor->get_cell_of(0)); @@ -83,7 +85,8 @@ SearchOnSealedIndex(const Schema& schema, search_result, bitset, *vec_index)) { - vec_index->Query(dataset, search_info, bitset, search_result); + vec_index->Query( + dataset, search_info, bitset, op_context, search_result); float* distances = search_result.distances_.data(); auto total_num = num_queries * topK; if (round_decimal != -1) { @@ -108,6 +111,7 @@ SearchOnSealedColumn(const Schema& schema, int64_t num_queries, int64_t row_count, const BitsetView& bitview, + milvus::OpContext* op_context, SearchResult& result) { auto field_id = search_info.field_id_; auto& field = schema[field_id]; @@ -182,7 +186,8 @@ SearchOnSealedColumn(const Schema& schema, index_info, bitview, data_type, - element_type); + element_type, + op_context); final_qr.merge(sub_qr); } offset += chunk_size; diff --git a/internal/core/src/query/SearchOnSealed.h b/internal/core/src/query/SearchOnSealed.h index 20314c69da..5c8ab0312b 100644 --- a/internal/core/src/query/SearchOnSealed.h +++ b/internal/core/src/query/SearchOnSealed.h @@ -26,6 +26,7 @@ SearchOnSealedIndex(const Schema& schema, const size_t* query_lims, int64_t num_queries, const BitsetView& view, + milvus::OpContext* op_context, SearchResult& search_result); void @@ -38,6 +39,7 @@ SearchOnSealedColumn(const Schema& schema, int64_t num_queries, int64_t row_count, const BitsetView& bitset, + milvus::OpContext* op_context, SearchResult& result); } // namespace milvus::query diff --git a/internal/core/src/segcore/ChunkedSegmentSealedImpl.cpp b/internal/core/src/segcore/ChunkedSegmentSealedImpl.cpp index e0a77832d3..5eb5f93808 100644 --- a/internal/core/src/segcore/ChunkedSegmentSealedImpl.cpp +++ b/internal/core/src/segcore/ChunkedSegmentSealedImpl.cpp @@ -685,7 +685,8 @@ ChunkedSegmentSealedImpl::GetNgramIndex(FieldId field_id) const { auto slot = iter->second.get(); lck.unlock(); - auto ca = SemiInlineGet(slot->PinCells({0})); + milvus::OpContext ctx; + auto ca = SemiInlineGet(slot->PinCells(&ctx, {0})); auto index = dynamic_cast(ca->get_cell_of(0)); AssertInfo(index != nullptr, "ngram index cache is corrupted, field_id: {}", @@ -706,7 +707,8 @@ ChunkedSegmentSealedImpl::GetNgramIndexForJson( auto slot = iter->second.at(nested_path).get(); - auto ca = SemiInlineGet(slot->PinCells({0})); + milvus::OpContext ctx; + auto ca = SemiInlineGet(slot->PinCells(&ctx, {0})); auto index = dynamic_cast(ca->get_cell_of(0)); AssertInfo(index != nullptr, @@ -749,6 +751,7 @@ ChunkedSegmentSealedImpl::vector_search(SearchInfo& search_info, int64_t query_count, Timestamp timestamp, const BitsetView& bitset, + milvus::OpContext* op_context, SearchResult& output) const { AssertInfo(is_system_field_ready(), "System field is not ready"); auto field_id = search_info.field_id_; @@ -774,6 +777,7 @@ ChunkedSegmentSealedImpl::vector_search(SearchInfo& search_info, query_lims, query_count, bitset, + op_context, output); milvus::tracer::AddEvent( "finish_searching_vector_temperate_binlog_index"); @@ -788,6 +792,7 @@ ChunkedSegmentSealedImpl::vector_search(SearchInfo& search_info, query_lims, query_count, bitset, + op_context, output); milvus::tracer::AddEvent("finish_searching_vector_index"); } else { @@ -816,6 +821,7 @@ ChunkedSegmentSealedImpl::vector_search(SearchInfo& search_info, query_count, row_count, bitset, + op_context, output); milvus::tracer::AddEvent("finish_searching_vector_data"); } @@ -837,7 +843,8 @@ ChunkedSegmentSealedImpl::get_vector(FieldId field_id, "vector index is not ready"); auto field_indexing = vector_indexings_.get_field_indexing(field_id); auto cache_index = field_indexing->indexing_; - auto ca = SemiInlineGet(cache_index->PinCells({0})); + milvus::OpContext ctx; + auto ca = SemiInlineGet(cache_index->PinCells(&ctx, {0})); auto vec_index = dynamic_cast(ca->get_cell_of(0)); AssertInfo(vec_index, "invalid vector indexing"); @@ -1612,8 +1619,9 @@ ChunkedSegmentSealedImpl::CreateTextIndex(FieldId field_id) { "index are found"); return iter; }); + milvus::OpContext ctx; auto accessor = - SemiInlineGet(field_index_iter->second->PinCells({0})); + SemiInlineGet(field_index_iter->second->PinCells(&ctx, {0})); auto ptr = accessor->get_cell_of(0); AssertInfo(ptr->HasRawData(), "text raw data not found, trying to create text index " diff --git a/internal/core/src/segcore/ChunkedSegmentSealedImpl.h b/internal/core/src/segcore/ChunkedSegmentSealedImpl.h index 17d96bde48..cf0c773b22 100644 --- a/internal/core/src/segcore/ChunkedSegmentSealedImpl.h +++ b/internal/core/src/segcore/ChunkedSegmentSealedImpl.h @@ -92,7 +92,7 @@ class ChunkedSegmentSealedImpl : public SegmentSealed { if (iter == scalar_indexings->end()) { return {}; } - auto ca = SemiInlineGet(iter->second->PinCells({0})); + auto ca = SemiInlineGet(iter->second->PinCells(nullptr, {0})); auto index = ca->get_cell_of(0); return {PinWrapper(ca, index)}; } @@ -425,6 +425,7 @@ class ChunkedSegmentSealedImpl : public SegmentSealed { int64_t query_count, Timestamp timestamp, const BitsetView& bitset, + milvus::OpContext* op_context, SearchResult& output) const override; void diff --git a/internal/core/src/segcore/ChunkedSegmentSealedTest.cpp b/internal/core/src/segcore/ChunkedSegmentSealedTest.cpp index 8235257ebe..263cc6afe7 100644 --- a/internal/core/src/segcore/ChunkedSegmentSealedTest.cpp +++ b/internal/core/src/segcore/ChunkedSegmentSealedTest.cpp @@ -124,7 +124,7 @@ TEST(test_chunk_segment, TestSearchOnSealed) { auto query_data = col_query_data.data(); auto index_info = std::map{}; SearchResult search_result; - + milvus::OpContext op_context; query::SearchOnSealedColumn(*schema, column.get(), search_info, @@ -134,6 +134,7 @@ TEST(test_chunk_segment, TestSearchOnSealed) { 1, total_row_count, bv, + &op_context, search_result); std::set offsets; @@ -160,6 +161,7 @@ TEST(test_chunk_segment, TestSearchOnSealed) { 1, total_row_count, bv, + &op_context, search_result); ASSERT_EQ(1, search_result.vector_iterators_->size()); diff --git a/internal/core/src/segcore/ReduceCTest.cpp b/internal/core/src/segcore/ReduceCTest.cpp index 2d3f410b77..91d6811fb4 100644 --- a/internal/core/src/segcore/ReduceCTest.cpp +++ b/internal/core/src/segcore/ReduceCTest.cpp @@ -322,3 +322,101 @@ TEST(CApiTest, StreamReduceGroupBY) { DeleteStreamSearchReducer(c_search_stream_reducer); DeleteStreamSearchReducer(nullptr); } + +TEST(CApiTest, ReduceSearchResultsAndFillDataCost) { + int N = 100; + int topK = 10; + int num_queries = 2; + + auto collection = NewCollection(get_default_schema_config().c_str()); + + CSegmentInterface segment; + auto status = NewSegment(collection, Growing, -1, &segment, false); + ASSERT_EQ(status.error_code, Success); + + auto schema = ((milvus::segcore::Collection*)collection)->get_schema(); + auto dataset = DataGen(schema, N, 77, 0, 1, 10, true); + int64_t offset; + PreInsert(segment, N, &offset); + auto insert_data = serialize(dataset.raw_); + auto ins_res = Insert(segment, + offset, + N, + dataset.row_ids_.data(), + dataset.timestamps_.data(), + insert_data.data(), + insert_data.size()); + ASSERT_EQ(ins_res.error_code, Success); + + auto fmt = boost::format(R"(vector_anns: < + field_id: 100 + query_info: < + topk: %1% + metric_type: "L2" + search_params: "{\"nprobe\": 10}" + > + placeholder_tag: "$0"> + output_field_ids: 100)") % + topK; + auto serialized_expr_plan = fmt.str(); + auto blob = generate_query_data(num_queries); + void* plan = nullptr; + auto binary_plan = + translate_text_plan_to_binary_plan(serialized_expr_plan.data()); + status = CreateSearchPlanByExpr( + collection, binary_plan.data(), binary_plan.size(), &plan); + ASSERT_EQ(status.error_code, Success); + void* placeholderGroup = nullptr; + + status = ParsePlaceholderGroup( + plan, blob.data(), blob.length(), &placeholderGroup); + ASSERT_EQ(status.error_code, Success); + + dataset.timestamps_.clear(); + dataset.timestamps_.push_back(1); + CSearchResult res; + auto stats = CSearch( + segment, plan, placeholderGroup, dataset.timestamps_[N - 1], &res); + ASSERT_EQ(stats.error_code, Success); + + // Reduce and fetch blob + scanned bytes + std::vector slice_nqs{num_queries}; + std::vector slice_topKs{topK}; + CSearchResultDataBlobs c_search_result_data_blobs; + uint8_t trace_id[16] = {0}; + uint8_t span_id[8] = {0}; + CTraceContext trace{ + .traceID = trace_id, + .spanID = span_id, + .traceFlags = 0, + }; + auto st = ReduceSearchResultsAndFillData(trace, + &c_search_result_data_blobs, + plan, + &res, + 1, + slice_nqs.data(), + slice_topKs.data(), + slice_nqs.size()); + ASSERT_EQ(st.error_code, Success); + + CProto blob_proto; + int64_t scanned_remote_bytes = 0; + int64_t scanned_total_bytes = 0; + auto st2 = GetSearchResultDataBlob(&blob_proto, + &scanned_remote_bytes, + &scanned_total_bytes, + c_search_result_data_blobs, + 0); + ASSERT_EQ(st2.error_code, Success); + ASSERT_EQ(scanned_remote_bytes, 0); + ASSERT_EQ(scanned_total_bytes, scanned_remote_bytes); + ASSERT_GT(blob_proto.proto_size, 0); + + DeleteSearchResultDataBlobs(c_search_result_data_blobs); + DeleteSearchResult(res); + DeletePlaceholderGroup(placeholderGroup); + DeleteSearchPlan(plan); + DeleteSegment(segment); + DeleteCollection(collection); +} diff --git a/internal/core/src/segcore/SegmentGrowingImpl.cpp b/internal/core/src/segcore/SegmentGrowingImpl.cpp index 9b07fce54c..75a24df4d2 100644 --- a/internal/core/src/segcore/SegmentGrowingImpl.cpp +++ b/internal/core/src/segcore/SegmentGrowingImpl.cpp @@ -679,6 +679,7 @@ SegmentGrowingImpl::vector_search(SearchInfo& search_info, int64_t query_count, Timestamp timestamp, const BitsetView& bitset, + milvus::OpContext* op_context, SearchResult& output) const { query::SearchOnGrowing(*this, search_info, @@ -687,6 +688,7 @@ SegmentGrowingImpl::vector_search(SearchInfo& search_info, query_count, timestamp, bitset, + op_context, output); } diff --git a/internal/core/src/segcore/SegmentGrowingImpl.h b/internal/core/src/segcore/SegmentGrowingImpl.h index 89da48bbd9..ed38df7a9b 100644 --- a/internal/core/src/segcore/SegmentGrowingImpl.h +++ b/internal/core/src/segcore/SegmentGrowingImpl.h @@ -329,6 +329,7 @@ class SegmentGrowingImpl : public SegmentGrowing { int64_t query_count, Timestamp timestamp, const BitsetView& bitset, + milvus::OpContext* op_context, SearchResult& output) const override; DataType diff --git a/internal/core/src/segcore/SegmentInterface.h b/internal/core/src/segcore/SegmentInterface.h index f0a9f46ee8..a195d4f69a 100644 --- a/internal/core/src/segcore/SegmentInterface.h +++ b/internal/core/src/segcore/SegmentInterface.h @@ -23,6 +23,7 @@ #include "cachinglayer/CacheSlot.h" #include "common/EasyAssert.h" #include "common/Json.h" +#include "common/OpContext.h" #include "common/Schema.h" #include "common/Span.h" #include "common/SystemProperty.h" @@ -363,6 +364,7 @@ class SegmentInternalInterface : public SegmentInterface { int64_t query_count, Timestamp timestamp, const BitsetView& bitset, + milvus::OpContext* op_context, SearchResult& output) const = 0; virtual void diff --git a/internal/core/src/segcore/SegmentSealed.h b/internal/core/src/segcore/SegmentSealed.h index 694d83bee1..139e8a6089 100644 --- a/internal/core/src/segcore/SegmentSealed.h +++ b/internal/core/src/segcore/SegmentSealed.h @@ -113,7 +113,7 @@ class SegmentSealed : public SegmentInternalInterface { if (best_match == nullptr) { return nullptr; } - auto ca = SemiInlineGet(best_match->PinCells({0})); + auto ca = SemiInlineGet(best_match->PinCells(nullptr, {0})); auto index = ca->get_cell_of(0); return PinWrapper(ca, index); }); diff --git a/internal/core/src/segcore/load_index_c_test.cpp b/internal/core/src/segcore/load_index_c_test.cpp index 8fbb83b871..fac0cb4bb8 100644 --- a/internal/core/src/segcore/load_index_c_test.cpp +++ b/internal/core/src/segcore/load_index_c_test.cpp @@ -244,7 +244,8 @@ Test_Indexing_Without_Predicate() { auto search_plan = reinterpret_cast(plan); SearchInfo search_info = search_plan->plan_node_->search_info_; SearchResult result_on_index; - vec_index->Query(query_dataset, search_info, nullptr, result_on_index); + vec_index->Query( + query_dataset, search_info, nullptr, nullptr, result_on_index); auto ids = result_on_index.seg_offsets_.data(); auto dis = result_on_index.distances_.data(); std::vector vec_ids(ids, ids + TOPK * num_queries); @@ -400,7 +401,8 @@ TEST(CApiTest, Indexing_Expr_Without_Predicate) { auto search_plan = reinterpret_cast(plan); SearchInfo search_info = search_plan->plan_node_->search_info_; SearchResult result_on_index; - vec_index->Query(query_dataset, search_info, nullptr, result_on_index); + vec_index->Query( + query_dataset, search_info, nullptr, nullptr, result_on_index); auto ids = result_on_index.seg_offsets_.data(); auto dis = result_on_index.distances_.data(); std::vector vec_ids(ids, ids + TOPK * num_queries); @@ -578,7 +580,8 @@ TEST(CApiTest, Indexing_With_float_Predicate_Range) { auto search_plan = reinterpret_cast(plan); SearchInfo search_info = search_plan->plan_node_->search_info_; SearchResult result_on_index; - vec_index->Query(query_dataset, search_info, nullptr, result_on_index); + vec_index->Query( + query_dataset, search_info, nullptr, nullptr, result_on_index); auto ids = result_on_index.seg_offsets_.data(); auto dis = result_on_index.distances_.data(); std::vector vec_ids(ids, ids + TOPK * num_queries); @@ -758,7 +761,8 @@ TEST(CApiTest, Indexing_Expr_With_float_Predicate_Range) { auto search_plan = reinterpret_cast(plan); SearchInfo search_info = search_plan->plan_node_->search_info_; SearchResult result_on_index; - vec_index->Query(query_dataset, search_info, nullptr, result_on_index); + vec_index->Query( + query_dataset, search_info, nullptr, nullptr, result_on_index); auto ids = result_on_index.seg_offsets_.data(); auto dis = result_on_index.distances_.data(); std::vector vec_ids(ids, ids + TOPK * num_queries); @@ -930,7 +934,8 @@ TEST(CApiTest, Indexing_With_float_Predicate_Term) { auto search_plan = reinterpret_cast(plan); SearchInfo search_info = search_plan->plan_node_->search_info_; SearchResult result_on_index; - vec_index->Query(query_dataset, search_info, nullptr, result_on_index); + vec_index->Query( + query_dataset, search_info, nullptr, nullptr, result_on_index); auto ids = result_on_index.seg_offsets_.data(); auto dis = result_on_index.distances_.data(); std::vector vec_ids(ids, ids + TOPK * num_queries); @@ -1103,7 +1108,8 @@ TEST(CApiTest, Indexing_Expr_With_float_Predicate_Term) { auto search_plan = reinterpret_cast(plan); SearchInfo search_info = search_plan->plan_node_->search_info_; SearchResult result_on_index; - vec_index->Query(query_dataset, search_info, nullptr, result_on_index); + vec_index->Query( + query_dataset, search_info, nullptr, nullptr, result_on_index); auto ids = result_on_index.seg_offsets_.data(); auto dis = result_on_index.distances_.data(); std::vector vec_ids(ids, ids + TOPK * num_queries); @@ -1285,7 +1291,8 @@ TEST(CApiTest, Indexing_With_binary_Predicate_Range) { auto search_plan = reinterpret_cast(plan); SearchInfo search_info = search_plan->plan_node_->search_info_; SearchResult result_on_index; - vec_index->Query(query_dataset, search_info, nullptr, result_on_index); + vec_index->Query( + query_dataset, search_info, nullptr, nullptr, result_on_index); auto ids = result_on_index.seg_offsets_.data(); auto dis = result_on_index.distances_.data(); std::vector vec_ids(ids, ids + TOPK * num_queries); @@ -1467,7 +1474,8 @@ TEST(CApiTest, Indexing_Expr_With_binary_Predicate_Range) { auto search_plan = reinterpret_cast(plan); SearchInfo search_info = search_plan->plan_node_->search_info_; SearchResult result_on_index; - vec_index->Query(query_dataset, search_info, nullptr, result_on_index); + vec_index->Query( + query_dataset, search_info, nullptr, nullptr, result_on_index); auto ids = result_on_index.seg_offsets_.data(); auto dis = result_on_index.distances_.data(); std::vector vec_ids(ids, ids + TOPK * num_queries); @@ -1643,7 +1651,8 @@ TEST(CApiTest, Indexing_With_binary_Predicate_Term) { auto search_plan = reinterpret_cast(plan); SearchInfo search_info = search_plan->plan_node_->search_info_; SearchResult result_on_index; - vec_index->Query(query_dataset, search_info, nullptr, result_on_index); + vec_index->Query( + query_dataset, search_info, nullptr, nullptr, result_on_index); auto ids = result_on_index.seg_offsets_.data(); auto dis = result_on_index.distances_.data(); std::vector vec_ids(ids, ids + TOPK * num_queries); @@ -1842,7 +1851,8 @@ TEST(CApiTest, Indexing_Expr_With_binary_Predicate_Term) { auto search_plan = reinterpret_cast(plan); SearchInfo search_info = search_plan->plan_node_->search_info_; SearchResult result_on_index; - vec_index->Query(query_dataset, search_info, nullptr, result_on_index); + vec_index->Query( + query_dataset, search_info, nullptr, nullptr, result_on_index); auto ids = result_on_index.seg_offsets_.data(); auto dis = result_on_index.distances_.data(); std::vector vec_ids(ids, ids + TOPK * num_queries); diff --git a/internal/core/src/segcore/reduce/Reduce.cpp b/internal/core/src/segcore/reduce/Reduce.cpp index 52bd545ea2..c4f5f9157b 100644 --- a/internal/core/src/segcore/reduce/Reduce.cpp +++ b/internal/core/src/segcore/reduce/Reduce.cpp @@ -37,6 +37,7 @@ ReduceHelper::Initialize() { // prefix sum, get slices offsets AssertInfo(num_slices_ > 0, "empty slice_nqs is not allowed"); + AssertInfo(total_nq_ > 0, "empty nq is not allowed"); slice_nqs_prefix_sum_.resize(num_slices_ + 1); std::partial_sum(slice_nqs_.begin(), slice_nqs_.end(), @@ -55,10 +56,11 @@ ReduceHelper::Initialize() { void ReduceHelper::Reduce() { - FillPrimaryKey(); + GetTotalStorageCost(); + FillPrimaryKey(); // retrieve primary keys, need to record the cost ReduceResultData(); RefreshSearchResults(); - FillEntryData(); + FillEntryData(); // retrieve other scalar data, need to record the cost } void @@ -68,9 +70,12 @@ ReduceHelper::Marshal() { search_result_data_blobs_ = std::make_unique(); search_result_data_blobs_->blobs.resize(num_slices_); + search_result_data_blobs_->costs.resize(num_slices_); for (int i = 0; i < num_slices_; i++) { - auto proto = GetSearchResultDataSlice(i); - search_result_data_blobs_->blobs[i] = proto; + auto [proto, cost] = + GetSearchResultDataSlice(i, total_search_storage_cost_); + search_result_data_blobs_->blobs[i] = std::move(proto); + search_result_data_blobs_->costs[i] = cost; } } @@ -138,6 +143,7 @@ ReduceHelper::FillPrimaryKey() { search_result->seg_offsets_.size()); auto segment = static_cast(search_result->segment_); if (search_result->get_total_result_count() > 0) { + // TODO: support storage usage recording in op_context segment->FillPrimaryKeys(plan_, *search_result); search_results_[valid_index++] = search_result; } @@ -192,6 +198,7 @@ ReduceHelper::FillEntryData() { search_result->segment_); std::chrono::high_resolution_clock::time_point get_target_entry_start = std::chrono::high_resolution_clock::now(); + // TODO: support storage usage recording in op_context segment->FillTargetEntry(plan_, *search_result); std::chrono::high_resolution_clock::time_point get_target_entry_end = std::chrono::high_resolution_clock::now(); @@ -307,8 +314,9 @@ ReduceHelper::FillOtherData( //simple batch reduce do nothing for other data } -std::vector -ReduceHelper::GetSearchResultDataSlice(int slice_index) { +std::pair, StorageCost> +ReduceHelper::GetSearchResultDataSlice(const int slice_index, + const StorageCost& total_cost) { auto nq_begin = slice_nqs_prefix_sum_[slice_index]; auto nq_end = slice_nqs_prefix_sum_[slice_index + 1]; @@ -322,6 +330,8 @@ ReduceHelper::GetSearchResultDataSlice(int slice_index) { search_result->topk_per_nq_prefix_sum_[nq_begin]; all_search_count += search_result->total_data_cnt_; } + // calculate the cost based on this slice's nq and total nq + StorageCost cost = total_cost * (1.0 * (nq_end - nq_begin) / total_nq_); auto search_result_data = std::make_unique(); @@ -448,13 +458,19 @@ ReduceHelper::GetSearchResultDataSlice(int slice_index) { search_result_data->mutable_fields_data()->AddAllocated( field_data.release()); } - // SearchResultData to blob auto size = search_result_data->ByteSizeLong(); auto buffer = std::vector(size); search_result_data->SerializePartialToArray(buffer.data(), size); - return buffer; + return {std::move(buffer), cost}; +} + +void +ReduceHelper::GetTotalStorageCost() { + for (auto search_result : search_results_) { + total_search_storage_cost_ += search_result->search_storage_cost_; + } } } // namespace milvus::segcore diff --git a/internal/core/src/segcore/reduce/Reduce.h b/internal/core/src/segcore/reduce/Reduce.h index 0aa16222f6..af0c9479ce 100644 --- a/internal/core/src/segcore/reduce/Reduce.h +++ b/internal/core/src/segcore/reduce/Reduce.h @@ -29,7 +29,8 @@ namespace milvus::segcore { // SearchResultDataBlobs contains the marshal blobs of many `milvus::proto::schema::SearchResultData` struct SearchResultDataBlobs { - std::vector> blobs; + std::vector> blobs; // the marshal blobs of each slice + std::vector costs; // the cost of each slice }; class ReduceHelper { @@ -96,8 +97,12 @@ class ReduceHelper { void FillEntryData(); - std::vector - GetSearchResultDataSlice(int slice_index_); + std::pair, StorageCost> + GetSearchResultDataSlice(const int slice_index, + const StorageCost& total_cost); + + void + GetTotalStorageCost(); protected: std::vector& search_results_; @@ -117,6 +122,7 @@ class ReduceHelper { // output std::unique_ptr search_result_data_blobs_; tracer::TraceContext* trace_ctx_; + StorageCost total_search_storage_cost_; }; } // namespace milvus::segcore diff --git a/internal/core/src/segcore/reduce/StreamReduce.cpp b/internal/core/src/segcore/reduce/StreamReduce.cpp index 38b519da1a..b830cbb163 100644 --- a/internal/core/src/segcore/reduce/StreamReduce.cpp +++ b/internal/core/src/segcore/reduce/StreamReduce.cpp @@ -171,6 +171,7 @@ StreamReducerHelper::AssembleMergedResult() { void StreamReducerHelper::MergeReduce() { + GetTotalStorageCost(); FilterSearchResults(); FillPrimaryKeys(); InitializeReduceRecords(); @@ -189,9 +190,12 @@ StreamReducerHelper::SerializeMergedResult() { "Wrong state for num_slice in streamReducer, num_slice:{}", num_slice_); search_result_blobs->blobs.resize(num_slice_); + search_result_blobs->costs.resize(num_slice_); for (int i = 0; i < num_slice_; i++) { - auto proto = GetSearchResultDataSlice(i); - search_result_blobs->blobs[i] = proto; + auto [proto, cost] = + GetSearchResultDataSlice(i, total_search_storage_cost_); + search_result_blobs->blobs[i] = std::move(proto); + search_result_blobs->costs[i] = cost; } return search_result_blobs.release(); } @@ -527,8 +531,9 @@ StreamReducerHelper::RefreshSearchResult() { } } -std::vector -StreamReducerHelper::GetSearchResultDataSlice(int slice_index) { +std::pair, StorageCost> +StreamReducerHelper::GetSearchResultDataSlice(int slice_index, + const StorageCost& total_cost) { auto nq_begin = slice_nqs_prefix_sum_[slice_index]; auto nq_end = slice_nqs_prefix_sum_[slice_index + 1]; @@ -555,6 +560,7 @@ StreamReducerHelper::GetSearchResultDataSlice(int slice_index) { result_count = merged_search_result->topk_per_nq_prefix_sum_[nq_end] - merged_search_result->topk_per_nq_prefix_sum_[nq_begin]; } + StorageCost cost = total_cost * (1.0 * (nq_end - nq_begin) / total_nq_); // `result_pairs` contains the SearchResult and result_offset info, used for filling output fields std::vector result_pairs(result_count); @@ -690,7 +696,14 @@ StreamReducerHelper::GetSearchResultDataSlice(int slice_index) { auto size = search_result_data->ByteSizeLong(); auto buffer = std::vector(size); search_result_data->SerializePartialToArray(buffer.data(), size); - return buffer; + return {std::move(buffer), cost}; +} + +void +StreamReducerHelper::GetTotalStorageCost() { + for (auto search_result : search_results_to_merge_) { + total_search_storage_cost_ += search_result->search_storage_cost_; + } } void diff --git a/internal/core/src/segcore/reduce/StreamReduce.h b/internal/core/src/segcore/reduce/StreamReduce.h index 10a138fd15..527585913e 100644 --- a/internal/core/src/segcore/reduce/StreamReduce.h +++ b/internal/core/src/segcore/reduce/StreamReduce.h @@ -152,6 +152,7 @@ class StreamReducerHelper { slice_nqs_.end(), slice_nqs_prefix_sum_.begin() + 1); total_nq_ = slice_nqs_prefix_sum_[num_slice_]; + AssertInfo(total_nq_ > 0, "empty nq is not allowed"); } void @@ -196,8 +197,12 @@ class StreamReducerHelper { void AssembleMergedResult(); - std::vector - GetSearchResultDataSlice(int slice_index); + std::pair, StorageCost> + GetSearchResultDataSlice(const int slice_index, + const StorageCost& total_cost); + + void + GetTotalStorageCost(); void CleanReduceStatus(); @@ -218,5 +223,6 @@ class StreamReducerHelper { std::unordered_set group_by_val_set_; std::vector>> final_search_records_; int64_t total_nq_{0}; + StorageCost total_search_storage_cost_; }; } // namespace milvus::segcore diff --git a/internal/core/src/segcore/reduce_c.cpp b/internal/core/src/segcore/reduce_c.cpp index 3d476f5b51..a059feb4fa 100644 --- a/internal/core/src/segcore/reduce_c.cpp +++ b/internal/core/src/segcore/reduce_c.cpp @@ -137,6 +137,8 @@ ReduceSearchResultsAndFillData(CTraceContext c_trace, CStatus GetSearchResultDataBlob(CProto* searchResultDataBlob, + int64_t* scanned_remote_bytes, + int64_t* scanned_total_bytes, CSearchResultDataBlobs cSearchResultDataBlobs, int32_t blob_index) { SCOPE_CGO_CALL_METRIC(); @@ -151,6 +153,10 @@ GetSearchResultDataBlob(CProto* searchResultDataBlob, search_result_data_blobs->blobs[blob_index].data(); searchResultDataBlob->proto_size = search_result_data_blobs->blobs[blob_index].size(); + *scanned_remote_bytes = + search_result_data_blobs->costs[blob_index].scanned_remote_bytes; + *scanned_total_bytes = + search_result_data_blobs->costs[blob_index].scanned_total_bytes; return milvus::SuccessCStatus(); } catch (std::exception& e) { searchResultDataBlob->proto_blob = nullptr; diff --git a/internal/core/src/segcore/reduce_c.h b/internal/core/src/segcore/reduce_c.h index 4c071f5dc0..6100124f66 100644 --- a/internal/core/src/segcore/reduce_c.h +++ b/internal/core/src/segcore/reduce_c.h @@ -48,6 +48,8 @@ ReduceSearchResultsAndFillData(CTraceContext c_trace, CStatus GetSearchResultDataBlob(CProto* searchResultDataBlob, + int64_t* scanned_remote_bytes, + int64_t* scanned_total_bytes, CSearchResultDataBlobs cSearchResultDataBlobs, int32_t blob_index); diff --git a/internal/core/src/segcore/segment_c_test.cpp b/internal/core/src/segcore/segment_c_test.cpp index 62e7fdf434..03ab6dfea7 100644 --- a/internal/core/src/segcore/segment_c_test.cpp +++ b/internal/core/src/segcore/segment_c_test.cpp @@ -1219,7 +1219,8 @@ TEST(CApiTest, SealedSegment_search_float_Predicate_Range) { search_info.search_params_ = generate_search_conf( IndexEnum::INDEX_FAISS_IVFSQ8, knowhere::metric::L2); SearchResult result_on_index; - vec_index->Query(query_dataset, search_info, nullptr, result_on_index); + vec_index->Query( + query_dataset, search_info, nullptr, nullptr, result_on_index); EXPECT_EQ(result_on_index.distances_.size(), num_queries * TOPK); auto cm = milvus::storage::RemoteChunkManagerSingleton::GetInstance() @@ -1454,7 +1455,8 @@ TEST(CApiTest, SealedSegment_search_float_With_Expr_Predicate_Range) { auto search_plan = reinterpret_cast(plan); SearchInfo search_info = search_plan->plan_node_->search_info_; SearchResult result_on_index; - vec_index->Query(query_dataset, search_info, nullptr, result_on_index); + vec_index->Query( + query_dataset, search_info, nullptr, nullptr, result_on_index); auto ids = result_on_index.seg_offsets_.data(); auto dis = result_on_index.distances_.data(); std::vector vec_ids(ids, ids + TOPK * num_queries); diff --git a/internal/core/src/segcore/storagev1translator/ChunkTranslator.h b/internal/core/src/segcore/storagev1translator/ChunkTranslator.h index 8df8126d87..700e4a4922 100644 --- a/internal/core/src/segcore/storagev1translator/ChunkTranslator.h +++ b/internal/core/src/segcore/storagev1translator/ChunkTranslator.h @@ -84,6 +84,13 @@ class ChunkTranslator : public milvus::cachinglayer::Translator { return &meta_; } + // TODO: implement this + int64_t + cells_storage_bytes( + const std::vector& cids) const override { + return 0; + } + private: std::vector file_infos_; int64_t segment_id_; diff --git a/internal/core/src/segcore/storagev1translator/DefaultValueChunkTranslator.h b/internal/core/src/segcore/storagev1translator/DefaultValueChunkTranslator.h index 7971debbed..e57b7390ae 100644 --- a/internal/core/src/segcore/storagev1translator/DefaultValueChunkTranslator.h +++ b/internal/core/src/segcore/storagev1translator/DefaultValueChunkTranslator.h @@ -52,6 +52,13 @@ class DefaultValueChunkTranslator return &meta_; } + // TODO: implement this + int64_t + cells_storage_bytes( + const std::vector& cids) const override { + return 0; + } + private: int64_t segment_id_; std::string key_; diff --git a/internal/core/src/segcore/storagev1translator/InterimSealedIndexTranslator.cpp b/internal/core/src/segcore/storagev1translator/InterimSealedIndexTranslator.cpp index 3ad81c7474..075670f645 100644 --- a/internal/core/src/segcore/storagev1translator/InterimSealedIndexTranslator.cpp +++ b/internal/core/src/segcore/storagev1translator/InterimSealedIndexTranslator.cpp @@ -48,15 +48,16 @@ std::pair InterimSealedIndexTranslator::estimated_byte_size_of_cell( milvus::cachinglayer::cid_t cid) const { - auto size = vec_data_->DataByteSize(); - auto row_count = vec_data_->NumRows(); + int64_t size = vec_data_->DataByteSize(); + int64_t row_count = vec_data_->NumRows(); // TODO: hack, move these estimate logic to knowhere // ignore the size of centroids if (index_type_ == knowhere::IndexEnum::INDEX_FAISS_SCANN_DVR) { - auto vec_size = size_t(index::GetValueFromConfig( - build_config_, knowhere::indexparam::SUB_DIM) - .value() / - 8 * dim_); + int64_t vec_size = + int64_t(index::GetValueFromConfig( + build_config_, knowhere::indexparam::SUB_DIM) + .value() / + 8 * dim_); if (build_config_[knowhere::indexparam::REFINE_TYPE] == knowhere::RefineType::UINT8_QUANT) { vec_size += dim_ * 1; @@ -70,7 +71,7 @@ InterimSealedIndexTranslator::estimated_byte_size_of_cell( {static_cast(vec_size * row_count + size * 0.5), 0}}; } else if (index_type_ == knowhere::IndexEnum::INDEX_FAISS_IVFFLAT_CC) { // fp16/bf16 all use float32 to build index - auto fp32_size = row_count * sizeof(float) * dim_; + int64_t fp32_size = row_count * sizeof(float) * dim_; return {{fp32_size, 0}, {static_cast(fp32_size + fp32_size * 0.5), 0}}; } else { @@ -95,6 +96,7 @@ InterimSealedIndexTranslator::get_cells( vec_data_](size_t id) { const void* data; int64_t data_id = id; + field_raw_data_ptr->BulkValueAt( [&data, &data_id](const char* value, size_t i) { data = static_cast(value); diff --git a/internal/core/src/segcore/storagev1translator/InterimSealedIndexTranslator.h b/internal/core/src/segcore/storagev1translator/InterimSealedIndexTranslator.h index 621949a0cf..90f1b48951 100644 --- a/internal/core/src/segcore/storagev1translator/InterimSealedIndexTranslator.h +++ b/internal/core/src/segcore/storagev1translator/InterimSealedIndexTranslator.h @@ -44,6 +44,13 @@ class InterimSealedIndexTranslator Meta* meta() override; + // TODO: implement this + int64_t + cells_storage_bytes( + const std::vector& cids) const override { + return 0; + } + private: std::shared_ptr vec_data_; std::string segment_id_; diff --git a/internal/core/src/segcore/storagev1translator/SealedIndexTranslator.cpp b/internal/core/src/segcore/storagev1translator/SealedIndexTranslator.cpp index 4aca3d51d1..5cd3266c49 100644 --- a/internal/core/src/segcore/storagev1translator/SealedIndexTranslator.cpp +++ b/internal/core/src/segcore/storagev1translator/SealedIndexTranslator.cpp @@ -75,8 +75,10 @@ SealedIndexTranslator::estimated_byte_size_of_cell( index_load_info_.num_rows, index_load_info_.dim); // this is an estimation, error could be up to 20%. - return {{request.final_memory_cost, request.final_disk_cost}, - {request.max_memory_cost, request.max_disk_cost}}; + return {milvus::cachinglayer::ResourceUsage(request.final_memory_cost, + request.final_disk_cost), + milvus::cachinglayer::ResourceUsage(request.max_memory_cost, + request.max_disk_cost)}; } const std::string& @@ -100,7 +102,8 @@ SealedIndexTranslator::get_cells(const std::vector& cids) { index_load_info_.enable_mmap, index_load_info_.num_rows, index_load_info_.dim); - index->SetCellSize({request.final_memory_cost, request.final_disk_cost}); + index->SetCellSize(milvus::cachinglayer::ResourceUsage( + request.final_memory_cost, request.final_disk_cost)); if (index_load_info_.enable_mmap && index->IsMmapSupported()) { AssertInfo(!index_load_info_.mmap_dir_path.empty(), "mmap directory path is empty"); diff --git a/internal/core/src/segcore/storagev1translator/SealedIndexTranslator.h b/internal/core/src/segcore/storagev1translator/SealedIndexTranslator.h index df25e5be73..7b6f4afc12 100644 --- a/internal/core/src/segcore/storagev1translator/SealedIndexTranslator.h +++ b/internal/core/src/segcore/storagev1translator/SealedIndexTranslator.h @@ -41,6 +41,13 @@ class SealedIndexTranslator Meta* meta() override; + // TODO: implement this + int64_t + cells_storage_bytes( + const std::vector& cids) const override { + return 0; + } + private: struct IndexLoadInfo { bool enable_mmap; diff --git a/internal/core/src/segcore/storagev1translator/V1SealedIndexTranslator.h b/internal/core/src/segcore/storagev1translator/V1SealedIndexTranslator.h index 0a8c3db8dc..0fcb9c039e 100644 --- a/internal/core/src/segcore/storagev1translator/V1SealedIndexTranslator.h +++ b/internal/core/src/segcore/storagev1translator/V1SealedIndexTranslator.h @@ -40,6 +40,13 @@ class V1SealedIndexTranslator : public Translator { Meta* meta() override; + // TODO: implement this + int64_t + cells_storage_bytes( + const std::vector& cids) const override { + return 0; + } + private: struct IndexLoadInfo { bool enable_mmap; diff --git a/internal/core/src/segcore/storagev2translator/GroupChunkTranslator.h b/internal/core/src/segcore/storagev2translator/GroupChunkTranslator.h index 3986974cfa..ebfec70eac 100644 --- a/internal/core/src/segcore/storagev2translator/GroupChunkTranslator.h +++ b/internal/core/src/segcore/storagev2translator/GroupChunkTranslator.h @@ -75,6 +75,12 @@ class GroupChunkTranslator return &meta_; } + int64_t + cells_storage_bytes( + const std::vector& cids) const override { + return 0; + } + private: std::unique_ptr load_group_chunk(const std::shared_ptr& table, diff --git a/internal/core/thirdparty/knowhere/CMakeLists.txt b/internal/core/thirdparty/knowhere/CMakeLists.txt index 829d6052ab..bd92bca5cb 100644 --- a/internal/core/thirdparty/knowhere/CMakeLists.txt +++ b/internal/core/thirdparty/knowhere/CMakeLists.txt @@ -14,7 +14,7 @@ # Update KNOWHERE_VERSION for the first occurrence milvus_add_pkg_config("knowhere") set_property(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY INCLUDE_DIRECTORIES "") -set( KNOWHERE_VERSION 77487c2 ) +set( KNOWHERE_VERSION v2.6.3 ) set( GIT_REPOSITORY "https://github.com/zilliztech/knowhere.git") message(STATUS "Knowhere repo: ${GIT_REPOSITORY}") diff --git a/internal/core/thirdparty/milvus-common/CMakeLists.txt b/internal/core/thirdparty/milvus-common/CMakeLists.txt index 6e88f83a76..8515baa8d2 100644 --- a/internal/core/thirdparty/milvus-common/CMakeLists.txt +++ b/internal/core/thirdparty/milvus-common/CMakeLists.txt @@ -13,7 +13,7 @@ milvus_add_pkg_config("milvus-common") set_property(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY INCLUDE_DIRECTORIES "") -set( MILVUS-COMMON-VERSION 0590476 ) +set( MILVUS-COMMON-VERSION 4767d68 ) set( GIT_REPOSITORY "https://github.com/zilliztech/milvus-common.git") message(STATUS "milvus-common repo: ${GIT_REPOSITORY}") diff --git a/internal/core/unittest/test_index_wrapper.cpp b/internal/core/unittest/test_index_wrapper.cpp index 577ef2f237..2968691615 100644 --- a/internal/core/unittest/test_index_wrapper.cpp +++ b/internal/core/unittest/test_index_wrapper.cpp @@ -186,7 +186,7 @@ TEST_P(IndexWrapperTest, BuildAndQuery) { auto xb_data = dataset.get_col(milvus::FieldId(100)); auto xq_dataset = knowhere::GenDataSet(NQ, DIM, xb_data.data() + DIM * query_offset); - result = vec_index->Query(xq_dataset, search_info, nullptr); + result = vec_index->Query(xq_dataset, search_info, nullptr, nullptr); } else if (vec_field_data_type == DataType::VECTOR_SPARSE_U32_F32) { auto dataset = GenFieldData(NQ, metric_type, vec_field_data_type); auto xb_data = @@ -196,7 +196,7 @@ TEST_P(IndexWrapperTest, BuildAndQuery) { auto xq_dataset = knowhere::GenDataSet(NQ, kTestSparseDim, xb_data.data()); xq_dataset->SetIsSparse(true); - result = vec_index->Query(xq_dataset, search_info, nullptr); + result = vec_index->Query(xq_dataset, search_info, nullptr, nullptr); } else { auto nb_for_nq = NQ + query_offset; auto dataset = GenFieldData( @@ -207,7 +207,7 @@ TEST_P(IndexWrapperTest, BuildAndQuery) { NQ, BINARY_DIM, xb_bin_data.data() + ((BINARY_DIM + 7) / 8) * query_offset); - result = vec_index->Query(xq_dataset, search_info, nullptr); + result = vec_index->Query(xq_dataset, search_info, nullptr, nullptr); } EXPECT_EQ(result->total_nq_, NQ); diff --git a/internal/core/unittest/test_indexing.cpp b/internal/core/unittest/test_indexing.cpp index d42b120f76..fb6be4356d 100644 --- a/internal/core/unittest/test_indexing.cpp +++ b/internal/core/unittest/test_indexing.cpp @@ -185,7 +185,8 @@ TEST(Indexing, BinaryBruteForce) { index_info, nullptr, DataType::VECTOR_BINARY, - DataType::NONE); + DataType::NONE, + nullptr); SearchResult sr; sr.total_nq_ = num_queries; @@ -296,7 +297,7 @@ TEST(Indexing, Naive) { searchInfo.search_params_ = search_conf; auto vec_index = dynamic_cast(index.get()); SearchResult result; - vec_index->Query(query_ds, searchInfo, view, result); + vec_index->Query(query_ds, searchInfo, view, nullptr, result); for (int i = 0; i < TOPK; ++i) { ASSERT_FALSE(result.seg_offsets_[i] < N / 2); @@ -519,7 +520,7 @@ TEST_P(IndexTest, BuildAndQuery) { search_info.metric_type_ = metric_type; search_info.search_params_ = search_conf; SearchResult result; - vec_index->Query(xq_dataset, search_info, nullptr, result); + vec_index->Query(xq_dataset, search_info, nullptr, nullptr, result); EXPECT_EQ(result.total_nq_, NQ); EXPECT_EQ(result.unity_topK_, K); EXPECT_EQ(result.distances_.size(), NQ * K); @@ -535,7 +536,7 @@ TEST_P(IndexTest, BuildAndQuery) { if (!is_sparse) { // sparse doesn't support range search yet search_info.search_params_ = range_search_conf; - vec_index->Query(xq_dataset, search_info, nullptr, result); + vec_index->Query(xq_dataset, search_info, nullptr, nullptr, result); } } @@ -590,7 +591,7 @@ TEST_P(IndexTest, Mmap) { search_info.metric_type_ = metric_type; search_info.search_params_ = search_conf; SearchResult result; - vec_index->Query(xq_dataset, search_info, nullptr, result); + vec_index->Query(xq_dataset, search_info, nullptr, nullptr, result); EXPECT_EQ(result.total_nq_, NQ); EXPECT_EQ(result.unity_topK_, K); EXPECT_EQ(result.distances_.size(), NQ * K); @@ -599,7 +600,7 @@ TEST_P(IndexTest, Mmap) { EXPECT_EQ(result.seg_offsets_[0], query_offset); } search_info.search_params_ = range_search_conf; - vec_index->Query(xq_dataset, search_info, nullptr, result); + vec_index->Query(xq_dataset, search_info, nullptr, nullptr, result); } TEST_P(IndexTest, GetVector) { @@ -842,8 +843,9 @@ TEST(Indexing, SearchDiskAnnWithInvalidParam) { {milvus::index::DISK_ANN_QUERY_LIST, K - 1}, }; SearchResult result; - EXPECT_THROW(vec_index->Query(xq_dataset, search_info, nullptr, result), - std::runtime_error); + EXPECT_THROW( + vec_index->Query(xq_dataset, search_info, nullptr, nullptr, result), + std::runtime_error); } TEST(Indexing, SearchDiskAnnWithFloat16) { @@ -928,7 +930,8 @@ TEST(Indexing, SearchDiskAnnWithFloat16) { {milvus::index::DISK_ANN_QUERY_LIST, K * 2}, }; SearchResult result; - EXPECT_NO_THROW(vec_index->Query(xq_dataset, search_info, nullptr, result)); + EXPECT_NO_THROW( + vec_index->Query(xq_dataset, search_info, nullptr, nullptr, result)); } TEST(Indexing, SearchDiskAnnWithBFloat16) { @@ -1013,7 +1016,8 @@ TEST(Indexing, SearchDiskAnnWithBFloat16) { {milvus::index::DISK_ANN_QUERY_LIST, K * 2}, }; SearchResult result; - EXPECT_NO_THROW(vec_index->Query(xq_dataset, search_info, nullptr, result)); + EXPECT_NO_THROW( + vec_index->Query(xq_dataset, search_info, nullptr, nullptr, result)); } #endif diff --git a/internal/core/unittest/test_sealed.cpp b/internal/core/unittest/test_sealed.cpp index 8311995a94..d55f4416be 100644 --- a/internal/core/unittest/test_sealed.cpp +++ b/internal/core/unittest/test_sealed.cpp @@ -125,7 +125,7 @@ TEST(Sealed, without_predicate) { searchInfo.metric_type_ = knowhere::metric::L2; searchInfo.search_params_ = search_conf; SearchResult result; - vec_index->Query(query_dataset, searchInfo, nullptr, result); + vec_index->Query(query_dataset, searchInfo, nullptr, nullptr, result); auto ref_result = SearchResultToJson(result); LoadIndexInfo load_info; @@ -330,7 +330,7 @@ TEST(Sealed, with_predicate) { searchInfo.metric_type_ = knowhere::metric::L2; searchInfo.search_params_ = search_conf; SearchResult result; - vec_index->Query(query_dataset, searchInfo, nullptr, result); + vec_index->Query(query_dataset, searchInfo, nullptr, nullptr, result); LoadIndexInfo load_info; load_info.field_id = fake_id.get(); @@ -2460,7 +2460,7 @@ TEST(Sealed, SearchVectorArray) { searchInfo.metric_type_ = knowhere::metric::MAX_SIM; searchInfo.search_params_ = search_conf; SearchResult result; - vec_index->Query(query_dataset, searchInfo, nullptr, result); + vec_index->Query(query_dataset, searchInfo, nullptr, nullptr, result); auto ref_result = SearchResultToJson(result); std::cout << ref_result.dump(1) << std::endl; EXPECT_EQ(result.total_nq_, 2); diff --git a/internal/core/unittest/test_string_expr.cpp b/internal/core/unittest/test_string_expr.cpp index c3cee52b90..8f1150d824 100644 --- a/internal/core/unittest/test_string_expr.cpp +++ b/internal/core/unittest/test_string_expr.cpp @@ -1563,7 +1563,8 @@ TEST(AlwaysTrueStringPlan, SearchWithOutputFields) { index_info, nullptr, DataType::VECTOR_FLOAT, - DataType::NONE); + DataType::NONE, + nullptr); auto sr = segment->Search(plan.get(), ph_group.get(), MAX_TIMESTAMP); segment->FillPrimaryKeys(plan.get(), *sr); diff --git a/internal/core/unittest/test_utils/cachinglayer_test_utils.h b/internal/core/unittest/test_utils/cachinglayer_test_utils.h index ae09aa2360..ae08c93f2e 100644 --- a/internal/core/unittest/test_utils/cachinglayer_test_utils.h +++ b/internal/core/unittest/test_utils/cachinglayer_test_utils.h @@ -77,6 +77,11 @@ class TestChunkTranslator : public Translator { return {{0, 0}, {0, 0}}; } + int64_t + cells_storage_bytes(const std::vector& cids) const override { + return 0; + } + const std::string& key() const override { return key_; @@ -148,6 +153,11 @@ class TestGroupChunkTranslator : public Translator { return {{0, 0}, {0, 0}}; } + int64_t + cells_storage_bytes(const std::vector& cids) const override { + return 0; + } + const std::string& key() const override { return key_; @@ -208,6 +218,11 @@ class TestIndexTranslator : public Translator { return {{0, 0}, {0, 0}}; } + int64_t + cells_storage_bytes(const std::vector& cids) const override { + return 0; + } + const std::string& key() const override { return key_; diff --git a/internal/mocks/util/mock_segcore/mock_data.go b/internal/mocks/util/mock_segcore/mock_data.go index a305b03e7f..7b18fce5a6 100644 --- a/internal/mocks/util/mock_segcore/mock_data.go +++ b/internal/mocks/util/mock_segcore/mock_data.go @@ -1092,7 +1092,7 @@ func CheckSearchResult(ctx context.Context, nq int64, plan *segcore.SearchPlan, } for i := 0; i < len(sInfo.SliceNQs); i++ { - blob, err := segcore.GetSearchResultDataBlob(ctx, res, i) + blob, _, err := segcore.GetSearchResultDataBlob(ctx, res, i) if err != nil { return err } diff --git a/internal/proxy/impl.go b/internal/proxy/impl.go index 33f60a6c7b..3b50bf3bc1 100644 --- a/internal/proxy/impl.go +++ b/internal/proxy/impl.go @@ -47,6 +47,7 @@ import ( "github.com/milvus-io/milvus/internal/types" "github.com/milvus-io/milvus/internal/util/analyzer" "github.com/milvus-io/milvus/internal/util/hookutil" + "github.com/milvus-io/milvus/internal/util/segcore" "github.com/milvus-io/milvus/pkg/v2/common" "github.com/milvus-io/milvus/pkg/v2/log" "github.com/milvus-io/milvus/pkg/v2/metrics" @@ -2880,6 +2881,20 @@ func (node *Proxy) search(ctx context.Context, request *milvuspb.SearchRequest, collectionName, ).Observe(float64(searchDur)) + metrics.ProxyScannedRemoteBytes.WithLabelValues( + nodeID, + metrics.SearchLabel, + dbName, + collectionName, + ).Add(float64(qt.storageCost.ScannedRemoteBytes)) + + metrics.ProxyScannedTotalBytes.WithLabelValues( + nodeID, + metrics.SearchLabel, + dbName, + collectionName, + ).Add(float64(qt.storageCost.ScannedTotalBytes)) + if qt.result != nil { username := GetCurUserFromContextOrDefault(ctx) sentSize := proto.Size(qt.result) @@ -2892,6 +2907,7 @@ func (node *Proxy) search(ctx context.Context, request *milvuspb.SearchRequest, hookutil.RelatedCntKey: qt.result.GetResults().GetAllSearchCount(), }) SetReportValue(qt.result.GetStatus(), v) + SetStorageCost(qt.result.GetStatus(), qt.storageCost) if merr.Ok(qt.result.GetStatus()) { metrics.ProxyReportValue.WithLabelValues(nodeID, hookutil.OpTypeSearch, dbName, username).Add(float64(v)) } @@ -3087,6 +3103,20 @@ func (node *Proxy) hybridSearch(ctx context.Context, request *milvuspb.HybridSea collectionName, ).Observe(float64(searchDur)) + metrics.ProxyScannedRemoteBytes.WithLabelValues( + nodeID, + metrics.HybridSearchLabel, + dbName, + collectionName, + ).Add(float64(qt.storageCost.ScannedRemoteBytes)) + + metrics.ProxyScannedTotalBytes.WithLabelValues( + nodeID, + metrics.HybridSearchLabel, + dbName, + collectionName, + ).Add(float64(qt.storageCost.ScannedTotalBytes)) + if qt.result != nil { sentSize := proto.Size(qt.result) username := GetCurUserFromContextOrDefault(ctx) @@ -3099,6 +3129,7 @@ func (node *Proxy) hybridSearch(ctx context.Context, request *milvuspb.HybridSea hookutil.RelatedCntKey: qt.result.GetResults().GetAllSearchCount(), }) SetReportValue(qt.result.GetStatus(), v) + SetStorageCost(qt.result.GetStatus(), qt.storageCost) if merr.Ok(qt.result.GetStatus()) { metrics.ProxyReportValue.WithLabelValues(nodeID, hookutil.OpTypeHybridSearch, dbName, username).Add(float64(v)) } @@ -3226,14 +3257,14 @@ func (node *Proxy) Flush(ctx context.Context, request *milvuspb.FlushRequest) (* } // Query get the records by primary keys. -func (node *Proxy) query(ctx context.Context, qt *queryTask, sp trace.Span) (*milvuspb.QueryResults, error) { +func (node *Proxy) query(ctx context.Context, qt *queryTask, sp trace.Span) (*milvuspb.QueryResults, segcore.StorageCost, error) { request := qt.request method := "Query" if err := merr.CheckHealthy(node.GetStateCode()); err != nil { return &milvuspb.QueryResults{ Status: merr.Status(err), - }, nil + }, segcore.StorageCost{}, nil } log := log.Ctx(ctx).With( @@ -3291,7 +3322,7 @@ func (node *Proxy) query(ctx context.Context, qt *queryTask, sp trace.Span) (*mi return &milvuspb.QueryResults{ Status: merr.Status(err), - }, nil + }, segcore.StorageCost{}, nil } tr.CtxRecord(ctx, "query request enqueue") @@ -3304,7 +3335,7 @@ func (node *Proxy) query(ctx context.Context, qt *queryTask, sp trace.Span) (*mi return &milvuspb.QueryResults{ Status: merr.Status(err), - }, nil + }, segcore.StorageCost{}, nil } if !qt.reQuery { @@ -3327,9 +3358,23 @@ func (node *Proxy) query(ctx context.Context, qt *queryTask, sp trace.Span) (*mi request.DbName, request.CollectionName, ).Observe(float64(tr.ElapseSpan().Milliseconds())) + + metrics.ProxyScannedRemoteBytes.WithLabelValues( + strconv.FormatInt(paramtable.GetNodeID(), 10), + metrics.QueryLabel, + request.DbName, + request.CollectionName, + ).Add(float64(qt.storageCost.ScannedRemoteBytes)) + + metrics.ProxyScannedTotalBytes.WithLabelValues( + strconv.FormatInt(paramtable.GetNodeID(), 10), + metrics.QueryLabel, + request.DbName, + request.CollectionName, + ).Add(float64(qt.storageCost.ScannedTotalBytes)) } - return qt.result, nil + return qt.result, qt.storageCost, nil } // Query get the records by primary keys. @@ -3376,7 +3421,7 @@ func (node *Proxy) Query(ctx context.Context, request *milvuspb.QueryRequest) (* defer sp.End() method := "Query" - res, err := node.query(ctx, qt, sp) + res, storageCost, err := node.query(ctx, qt, sp) if err != nil || !merr.Ok(res.Status) { return res, err } @@ -3394,6 +3439,7 @@ func (node *Proxy) Query(ctx context.Context, request *milvuspb.QueryRequest) (* hookutil.RelatedCntKey: qt.allQueryCnt, }) SetReportValue(res.Status, v) + SetStorageCost(res.Status, storageCost) metrics.ProxyReportValue.WithLabelValues(nodeID, hookutil.OpTypeQuery, request.DbName, username).Add(float64(v)) if log.Ctx(ctx).Core().Enabled(zap.DebugLevel) && matchCountRule(request.GetOutputFields()) { diff --git a/internal/proxy/search_pipeline.go b/internal/proxy/search_pipeline.go index b199ed7674..94e8c137f0 100644 --- a/internal/proxy/search_pipeline.go +++ b/internal/proxy/search_pipeline.go @@ -32,6 +32,7 @@ import ( "github.com/milvus-io/milvus/internal/parser/planparserv2" "github.com/milvus-io/milvus/internal/types" "github.com/milvus-io/milvus/internal/util/function/rerank" + "github.com/milvus-io/milvus/internal/util/segcore" "github.com/milvus-io/milvus/pkg/v2/log" "github.com/milvus-io/milvus/pkg/v2/proto/internalpb" "github.com/milvus-io/milvus/pkg/v2/proto/planpb" @@ -243,7 +244,6 @@ func (op *hybridSearchReduceOperator) run(ctx context.Context, span trace.Span, if err != nil { return nil, err } - searchMetrics = append(searchMetrics, subMetricType) multipleMilvusResults[index] = result } @@ -357,18 +357,21 @@ func newRequeryOperator(t *searchTask, _ map[string]any) (operator, error) { func (op *requeryOperator) run(ctx context.Context, span trace.Span, inputs ...any) ([]any, error) { allIDs := inputs[0].(*schemapb.IDs) + storageCostFromLastOp := inputs[1].(segcore.StorageCost) if typeutil.GetSizeOfIDs(allIDs) == 0 { - return []any{[]*schemapb.FieldData{}}, nil + return []any{[]*schemapb.FieldData{}, storageCostFromLastOp}, nil } - queryResult, err := op.requery(ctx, span, allIDs, op.outputFieldNames) + queryResult, storageCost, err := op.requery(ctx, span, allIDs, op.outputFieldNames) if err != nil { return nil, err } - return []any{queryResult.GetFieldsData()}, nil + storageCost.ScannedRemoteBytes += storageCostFromLastOp.ScannedRemoteBytes + storageCost.ScannedTotalBytes += storageCostFromLastOp.ScannedTotalBytes + return []any{queryResult.GetFieldsData(), storageCost}, nil } -func (op *requeryOperator) requery(ctx context.Context, span trace.Span, ids *schemapb.IDs, outputFields []string) (*milvuspb.QueryResults, error) { +func (op *requeryOperator) requery(ctx context.Context, span trace.Span, ids *schemapb.IDs, outputFields []string) (*milvuspb.QueryResults, segcore.StorageCost, error) { queryReq := &milvuspb.QueryRequest{ Base: &commonpb.MsgBase{ MsgType: commonpb.MsgType_Retrieve, @@ -409,15 +412,15 @@ func (op *requeryOperator) requery(ctx context.Context, span trace.Span, ids *sc fastSkip: true, reQuery: true, } - queryResult, err := op.node.(*Proxy).query(op.traceCtx, qt, span) + queryResult, storageCost, err := op.node.(*Proxy).query(op.traceCtx, qt, span) if err != nil { - return nil, err + return nil, segcore.StorageCost{}, err } if queryResult.GetStatus().GetErrorCode() != commonpb.ErrorCode_Success { - return nil, merr.Error(queryResult.GetStatus()) + return nil, segcore.StorageCost{}, merr.Error(queryResult.GetStatus()) } - return queryResult, nil + return queryResult, storageCost, nil } type organizeOperator struct { @@ -632,20 +635,21 @@ func newPipeline(pipeDef *pipelineDef, t *searchTask) (*pipeline, error) { return &pipeline{name: pipeDef.name, nodes: nodes}, nil } -func (p *pipeline) Run(ctx context.Context, span trace.Span, toReduceResults []*internalpb.SearchResults) (*milvuspb.SearchResults, error) { +func (p *pipeline) Run(ctx context.Context, span trace.Span, toReduceResults []*internalpb.SearchResults, storageCost segcore.StorageCost) (*milvuspb.SearchResults, segcore.StorageCost, error) { log.Ctx(ctx).Debug("SearchPipeline run", zap.String("pipeline", p.String())) msg := opMsg{} msg["input"] = toReduceResults + msg["storage_cost"] = storageCost for _, node := range p.nodes { var err error log.Ctx(ctx).Debug("SearchPipeline run node", zap.String("node", node.name)) msg, err = node.Run(ctx, span, msg) if err != nil { log.Ctx(ctx).Error("Run node failed: ", zap.String("err", err.Error())) - return nil, err + return nil, storageCost, err } } - return msg["output"].(*milvuspb.SearchResults), nil + return msg["output"].(*milvuspb.SearchResults), msg["storage_cost"].(segcore.StorageCost), nil } func (p *pipeline) String() string { @@ -666,7 +670,7 @@ var searchPipe = &pipelineDef{ nodes: []*nodeDef{ { name: "reduce", - inputs: []string{"input"}, + inputs: []string{"input", "storage_cost"}, outputs: []string{"reduced", "metrics"}, opName: searchReduceOp, }, @@ -696,7 +700,7 @@ var searchWithRequeryPipe = &pipelineDef{ nodes: []*nodeDef{ { name: "reduce", - inputs: []string{"input"}, + inputs: []string{"input", "storage_cost"}, outputs: []string{"reduced", "metrics"}, opName: searchReduceOp, }, @@ -711,8 +715,8 @@ var searchWithRequeryPipe = &pipelineDef{ }, { name: "requery", - inputs: []string{"unique_ids"}, - outputs: []string{"fields"}, + inputs: []string{"unique_ids", "storage_cost"}, + outputs: []string{"fields", "storage_cost"}, opName: requeryOp, }, { @@ -760,7 +764,7 @@ var searchWithRerankPipe = &pipelineDef{ nodes: []*nodeDef{ { name: "reduce", - inputs: []string{"input"}, + inputs: []string{"input", "storage_cost"}, outputs: []string{"reduced", "metrics"}, opName: searchReduceOp, }, @@ -818,7 +822,7 @@ var searchWithRerankRequeryPipe = &pipelineDef{ nodes: []*nodeDef{ { name: "reduce", - inputs: []string{"input"}, + inputs: []string{"input", "storage_cost"}, outputs: []string{"reduced", "metrics"}, opName: searchReduceOp, }, @@ -843,8 +847,8 @@ var searchWithRerankRequeryPipe = &pipelineDef{ }, { name: "requery", - inputs: []string{"ids"}, - outputs: []string{"fields"}, + inputs: []string{"ids", "storage_cost"}, + outputs: []string{"fields", "storage_cost"}, opName: requeryOp, }, { @@ -892,7 +896,7 @@ var hybridSearchPipe = &pipelineDef{ nodes: []*nodeDef{ { name: "reduce", - inputs: []string{"input"}, + inputs: []string{"input", "storage_cost"}, outputs: []string{"reduced", "metrics"}, opName: hybridSearchReduceOp, }, @@ -910,7 +914,7 @@ var hybridSearchWithRequeryPipe = &pipelineDef{ nodes: []*nodeDef{ { name: "reduce", - inputs: []string{"input"}, + inputs: []string{"input", "storage_cost"}, outputs: []string{"reduced", "metrics"}, opName: hybridSearchReduceOp, }, @@ -925,8 +929,8 @@ var hybridSearchWithRequeryPipe = &pipelineDef{ }, { name: "requery", - inputs: []string{"ids"}, - outputs: []string{"fields"}, + inputs: []string{"ids", "storage_cost"}, + outputs: []string{"fields", "storage_cost"}, opName: requeryOp, }, { diff --git a/internal/proxy/search_pipeline_test.go b/internal/proxy/search_pipeline_test.go index e884de0d06..2b2891dc97 100644 --- a/internal/proxy/search_pipeline_test.go +++ b/internal/proxy/search_pipeline_test.go @@ -32,6 +32,7 @@ import ( "github.com/milvus-io/milvus-proto/go-api/v2/milvuspb" "github.com/milvus-io/milvus-proto/go-api/v2/schemapb" "github.com/milvus-io/milvus/internal/util/function/rerank" + "github.com/milvus-io/milvus/internal/util/segcore" "github.com/milvus-io/milvus/pkg/v2/proto/internalpb" "github.com/milvus-io/milvus/pkg/v2/proto/planpb" "github.com/milvus-io/milvus/pkg/v2/util/testutils" @@ -192,7 +193,7 @@ func (s *SearchPipelineSuite) TestRequeryOp() { mocker := mockey.Mock((*requeryOperator).requery).Return(&milvuspb.QueryResults{ FieldsData: []*schemapb.FieldData{f1}, - }, nil).Build() + }, segcore.StorageCost{}, nil).Build() defer mocker.UnPatch() op := requeryOperator{ @@ -206,7 +207,7 @@ func (s *SearchPipelineSuite) TestRequeryOp() { }, }, } - _, err := op.run(context.Background(), s.span, ids, []string{"int64"}) + _, err := op.run(context.Background(), s.span, ids, segcore.StorageCost{}) s.NoError(err) } @@ -296,9 +297,8 @@ func (s *SearchPipelineSuite) TestSearchPipeline() { } pipeline, err := newPipeline(searchPipe, task) s.NoError(err) - results, err := pipeline.Run(context.Background(), s.span, []*internalpb.SearchResults{ - genTestSearchResultData(2, 10, schemapb.DataType_Int64, "intField", 101, false), - }) + sr := genTestSearchResultData(2, 10, schemapb.DataType_Int64, "intField", 101, false) + results, storageCost, err := pipeline.Run(context.Background(), s.span, []*internalpb.SearchResults{sr}, segcore.StorageCost{ScannedRemoteBytes: 100, ScannedTotalBytes: 250}) s.NoError(err) s.NotNil(results) s.NotNil(results.Results) @@ -314,6 +314,8 @@ func (s *SearchPipelineSuite) TestSearchPipeline() { s.Len(results.Results.FieldsData, 1) // One output field s.Equal("intField", results.Results.FieldsData[0].FieldName) s.Equal(int64(101), results.Results.FieldsData[0].FieldId) + s.Equal(int64(100), storageCost.ScannedRemoteBytes) + s.Equal(int64(250), storageCost.ScannedTotalBytes) fmt.Println(results) } @@ -355,14 +357,14 @@ func (s *SearchPipelineSuite) TestSearchPipelineWithRequery() { f2.FieldId = 100 mocker := mockey.Mock((*requeryOperator).requery).Return(&milvuspb.QueryResults{ FieldsData: []*schemapb.FieldData{f1, f2}, - }, nil).Build() + }, segcore.StorageCost{ScannedRemoteBytes: 100, ScannedTotalBytes: 200}, nil).Build() defer mocker.UnPatch() pipeline, err := newPipeline(searchWithRequeryPipe, task) s.NoError(err) - results, err := pipeline.Run(context.Background(), s.span, []*internalpb.SearchResults{ + results, storageCost, err := pipeline.Run(context.Background(), s.span, []*internalpb.SearchResults{ genTestSearchResultData(2, 10, schemapb.DataType_Int64, "intField", 101, false), - }) + }, segcore.StorageCost{ScannedRemoteBytes: 100, ScannedTotalBytes: 200}) s.NoError(err) s.NotNil(results) s.NotNil(results.Results) @@ -378,6 +380,8 @@ func (s *SearchPipelineSuite) TestSearchPipelineWithRequery() { s.Len(results.Results.FieldsData, 1) // One output field s.Equal("intField", results.Results.FieldsData[0].FieldName) s.Equal(int64(101), results.Results.FieldsData[0].FieldId) + s.Equal(int64(200), storageCost.ScannedRemoteBytes) + s.Equal(int64(400), storageCost.ScannedTotalBytes) } func (s *SearchPipelineSuite) TestSearchWithRerankPipe() { @@ -431,7 +435,7 @@ func (s *SearchPipelineSuite) TestSearchWithRerankPipe() { s.NoError(err) searchResults := genTestSearchResultData(2, 10, schemapb.DataType_Int64, "intField", 101, false) - results, err := pipeline.Run(context.Background(), s.span, []*internalpb.SearchResults{searchResults}) + results, _, err := pipeline.Run(context.Background(), s.span, []*internalpb.SearchResults{searchResults}, segcore.StorageCost{}) s.NoError(err) s.NotNil(results) @@ -506,14 +510,14 @@ func (s *SearchPipelineSuite) TestSearchWithRerankRequeryPipe() { f2.FieldId = 100 mocker := mockey.Mock((*requeryOperator).requery).Return(&milvuspb.QueryResults{ FieldsData: []*schemapb.FieldData{f1, f2}, - }, nil).Build() + }, segcore.StorageCost{}, nil).Build() defer mocker.UnPatch() pipeline, err := newPipeline(searchWithRerankRequeryPipe, task) s.NoError(err) searchResults := genTestSearchResultData(2, 10, schemapb.DataType_Int64, "intField", 101, false) - results, err := pipeline.Run(context.Background(), s.span, []*internalpb.SearchResults{searchResults}) + results, storageCost, err := pipeline.Run(context.Background(), s.span, []*internalpb.SearchResults{searchResults}, segcore.StorageCost{}) s.NoError(err) s.NotNil(results) @@ -530,6 +534,8 @@ func (s *SearchPipelineSuite) TestSearchWithRerankRequeryPipe() { s.Len(results.Results.FieldsData, 1) // One output field s.Equal("intField", results.Results.FieldsData[0].FieldName) s.Equal(int64(101), results.Results.FieldsData[0].FieldId) + s.Equal(int64(0), storageCost.ScannedRemoteBytes) + s.Equal(int64(0), storageCost.ScannedTotalBytes) } func (s *SearchPipelineSuite) TestHybridSearchPipe() { @@ -545,7 +551,7 @@ func (s *SearchPipelineSuite) TestHybridSearchPipe() { f1 := genTestSearchResultData(2, 10, schemapb.DataType_Int64, "intField", 101, true) f2 := genTestSearchResultData(2, 10, schemapb.DataType_Int64, "intField", 101, true) - results, err := pipeline.Run(context.Background(), s.span, []*internalpb.SearchResults{f1, f2}) + results, storageCost, err := pipeline.Run(context.Background(), s.span, []*internalpb.SearchResults{f1, f2}, segcore.StorageCost{ScannedRemoteBytes: 900, ScannedTotalBytes: 2000}) s.NoError(err) s.NotNil(results) @@ -558,6 +564,8 @@ func (s *SearchPipelineSuite) TestHybridSearchPipe() { s.Len(results.Results.Ids.GetIntId().Data, 20) // 2 queries * 10 topk s.NotNil(results.Results.Scores) s.Len(results.Results.Scores, 20) // 2 queries * 10 topk + s.Equal(int64(900), storageCost.ScannedRemoteBytes) + s.Equal(int64(2000), storageCost.ScannedTotalBytes) } func (s *SearchPipelineSuite) TestFilterFieldOperatorWithStructArrayFields() { @@ -647,7 +655,7 @@ func (s *SearchPipelineSuite) TestHybridSearchWithRequeryPipe() { f2.FieldId = 100 mocker := mockey.Mock((*requeryOperator).requery).Return(&milvuspb.QueryResults{ FieldsData: []*schemapb.FieldData{f1, f2}, - }, nil).Build() + }, segcore.StorageCost{}, nil).Build() defer mocker.UnPatch() pipeline, err := newPipeline(hybridSearchWithRequeryPipe, task) @@ -655,7 +663,7 @@ func (s *SearchPipelineSuite) TestHybridSearchWithRequeryPipe() { d1 := genTestSearchResultData(2, 10, schemapb.DataType_Int64, "intField", 101, true) d2 := genTestSearchResultData(2, 10, schemapb.DataType_Int64, "intField", 101, true) - results, err := pipeline.Run(context.Background(), s.span, []*internalpb.SearchResults{d1, d2}) + results, _, err := pipeline.Run(context.Background(), s.span, []*internalpb.SearchResults{d1, d2}, segcore.StorageCost{}) s.NoError(err) s.NotNil(results) diff --git a/internal/proxy/task_query.go b/internal/proxy/task_query.go index 2d39ea18d1..d53d6778d0 100644 --- a/internal/proxy/task_query.go +++ b/internal/proxy/task_query.go @@ -19,6 +19,7 @@ import ( "github.com/milvus-io/milvus/internal/types" "github.com/milvus-io/milvus/internal/util/exprutil" "github.com/milvus-io/milvus/internal/util/reduce" + "github.com/milvus-io/milvus/internal/util/segcore" typeutil2 "github.com/milvus-io/milvus/internal/util/typeutil" "github.com/milvus-io/milvus/pkg/v2/common" "github.com/milvus-io/milvus/pkg/v2/log" @@ -75,6 +76,8 @@ type queryTask struct { allQueryCnt int64 totalRelatedDataSize int64 mustUsePartitionKey bool + + storageCost segcore.StorageCost } type queryParams struct { @@ -624,6 +627,7 @@ func (t *queryTask) PostExecute(ctx context.Context) error { toReduceResults := make([]*internalpb.RetrieveResults, 0) t.allQueryCnt = 0 t.totalRelatedDataSize = 0 + t.storageCost = segcore.StorageCost{} select { case <-t.TraceCtx().Done(): log.Warn("proxy", zap.Int64("Query: wait to finish failed, timeout!, msgID:", t.ID())) @@ -633,6 +637,8 @@ func (t *queryTask) PostExecute(ctx context.Context) error { t.resultBuf.Range(func(res *internalpb.RetrieveResults) bool { toReduceResults = append(toReduceResults, res) t.allQueryCnt += res.GetAllRetrieveCount() + t.storageCost.ScannedRemoteBytes += res.GetScannedRemoteBytes() + t.storageCost.ScannedTotalBytes += res.GetScannedTotalBytes() t.totalRelatedDataSize += res.GetCostAggregation().GetTotalRelatedDataSize() log.Debug("proxy receives one query result", zap.Int64("sourceID", res.GetBase().GetSourceID())) return true diff --git a/internal/proxy/task_search.go b/internal/proxy/task_search.go index ce620e09e6..d74603e742 100644 --- a/internal/proxy/task_search.go +++ b/internal/proxy/task_search.go @@ -21,6 +21,7 @@ import ( "github.com/milvus-io/milvus/internal/util/exprutil" "github.com/milvus-io/milvus/internal/util/function/embedding" "github.com/milvus-io/milvus/internal/util/function/rerank" + "github.com/milvus-io/milvus/internal/util/segcore" "github.com/milvus-io/milvus/pkg/v2/log" "github.com/milvus-io/milvus/pkg/v2/metrics" "github.com/milvus-io/milvus/pkg/v2/proto/internalpb" @@ -94,6 +95,8 @@ type searchTask struct { // we always remove pk field from output fields, as search result already contains pk field. // if the user explicitly set pk field in output fields, we add it back to the result. userRequestedPkFieldExplicitly bool + + storageCost segcore.StorageCost } func (t *searchTask) CanSkipAllocTimestamp() bool { @@ -739,6 +742,7 @@ func (t *searchTask) PostExecute(ctx context.Context) error { t.relatedDataSize = 0 isTopkReduce := false isRecallEvaluation := false + storageCost := segcore.StorageCost{} for _, r := range toReduceResults { if r.GetIsTopkReduce() { isTopkReduce = true @@ -750,6 +754,8 @@ func (t *searchTask) PostExecute(ctx context.Context) error { for ch, ts := range r.GetChannelsMvcc() { t.queryChannelsTs[ch] = ts } + storageCost.ScannedRemoteBytes += r.GetScannedRemoteBytes() + storageCost.ScannedTotalBytes += r.GetScannedTotalBytes() } t.isTopkReduce = isTopkReduce @@ -761,7 +767,7 @@ func (t *searchTask) PostExecute(ctx context.Context) error { log.Warn("Faild to create post process pipeline") return err } - if t.result, err = pipeline.Run(ctx, sp, toReduceResults); err != nil { + if t.result, t.storageCost, err = pipeline.Run(ctx, sp, toReduceResults, storageCost); err != nil { return err } t.fillResult() diff --git a/internal/proxy/task_search_test.go b/internal/proxy/task_search_test.go index d117dd6a67..62a246c1b4 100644 --- a/internal/proxy/task_search_test.go +++ b/internal/proxy/task_search_test.go @@ -43,6 +43,7 @@ import ( "github.com/milvus-io/milvus/internal/util/dependency" "github.com/milvus-io/milvus/internal/util/function/embedding" "github.com/milvus-io/milvus/internal/util/reduce" + "github.com/milvus-io/milvus/internal/util/segcore" "github.com/milvus-io/milvus/pkg/v2/common" "github.com/milvus-io/milvus/pkg/v2/proto/internalpb" "github.com/milvus-io/milvus/pkg/v2/proto/planpb" @@ -395,7 +396,7 @@ func TestSearchTask_PostExecute(t *testing.T) { mocker := mockey.Mock((*requeryOperator).requery).Return(&milvuspb.QueryResults{ FieldsData: []*schemapb.FieldData{f1, f2, f3}, - }, nil).Build() + }, segcore.StorageCost{}, nil).Build() defer mocker.UnPatch() err := qt.PostExecute(context.TODO()) @@ -435,7 +436,7 @@ func TestSearchTask_PostExecute(t *testing.T) { mocker := mockey.Mock((*requeryOperator).requery).Return(&milvuspb.QueryResults{ FieldsData: []*schemapb.FieldData{f1, f2, f3}, - }, nil).Build() + }, segcore.StorageCost{}, nil).Build() defer mocker.UnPatch() err := qt.PostExecute(context.TODO()) @@ -475,7 +476,7 @@ func TestSearchTask_PostExecute(t *testing.T) { f4.FieldId = fieldNameId[testFloatField] mocker := mockey.Mock((*requeryOperator).requery).Return(&milvuspb.QueryResults{ FieldsData: []*schemapb.FieldData{f1, f2, f3, f4}, - }, nil).Build() + }, segcore.StorageCost{}, nil).Build() defer mocker.UnPatch() err := qt.PostExecute(context.TODO()) @@ -4154,8 +4155,10 @@ func TestSearchTask_Requery(t *testing.T) { } op, err := newRequeryOperator(qt, nil) assert.NoError(t, err) - queryResult, err := op.(*requeryOperator).requery(ctx, nil, qt.result.Results.Ids, outputFields) + queryResult, storageCost, err := op.(*requeryOperator).requery(ctx, nil, qt.result.Results.Ids, outputFields) assert.NoError(t, err) + assert.Equal(t, int64(0), storageCost.ScannedRemoteBytes) + assert.Equal(t, int64(0), storageCost.ScannedTotalBytes) assert.Len(t, queryResult.FieldsData, 2) for _, field := range qt.result.Results.FieldsData { fieldName := field.GetFieldName() @@ -4219,7 +4222,7 @@ func TestSearchTask_Requery(t *testing.T) { op, err := newRequeryOperator(qt, nil) assert.NoError(t, err) - _, err = op.(*requeryOperator).requery(ctx, nil, &schemapb.IDs{}, []string{}) + _, _, err = op.(*requeryOperator).requery(ctx, nil, &schemapb.IDs{}, []string{}) t.Logf("err = %s", err) assert.Error(t, err) }) diff --git a/internal/proxy/task_upsert.go b/internal/proxy/task_upsert.go index cd3fcd64de..5b42365a42 100644 --- a/internal/proxy/task_upsert.go +++ b/internal/proxy/task_upsert.go @@ -223,7 +223,8 @@ func retrieveByPKs(ctx context.Context, t *upsertTask, ids *schemapb.IDs, output defer func() { sp.End() }() - queryResult, err := t.node.(*Proxy).query(ctx, qt, sp) + // ignore storage cost? + queryResult, _, err := t.node.(*Proxy).query(ctx, qt, sp) if err := merr.CheckRPCCall(queryResult.GetStatus(), err); err != nil { return nil, err } diff --git a/internal/proxy/task_upsert_test.go b/internal/proxy/task_upsert_test.go index 23bfaff9b2..7697e55aa5 100644 --- a/internal/proxy/task_upsert_test.go +++ b/internal/proxy/task_upsert_test.go @@ -33,6 +33,7 @@ import ( "github.com/milvus-io/milvus/internal/mocks" "github.com/milvus-io/milvus/internal/parser/planparserv2" "github.com/milvus-io/milvus/internal/util/function/embedding" + "github.com/milvus-io/milvus/internal/util/segcore" "github.com/milvus-io/milvus/pkg/v2/mq/msgstream" "github.com/milvus-io/milvus/pkg/v2/proto/planpb" "github.com/milvus-io/milvus/pkg/v2/proto/rootcoordpb" @@ -665,7 +666,7 @@ func TestRetrieveByPKs_Success(t *testing.T) { }, }, }, - }, nil).Build() + }, segcore.StorageCost{}, nil).Build() globalMetaCache = &MetaCache{} mockey.Mock(globalMetaCache.GetPartitionID).Return(int64(1002), nil).Build() @@ -736,7 +737,7 @@ func TestRetrieveByPKs_PartitionKeyMode(t *testing.T) { mockey.Mock((*Proxy).query).Return(&milvuspb.QueryResults{ Status: merr.Success(), FieldsData: []*schemapb.FieldData{}, - }, nil).Build() + }, segcore.StorageCost{}, nil).Build() task := createTestUpdateTask() task.partitionKeyMode = true diff --git a/internal/proxy/util.go b/internal/proxy/util.go index 02bc810d8b..8fc6e79af2 100644 --- a/internal/proxy/util.go +++ b/internal/proxy/util.go @@ -42,6 +42,7 @@ import ( "github.com/milvus-io/milvus/internal/util/function/embedding" "github.com/milvus-io/milvus/internal/util/hookutil" "github.com/milvus-io/milvus/internal/util/indexparamcheck" + "github.com/milvus-io/milvus/internal/util/segcore" typeutil2 "github.com/milvus-io/milvus/internal/util/typeutil" "github.com/milvus-io/milvus/pkg/v2/common" "github.com/milvus-io/milvus/pkg/v2/log" @@ -2412,6 +2413,23 @@ func SetReportValue(status *commonpb.Status, value int) { status.ExtraInfo["report_value"] = strconv.Itoa(value) } +func SetStorageCost(status *commonpb.Status, storageCost segcore.StorageCost) { + if storageCost.ScannedTotalBytes <= 0 { + return + } + if !merr.Ok(status) { + return + } + if status.ExtraInfo == nil { + status.ExtraInfo = make(map[string]string) + } + + status.ExtraInfo["scanned_remote_bytes"] = strconv.FormatInt(storageCost.ScannedRemoteBytes, 10) + status.ExtraInfo["scanned_total_bytes"] = strconv.FormatInt(storageCost.ScannedTotalBytes, 10) + cacheHitRatio := float64(storageCost.ScannedTotalBytes-storageCost.ScannedRemoteBytes) / float64(storageCost.ScannedTotalBytes) + status.ExtraInfo["cache_hit_ratio"] = strconv.FormatFloat(cacheHitRatio, 'f', -1, 64) +} + func GetCostValue(status *commonpb.Status) int { if status == nil || status.ExtraInfo == nil { return 0 diff --git a/internal/querynodev2/segments/count_reducer.go b/internal/querynodev2/segments/count_reducer.go index 61fdd72fec..7ffb82a3a8 100644 --- a/internal/querynodev2/segments/count_reducer.go +++ b/internal/querynodev2/segments/count_reducer.go @@ -15,9 +15,13 @@ func (r *cntReducer) Reduce(ctx context.Context, results []*internalpb.RetrieveR cnt := int64(0) allRetrieveCount := int64(0) relatedDataSize := int64(0) + scannedRemoteBytes := int64(0) + scannedTotalBytes := int64(0) for _, res := range results { allRetrieveCount += res.GetAllRetrieveCount() relatedDataSize += res.GetCostAggregation().GetTotalRelatedDataSize() + scannedRemoteBytes += res.GetScannedRemoteBytes() + scannedTotalBytes += res.GetScannedTotalBytes() c, err := funcutil.CntOfInternalResult(res) if err != nil { return nil, err @@ -29,6 +33,8 @@ func (r *cntReducer) Reduce(ctx context.Context, results []*internalpb.RetrieveR res.CostAggregation = &internalpb.CostAggregation{ TotalRelatedDataSize: relatedDataSize, } + res.ScannedRemoteBytes = scannedRemoteBytes + res.ScannedTotalBytes = scannedTotalBytes return res, nil } @@ -37,8 +43,12 @@ type cntReducerSegCore struct{} func (r *cntReducerSegCore) Reduce(ctx context.Context, results []*segcorepb.RetrieveResults, _ []Segment, _ *segcore.RetrievePlan) (*segcorepb.RetrieveResults, error) { cnt := int64(0) allRetrieveCount := int64(0) + scannedRemoteBytes := int64(0) + scannedTotalBytes := int64(0) for _, res := range results { allRetrieveCount += res.GetAllRetrieveCount() + scannedRemoteBytes += res.GetScannedRemoteBytes() + scannedTotalBytes += res.GetScannedTotalBytes() c, err := funcutil.CntOfSegCoreResult(res) if err != nil { return nil, err @@ -47,5 +57,7 @@ func (r *cntReducerSegCore) Reduce(ctx context.Context, results []*segcorepb.Ret } res := funcutil.WrapCntToSegCoreResult(cnt) res.AllRetrieveCount = allRetrieveCount + res.ScannedRemoteBytes = scannedRemoteBytes + res.ScannedTotalBytes = scannedTotalBytes return res, nil } diff --git a/internal/querynodev2/segments/result.go b/internal/querynodev2/segments/result.go index 57b2a448ae..faed762cdb 100644 --- a/internal/querynodev2/segments/result.go +++ b/internal/querynodev2/segments/result.go @@ -125,10 +125,17 @@ func ReduceSearchResults(ctx context.Context, results []*internalpb.SearchResult relatedDataSize := lo.Reduce(results, func(acc int64, result *internalpb.SearchResults, _ int) int64 { return acc + result.GetCostAggregation().GetTotalRelatedDataSize() }, 0) + storageCost := lo.Reduce(results, func(acc segcore.StorageCost, result *internalpb.SearchResults, _ int) segcore.StorageCost { + acc.ScannedRemoteBytes += result.GetScannedRemoteBytes() + acc.ScannedTotalBytes += result.GetScannedTotalBytes() + return acc + }, segcore.StorageCost{}) searchResults.CostAggregation.TotalRelatedDataSize = relatedDataSize searchResults.ChannelsMvcc = channelsMvcc searchResults.IsTopkReduce = isTopkReduce searchResults.IsRecallEvaluation = isRecallEvaluation + searchResults.ScannedRemoteBytes = storageCost.ScannedRemoteBytes + searchResults.ScannedTotalBytes = storageCost.ScannedTotalBytes return searchResults, nil } @@ -142,12 +149,14 @@ func ReduceAdvancedSearchResults(ctx context.Context, results []*internalpb.Sear searchResults := &internalpb.SearchResults{ IsAdvanced: true, } - + storageCost := segcore.StorageCost{} for index, result := range results { if result.GetIsTopkReduce() { isTopkReduce = true } relatedDataSize += result.GetCostAggregation().GetTotalRelatedDataSize() + storageCost.ScannedRemoteBytes += result.GetScannedRemoteBytes() + storageCost.ScannedTotalBytes += result.GetScannedTotalBytes() for ch, ts := range result.GetChannelsMvcc() { channelsMvcc[ch] = ts } @@ -178,6 +187,8 @@ func ReduceAdvancedSearchResults(ctx context.Context, results []*internalpb.Sear } searchResults.CostAggregation.TotalRelatedDataSize = relatedDataSize searchResults.IsTopkReduce = isTopkReduce + searchResults.ScannedRemoteBytes = storageCost.ScannedRemoteBytes + searchResults.ScannedTotalBytes = storageCost.ScannedTotalBytes return searchResults, nil } @@ -231,7 +242,6 @@ func DecodeSearchResults(ctx context.Context, searchResults []*internalpb.Search if err != nil { return nil, err } - results = append(results, &partialResultData) } return results, nil @@ -286,6 +296,8 @@ func MergeInternalRetrieveResult(ctx context.Context, retrieveResults []*interna hasMoreResult := false for _, r := range retrieveResults { ret.AllRetrieveCount += r.GetAllRetrieveCount() + ret.ScannedRemoteBytes += r.GetScannedRemoteBytes() + ret.ScannedTotalBytes += r.GetScannedTotalBytes() relatedDataSize += r.GetCostAggregation().GetTotalRelatedDataSize() size := typeutil.GetSizeOfIDs(r.GetIds()) if r == nil || len(r.GetFieldsData()) == 0 || size == 0 { @@ -402,6 +414,8 @@ func MergeSegcoreRetrieveResults(ctx context.Context, retrieveResults []*segcore for i, r := range retrieveResults { size := typeutil.GetSizeOfIDs(r.GetIds()) ret.AllRetrieveCount += r.GetAllRetrieveCount() + ret.ScannedRemoteBytes += r.GetScannedRemoteBytes() + ret.ScannedTotalBytes += r.GetScannedTotalBytes() if r == nil || len(r.GetOffset()) == 0 || size == 0 { log.Debug("filter out invalid retrieve result") continue diff --git a/internal/querynodev2/segments/result_test.go b/internal/querynodev2/segments/result_test.go index efb8a49132..34a682ea5f 100644 --- a/internal/querynodev2/segments/result_test.go +++ b/internal/querynodev2/segments/result_test.go @@ -951,19 +951,23 @@ func (suite *ResultSuite) TestReduceSearchOnQueryNode() { mockBlob := []byte{65, 66, 67, 65, 66, 67} { subRes1 := &internalpb.SearchResults{ - MetricType: metricType, - NumQueries: nq, - TopK: topK, - SlicedBlob: mockBlob, + MetricType: metricType, + NumQueries: nq, + TopK: topK, + SlicedBlob: mockBlob, + ScannedRemoteBytes: 100, + ScannedTotalBytes: 200, } results = append(results, subRes1) } { subRes2 := &internalpb.SearchResults{ - MetricType: metricType, - NumQueries: nq, - TopK: topK, - SlicedBlob: mockBlob, + MetricType: metricType, + NumQueries: nq, + TopK: topK, + SlicedBlob: mockBlob, + ScannedRemoteBytes: 100, + ScannedTotalBytes: 200, } results = append(results, subRes2) } @@ -977,6 +981,44 @@ func (suite *ResultSuite) TestReduceSearchOnQueryNode() { suite.Equal(nq, subRes1.GetNumQueries()) suite.Equal(topK, subRes1.GetTopK()) suite.Equal(mockBlob, subRes1.GetSlicedBlob()) + suite.Equal(int64(200), reducedRes.GetScannedRemoteBytes()) + suite.Equal(int64(400), reducedRes.GetScannedTotalBytes()) +} + +func (suite *ResultSuite) TestReduceSearchOnQueryNode_NonAdvanced() { + ctx := context.Background() + metricType := metric.IP + nq := int64(1) + topK := int64(1) + // build minimal valid blobs via encoder + srd1 := &schemapb.SearchResultData{ + NumQueries: nq, + TopK: topK, + Ids: &schemapb.IDs{IdField: &schemapb.IDs_IntId{IntId: &schemapb.LongArray{Data: []int64{1}}}}, + Scores: []float32{0.9}, + Topks: []int64{1}, + } + srd2 := &schemapb.SearchResultData{ + NumQueries: nq, + TopK: topK, + Ids: &schemapb.IDs{IdField: &schemapb.IDs_IntId{IntId: &schemapb.LongArray{Data: []int64{2}}}}, + Scores: []float32{0.8}, + Topks: []int64{1}, + } + rEnc1, err := EncodeSearchResultData(ctx, srd1, nq, topK, metricType) + suite.NoError(err) + rEnc1.ScannedRemoteBytes = 111 + rEnc1.ScannedTotalBytes = 222 + rEnc2, err := EncodeSearchResultData(ctx, srd2, nq, topK, metricType) + suite.NoError(err) + rEnc2.ScannedRemoteBytes = 333 + rEnc2.ScannedTotalBytes = 444 + + out, err := ReduceSearchOnQueryNode(ctx, []*internalpb.SearchResults{rEnc1, rEnc2}, reduce.NewReduceSearchResultInfo(nq, topK).WithMetricType(metricType).WithPkType(schemapb.DataType_Int64)) + suite.NoError(err) + // costs should aggregate across both included results + suite.Equal(int64(111+333), out.GetScannedRemoteBytes()) + suite.Equal(int64(222+444), out.GetScannedTotalBytes()) } func TestResult_MergeRequestCost(t *testing.T) { diff --git a/internal/querynodev2/segments/retrieve.go b/internal/querynodev2/segments/retrieve.go index 3a327ce6b5..c4ae9f5fc5 100644 --- a/internal/querynodev2/segments/retrieve.go +++ b/internal/querynodev2/segments/retrieve.go @@ -147,6 +147,8 @@ func retrieveOnSegmentsWithStream(ctx context.Context, mgr *Manager, segments [] }, SealedSegmentIDsRetrieved: []int64{segment.ID()}, AllRetrieveCount: result.GetAllRetrieveCount(), + ScannedRemoteBytes: result.GetScannedRemoteBytes(), + ScannedTotalBytes: result.GetScannedTotalBytes(), }); err != nil { errs[i] = err } diff --git a/internal/querynodev2/tasks/query_task.go b/internal/querynodev2/tasks/query_task.go index a5b3a9e3a1..a81d59873b 100644 --- a/internal/querynodev2/tasks/query_task.go +++ b/internal/querynodev2/tasks/query_task.go @@ -158,8 +158,10 @@ func (t *QueryTask) Execute() error { ServiceTime: tr.ElapseSpan().Milliseconds(), TotalRelatedDataSize: relatedDataSize, }, - AllRetrieveCount: reducedResult.GetAllRetrieveCount(), - HasMoreResult: reducedResult.HasMoreResult, + AllRetrieveCount: reducedResult.GetAllRetrieveCount(), + HasMoreResult: reducedResult.HasMoreResult, + ScannedRemoteBytes: reducedResult.GetScannedRemoteBytes(), + ScannedTotalBytes: reducedResult.GetScannedTotalBytes(), } return nil } diff --git a/internal/querynodev2/tasks/search_task.go b/internal/querynodev2/tasks/search_task.go index a6cb77aa5a..1db0775adc 100644 --- a/internal/querynodev2/tasks/search_task.go +++ b/internal/querynodev2/tasks/search_task.go @@ -236,7 +236,7 @@ func (t *SearchTask) Execute() error { metrics.BatchReduce). Observe(float64(tr.RecordSpan().Milliseconds())) for i := range t.originNqs { - blob, err := segcore.GetSearchResultDataBlob(t.ctx, blobs, i) + blob, cost, err := segcore.GetSearchResultDataBlob(t.ctx, blobs, i) if err != nil { return err } @@ -267,6 +267,8 @@ func (t *SearchTask) Execute() error { ServiceTime: tr.ElapseSpan().Milliseconds(), TotalRelatedDataSize: relatedDataSize, }, + ScannedRemoteBytes: cost.ScannedRemoteBytes, + ScannedTotalBytes: cost.ScannedTotalBytes, } } @@ -516,7 +518,7 @@ func (t *StreamingSearchTask) Execute() error { // 2. reorganize blobs to original search request for i := range t.originNqs { - blob, err := segcore.GetSearchResultDataBlob(t.ctx, t.resultBlobs, i) + blob, cost, err := segcore.GetSearchResultDataBlob(t.ctx, t.resultBlobs, i) if err != nil { return err } @@ -547,6 +549,8 @@ func (t *StreamingSearchTask) Execute() error { ServiceTime: tr.ElapseSpan().Milliseconds(), TotalRelatedDataSize: relatedDataSize, }, + ScannedRemoteBytes: cost.ScannedRemoteBytes, + ScannedTotalBytes: cost.ScannedTotalBytes, } } @@ -578,6 +582,8 @@ func (t *StreamingSearchTask) maybeReturnForEmptyResults(results []*segments.Sea CostAggregation: &internalpb.CostAggregation{ ServiceTime: tr.ElapseSpan().Milliseconds(), }, + ScannedRemoteBytes: 0, + ScannedTotalBytes: 0, } } return true diff --git a/internal/util/segcore/reduce.go b/internal/util/segcore/reduce.go index ceeb0bcc29..80e8c99f26 100644 --- a/internal/util/segcore/reduce.go +++ b/internal/util/segcore/reduce.go @@ -42,6 +42,11 @@ type ( StreamSearchReducer = C.CSearchStreamReducer ) +type StorageCost struct { + ScannedRemoteBytes int64 + ScannedTotalBytes int64 +} + func ParseSliceInfo(originNQs []int64, originTopKs []int64, nqPerSlice int64) *SliceInfo { sInfo := &SliceInfo{ SliceNQs: make([]int64, 0), @@ -152,13 +157,15 @@ func ReduceSearchResultsAndFillData(ctx context.Context, plan *SearchPlan, searc return cSearchResultDataBlobs, nil } -func GetSearchResultDataBlob(ctx context.Context, cSearchResultDataBlobs SearchResultDataBlobs, blobIndex int) ([]byte, error) { +func GetSearchResultDataBlob(ctx context.Context, cSearchResultDataBlobs SearchResultDataBlobs, blobIndex int) ([]byte, StorageCost, error) { var blob C.CProto - status := C.GetSearchResultDataBlob(&blob, cSearchResultDataBlobs, C.int32_t(blobIndex)) + var scannedRemoteBytes C.int64_t + var scannedTotalBytes C.int64_t + status := C.GetSearchResultDataBlob(&blob, &scannedRemoteBytes, &scannedTotalBytes, cSearchResultDataBlobs, C.int32_t(blobIndex)) if err := ConsumeCStatusIntoError(&status); err != nil { - return nil, errors.Wrap(err, "marshal failed") + return nil, StorageCost{ScannedRemoteBytes: 0, ScannedTotalBytes: 0}, errors.Wrap(err, "marshal failed") } - return getCProtoBlob(&blob), nil + return getCProtoBlob(&blob), StorageCost{ScannedRemoteBytes: int64(scannedRemoteBytes), ScannedTotalBytes: int64(scannedTotalBytes)}, nil } func DeleteSearchResultDataBlobs(cSearchResultDataBlobs SearchResultDataBlobs) { diff --git a/internal/util/streamrpc/streamer.go b/internal/util/streamrpc/streamer.go index 5a326c1b44..079d6153b3 100644 --- a/internal/util/streamrpc/streamer.go +++ b/internal/util/streamrpc/streamer.go @@ -89,6 +89,8 @@ func (c *RetrieveResultCache) merge(result *internalpb.RetrieveResults) { } c.result.AllRetrieveCount = c.result.AllRetrieveCount + result.AllRetrieveCount c.result.CostAggregation = mergeCostAggregation(c.result.GetCostAggregation(), result.GetCostAggregation()) + c.result.ScannedRemoteBytes = c.result.GetScannedRemoteBytes() + result.GetScannedRemoteBytes() + c.result.ScannedTotalBytes = c.result.GetScannedTotalBytes() + result.GetScannedTotalBytes() c.size = proto.Size(c.result) } @@ -160,6 +162,8 @@ func (s *ResultCacheServer) splitMsgToMaxSize(result *internalpb.RetrieveResults } } results[len(results)-1].AllRetrieveCount = result.AllRetrieveCount + results[len(results)-1].ScannedRemoteBytes = result.GetScannedRemoteBytes() + results[len(results)-1].ScannedTotalBytes = result.GetScannedTotalBytes() results[len(results)-1].CostAggregation = result.CostAggregation return results } diff --git a/pkg/metrics/proxy_metrics.go b/pkg/metrics/proxy_metrics.go index 09da0fdcb0..9eb7fe2420 100644 --- a/pkg/metrics/proxy_metrics.go +++ b/pkg/metrics/proxy_metrics.go @@ -464,6 +464,22 @@ var ( Help: "latency of function call", Buckets: buckets, }, []string{nodeIDLabelName, collectionName, functionTypeName, functionProvider, functionName}) + + ProxyScannedRemoteBytes = prometheus.NewCounterVec( + prometheus.CounterOpts{ + Namespace: milvusNamespace, + Subsystem: typeutil.ProxyRole, + Name: "scanned_remote_bytes", + Help: "the scanned remote bytes", + }, []string{nodeIDLabelName, queryTypeLabelName, databaseLabelName, collectionName}) + + ProxyScannedTotalBytes = prometheus.NewCounterVec( + prometheus.CounterOpts{ + Namespace: milvusNamespace, + Subsystem: typeutil.ProxyRole, + Name: "scanned_total_bytes", + Help: "the scanned total bytes", + }, []string{nodeIDLabelName, queryTypeLabelName, databaseLabelName, collectionName}) ) // RegisterProxy registers Proxy metrics @@ -534,6 +550,8 @@ func RegisterProxy(registry *prometheus.Registry) { registry.MustRegister(ProxyFunctionlatency) + registry.MustRegister(ProxyScannedRemoteBytes) + registry.MustRegister(ProxyScannedTotalBytes) RegisterStreamingServiceClient(registry) } @@ -696,4 +714,28 @@ func CleanupProxyCollectionMetrics(nodeID int64, dbName string, collection strin databaseLabelName: dbName, collectionName: collection, }) + ProxyScannedRemoteBytes.Delete(prometheus.Labels{ + nodeIDLabelName: strconv.FormatInt(nodeID, 10), + queryTypeLabelName: SearchLabel, + databaseLabelName: dbName, + collectionName: collection, + }) + ProxyScannedRemoteBytes.Delete(prometheus.Labels{ + nodeIDLabelName: strconv.FormatInt(nodeID, 10), + queryTypeLabelName: QueryLabel, + databaseLabelName: dbName, + collectionName: collection, + }) + ProxyScannedTotalBytes.Delete(prometheus.Labels{ + nodeIDLabelName: strconv.FormatInt(nodeID, 10), + queryTypeLabelName: SearchLabel, + databaseLabelName: dbName, + collectionName: collection, + }) + ProxyScannedTotalBytes.Delete(prometheus.Labels{ + nodeIDLabelName: strconv.FormatInt(nodeID, 10), + queryTypeLabelName: QueryLabel, + databaseLabelName: dbName, + collectionName: collection, + }) } diff --git a/pkg/proto/internal.proto b/pkg/proto/internal.proto index 62bb6032dc..282e633431 100644 --- a/pkg/proto/internal.proto +++ b/pkg/proto/internal.proto @@ -171,6 +171,8 @@ message SearchResults { int64 all_search_count = 17; bool is_topk_reduce = 18; bool is_recall_evaluation = 19; + int64 scanned_remote_bytes = 20; + int64 scanned_total_bytes = 21; } message CostAggregation { @@ -218,6 +220,8 @@ message RetrieveResults { CostAggregation costAggregation = 13; int64 all_retrieve_count = 14; bool has_more_result = 15; + int64 scanned_remote_bytes = 16; + int64 scanned_total_bytes = 17; } message LoadIndex { diff --git a/pkg/proto/internalpb/internal.pb.go b/pkg/proto/internalpb/internal.pb.go index f7636c78fc..0692549a37 100644 --- a/pkg/proto/internalpb/internal.pb.go +++ b/pkg/proto/internalpb/internal.pb.go @@ -1521,6 +1521,8 @@ type SearchResults struct { AllSearchCount int64 `protobuf:"varint,17,opt,name=all_search_count,json=allSearchCount,proto3" json:"all_search_count,omitempty"` IsTopkReduce bool `protobuf:"varint,18,opt,name=is_topk_reduce,json=isTopkReduce,proto3" json:"is_topk_reduce,omitempty"` IsRecallEvaluation bool `protobuf:"varint,19,opt,name=is_recall_evaluation,json=isRecallEvaluation,proto3" json:"is_recall_evaluation,omitempty"` + ScannedRemoteBytes int64 `protobuf:"varint,20,opt,name=scanned_remote_bytes,json=scannedRemoteBytes,proto3" json:"scanned_remote_bytes,omitempty"` + ScannedTotalBytes int64 `protobuf:"varint,21,opt,name=scanned_total_bytes,json=scannedTotalBytes,proto3" json:"scanned_total_bytes,omitempty"` } func (x *SearchResults) Reset() { @@ -1688,6 +1690,20 @@ func (x *SearchResults) GetIsRecallEvaluation() bool { return false } +func (x *SearchResults) GetScannedRemoteBytes() int64 { + if x != nil { + return x.ScannedRemoteBytes + } + return 0 +} + +func (x *SearchResults) GetScannedTotalBytes() int64 { + if x != nil { + return x.ScannedTotalBytes + } + return 0 +} + type CostAggregation struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1972,9 +1988,11 @@ type RetrieveResults struct { ChannelIDsRetrieved []string `protobuf:"bytes,7,rep,name=channelIDs_retrieved,json=channelIDsRetrieved,proto3" json:"channelIDs_retrieved,omitempty"` GlobalSealedSegmentIDs []int64 `protobuf:"varint,8,rep,packed,name=global_sealed_segmentIDs,json=globalSealedSegmentIDs,proto3" json:"global_sealed_segmentIDs,omitempty"` // query request cost - CostAggregation *CostAggregation `protobuf:"bytes,13,opt,name=costAggregation,proto3" json:"costAggregation,omitempty"` - AllRetrieveCount int64 `protobuf:"varint,14,opt,name=all_retrieve_count,json=allRetrieveCount,proto3" json:"all_retrieve_count,omitempty"` - HasMoreResult bool `protobuf:"varint,15,opt,name=has_more_result,json=hasMoreResult,proto3" json:"has_more_result,omitempty"` + CostAggregation *CostAggregation `protobuf:"bytes,13,opt,name=costAggregation,proto3" json:"costAggregation,omitempty"` + AllRetrieveCount int64 `protobuf:"varint,14,opt,name=all_retrieve_count,json=allRetrieveCount,proto3" json:"all_retrieve_count,omitempty"` + HasMoreResult bool `protobuf:"varint,15,opt,name=has_more_result,json=hasMoreResult,proto3" json:"has_more_result,omitempty"` + ScannedRemoteBytes int64 `protobuf:"varint,16,opt,name=scanned_remote_bytes,json=scannedRemoteBytes,proto3" json:"scanned_remote_bytes,omitempty"` + ScannedTotalBytes int64 `protobuf:"varint,17,opt,name=scanned_total_bytes,json=scannedTotalBytes,proto3" json:"scanned_total_bytes,omitempty"` } func (x *RetrieveResults) Reset() { @@ -2086,6 +2104,20 @@ func (x *RetrieveResults) GetHasMoreResult() bool { return false } +func (x *RetrieveResults) GetScannedRemoteBytes() int64 { + if x != nil { + return x.ScannedRemoteBytes + } + return 0 +} + +func (x *RetrieveResults) GetScannedTotalBytes() int64 { + if x != nil { + return x.ScannedTotalBytes + } + return 0 +} + type LoadIndex struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -4224,7 +4256,7 @@ var file_internal_proto_rawDesc = []byte{ 0x65, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x64, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x72, 0x65, 0x71, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x72, 0x65, 0x71, 0x49, 0x6e, - 0x64, 0x65, 0x78, 0x22, 0xd9, 0x07, 0x0a, 0x0d, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, + 0x64, 0x65, 0x78, 0x22, 0xbb, 0x08, 0x0a, 0x0d, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x30, 0x0a, 0x04, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6d, 0x69, 0x6c, 0x76, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4d, 0x73, 0x67, 0x42, 0x61, 0x73, @@ -4281,443 +4313,455 @@ var file_internal_proto_rawDesc = []byte{ 0x69, 0x73, 0x54, 0x6f, 0x70, 0x6b, 0x52, 0x65, 0x64, 0x75, 0x63, 0x65, 0x12, 0x30, 0x0a, 0x14, 0x69, 0x73, 0x5f, 0x72, 0x65, 0x63, 0x61, 0x6c, 0x6c, 0x5f, 0x65, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x13, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x69, 0x73, 0x52, 0x65, - 0x63, 0x61, 0x6c, 0x6c, 0x45, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x3f, - 0x0a, 0x11, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x4d, 0x76, 0x63, 0x63, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, - 0xa5, 0x01, 0x0a, 0x0f, 0x43, 0x6f, 0x73, 0x74, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x12, 0x22, 0x0a, 0x0c, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x54, - 0x69, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x72, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x73, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x73, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x6f, 0x74, - 0x61, 0x6c, 0x4e, 0x51, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x74, 0x6f, 0x74, 0x61, - 0x6c, 0x4e, 0x51, 0x12, 0x32, 0x0a, 0x14, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x52, 0x65, 0x6c, 0x61, - 0x74, 0x65, 0x64, 0x44, 0x61, 0x74, 0x61, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x14, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x52, 0x65, 0x6c, 0x61, 0x74, 0x65, 0x64, 0x44, - 0x61, 0x74, 0x61, 0x53, 0x69, 0x7a, 0x65, 0x22, 0xd3, 0x06, 0x0a, 0x0f, 0x52, 0x65, 0x74, 0x72, - 0x69, 0x65, 0x76, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x30, 0x0a, 0x04, 0x62, - 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6d, 0x69, 0x6c, 0x76, + 0x63, 0x61, 0x6c, 0x6c, 0x45, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x30, + 0x0a, 0x14, 0x73, 0x63, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x5f, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, + 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x14, 0x20, 0x01, 0x28, 0x03, 0x52, 0x12, 0x73, 0x63, + 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x42, 0x79, 0x74, 0x65, 0x73, + 0x12, 0x2e, 0x0a, 0x13, 0x73, 0x63, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x5f, 0x74, 0x6f, 0x74, 0x61, + 0x6c, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x15, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, 0x73, + 0x63, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x42, 0x79, 0x74, 0x65, 0x73, + 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x4d, 0x76, 0x63, 0x63, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, + 0x01, 0x22, 0xa5, 0x01, 0x0a, 0x0f, 0x43, 0x6f, 0x73, 0x74, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x22, 0x0a, 0x0c, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x54, 0x69, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x72, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x73, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, + 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x74, + 0x6f, 0x74, 0x61, 0x6c, 0x4e, 0x51, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x74, 0x6f, + 0x74, 0x61, 0x6c, 0x4e, 0x51, 0x12, 0x32, 0x0a, 0x14, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x52, 0x65, + 0x6c, 0x61, 0x74, 0x65, 0x64, 0x44, 0x61, 0x74, 0x61, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x14, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x52, 0x65, 0x6c, 0x61, 0x74, 0x65, + 0x64, 0x44, 0x61, 0x74, 0x61, 0x53, 0x69, 0x7a, 0x65, 0x22, 0xd3, 0x06, 0x0a, 0x0f, 0x52, 0x65, + 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x30, 0x0a, + 0x04, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6d, 0x69, + 0x6c, 0x76, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, + 0x6e, 0x2e, 0x4d, 0x73, 0x67, 0x42, 0x61, 0x73, 0x65, 0x52, 0x04, 0x62, 0x61, 0x73, 0x65, 0x12, + 0x14, 0x0a, 0x05, 0x72, 0x65, 0x71, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, + 0x72, 0x65, 0x71, 0x49, 0x44, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x62, 0x49, 0x44, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x04, 0x64, 0x62, 0x49, 0x44, 0x12, 0x22, 0x0a, 0x0c, 0x63, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, + 0x0c, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x12, 0x22, 0x0a, + 0x0c, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x73, 0x18, 0x05, 0x20, + 0x03, 0x28, 0x03, 0x52, 0x0c, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, + 0x73, 0x12, 0x30, 0x0a, 0x14, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, + 0x65, 0x78, 0x70, 0x72, 0x5f, 0x70, 0x6c, 0x61, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0c, 0x52, + 0x12, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x45, 0x78, 0x70, 0x72, 0x50, + 0x6c, 0x61, 0x6e, 0x12, 0x28, 0x0a, 0x10, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x5f, 0x66, 0x69, + 0x65, 0x6c, 0x64, 0x73, 0x5f, 0x69, 0x64, 0x18, 0x07, 0x20, 0x03, 0x28, 0x03, 0x52, 0x0e, 0x6f, + 0x75, 0x74, 0x70, 0x75, 0x74, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x49, 0x64, 0x12, 0x25, 0x0a, + 0x0e, 0x6d, 0x76, 0x63, 0x63, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, + 0x08, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x6d, 0x76, 0x63, 0x63, 0x54, 0x69, 0x6d, 0x65, 0x73, + 0x74, 0x61, 0x6d, 0x70, 0x12, 0x2f, 0x0a, 0x13, 0x67, 0x75, 0x61, 0x72, 0x61, 0x6e, 0x74, 0x65, + 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x09, 0x20, 0x01, 0x28, + 0x04, 0x52, 0x12, 0x67, 0x75, 0x61, 0x72, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x54, 0x69, 0x6d, 0x65, + 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x2b, 0x0a, 0x11, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, + 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x04, + 0x52, 0x10, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, + 0x6d, 0x70, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x24, 0x0a, 0x0d, 0x69, 0x67, 0x6e, 0x6f, + 0x72, 0x65, 0x47, 0x72, 0x6f, 0x77, 0x69, 0x6e, 0x67, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x0d, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x47, 0x72, 0x6f, 0x77, 0x69, 0x6e, 0x67, 0x12, 0x19, + 0x0a, 0x08, 0x69, 0x73, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x07, 0x69, 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x45, 0x0a, 0x1f, 0x69, 0x74, 0x65, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, + 0x5f, 0x72, 0x65, 0x64, 0x75, 0x63, 0x65, 0x5f, 0x72, 0x61, 0x74, 0x65, 0x18, 0x0e, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x1c, 0x69, 0x74, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x78, 0x74, + 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x64, 0x75, 0x63, 0x65, 0x52, 0x61, 0x74, 0x65, + 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x0f, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2f, 0x0a, 0x14, + 0x72, 0x65, 0x64, 0x75, 0x63, 0x65, 0x5f, 0x73, 0x74, 0x6f, 0x70, 0x5f, 0x66, 0x6f, 0x72, 0x5f, + 0x62, 0x65, 0x73, 0x74, 0x18, 0x10, 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, 0x72, 0x65, 0x64, 0x75, + 0x63, 0x65, 0x53, 0x74, 0x6f, 0x70, 0x46, 0x6f, 0x72, 0x42, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, + 0x0b, 0x72, 0x65, 0x64, 0x75, 0x63, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x11, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x0a, 0x72, 0x65, 0x64, 0x75, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x52, + 0x0a, 0x11, 0x63, 0x6f, 0x6e, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x5f, 0x6c, 0x65, + 0x76, 0x65, 0x6c, 0x18, 0x12, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x25, 0x2e, 0x6d, 0x69, 0x6c, 0x76, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, - 0x4d, 0x73, 0x67, 0x42, 0x61, 0x73, 0x65, 0x52, 0x04, 0x62, 0x61, 0x73, 0x65, 0x12, 0x14, 0x0a, - 0x05, 0x72, 0x65, 0x71, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x72, 0x65, - 0x71, 0x49, 0x44, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x62, 0x49, 0x44, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x04, 0x64, 0x62, 0x49, 0x44, 0x12, 0x22, 0x0a, 0x0c, 0x63, 0x6f, 0x6c, 0x6c, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x63, - 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x12, 0x22, 0x0a, 0x0c, 0x70, - 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, - 0x03, 0x52, 0x0c, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x73, 0x12, - 0x30, 0x0a, 0x14, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x65, 0x78, - 0x70, 0x72, 0x5f, 0x70, 0x6c, 0x61, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x12, 0x73, - 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x45, 0x78, 0x70, 0x72, 0x50, 0x6c, 0x61, - 0x6e, 0x12, 0x28, 0x0a, 0x10, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x5f, 0x66, 0x69, 0x65, 0x6c, - 0x64, 0x73, 0x5f, 0x69, 0x64, 0x18, 0x07, 0x20, 0x03, 0x28, 0x03, 0x52, 0x0e, 0x6f, 0x75, 0x74, - 0x70, 0x75, 0x74, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x49, 0x64, 0x12, 0x25, 0x0a, 0x0e, 0x6d, - 0x76, 0x63, 0x63, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x08, 0x20, - 0x01, 0x28, 0x04, 0x52, 0x0d, 0x6d, 0x76, 0x63, 0x63, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, - 0x6d, 0x70, 0x12, 0x2f, 0x0a, 0x13, 0x67, 0x75, 0x61, 0x72, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x5f, - 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x09, 0x20, 0x01, 0x28, 0x04, 0x52, - 0x12, 0x67, 0x75, 0x61, 0x72, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, - 0x61, 0x6d, 0x70, 0x12, 0x2b, 0x0a, 0x11, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x5f, 0x74, - 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x04, 0x52, 0x10, - 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, - 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x03, 0x52, - 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x24, 0x0a, 0x0d, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, - 0x47, 0x72, 0x6f, 0x77, 0x69, 0x6e, 0x67, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x69, - 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x47, 0x72, 0x6f, 0x77, 0x69, 0x6e, 0x67, 0x12, 0x19, 0x0a, 0x08, - 0x69, 0x73, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, - 0x69, 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x45, 0x0a, 0x1f, 0x69, 0x74, 0x65, 0x72, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x72, - 0x65, 0x64, 0x75, 0x63, 0x65, 0x5f, 0x72, 0x61, 0x74, 0x65, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x03, - 0x52, 0x1c, 0x69, 0x74, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x78, 0x74, 0x65, 0x6e, - 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x64, 0x75, 0x63, 0x65, 0x52, 0x61, 0x74, 0x65, 0x12, 0x1a, - 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2f, 0x0a, 0x14, 0x72, 0x65, - 0x64, 0x75, 0x63, 0x65, 0x5f, 0x73, 0x74, 0x6f, 0x70, 0x5f, 0x66, 0x6f, 0x72, 0x5f, 0x62, 0x65, - 0x73, 0x74, 0x18, 0x10, 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, 0x72, 0x65, 0x64, 0x75, 0x63, 0x65, - 0x53, 0x74, 0x6f, 0x70, 0x46, 0x6f, 0x72, 0x42, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x72, - 0x65, 0x64, 0x75, 0x63, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x11, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x0a, 0x72, 0x65, 0x64, 0x75, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x52, 0x0a, 0x11, - 0x63, 0x6f, 0x6e, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x5f, 0x6c, 0x65, 0x76, 0x65, - 0x6c, 0x18, 0x12, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x25, 0x2e, 0x6d, 0x69, 0x6c, 0x76, 0x75, 0x73, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x43, 0x6f, - 0x6e, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x52, 0x10, - 0x63, 0x6f, 0x6e, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x4c, 0x65, 0x76, 0x65, 0x6c, - 0x12, 0x1f, 0x0a, 0x0b, 0x69, 0x73, 0x5f, 0x69, 0x74, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x18, - 0x13, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x69, 0x73, 0x49, 0x74, 0x65, 0x72, 0x61, 0x74, 0x6f, - 0x72, 0x12, 0x3a, 0x0a, 0x19, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, - 0x74, 0x74, 0x6c, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x73, 0x18, 0x14, - 0x20, 0x01, 0x28, 0x04, 0x52, 0x17, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x54, 0x74, 0x6c, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x73, 0x22, 0xd0, 0x04, - 0x0a, 0x0f, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, - 0x73, 0x12, 0x30, 0x0a, 0x04, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1c, 0x2e, 0x6d, 0x69, 0x6c, 0x76, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x63, - 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4d, 0x73, 0x67, 0x42, 0x61, 0x73, 0x65, 0x52, 0x04, 0x62, - 0x61, 0x73, 0x65, 0x12, 0x33, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x6d, 0x69, 0x6c, 0x76, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x65, 0x71, 0x49, - 0x44, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x72, 0x65, 0x71, 0x49, 0x44, 0x12, 0x2a, - 0x0a, 0x03, 0x69, 0x64, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6d, 0x69, - 0x6c, 0x76, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x49, 0x44, 0x73, 0x52, 0x03, 0x69, 0x64, 0x73, 0x12, 0x3f, 0x0a, 0x0b, 0x66, 0x69, - 0x65, 0x6c, 0x64, 0x73, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x1e, 0x2e, 0x6d, 0x69, 0x6c, 0x76, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x44, 0x61, 0x74, 0x61, 0x52, - 0x0a, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x44, 0x61, 0x74, 0x61, 0x12, 0x3e, 0x0a, 0x1b, 0x73, - 0x65, 0x61, 0x6c, 0x65, 0x64, 0x5f, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x44, 0x73, - 0x5f, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x64, 0x18, 0x06, 0x20, 0x03, 0x28, 0x03, - 0x52, 0x19, 0x73, 0x65, 0x61, 0x6c, 0x65, 0x64, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x49, - 0x44, 0x73, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x64, 0x12, 0x31, 0x0a, 0x14, 0x63, - 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x44, 0x73, 0x5f, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, - 0x76, 0x65, 0x64, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x13, 0x63, 0x68, 0x61, 0x6e, 0x6e, - 0x65, 0x6c, 0x49, 0x44, 0x73, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x64, 0x12, 0x38, - 0x0a, 0x18, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x5f, 0x73, 0x65, 0x61, 0x6c, 0x65, 0x64, 0x5f, - 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x44, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x03, - 0x52, 0x16, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x53, 0x65, 0x61, 0x6c, 0x65, 0x64, 0x53, 0x65, - 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x44, 0x73, 0x12, 0x50, 0x0a, 0x0f, 0x63, 0x6f, 0x73, 0x74, - 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0d, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x26, 0x2e, 0x6d, 0x69, 0x6c, 0x76, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x43, 0x6f, 0x73, 0x74, 0x41, 0x67, - 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0f, 0x63, 0x6f, 0x73, 0x74, 0x41, - 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2c, 0x0a, 0x12, 0x61, 0x6c, - 0x6c, 0x5f, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, - 0x18, 0x0e, 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, 0x61, 0x6c, 0x6c, 0x52, 0x65, 0x74, 0x72, 0x69, - 0x65, 0x76, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x26, 0x0a, 0x0f, 0x68, 0x61, 0x73, 0x5f, - 0x6d, 0x6f, 0x72, 0x65, 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x0f, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x0d, 0x68, 0x61, 0x73, 0x4d, 0x6f, 0x72, 0x65, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, - 0x22, 0xfa, 0x01, 0x0a, 0x09, 0x4c, 0x6f, 0x61, 0x64, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x30, - 0x0a, 0x04, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6d, - 0x69, 0x6c, 0x76, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, - 0x6f, 0x6e, 0x2e, 0x4d, 0x73, 0x67, 0x42, 0x61, 0x73, 0x65, 0x52, 0x04, 0x62, 0x61, 0x73, 0x65, - 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x44, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x09, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x44, 0x12, 0x1c, - 0x0a, 0x09, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x09, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, - 0x66, 0x69, 0x65, 0x6c, 0x64, 0x49, 0x44, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x66, - 0x69, 0x65, 0x6c, 0x64, 0x49, 0x44, 0x12, 0x1f, 0x0a, 0x0b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5f, - 0x70, 0x61, 0x74, 0x68, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x69, 0x6e, 0x64, - 0x65, 0x78, 0x50, 0x61, 0x74, 0x68, 0x73, 0x12, 0x44, 0x0a, 0x0c, 0x69, 0x6e, 0x64, 0x65, 0x78, - 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, - 0x6d, 0x69, 0x6c, 0x76, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x63, 0x6f, 0x6d, - 0x6d, 0x6f, 0x6e, 0x2e, 0x4b, 0x65, 0x79, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x50, 0x61, 0x69, 0x72, - 0x52, 0x0b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x22, 0x84, 0x01, - 0x0a, 0x0a, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, 0x44, 0x0a, 0x0c, - 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6d, 0x69, 0x6c, 0x76, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4b, 0x65, 0x79, 0x56, 0x61, 0x6c, 0x75, - 0x65, 0x50, 0x61, 0x69, 0x72, 0x52, 0x0b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x50, 0x61, 0x72, 0x61, - 0x6d, 0x73, 0x12, 0x30, 0x0a, 0x14, 0x6e, 0x75, 0x6d, 0x5f, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x65, - 0x64, 0x5f, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, - 0x52, 0x12, 0x6e, 0x75, 0x6d, 0x52, 0x65, 0x6c, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x67, 0x6d, - 0x65, 0x6e, 0x74, 0x73, 0x22, 0x8e, 0x01, 0x0a, 0x0a, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x53, 0x74, - 0x61, 0x74, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x63, 0x6f, 0x6c, 0x6c, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x12, 0x18, 0x0a, 0x07, 0x66, 0x69, 0x65, 0x6c, 0x64, - 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x49, - 0x44, 0x12, 0x42, 0x0a, 0x0b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x73, - 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6d, 0x69, 0x6c, 0x76, 0x75, 0x73, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x49, - 0x6e, 0x64, 0x65, 0x78, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x0a, 0x69, 0x6e, 0x64, 0x65, 0x78, - 0x53, 0x74, 0x61, 0x74, 0x73, 0x22, 0x95, 0x01, 0x0a, 0x0c, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, - 0x74, 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, - 0x74, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x73, 0x65, 0x67, 0x6d, 0x65, - 0x6e, 0x74, 0x49, 0x44, 0x12, 0x1f, 0x0a, 0x0b, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x73, - 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x6d, 0x65, 0x6d, 0x6f, 0x72, - 0x79, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x6e, 0x75, 0x6d, 0x5f, 0x72, 0x6f, 0x77, - 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x6e, 0x75, 0x6d, 0x52, 0x6f, 0x77, 0x73, - 0x12, 0x2b, 0x0a, 0x11, 0x72, 0x65, 0x63, 0x65, 0x6e, 0x74, 0x6c, 0x79, 0x5f, 0x6d, 0x6f, 0x64, - 0x69, 0x66, 0x69, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x72, 0x65, 0x63, - 0x65, 0x6e, 0x74, 0x6c, 0x79, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x22, 0xb7, 0x01, - 0x0a, 0x12, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x54, 0x69, 0x6d, 0x65, 0x54, 0x69, 0x63, - 0x6b, 0x4d, 0x73, 0x67, 0x12, 0x30, 0x0a, 0x04, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6d, 0x69, 0x6c, 0x76, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4d, 0x73, 0x67, 0x42, 0x61, 0x73, 0x65, - 0x52, 0x04, 0x62, 0x61, 0x73, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, - 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x63, 0x68, - 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x74, 0x69, - 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x04, 0x52, 0x0a, - 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x64, 0x65, - 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x10, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x54, 0x69, - 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0xd4, 0x01, 0x0a, 0x0e, 0x43, 0x72, 0x65, 0x64, - 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, - 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, - 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2d, 0x0a, 0x12, 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, - 0x74, 0x65, 0x64, 0x5f, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x11, 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x65, 0x64, 0x50, 0x61, 0x73, - 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x12, 0x19, 0x0a, - 0x08, 0x69, 0x73, 0x5f, 0x73, 0x75, 0x70, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x07, 0x69, 0x73, 0x53, 0x75, 0x70, 0x65, 0x72, 0x12, 0x27, 0x0a, 0x0f, 0x73, 0x68, 0x61, 0x32, - 0x35, 0x36, 0x5f, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0e, 0x73, 0x68, 0x61, 0x32, 0x35, 0x36, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, - 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x74, 0x69, 0x63, 0x6b, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x74, 0x69, 0x6d, 0x65, 0x54, 0x69, 0x63, 0x6b, 0x22, 0x45, - 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x30, 0x0a, 0x04, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x43, 0x6f, 0x6e, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x4c, 0x65, 0x76, 0x65, 0x6c, + 0x52, 0x10, 0x63, 0x6f, 0x6e, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x4c, 0x65, 0x76, + 0x65, 0x6c, 0x12, 0x1f, 0x0a, 0x0b, 0x69, 0x73, 0x5f, 0x69, 0x74, 0x65, 0x72, 0x61, 0x74, 0x6f, + 0x72, 0x18, 0x13, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x69, 0x73, 0x49, 0x74, 0x65, 0x72, 0x61, + 0x74, 0x6f, 0x72, 0x12, 0x3a, 0x0a, 0x19, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x5f, 0x74, 0x74, 0x6c, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x73, + 0x18, 0x14, 0x20, 0x01, 0x28, 0x04, 0x52, 0x17, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x54, 0x74, 0x6c, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x73, 0x22, + 0xb2, 0x05, 0x0a, 0x0f, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x52, 0x65, 0x73, 0x75, + 0x6c, 0x74, 0x73, 0x12, 0x30, 0x0a, 0x04, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6d, 0x69, 0x6c, 0x76, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4d, 0x73, 0x67, 0x42, 0x61, 0x73, 0x65, 0x52, - 0x04, 0x62, 0x61, 0x73, 0x65, 0x22, 0xdf, 0x01, 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x6f, - 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x33, 0x0a, 0x06, - 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x6d, - 0x69, 0x6c, 0x76, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, - 0x6f, 0x6e, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x6e, 0x66, 0x6f, - 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, - 0x6e, 0x66, 0x6f, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x72, 0x6f, 0x6c, - 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x75, 0x73, 0x65, 0x72, 0x52, 0x6f, - 0x6c, 0x65, 0x73, 0x12, 0x52, 0x0a, 0x10, 0x70, 0x72, 0x69, 0x76, 0x69, 0x6c, 0x65, 0x67, 0x65, - 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, - 0x6d, 0x69, 0x6c, 0x76, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x6d, 0x69, 0x6c, - 0x76, 0x75, 0x73, 0x2e, 0x50, 0x72, 0x69, 0x76, 0x69, 0x6c, 0x65, 0x67, 0x65, 0x47, 0x72, 0x6f, - 0x75, 0x70, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0f, 0x70, 0x72, 0x69, 0x76, 0x69, 0x6c, 0x65, 0x67, - 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x22, 0x67, 0x0a, 0x19, 0x53, 0x68, 0x6f, 0x77, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x30, 0x0a, 0x04, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6d, 0x69, 0x6c, 0x76, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4d, 0x73, 0x67, 0x42, 0x61, 0x73, 0x65, - 0x52, 0x04, 0x62, 0x61, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, - 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, - 0x22, 0x9a, 0x01, 0x0a, 0x1a, 0x53, 0x68, 0x6f, 0x77, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, - 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x33, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1b, 0x2e, 0x6d, 0x69, 0x6c, 0x76, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x63, - 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x12, 0x47, 0x0a, 0x0d, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6d, 0x69, - 0x6c, 0x76, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, - 0x6e, 0x2e, 0x4b, 0x65, 0x79, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x50, 0x61, 0x69, 0x72, 0x52, 0x0d, - 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x45, 0x0a, - 0x04, 0x52, 0x61, 0x74, 0x65, 0x12, 0x2f, 0x0a, 0x02, 0x72, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0e, 0x32, 0x1f, 0x2e, 0x6d, 0x69, 0x6c, 0x76, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x52, 0x61, 0x74, 0x65, 0x54, 0x79, - 0x70, 0x65, 0x52, 0x02, 0x72, 0x74, 0x12, 0x0c, 0x0a, 0x01, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x01, 0x52, 0x01, 0x72, 0x22, 0x32, 0x0a, 0x0a, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x46, 0x69, - 0x6c, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x02, - 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x61, 0x74, 0x68, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, - 0x09, 0x52, 0x05, 0x70, 0x61, 0x74, 0x68, 0x73, 0x22, 0xb7, 0x03, 0x0a, 0x15, 0x49, 0x6d, 0x70, - 0x6f, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, - 0x61, 0x6c, 0x12, 0x16, 0x0a, 0x04, 0x64, 0x62, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, - 0x42, 0x02, 0x18, 0x01, 0x52, 0x04, 0x64, 0x62, 0x49, 0x44, 0x12, 0x22, 0x0a, 0x0c, 0x63, 0x6f, - 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, - 0x52, 0x0c, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x12, 0x27, - 0x0a, 0x0f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x70, 0x61, 0x72, 0x74, 0x69, - 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x03, 0x52, 0x0c, 0x70, - 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x63, - 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, - 0x28, 0x09, 0x52, 0x0c, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x73, - 0x12, 0x3d, 0x0a, 0x06, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x25, 0x2e, 0x6d, 0x69, 0x6c, 0x76, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x06, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, - 0x37, 0x0a, 0x05, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, - 0x2e, 0x6d, 0x69, 0x6c, 0x76, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x69, 0x6e, - 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x46, 0x69, 0x6c, - 0x65, 0x52, 0x05, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x3b, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6d, 0x69, 0x6c, 0x76, - 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, - 0x4b, 0x65, 0x79, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x50, 0x61, 0x69, 0x72, 0x52, 0x07, 0x6f, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x74, 0x69, - 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x09, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x64, - 0x61, 0x74, 0x61, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x14, 0x0a, 0x05, - 0x6a, 0x6f, 0x62, 0x49, 0x44, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x6a, 0x6f, 0x62, - 0x49, 0x44, 0x22, 0xee, 0x01, 0x0a, 0x0d, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x64, 0x62, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x64, 0x62, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x27, 0x0a, - 0x0f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, - 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, - 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x37, 0x0a, - 0x05, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6d, - 0x69, 0x6c, 0x76, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x69, 0x6e, 0x74, 0x65, - 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x52, - 0x05, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x3b, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6d, 0x69, 0x6c, 0x76, 0x75, 0x73, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4b, 0x65, - 0x79, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x50, 0x61, 0x69, 0x72, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x22, 0x5b, 0x0a, 0x0e, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x33, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x6d, 0x69, 0x6c, 0x76, 0x75, 0x73, 0x2e, 0x70, + 0x04, 0x62, 0x61, 0x73, 0x65, 0x12, 0x33, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x6d, 0x69, 0x6c, 0x76, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x6a, 0x6f, - 0x62, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6a, 0x6f, 0x62, 0x49, 0x44, - 0x22, 0x49, 0x0a, 0x18, 0x47, 0x65, 0x74, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x50, 0x72, 0x6f, - 0x67, 0x72, 0x65, 0x73, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, - 0x64, 0x62, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x64, - 0x62, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6a, 0x6f, 0x62, 0x49, 0x44, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6a, 0x6f, 0x62, 0x49, 0x44, 0x22, 0x81, 0x02, 0x0a, 0x12, - 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, - 0x73, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, - 0x1b, 0x0a, 0x09, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x16, 0x0a, 0x06, - 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, - 0x61, 0x73, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, - 0x12, 0x23, 0x0a, 0x0d, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, - 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, - 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x69, - 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x5f, 0x72, 0x6f, 0x77, 0x73, 0x18, 0x07, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x0c, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x52, 0x6f, 0x77, 0x73, - 0x12, 0x1d, 0x0a, 0x0a, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x72, 0x6f, 0x77, 0x73, 0x18, 0x08, - 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x52, 0x6f, 0x77, 0x73, 0x22, - 0xc6, 0x03, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x50, 0x72, 0x6f, - 0x67, 0x72, 0x65, 0x73, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x33, 0x0a, - 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, - 0x6d, 0x69, 0x6c, 0x76, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x63, 0x6f, 0x6d, - 0x6d, 0x6f, 0x6e, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x12, 0x3b, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0e, 0x32, 0x25, 0x2e, 0x6d, 0x69, 0x6c, 0x76, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, - 0x4a, 0x6f, 0x62, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, - 0x16, 0x0a, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x67, 0x72, - 0x65, 0x73, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x67, 0x72, - 0x65, 0x73, 0x73, 0x12, 0x27, 0x0a, 0x0f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x63, 0x6f, - 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x23, 0x0a, 0x0d, - 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0c, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x54, 0x69, 0x6d, - 0x65, 0x12, 0x52, 0x0a, 0x0f, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x65, - 0x73, 0x73, 0x65, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x6d, 0x69, 0x6c, + 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x65, + 0x71, 0x49, 0x44, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x72, 0x65, 0x71, 0x49, 0x44, + 0x12, 0x2a, 0x0a, 0x03, 0x69, 0x64, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, + 0x6d, 0x69, 0x6c, 0x76, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x44, 0x73, 0x52, 0x03, 0x69, 0x64, 0x73, 0x12, 0x3f, 0x0a, 0x0b, + 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x1e, 0x2e, 0x6d, 0x69, 0x6c, 0x76, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x44, 0x61, 0x74, + 0x61, 0x52, 0x0a, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x44, 0x61, 0x74, 0x61, 0x12, 0x3e, 0x0a, + 0x1b, 0x73, 0x65, 0x61, 0x6c, 0x65, 0x64, 0x5f, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x49, + 0x44, 0x73, 0x5f, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x64, 0x18, 0x06, 0x20, 0x03, + 0x28, 0x03, 0x52, 0x19, 0x73, 0x65, 0x61, 0x6c, 0x65, 0x64, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, + 0x74, 0x49, 0x44, 0x73, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x64, 0x12, 0x31, 0x0a, + 0x14, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x44, 0x73, 0x5f, 0x72, 0x65, 0x74, 0x72, + 0x69, 0x65, 0x76, 0x65, 0x64, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x13, 0x63, 0x68, 0x61, + 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x44, 0x73, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x64, + 0x12, 0x38, 0x0a, 0x18, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x5f, 0x73, 0x65, 0x61, 0x6c, 0x65, + 0x64, 0x5f, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x44, 0x73, 0x18, 0x08, 0x20, 0x03, + 0x28, 0x03, 0x52, 0x16, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x53, 0x65, 0x61, 0x6c, 0x65, 0x64, + 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x44, 0x73, 0x12, 0x50, 0x0a, 0x0f, 0x63, 0x6f, + 0x73, 0x74, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0d, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x6d, 0x69, 0x6c, 0x76, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x43, 0x6f, 0x73, 0x74, + 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0f, 0x63, 0x6f, 0x73, + 0x74, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2c, 0x0a, 0x12, + 0x61, 0x6c, 0x6c, 0x5f, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x5f, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, 0x61, 0x6c, 0x6c, 0x52, 0x65, 0x74, + 0x72, 0x69, 0x65, 0x76, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x26, 0x0a, 0x0f, 0x68, 0x61, + 0x73, 0x5f, 0x6d, 0x6f, 0x72, 0x65, 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x0f, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x0d, 0x68, 0x61, 0x73, 0x4d, 0x6f, 0x72, 0x65, 0x52, 0x65, 0x73, 0x75, + 0x6c, 0x74, 0x12, 0x30, 0x0a, 0x14, 0x73, 0x63, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x5f, 0x72, 0x65, + 0x6d, 0x6f, 0x74, 0x65, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x10, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x12, 0x73, 0x63, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x42, + 0x79, 0x74, 0x65, 0x73, 0x12, 0x2e, 0x0a, 0x13, 0x73, 0x63, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x5f, + 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x11, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x11, 0x73, 0x63, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x42, + 0x79, 0x74, 0x65, 0x73, 0x22, 0xfa, 0x01, 0x0a, 0x09, 0x4c, 0x6f, 0x61, 0x64, 0x49, 0x6e, 0x64, + 0x65, 0x78, 0x12, 0x30, 0x0a, 0x04, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1c, 0x2e, 0x6d, 0x69, 0x6c, 0x76, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, + 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4d, 0x73, 0x67, 0x42, 0x61, 0x73, 0x65, 0x52, 0x04, + 0x62, 0x61, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x49, + 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, + 0x49, 0x44, 0x12, 0x1c, 0x0a, 0x09, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x4e, 0x61, 0x6d, 0x65, + 0x12, 0x18, 0x0a, 0x07, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x49, 0x44, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x07, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x49, 0x44, 0x12, 0x1f, 0x0a, 0x0b, 0x69, 0x6e, + 0x64, 0x65, 0x78, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, + 0x0a, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x50, 0x61, 0x74, 0x68, 0x73, 0x12, 0x44, 0x0a, 0x0c, 0x69, + 0x6e, 0x64, 0x65, 0x78, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x21, 0x2e, 0x6d, 0x69, 0x6c, 0x76, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4b, 0x65, 0x79, 0x56, 0x61, 0x6c, 0x75, 0x65, + 0x50, 0x61, 0x69, 0x72, 0x52, 0x0b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x50, 0x61, 0x72, 0x61, 0x6d, + 0x73, 0x22, 0x84, 0x01, 0x0a, 0x0a, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x53, 0x74, 0x61, 0x74, 0x73, + 0x12, 0x44, 0x0a, 0x0c, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6d, 0x69, 0x6c, 0x76, 0x75, 0x73, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4b, 0x65, 0x79, + 0x56, 0x61, 0x6c, 0x75, 0x65, 0x50, 0x61, 0x69, 0x72, 0x52, 0x0b, 0x69, 0x6e, 0x64, 0x65, 0x78, + 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x30, 0x0a, 0x14, 0x6e, 0x75, 0x6d, 0x5f, 0x72, 0x65, + 0x6c, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x03, 0x52, 0x12, 0x6e, 0x75, 0x6d, 0x52, 0x65, 0x6c, 0x61, 0x74, 0x65, 0x64, + 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x8e, 0x01, 0x0a, 0x0a, 0x46, 0x69, 0x65, + 0x6c, 0x64, 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x63, 0x6f, 0x6c, 0x6c, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x63, + 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x12, 0x18, 0x0a, 0x07, 0x66, + 0x69, 0x65, 0x6c, 0x64, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x66, 0x69, + 0x65, 0x6c, 0x64, 0x49, 0x44, 0x12, 0x42, 0x0a, 0x0b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5f, 0x73, + 0x74, 0x61, 0x74, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6d, 0x69, 0x6c, 0x76, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, - 0x61, 0x6c, 0x2e, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x50, 0x72, 0x6f, - 0x67, 0x72, 0x65, 0x73, 0x73, 0x52, 0x0e, 0x74, 0x61, 0x73, 0x6b, 0x50, 0x72, 0x6f, 0x67, 0x72, - 0x65, 0x73, 0x73, 0x65, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x65, - 0x64, 0x5f, 0x72, 0x6f, 0x77, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x69, 0x6d, - 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x52, 0x6f, 0x77, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x74, 0x6f, - 0x74, 0x61, 0x6c, 0x5f, 0x72, 0x6f, 0x77, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, - 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x52, 0x6f, 0x77, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x74, 0x61, - 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, - 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x22, 0x54, 0x0a, 0x1a, 0x4c, 0x69, 0x73, 0x74, - 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x49, 0x6e, - 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x62, 0x49, 0x44, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x64, 0x62, 0x49, 0x44, 0x12, 0x22, 0x0a, 0x0c, 0x63, 0x6f, - 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, - 0x52, 0x0c, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x22, 0x56, - 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x64, 0x62, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x64, 0x62, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x27, 0x0a, - 0x0f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x86, 0x02, 0x0a, 0x13, 0x4c, 0x69, 0x73, 0x74, 0x49, - 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x33, - 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, - 0x2e, 0x6d, 0x69, 0x6c, 0x76, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x63, 0x6f, - 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x6a, 0x6f, 0x62, 0x49, 0x44, 0x73, 0x18, 0x02, 0x20, - 0x03, 0x28, 0x09, 0x52, 0x06, 0x6a, 0x6f, 0x62, 0x49, 0x44, 0x73, 0x12, 0x3d, 0x0a, 0x06, 0x73, - 0x74, 0x61, 0x74, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x25, 0x2e, 0x6d, 0x69, - 0x6c, 0x76, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, - 0x6e, 0x61, 0x6c, 0x2e, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x4a, 0x6f, 0x62, 0x53, 0x74, 0x61, - 0x74, 0x65, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x65, - 0x61, 0x73, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x72, 0x65, 0x61, - 0x73, 0x6f, 0x6e, 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, - 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x03, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x65, - 0x73, 0x73, 0x65, 0x73, 0x12, 0x29, 0x0a, 0x10, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0f, - 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x22, - 0x74, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x49, 0x6e, - 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x64, 0x62, 0x4e, + 0x61, 0x6c, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x0a, 0x69, + 0x6e, 0x64, 0x65, 0x78, 0x53, 0x74, 0x61, 0x74, 0x73, 0x22, 0x95, 0x01, 0x0a, 0x0c, 0x53, 0x65, + 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x65, + 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x73, + 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x44, 0x12, 0x1f, 0x0a, 0x0b, 0x6d, 0x65, 0x6d, 0x6f, + 0x72, 0x79, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x6d, + 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x6e, 0x75, 0x6d, + 0x5f, 0x72, 0x6f, 0x77, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x6e, 0x75, 0x6d, + 0x52, 0x6f, 0x77, 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x72, 0x65, 0x63, 0x65, 0x6e, 0x74, 0x6c, 0x79, + 0x5f, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x10, 0x72, 0x65, 0x63, 0x65, 0x6e, 0x74, 0x6c, 0x79, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, + 0x64, 0x22, 0xb7, 0x01, 0x0a, 0x12, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x54, 0x69, 0x6d, + 0x65, 0x54, 0x69, 0x63, 0x6b, 0x4d, 0x73, 0x67, 0x12, 0x30, 0x0a, 0x04, 0x62, 0x61, 0x73, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6d, 0x69, 0x6c, 0x76, 0x75, 0x73, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4d, 0x73, 0x67, + 0x42, 0x61, 0x73, 0x65, 0x52, 0x04, 0x62, 0x61, 0x73, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x63, 0x68, + 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, + 0x52, 0x0c, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x1e, + 0x0a, 0x0a, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x73, 0x18, 0x03, 0x20, 0x03, + 0x28, 0x04, 0x52, 0x0a, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x73, 0x12, 0x2b, + 0x0a, 0x11, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, + 0x61, 0x6d, 0x70, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x10, 0x64, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0xd4, 0x01, 0x0a, 0x0e, + 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1a, + 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2d, 0x0a, 0x12, 0x65, 0x6e, + 0x63, 0x72, 0x79, 0x70, 0x74, 0x65, 0x64, 0x5f, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x65, + 0x64, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x65, 0x6e, + 0x61, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x6e, 0x61, 0x6e, + 0x74, 0x12, 0x19, 0x0a, 0x08, 0x69, 0x73, 0x5f, 0x73, 0x75, 0x70, 0x65, 0x72, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x07, 0x69, 0x73, 0x53, 0x75, 0x70, 0x65, 0x72, 0x12, 0x27, 0x0a, 0x0f, + 0x73, 0x68, 0x61, 0x32, 0x35, 0x36, 0x5f, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x73, 0x68, 0x61, 0x32, 0x35, 0x36, 0x50, 0x61, 0x73, + 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x74, 0x69, + 0x63, 0x6b, 0x18, 0x06, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x74, 0x69, 0x6d, 0x65, 0x54, 0x69, + 0x63, 0x6b, 0x22, 0x45, 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x30, 0x0a, 0x04, 0x62, 0x61, 0x73, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6d, 0x69, 0x6c, 0x76, 0x75, 0x73, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4d, 0x73, 0x67, 0x42, + 0x61, 0x73, 0x65, 0x52, 0x04, 0x62, 0x61, 0x73, 0x65, 0x22, 0xdf, 0x01, 0x0a, 0x12, 0x4c, 0x69, + 0x73, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x33, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1b, 0x2e, 0x6d, 0x69, 0x6c, 0x76, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, + 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, + 0x69, 0x6e, 0x66, 0x6f, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 0x49, 0x6e, 0x66, 0x6f, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x75, 0x73, 0x65, 0x72, + 0x5f, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x75, 0x73, + 0x65, 0x72, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x52, 0x0a, 0x10, 0x70, 0x72, 0x69, 0x76, 0x69, + 0x6c, 0x65, 0x67, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x27, 0x2e, 0x6d, 0x69, 0x6c, 0x76, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x2e, 0x6d, 0x69, 0x6c, 0x76, 0x75, 0x73, 0x2e, 0x50, 0x72, 0x69, 0x76, 0x69, 0x6c, 0x65, 0x67, + 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0f, 0x70, 0x72, 0x69, 0x76, + 0x69, 0x6c, 0x65, 0x67, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x22, 0x67, 0x0a, 0x19, 0x53, + 0x68, 0x6f, 0x77, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x30, 0x0a, 0x04, 0x62, 0x61, 0x73, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6d, 0x69, 0x6c, 0x76, 0x75, 0x73, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4d, 0x73, 0x67, + 0x42, 0x61, 0x73, 0x65, 0x52, 0x04, 0x62, 0x61, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x61, + 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x74, + 0x74, 0x65, 0x72, 0x6e, 0x22, 0x9a, 0x01, 0x0a, 0x1a, 0x53, 0x68, 0x6f, 0x77, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x33, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x6d, 0x69, 0x6c, 0x76, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x47, 0x0a, 0x0d, 0x63, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x21, 0x2e, 0x6d, 0x69, 0x6c, 0x76, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x63, + 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4b, 0x65, 0x79, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x50, 0x61, + 0x69, 0x72, 0x52, 0x0d, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x22, 0x45, 0x0a, 0x04, 0x52, 0x61, 0x74, 0x65, 0x12, 0x2f, 0x0a, 0x02, 0x72, 0x74, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1f, 0x2e, 0x6d, 0x69, 0x6c, 0x76, 0x75, 0x73, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x52, 0x61, + 0x74, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x02, 0x72, 0x74, 0x12, 0x0c, 0x0a, 0x01, 0x72, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x01, 0x52, 0x01, 0x72, 0x22, 0x32, 0x0a, 0x0a, 0x49, 0x6d, 0x70, 0x6f, + 0x72, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x61, 0x74, 0x68, 0x73, 0x18, + 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x70, 0x61, 0x74, 0x68, 0x73, 0x22, 0xb7, 0x03, 0x0a, + 0x15, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x49, 0x6e, + 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x12, 0x16, 0x0a, 0x04, 0x64, 0x62, 0x49, 0x44, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x03, 0x42, 0x02, 0x18, 0x01, 0x52, 0x04, 0x64, 0x62, 0x49, 0x44, 0x12, 0x22, + 0x0a, 0x0c, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x49, 0x44, 0x12, 0x27, 0x0a, 0x0f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x63, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x70, + 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, + 0x03, 0x52, 0x0c, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x73, 0x12, + 0x23, 0x0a, 0x0d, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, + 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x4e, + 0x61, 0x6d, 0x65, 0x73, 0x12, 0x3d, 0x0a, 0x06, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x6d, 0x69, 0x6c, 0x76, 0x75, 0x73, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x06, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x12, 0x37, 0x0a, 0x05, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x07, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6d, 0x69, 0x6c, 0x76, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x49, 0x6d, 0x70, 0x6f, 0x72, + 0x74, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x05, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x3b, 0x0a, 0x07, + 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, + 0x6d, 0x69, 0x6c, 0x76, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x63, 0x6f, 0x6d, + 0x6d, 0x6f, 0x6e, 0x2e, 0x4b, 0x65, 0x79, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x50, 0x61, 0x69, 0x72, + 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x64, 0x61, 0x74, + 0x61, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x09, 0x20, 0x01, 0x28, + 0x04, 0x52, 0x0d, 0x64, 0x61, 0x74, 0x61, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, + 0x12, 0x14, 0x0a, 0x05, 0x6a, 0x6f, 0x62, 0x49, 0x44, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03, 0x52, + 0x05, 0x6a, 0x6f, 0x62, 0x49, 0x44, 0x22, 0xee, 0x01, 0x0a, 0x0d, 0x49, 0x6d, 0x70, 0x6f, 0x72, + 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x64, 0x62, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x64, 0x62, 0x4e, 0x61, 0x6d, - 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, - 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x12, 0x1e, 0x0a, 0x0a, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, - 0x49, 0x44, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x03, 0x52, 0x0a, 0x73, 0x65, 0x67, 0x6d, 0x65, - 0x6e, 0x74, 0x49, 0x44, 0x73, 0x22, 0x3f, 0x0a, 0x0b, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x42, 0x69, - 0x6e, 0x6c, 0x6f, 0x67, 0x12, 0x18, 0x0a, 0x07, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x49, 0x44, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x49, 0x44, 0x12, 0x16, - 0x0a, 0x06, 0x6c, 0x6f, 0x67, 0x49, 0x44, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x03, 0x52, 0x06, - 0x6c, 0x6f, 0x67, 0x49, 0x44, 0x73, 0x22, 0x82, 0x04, 0x0a, 0x0b, 0x53, 0x65, 0x67, 0x6d, 0x65, - 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, - 0x74, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x73, 0x65, 0x67, 0x6d, 0x65, - 0x6e, 0x74, 0x49, 0x44, 0x12, 0x22, 0x0a, 0x0c, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x63, 0x6f, 0x6c, 0x6c, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, - 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x70, - 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x12, 0x1a, 0x0a, 0x08, 0x76, 0x43, - 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x76, 0x43, - 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x12, 0x19, 0x0a, 0x08, 0x6e, 0x75, 0x6d, 0x5f, 0x72, 0x6f, - 0x77, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x6e, 0x75, 0x6d, 0x52, 0x6f, 0x77, - 0x73, 0x12, 0x37, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, + 0x65, 0x12, 0x27, 0x0a, 0x0f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x63, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x70, 0x61, + 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0d, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, + 0x65, 0x12, 0x37, 0x0a, 0x05, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6d, 0x69, 0x6c, 0x76, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, - 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x74, - 0x61, 0x74, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x37, 0x0a, 0x05, 0x6c, 0x65, - 0x76, 0x65, 0x6c, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x21, 0x2e, 0x6d, 0x69, 0x6c, 0x76, + 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x46, + 0x69, 0x6c, 0x65, 0x52, 0x05, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x3b, 0x0a, 0x07, 0x6f, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6d, 0x69, + 0x6c, 0x76, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, + 0x6e, 0x2e, 0x4b, 0x65, 0x79, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x50, 0x61, 0x69, 0x72, 0x52, 0x07, + 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x5b, 0x0a, 0x0e, 0x49, 0x6d, 0x70, 0x6f, 0x72, + 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x33, 0x0a, 0x06, 0x73, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x6d, 0x69, 0x6c, 0x76, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, - 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x52, 0x05, 0x6c, 0x65, - 0x76, 0x65, 0x6c, 0x12, 0x1b, 0x0a, 0x09, 0x69, 0x73, 0x5f, 0x73, 0x6f, 0x72, 0x74, 0x65, 0x64, - 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x69, 0x73, 0x53, 0x6f, 0x72, 0x74, 0x65, 0x64, - 0x12, 0x43, 0x0a, 0x0b, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x5f, 0x6c, 0x6f, 0x67, 0x73, 0x18, - 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x6d, 0x69, 0x6c, 0x76, 0x75, 0x73, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x46, 0x69, - 0x65, 0x6c, 0x64, 0x42, 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x52, 0x0a, 0x69, 0x6e, 0x73, 0x65, 0x72, - 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x12, 0x41, 0x0a, 0x0a, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x5f, 0x6c, - 0x6f, 0x67, 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x6d, 0x69, 0x6c, 0x76, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, + 0x0a, 0x05, 0x6a, 0x6f, 0x62, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6a, + 0x6f, 0x62, 0x49, 0x44, 0x22, 0x49, 0x0a, 0x18, 0x47, 0x65, 0x74, 0x49, 0x6d, 0x70, 0x6f, 0x72, + 0x74, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x17, 0x0a, 0x07, 0x64, 0x62, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x06, 0x64, 0x62, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6a, 0x6f, 0x62, + 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6a, 0x6f, 0x62, 0x49, 0x44, 0x22, + 0x81, 0x02, 0x0a, 0x12, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x50, 0x72, + 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x4e, + 0x61, 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, + 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x67, + 0x72, 0x65, 0x73, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x67, + 0x72, 0x65, 0x73, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, + 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x63, 0x6f, 0x6d, + 0x70, 0x6c, 0x65, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, + 0x74, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, + 0x23, 0x0a, 0x0d, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x5f, 0x72, 0x6f, 0x77, 0x73, + 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, + 0x52, 0x6f, 0x77, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x72, 0x6f, + 0x77, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x52, + 0x6f, 0x77, 0x73, 0x22, 0xc6, 0x03, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x49, 0x6d, 0x70, 0x6f, 0x72, + 0x74, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x33, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1b, 0x2e, 0x6d, 0x69, 0x6c, 0x76, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, + 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x3b, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x25, 0x2e, 0x6d, 0x69, 0x6c, 0x76, 0x75, 0x73, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x49, 0x6d, + 0x70, 0x6f, 0x72, 0x74, 0x4a, 0x6f, 0x62, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x05, 0x73, 0x74, + 0x61, 0x74, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x70, + 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x70, + 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x12, 0x27, 0x0a, 0x0f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0e, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, + 0x12, 0x23, 0x0a, 0x0d, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, + 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, + 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x52, 0x0a, 0x0f, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x70, 0x72, + 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, + 0x2e, 0x6d, 0x69, 0x6c, 0x76, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x69, 0x6e, + 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, + 0x6b, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x52, 0x0e, 0x74, 0x61, 0x73, 0x6b, 0x50, + 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x69, 0x6d, 0x70, + 0x6f, 0x72, 0x74, 0x65, 0x64, 0x5f, 0x72, 0x6f, 0x77, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x0c, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x52, 0x6f, 0x77, 0x73, 0x12, 0x1d, + 0x0a, 0x0a, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x72, 0x6f, 0x77, 0x73, 0x18, 0x09, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x09, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x52, 0x6f, 0x77, 0x73, 0x12, 0x1d, 0x0a, + 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x22, 0x54, 0x0a, 0x1a, + 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x62, + 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x64, 0x62, 0x49, 0x44, 0x12, 0x22, + 0x0a, 0x0c, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x49, 0x44, 0x22, 0x56, 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x64, 0x62, 0x5f, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x64, 0x62, 0x4e, 0x61, 0x6d, + 0x65, 0x12, 0x27, 0x0a, 0x0f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x63, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x86, 0x02, 0x0a, 0x13, 0x4c, + 0x69, 0x73, 0x74, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x33, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x6d, 0x69, 0x6c, 0x76, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, + 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x6a, 0x6f, 0x62, 0x49, 0x44, + 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x6a, 0x6f, 0x62, 0x49, 0x44, 0x73, 0x12, + 0x3d, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0e, 0x32, + 0x25, 0x2e, 0x6d, 0x69, 0x6c, 0x76, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x69, + 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x4a, 0x6f, + 0x62, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x65, 0x73, 0x12, 0x18, + 0x0a, 0x07, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, + 0x07, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x67, + 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x03, 0x52, 0x0a, 0x70, 0x72, + 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x12, 0x29, 0x0a, 0x10, 0x63, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, + 0x28, 0x09, 0x52, 0x0f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, + 0x6d, 0x65, 0x73, 0x22, 0x74, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, + 0x06, 0x64, 0x62, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x64, + 0x62, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x63, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x12, 0x1e, 0x0a, 0x0a, 0x73, 0x65, 0x67, + 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x44, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x03, 0x52, 0x0a, 0x73, + 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x44, 0x73, 0x22, 0x3f, 0x0a, 0x0b, 0x46, 0x69, 0x65, + 0x6c, 0x64, 0x42, 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x12, 0x18, 0x0a, 0x07, 0x66, 0x69, 0x65, 0x6c, + 0x64, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x66, 0x69, 0x65, 0x6c, 0x64, + 0x49, 0x44, 0x12, 0x16, 0x0a, 0x06, 0x6c, 0x6f, 0x67, 0x49, 0x44, 0x73, 0x18, 0x02, 0x20, 0x03, + 0x28, 0x03, 0x52, 0x06, 0x6c, 0x6f, 0x67, 0x49, 0x44, 0x73, 0x22, 0x82, 0x04, 0x0a, 0x0b, 0x53, + 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x65, + 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x73, + 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x44, 0x12, 0x22, 0x0a, 0x0c, 0x63, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, + 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x12, 0x20, 0x0a, 0x0b, + 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x12, 0x1a, + 0x0a, 0x08, 0x76, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x76, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x12, 0x19, 0x0a, 0x08, 0x6e, 0x75, + 0x6d, 0x5f, 0x72, 0x6f, 0x77, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x6e, 0x75, + 0x6d, 0x52, 0x6f, 0x77, 0x73, 0x12, 0x37, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x0e, 0x32, 0x21, 0x2e, 0x6d, 0x69, 0x6c, 0x76, 0x75, 0x73, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x53, 0x65, 0x67, 0x6d, 0x65, + 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x37, + 0x0a, 0x05, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x21, 0x2e, + 0x6d, 0x69, 0x6c, 0x76, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x63, 0x6f, 0x6d, + 0x6d, 0x6f, 0x6e, 0x2e, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x4c, 0x65, 0x76, 0x65, 0x6c, + 0x52, 0x05, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x1b, 0x0a, 0x09, 0x69, 0x73, 0x5f, 0x73, 0x6f, + 0x72, 0x74, 0x65, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x69, 0x73, 0x53, 0x6f, + 0x72, 0x74, 0x65, 0x64, 0x12, 0x43, 0x0a, 0x0b, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x5f, 0x6c, + 0x6f, 0x67, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x6d, 0x69, 0x6c, 0x76, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, - 0x6c, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x42, 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x52, 0x09, 0x64, - 0x65, 0x6c, 0x74, 0x61, 0x4c, 0x6f, 0x67, 0x73, 0x12, 0x41, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x74, - 0x73, 0x5f, 0x6c, 0x6f, 0x67, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x6d, - 0x69, 0x6c, 0x76, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x69, 0x6e, 0x74, 0x65, - 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x42, 0x69, 0x6e, 0x6c, 0x6f, 0x67, - 0x52, 0x09, 0x73, 0x74, 0x61, 0x74, 0x73, 0x4c, 0x6f, 0x67, 0x73, 0x22, 0x96, 0x01, 0x0a, 0x17, - 0x47, 0x65, 0x74, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x33, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x6d, 0x69, 0x6c, 0x76, 0x75, 0x73, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x46, 0x0a, 0x0c, - 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x73, 0x18, 0x02, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x6d, 0x69, 0x6c, 0x76, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x53, 0x65, 0x67, 0x6d, 0x65, - 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0c, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x49, - 0x6e, 0x66, 0x6f, 0x73, 0x22, 0x4a, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x51, 0x75, 0x6f, 0x74, 0x61, - 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x30, - 0x0a, 0x04, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6d, - 0x69, 0x6c, 0x76, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, - 0x6f, 0x6e, 0x2e, 0x4d, 0x73, 0x67, 0x42, 0x61, 0x73, 0x65, 0x52, 0x04, 0x62, 0x61, 0x73, 0x65, - 0x22, 0x71, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x51, 0x75, 0x6f, 0x74, 0x61, 0x4d, 0x65, 0x74, 0x72, - 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x33, 0x0a, 0x06, 0x73, + 0x6c, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x42, 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x52, 0x0a, 0x69, + 0x6e, 0x73, 0x65, 0x72, 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x12, 0x41, 0x0a, 0x0a, 0x64, 0x65, 0x6c, + 0x74, 0x61, 0x5f, 0x6c, 0x6f, 0x67, 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, + 0x6d, 0x69, 0x6c, 0x76, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x69, 0x6e, 0x74, + 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x42, 0x69, 0x6e, 0x6c, 0x6f, + 0x67, 0x52, 0x09, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x4c, 0x6f, 0x67, 0x73, 0x12, 0x41, 0x0a, 0x0a, + 0x73, 0x74, 0x61, 0x74, 0x73, 0x5f, 0x6c, 0x6f, 0x67, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x22, 0x2e, 0x6d, 0x69, 0x6c, 0x76, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, + 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x42, 0x69, + 0x6e, 0x6c, 0x6f, 0x67, 0x52, 0x09, 0x73, 0x74, 0x61, 0x74, 0x73, 0x4c, 0x6f, 0x67, 0x73, 0x22, + 0x96, 0x01, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x49, + 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x33, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x6d, 0x69, 0x6c, 0x76, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x12, 0x21, 0x0a, 0x0c, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x69, 0x6e, 0x66, 0x6f, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x49, - 0x6e, 0x66, 0x6f, 0x2a, 0x45, 0x0a, 0x09, 0x52, 0x61, 0x74, 0x65, 0x53, 0x63, 0x6f, 0x70, 0x65, - 0x12, 0x0b, 0x0a, 0x07, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x10, 0x00, 0x12, 0x0c, 0x0a, - 0x08, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x10, 0x01, 0x12, 0x0e, 0x0a, 0x0a, 0x43, - 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x50, - 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x10, 0x03, 0x2a, 0xc4, 0x01, 0x0a, 0x08, 0x52, - 0x61, 0x74, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x11, 0x0a, 0x0d, 0x44, 0x44, 0x4c, 0x43, 0x6f, - 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x10, 0x00, 0x12, 0x10, 0x0a, 0x0c, 0x44, 0x44, - 0x4c, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x10, 0x01, 0x12, 0x0c, 0x0a, 0x08, - 0x44, 0x44, 0x4c, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x10, 0x02, 0x12, 0x0c, 0x0a, 0x08, 0x44, 0x44, - 0x4c, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x10, 0x03, 0x12, 0x11, 0x0a, 0x0d, 0x44, 0x44, 0x4c, 0x43, - 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x10, 0x04, 0x12, 0x0d, 0x0a, 0x09, 0x44, - 0x4d, 0x4c, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x10, 0x05, 0x12, 0x0d, 0x0a, 0x09, 0x44, 0x4d, - 0x4c, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x10, 0x06, 0x12, 0x0f, 0x0a, 0x0b, 0x44, 0x4d, 0x4c, - 0x42, 0x75, 0x6c, 0x6b, 0x4c, 0x6f, 0x61, 0x64, 0x10, 0x07, 0x12, 0x0d, 0x0a, 0x09, 0x44, 0x51, - 0x4c, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x10, 0x08, 0x12, 0x0c, 0x0a, 0x08, 0x44, 0x51, 0x4c, - 0x51, 0x75, 0x65, 0x72, 0x79, 0x10, 0x09, 0x12, 0x0d, 0x0a, 0x09, 0x44, 0x4d, 0x4c, 0x55, 0x70, - 0x73, 0x65, 0x72, 0x74, 0x10, 0x0a, 0x12, 0x09, 0x0a, 0x05, 0x44, 0x44, 0x4c, 0x44, 0x42, 0x10, - 0x0b, 0x2a, 0x83, 0x01, 0x0a, 0x0e, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x4a, 0x6f, 0x62, 0x53, - 0x74, 0x61, 0x74, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x6f, 0x6e, 0x65, 0x10, 0x00, 0x12, 0x0b, - 0x0a, 0x07, 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x10, 0x01, 0x12, 0x10, 0x0a, 0x0c, 0x50, - 0x72, 0x65, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x10, 0x02, 0x12, 0x0d, 0x0a, - 0x09, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x10, 0x03, 0x12, 0x0a, 0x0a, 0x06, - 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x10, 0x04, 0x12, 0x0d, 0x0a, 0x09, 0x43, 0x6f, 0x6d, 0x70, - 0x6c, 0x65, 0x74, 0x65, 0x64, 0x10, 0x05, 0x12, 0x11, 0x0a, 0x0d, 0x49, 0x6e, 0x64, 0x65, 0x78, - 0x42, 0x75, 0x69, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x10, 0x06, 0x12, 0x0b, 0x0a, 0x07, 0x53, 0x6f, - 0x72, 0x74, 0x69, 0x6e, 0x67, 0x10, 0x07, 0x42, 0x35, 0x5a, 0x33, 0x67, 0x69, 0x74, 0x68, 0x75, - 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6d, 0x69, 0x6c, 0x76, 0x75, 0x73, 0x2d, 0x69, 0x6f, 0x2f, - 0x6d, 0x69, 0x6c, 0x76, 0x75, 0x73, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x76, 0x32, 0x2f, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x70, 0x62, 0x62, 0x06, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x12, 0x46, 0x0a, 0x0c, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x73, + 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x6d, 0x69, 0x6c, 0x76, 0x75, 0x73, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x53, + 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0c, 0x73, 0x65, 0x67, 0x6d, + 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x73, 0x22, 0x4a, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x51, + 0x75, 0x6f, 0x74, 0x61, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x30, 0x0a, 0x04, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1c, 0x2e, 0x6d, 0x69, 0x6c, 0x76, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, + 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4d, 0x73, 0x67, 0x42, 0x61, 0x73, 0x65, 0x52, 0x04, + 0x62, 0x61, 0x73, 0x65, 0x22, 0x71, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x51, 0x75, 0x6f, 0x74, 0x61, + 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x33, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1b, 0x2e, 0x6d, 0x69, 0x6c, 0x76, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x63, + 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, + 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x6d, 0x65, 0x74, 0x72, + 0x69, 0x63, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x2a, 0x45, 0x0a, 0x09, 0x52, 0x61, 0x74, 0x65, 0x53, + 0x63, 0x6f, 0x70, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x10, + 0x00, 0x12, 0x0c, 0x0a, 0x08, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x10, 0x01, 0x12, + 0x0e, 0x0a, 0x0a, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x10, 0x02, 0x12, + 0x0d, 0x0a, 0x09, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x10, 0x03, 0x2a, 0xc4, + 0x01, 0x0a, 0x08, 0x52, 0x61, 0x74, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x11, 0x0a, 0x0d, 0x44, + 0x44, 0x4c, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x10, 0x00, 0x12, 0x10, + 0x0a, 0x0c, 0x44, 0x44, 0x4c, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x10, 0x01, + 0x12, 0x0c, 0x0a, 0x08, 0x44, 0x44, 0x4c, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x10, 0x02, 0x12, 0x0c, + 0x0a, 0x08, 0x44, 0x44, 0x4c, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x10, 0x03, 0x12, 0x11, 0x0a, 0x0d, + 0x44, 0x44, 0x4c, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x10, 0x04, 0x12, + 0x0d, 0x0a, 0x09, 0x44, 0x4d, 0x4c, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x10, 0x05, 0x12, 0x0d, + 0x0a, 0x09, 0x44, 0x4d, 0x4c, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x10, 0x06, 0x12, 0x0f, 0x0a, + 0x0b, 0x44, 0x4d, 0x4c, 0x42, 0x75, 0x6c, 0x6b, 0x4c, 0x6f, 0x61, 0x64, 0x10, 0x07, 0x12, 0x0d, + 0x0a, 0x09, 0x44, 0x51, 0x4c, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x10, 0x08, 0x12, 0x0c, 0x0a, + 0x08, 0x44, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x10, 0x09, 0x12, 0x0d, 0x0a, 0x09, 0x44, + 0x4d, 0x4c, 0x55, 0x70, 0x73, 0x65, 0x72, 0x74, 0x10, 0x0a, 0x12, 0x09, 0x0a, 0x05, 0x44, 0x44, + 0x4c, 0x44, 0x42, 0x10, 0x0b, 0x2a, 0x83, 0x01, 0x0a, 0x0e, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, + 0x4a, 0x6f, 0x62, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x6f, 0x6e, 0x65, + 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x10, 0x01, 0x12, + 0x10, 0x0a, 0x0c, 0x50, 0x72, 0x65, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x10, + 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x10, 0x03, + 0x12, 0x0a, 0x0a, 0x06, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x10, 0x04, 0x12, 0x0d, 0x0a, 0x09, + 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x10, 0x05, 0x12, 0x11, 0x0a, 0x0d, 0x49, + 0x6e, 0x64, 0x65, 0x78, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x10, 0x06, 0x12, 0x0b, + 0x0a, 0x07, 0x53, 0x6f, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x10, 0x07, 0x42, 0x35, 0x5a, 0x33, 0x67, + 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6d, 0x69, 0x6c, 0x76, 0x75, 0x73, + 0x2d, 0x69, 0x6f, 0x2f, 0x6d, 0x69, 0x6c, 0x76, 0x75, 0x73, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x76, + 0x32, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, + 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/pkg/proto/segcore.proto b/pkg/proto/segcore.proto index da56244977..6bc56d3cb4 100644 --- a/pkg/proto/segcore.proto +++ b/pkg/proto/segcore.proto @@ -11,6 +11,8 @@ message RetrieveResults { repeated schema.FieldData fields_data = 3; int64 all_retrieve_count = 4; bool has_more_result = 5; + int64 scanned_remote_bytes = 6; + int64 scanned_total_bytes = 7; } message LoadFieldMeta { diff --git a/pkg/proto/segcorepb/segcore.pb.go b/pkg/proto/segcorepb/segcore.pb.go index c8e9c3c3ae..c4d61a3704 100644 --- a/pkg/proto/segcorepb/segcore.pb.go +++ b/pkg/proto/segcorepb/segcore.pb.go @@ -27,11 +27,13 @@ type RetrieveResults struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Ids *schemapb.IDs `protobuf:"bytes,1,opt,name=ids,proto3" json:"ids,omitempty"` - Offset []int64 `protobuf:"varint,2,rep,packed,name=offset,proto3" json:"offset,omitempty"` - FieldsData []*schemapb.FieldData `protobuf:"bytes,3,rep,name=fields_data,json=fieldsData,proto3" json:"fields_data,omitempty"` - AllRetrieveCount int64 `protobuf:"varint,4,opt,name=all_retrieve_count,json=allRetrieveCount,proto3" json:"all_retrieve_count,omitempty"` - HasMoreResult bool `protobuf:"varint,5,opt,name=has_more_result,json=hasMoreResult,proto3" json:"has_more_result,omitempty"` + Ids *schemapb.IDs `protobuf:"bytes,1,opt,name=ids,proto3" json:"ids,omitempty"` + Offset []int64 `protobuf:"varint,2,rep,packed,name=offset,proto3" json:"offset,omitempty"` + FieldsData []*schemapb.FieldData `protobuf:"bytes,3,rep,name=fields_data,json=fieldsData,proto3" json:"fields_data,omitempty"` + AllRetrieveCount int64 `protobuf:"varint,4,opt,name=all_retrieve_count,json=allRetrieveCount,proto3" json:"all_retrieve_count,omitempty"` + HasMoreResult bool `protobuf:"varint,5,opt,name=has_more_result,json=hasMoreResult,proto3" json:"has_more_result,omitempty"` + ScannedRemoteBytes int64 `protobuf:"varint,6,opt,name=scanned_remote_bytes,json=scannedRemoteBytes,proto3" json:"scanned_remote_bytes,omitempty"` + ScannedTotalBytes int64 `protobuf:"varint,7,opt,name=scanned_total_bytes,json=scannedTotalBytes,proto3" json:"scanned_total_bytes,omitempty"` } func (x *RetrieveResults) Reset() { @@ -101,6 +103,20 @@ func (x *RetrieveResults) GetHasMoreResult() bool { return false } +func (x *RetrieveResults) GetScannedRemoteBytes() int64 { + if x != nil { + return x.ScannedRemoteBytes + } + return 0 +} + +func (x *RetrieveResults) GetScannedTotalBytes() int64 { + if x != nil { + return x.ScannedTotalBytes + } + return 0 +} + type LoadFieldMeta struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -432,7 +448,7 @@ var file_segcore_proto_rawDesc = []byte{ 0x14, 0x6d, 0x69, 0x6c, 0x76, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x73, 0x65, 0x67, 0x63, 0x6f, 0x72, 0x65, 0x1a, 0x0c, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x0c, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x22, 0xec, 0x01, 0x0a, 0x0f, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x52, 0x65, + 0x6f, 0x22, 0xce, 0x02, 0x0a, 0x0f, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x2a, 0x0a, 0x03, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6d, 0x69, 0x6c, 0x76, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x44, 0x73, 0x52, 0x03, 0x69, 0x64, @@ -447,63 +463,69 @@ var file_segcore_proto_rawDesc = []byte{ 0x65, 0x76, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x26, 0x0a, 0x0f, 0x68, 0x61, 0x73, 0x5f, 0x6d, 0x6f, 0x72, 0x65, 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x68, 0x61, 0x73, 0x4d, 0x6f, 0x72, 0x65, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, - 0x22, 0x76, 0x0a, 0x0d, 0x4c, 0x6f, 0x61, 0x64, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4d, 0x65, 0x74, - 0x61, 0x12, 0x23, 0x0a, 0x0d, 0x6d, 0x69, 0x6e, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, - 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x6d, 0x69, 0x6e, 0x54, 0x69, 0x6d, - 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x23, 0x0a, 0x0d, 0x6d, 0x61, 0x78, 0x5f, 0x74, 0x69, - 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x6d, - 0x61, 0x78, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x1b, 0x0a, 0x09, 0x72, - 0x6f, 0x77, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, - 0x72, 0x6f, 0x77, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x6b, 0x0a, 0x0f, 0x4c, 0x6f, 0x61, 0x64, - 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x39, 0x0a, 0x05, 0x6d, - 0x65, 0x74, 0x61, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x6d, 0x69, 0x6c, - 0x76, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x73, 0x65, 0x67, 0x63, 0x6f, 0x72, - 0x65, 0x2e, 0x4c, 0x6f, 0x61, 0x64, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4d, 0x65, 0x74, 0x61, 0x52, - 0x05, 0x6d, 0x65, 0x74, 0x61, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, - 0x73, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x6f, 0x74, 0x61, - 0x6c, 0x53, 0x69, 0x7a, 0x65, 0x22, 0x6a, 0x0a, 0x0c, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x52, - 0x65, 0x63, 0x6f, 0x72, 0x64, 0x12, 0x3f, 0x0a, 0x0b, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x5f, - 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x6d, 0x69, 0x6c, - 0x76, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x44, 0x61, 0x74, 0x61, 0x52, 0x0a, 0x66, 0x69, 0x65, 0x6c, - 0x64, 0x73, 0x44, 0x61, 0x74, 0x61, 0x12, 0x19, 0x0a, 0x08, 0x6e, 0x75, 0x6d, 0x5f, 0x72, 0x6f, - 0x77, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x6e, 0x75, 0x6d, 0x52, 0x6f, 0x77, - 0x73, 0x22, 0xea, 0x02, 0x0a, 0x0e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x49, 0x6e, 0x64, 0x65, 0x78, - 0x4d, 0x65, 0x74, 0x61, 0x12, 0x18, 0x0a, 0x07, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x49, 0x44, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x49, 0x44, 0x12, 0x22, - 0x0a, 0x0c, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x49, 0x44, 0x12, 0x1d, 0x0a, 0x0a, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5f, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4e, 0x61, 0x6d, - 0x65, 0x12, 0x42, 0x0a, 0x0b, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, - 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6d, 0x69, 0x6c, 0x76, 0x75, 0x73, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4b, 0x65, 0x79, - 0x56, 0x61, 0x6c, 0x75, 0x65, 0x50, 0x61, 0x69, 0x72, 0x52, 0x0a, 0x74, 0x79, 0x70, 0x65, 0x50, - 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x44, 0x0a, 0x0c, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5f, 0x70, - 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6d, 0x69, - 0x6c, 0x76, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, - 0x6e, 0x2e, 0x4b, 0x65, 0x79, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x50, 0x61, 0x69, 0x72, 0x52, 0x0b, - 0x69, 0x6e, 0x64, 0x65, 0x78, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x22, 0x0a, 0x0d, 0x69, - 0x73, 0x5f, 0x61, 0x75, 0x74, 0x6f, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x0b, 0x69, 0x73, 0x41, 0x75, 0x74, 0x6f, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, - 0x4d, 0x0a, 0x11, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5f, 0x70, 0x61, - 0x72, 0x61, 0x6d, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6d, 0x69, 0x6c, - 0x76, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, - 0x2e, 0x4b, 0x65, 0x79, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x50, 0x61, 0x69, 0x72, 0x52, 0x0f, 0x75, - 0x73, 0x65, 0x72, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x22, 0x88, - 0x01, 0x0a, 0x13, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x64, - 0x65, 0x78, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x2a, 0x0a, 0x10, 0x6d, 0x61, 0x78, 0x49, 0x6e, 0x64, - 0x65, 0x78, 0x52, 0x6f, 0x77, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, - 0x52, 0x10, 0x6d, 0x61, 0x78, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x6f, 0x77, 0x43, 0x6f, 0x75, - 0x6e, 0x74, 0x12, 0x45, 0x0a, 0x0b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5f, 0x6d, 0x65, 0x74, 0x61, - 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x6d, 0x69, 0x6c, 0x76, 0x75, 0x73, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x73, 0x65, 0x67, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x46, - 0x69, 0x65, 0x6c, 0x64, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4d, 0x65, 0x74, 0x61, 0x52, 0x0a, 0x69, - 0x6e, 0x64, 0x65, 0x78, 0x4d, 0x65, 0x74, 0x61, 0x73, 0x42, 0x34, 0x5a, 0x32, 0x67, 0x69, 0x74, - 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6d, 0x69, 0x6c, 0x76, 0x75, 0x73, 0x2d, 0x69, - 0x6f, 0x2f, 0x6d, 0x69, 0x6c, 0x76, 0x75, 0x73, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x76, 0x32, 0x2f, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x73, 0x65, 0x67, 0x63, 0x6f, 0x72, 0x65, 0x70, 0x62, 0x62, - 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x12, 0x30, 0x0a, 0x14, 0x73, 0x63, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x5f, 0x72, 0x65, 0x6d, 0x6f, + 0x74, 0x65, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x12, + 0x73, 0x63, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x42, 0x79, 0x74, + 0x65, 0x73, 0x12, 0x2e, 0x0a, 0x13, 0x73, 0x63, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x5f, 0x74, 0x6f, + 0x74, 0x61, 0x6c, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x52, + 0x11, 0x73, 0x63, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x42, 0x79, 0x74, + 0x65, 0x73, 0x22, 0x76, 0x0a, 0x0d, 0x4c, 0x6f, 0x61, 0x64, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4d, + 0x65, 0x74, 0x61, 0x12, 0x23, 0x0a, 0x0d, 0x6d, 0x69, 0x6e, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, + 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x6d, 0x69, 0x6e, 0x54, + 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x23, 0x0a, 0x0d, 0x6d, 0x61, 0x78, 0x5f, + 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, + 0x0c, 0x6d, 0x61, 0x78, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x1b, 0x0a, + 0x09, 0x72, 0x6f, 0x77, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x08, 0x72, 0x6f, 0x77, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x6b, 0x0a, 0x0f, 0x4c, 0x6f, + 0x61, 0x64, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x39, 0x0a, + 0x05, 0x6d, 0x65, 0x74, 0x61, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x6d, + 0x69, 0x6c, 0x76, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x73, 0x65, 0x67, 0x63, + 0x6f, 0x72, 0x65, 0x2e, 0x4c, 0x6f, 0x61, 0x64, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4d, 0x65, 0x74, + 0x61, 0x52, 0x05, 0x6d, 0x65, 0x74, 0x61, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x74, 0x6f, 0x74, 0x61, + 0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x6f, + 0x74, 0x61, 0x6c, 0x53, 0x69, 0x7a, 0x65, 0x22, 0x6a, 0x0a, 0x0c, 0x49, 0x6e, 0x73, 0x65, 0x72, + 0x74, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x12, 0x3f, 0x0a, 0x0b, 0x66, 0x69, 0x65, 0x6c, 0x64, + 0x73, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x6d, + 0x69, 0x6c, 0x76, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x44, 0x61, 0x74, 0x61, 0x52, 0x0a, 0x66, 0x69, + 0x65, 0x6c, 0x64, 0x73, 0x44, 0x61, 0x74, 0x61, 0x12, 0x19, 0x0a, 0x08, 0x6e, 0x75, 0x6d, 0x5f, + 0x72, 0x6f, 0x77, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x6e, 0x75, 0x6d, 0x52, + 0x6f, 0x77, 0x73, 0x22, 0xea, 0x02, 0x0a, 0x0e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x49, 0x6e, 0x64, + 0x65, 0x78, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x18, 0x0a, 0x07, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x49, + 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x49, 0x44, + 0x12, 0x22, 0x0a, 0x0c, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x49, 0x44, 0x12, 0x1d, 0x0a, 0x0a, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5f, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4e, + 0x61, 0x6d, 0x65, 0x12, 0x42, 0x0a, 0x0b, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x70, 0x61, 0x72, 0x61, + 0x6d, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6d, 0x69, 0x6c, 0x76, 0x75, + 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4b, + 0x65, 0x79, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x50, 0x61, 0x69, 0x72, 0x52, 0x0a, 0x74, 0x79, 0x70, + 0x65, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x44, 0x0a, 0x0c, 0x69, 0x6e, 0x64, 0x65, 0x78, + 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, + 0x6d, 0x69, 0x6c, 0x76, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x63, 0x6f, 0x6d, + 0x6d, 0x6f, 0x6e, 0x2e, 0x4b, 0x65, 0x79, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x50, 0x61, 0x69, 0x72, + 0x52, 0x0b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x22, 0x0a, + 0x0d, 0x69, 0x73, 0x5f, 0x61, 0x75, 0x74, 0x6f, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x69, 0x73, 0x41, 0x75, 0x74, 0x6f, 0x49, 0x6e, 0x64, 0x65, + 0x78, 0x12, 0x4d, 0x0a, 0x11, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5f, + 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6d, + 0x69, 0x6c, 0x76, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, + 0x6f, 0x6e, 0x2e, 0x4b, 0x65, 0x79, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x50, 0x61, 0x69, 0x72, 0x52, + 0x0f, 0x75, 0x73, 0x65, 0x72, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, + 0x22, 0x88, 0x01, 0x0a, 0x13, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, + 0x6e, 0x64, 0x65, 0x78, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x2a, 0x0a, 0x10, 0x6d, 0x61, 0x78, 0x49, + 0x6e, 0x64, 0x65, 0x78, 0x52, 0x6f, 0x77, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x10, 0x6d, 0x61, 0x78, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x6f, 0x77, 0x43, + 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x45, 0x0a, 0x0b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5f, 0x6d, 0x65, + 0x74, 0x61, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x6d, 0x69, 0x6c, 0x76, + 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x73, 0x65, 0x67, 0x63, 0x6f, 0x72, 0x65, + 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4d, 0x65, 0x74, 0x61, 0x52, + 0x0a, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4d, 0x65, 0x74, 0x61, 0x73, 0x42, 0x34, 0x5a, 0x32, 0x67, + 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6d, 0x69, 0x6c, 0x76, 0x75, 0x73, + 0x2d, 0x69, 0x6f, 0x2f, 0x6d, 0x69, 0x6c, 0x76, 0x75, 0x73, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x76, + 0x32, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x73, 0x65, 0x67, 0x63, 0x6f, 0x72, 0x65, 0x70, + 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/tests/python_client/requirements.txt b/tests/python_client/requirements.txt index bf3b1e659c..ba4ceaec0e 100644 --- a/tests/python_client/requirements.txt +++ b/tests/python_client/requirements.txt @@ -28,8 +28,8 @@ pytest-parallel pytest-random-order # pymilvus -pymilvus==2.7.0rc29 -pymilvus[bulk_writer]==2.7.0rc29 +pymilvus==2.7.0rc33 +pymilvus[bulk_writer]==2.7.0rc33 # for protobuf protobuf>=5.29.5