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 <chao.gao@zilliz.com>
Signed-off-by: marcelo.chen <marcelo.chen@zilliz.com>
Co-authored-by: marcelo.chen <marcelo.chen@zilliz.com>
This commit is contained in:
Gao 2025-09-19 20:20:02 +08:00 committed by GitHub
parent 92d2fb6360
commit d3784c6515
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
80 changed files with 1363 additions and 739 deletions

View File

@ -33,6 +33,64 @@
namespace milvus { 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<int64_t>(scanned_remote_bytes * factor),
static_cast<int64_t>(scanned_total_bytes * factor)};
}
void
operator*=(const double factor) {
scanned_remote_bytes =
static_cast<int64_t>(scanned_remote_bytes * factor);
scanned_total_bytes =
static_cast<int64_t>(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 { struct OffsetDisPair {
private: private:
std::pair<int64_t, float> off_dis_; std::pair<int64_t, float> off_dis_;
@ -215,6 +273,8 @@ struct SearchResult {
//Vector iterators, used for group by //Vector iterators, used for group by
std::optional<std::vector<std::shared_ptr<VectorIterator>>> std::optional<std::vector<std::shared_ptr<VectorIterator>>>
vector_iterators_; vector_iterators_;
// record the storage usage in search
StorageCost search_storage_cost_;
}; };
using SearchResultPtr = std::shared_ptr<SearchResult>; using SearchResultPtr = std::shared_ptr<SearchResult>;
@ -229,6 +289,8 @@ struct RetrieveResult {
std::vector<int64_t> result_offsets_; std::vector<int64_t> result_offsets_;
std::vector<DataArray> field_data_; std::vector<DataArray> field_data_;
bool has_more_result = true; bool has_more_result = true;
// record the storage usage in retrieve
StorageCost retrieve_storage_cost_;
}; };
using RetrieveResultPtr = std::shared_ptr<RetrieveResult>; using RetrieveResultPtr = std::shared_ptr<RetrieveResult>;

View File

@ -342,10 +342,14 @@ TEST_F(TestVectorArrayStorageV2, BuildEmbListHNSWIndex) {
searchInfo.metric_type_ = knowhere::metric::MAX_SIM; searchInfo.metric_type_ = knowhere::metric::MAX_SIM;
searchInfo.search_params_ = search_conf; searchInfo.search_params_ = search_conf;
SearchResult result; 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); auto ref_result = SearchResultToJson(result);
std::cout << ref_result.dump(1) << std::endl; std::cout << ref_result.dump(1) << std::endl;
EXPECT_EQ(result.total_nq_, 2); EXPECT_EQ(result.total_nq_, 2);
EXPECT_EQ(result.distances_.size(), 2 * searchInfo.topk_); 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);
} }
} }

View File

@ -84,15 +84,21 @@ PhyVectorSearchNode::GetOutput() {
// TODO: uniform knowhere BitsetView and milvus BitsetView // TODO: uniform knowhere BitsetView and milvus BitsetView
milvus::BitsetView final_view((uint8_t*)col_input->GetRawData(), milvus::BitsetView final_view((uint8_t*)col_input->GetRawData(),
col_input->size()); col_input->size());
milvus::OpContext op_context;
segment_->vector_search(search_info_, segment_->vector_search(search_info_,
src_data, src_data,
src_lims, src_lims,
num_queries, num_queries,
query_timestamp_, query_timestamp_,
final_view, final_view,
&op_context,
search_result); search_result);
search_result.total_data_cnt_ = final_view.size(); 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)); query_context_->set_search_result(std::move(search_result));
std::chrono::high_resolution_clock::time_point vector_end = std::chrono::high_resolution_clock::time_point vector_end =
std::chrono::high_resolution_clock::now(); std::chrono::high_resolution_clock::now();

View File

@ -25,7 +25,7 @@ SkipIndex::GetFieldChunkMetrics(milvus::FieldId field_id, int chunk_id) const {
if (field_metrics != fieldChunkMetrics_.end()) { if (field_metrics != fieldChunkMetrics_.end()) {
auto& field_chunk_metrics = field_metrics->second; auto& field_chunk_metrics = field_metrics->second;
auto ca = cachinglayer::SemiInlineGet( 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); auto metrics = ca->get_cell_of(chunk_id);
return cachinglayer::PinWrapper<const FieldChunkMetrics*>(ca, metrics); return cachinglayer::PinWrapper<const FieldChunkMetrics*>(ca, metrics);
} }

View File

@ -11,6 +11,7 @@
#pragma once #pragma once
#include <cstdint>
#include <unordered_map> #include <unordered_map>
#include "cachinglayer/CacheSlot.h" #include "cachinglayer/CacheSlot.h"
@ -112,6 +113,12 @@ class FieldChunkMetricsTranslator
return &meta_; return &meta_;
} }
int64_t
cells_storage_bytes(
const std::vector<milvus::cachinglayer::cid_t>& cids) const override {
return 0;
}
private: private:
// todo: support some null_count_ skip // todo: support some null_count_ skip

View File

@ -245,6 +245,7 @@ void
VectorDiskAnnIndex<T>::Query(const DatasetPtr dataset, VectorDiskAnnIndex<T>::Query(const DatasetPtr dataset,
const SearchInfo& search_info, const SearchInfo& search_info,
const BitsetView& bitset, const BitsetView& bitset,
milvus::OpContext* op_context,
SearchResult& search_result) const { SearchResult& search_result) const {
AssertInfo(GetMetricType() == search_info.metric_type_, AssertInfo(GetMetricType() == search_info.metric_type_,
"Metric type of field index isn't the same with search info"); "Metric type of field index isn't the same with search info");
@ -272,7 +273,8 @@ VectorDiskAnnIndex<T>::Query(const DatasetPtr dataset,
auto final = [&] { auto final = [&] {
if (CheckAndUpdateKnowhereRangeSearchParam( if (CheckAndUpdateKnowhereRangeSearchParam(
search_info, topk, GetMetricType(), search_config)) { 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()) { if (!res.has_value()) {
ThrowInfo(ErrorCode::UnexpectedError, ThrowInfo(ErrorCode::UnexpectedError,
fmt::format("failed to range search: {}: {}", fmt::format("failed to range search: {}: {}",
@ -282,7 +284,8 @@ VectorDiskAnnIndex<T>::Query(const DatasetPtr dataset,
return ReGenRangeSearchResult( return ReGenRangeSearchResult(
res.value(), topk, num_rows, GetMetricType()); res.value(), topk, num_rows, GetMetricType());
} else { } else {
auto res = index_.Search(dataset, search_config, bitset); auto res =
index_.Search(dataset, search_config, bitset, op_context);
if (!res.has_value()) { if (!res.has_value()) {
ThrowInfo(ErrorCode::UnexpectedError, ThrowInfo(ErrorCode::UnexpectedError,
fmt::format("failed to search: {}: {}", fmt::format("failed to search: {}: {}",

View File

@ -72,6 +72,7 @@ class VectorDiskAnnIndex : public VectorIndex {
Query(const DatasetPtr dataset, Query(const DatasetPtr dataset,
const SearchInfo& search_info, const SearchInfo& search_info,
const BitsetView& bitset, const BitsetView& bitset,
milvus::OpContext* op_context,
SearchResult& search_result) const override; SearchResult& search_result) const override;
const bool const bool

View File

@ -29,6 +29,7 @@
#include "common/BitsetView.h" #include "common/BitsetView.h"
#include "common/QueryResult.h" #include "common/QueryResult.h"
#include "common/QueryInfo.h" #include "common/QueryInfo.h"
#include "common/OpContext.h"
#include "knowhere/version.h" #include "knowhere/version.h"
namespace milvus::index { namespace milvus::index {
@ -58,6 +59,7 @@ class VectorIndex : public IndexBase {
Query(const DatasetPtr dataset, Query(const DatasetPtr dataset,
const SearchInfo& search_info, const SearchInfo& search_info,
const BitsetView& bitset, const BitsetView& bitset,
milvus::OpContext* op_context,
SearchResult& search_result) const = 0; SearchResult& search_result) const = 0;
virtual knowhere::expected<std::vector<knowhere::IndexNode::IteratorPtr>> virtual knowhere::expected<std::vector<knowhere::IndexNode::IteratorPtr>>

View File

@ -473,6 +473,7 @@ void
VectorMemIndex<T>::Query(const DatasetPtr dataset, VectorMemIndex<T>::Query(const DatasetPtr dataset,
const SearchInfo& search_info, const SearchInfo& search_info,
const BitsetView& bitset, const BitsetView& bitset,
milvus::OpContext* op_context,
SearchResult& search_result) const { SearchResult& search_result) const {
// AssertInfo(GetMetricType() == search_info.metric_type_, // AssertInfo(GetMetricType() == search_info.metric_type_,
// "Metric type of field index isn't the same with search info"); // "Metric type of field index isn't the same with search info");
@ -486,7 +487,8 @@ VectorMemIndex<T>::Query(const DatasetPtr dataset,
if (CheckAndUpdateKnowhereRangeSearchParam( if (CheckAndUpdateKnowhereRangeSearchParam(
search_info, topk, GetMetricType(), search_conf)) { search_info, topk, GetMetricType(), search_conf)) {
milvus::tracer::AddEvent("start_knowhere_index_range_search"); 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"); milvus::tracer::AddEvent("finish_knowhere_index_range_search");
if (!res.has_value()) { if (!res.has_value()) {
ThrowInfo(ErrorCode::UnexpectedError, ThrowInfo(ErrorCode::UnexpectedError,
@ -500,7 +502,7 @@ VectorMemIndex<T>::Query(const DatasetPtr dataset,
return result; return result;
} else { } else {
milvus::tracer::AddEvent("start_knowhere_index_search"); 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"); milvus::tracer::AddEvent("finish_knowhere_index_search");
if (!res.has_value()) { if (!res.has_value()) {
ThrowInfo( ThrowInfo(

View File

@ -79,6 +79,7 @@ class VectorMemIndex : public VectorIndex {
Query(const DatasetPtr dataset, Query(const DatasetPtr dataset,
const SearchInfo& search_info, const SearchInfo& search_info,
const BitsetView& bitset, const BitsetView& bitset,
milvus::OpContext* op_context,
SearchResult& search_result) const override; SearchResult& search_result) const override;
const bool const bool

View File

@ -84,10 +84,12 @@ VecIndexCreator::Load(const milvus::BinarySet& binary_set) {
std::unique_ptr<SearchResult> std::unique_ptr<SearchResult>
VecIndexCreator::Query(const milvus::DatasetPtr& dataset, VecIndexCreator::Query(const milvus::DatasetPtr& dataset,
const SearchInfo& search_info, const SearchInfo& search_info,
const BitsetView& bitset) { const BitsetView& bitset,
milvus::OpContext* op_context) {
auto vector_index = dynamic_cast<index::VectorIndex*>(index_.get()); auto vector_index = dynamic_cast<index::VectorIndex*>(index_.get());
auto search_result = std::make_unique<SearchResult>(); auto search_result = std::make_unique<SearchResult>();
vector_index->Query(dataset, search_info, bitset, *search_result); vector_index->Query(
dataset, search_info, bitset, op_context, *search_result);
return search_result; return search_result;
} }

View File

@ -56,7 +56,8 @@ class VecIndexCreator : public IndexCreatorBase {
std::unique_ptr<SearchResult> std::unique_ptr<SearchResult>
Query(const milvus::DatasetPtr& dataset, Query(const milvus::DatasetPtr& dataset,
const SearchInfo& search_info, const SearchInfo& search_info,
const BitsetView& bitset); const BitsetView& bitset,
milvus::OpContext* op_context);
index::IndexStatsPtr index::IndexStatsPtr
Upload() override; Upload() override;

View File

@ -135,7 +135,7 @@ class ChunkedColumnBase : public ChunkedColumnInterface {
PinWrapper<const char*> PinWrapper<const char*>
DataOfChunk(int chunk_id) const override { 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); auto chunk = ca->get_cell_of(chunk_id);
return PinWrapper<const char*>(ca, chunk->Data()); return PinWrapper<const char*>(ca, chunk->Data());
} }
@ -146,8 +146,8 @@ class ChunkedColumnBase : public ChunkedColumnInterface {
return true; return true;
} }
auto [chunk_id, offset_in_chunk] = GetChunkIDByOffset(offset); auto [chunk_id, offset_in_chunk] = GetChunkIDByOffset(offset);
auto ca = auto ca = SemiInlineGet(
SemiInlineGet(slot_->PinCells({static_cast<cid_t>(chunk_id)})); slot_->PinCells(nullptr, {static_cast<cid_t>(chunk_id)}));
auto chunk = ca->get_cell_of(chunk_id); auto chunk = ca->get_cell_of(chunk_id);
return chunk->isValid(offset_in_chunk); return chunk->isValid(offset_in_chunk);
} }
@ -169,7 +169,7 @@ class ChunkedColumnBase : public ChunkedColumnInterface {
} }
// nullable: // nullable:
if (offsets == nullptr) { if (offsets == nullptr) {
auto ca = SemiInlineGet(slot_->PinAllCells()); auto ca = SemiInlineGet(slot_->PinAllCells(nullptr));
for (int64_t i = 0; i < num_rows_; i++) { for (int64_t i = 0; i < num_rows_; i++) {
auto [cid, offset_in_chunk] = GetChunkIDByOffset(i); auto [cid, offset_in_chunk] = GetChunkIDByOffset(i);
auto chunk = ca->get_cell_of(cid); auto chunk = ca->get_cell_of(cid);
@ -178,7 +178,7 @@ class ChunkedColumnBase : public ChunkedColumnInterface {
} }
} else { } else {
auto [cids, offsets_in_chunk] = ToChunkIdAndOffset(offsets, count); 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++) { for (int64_t i = 0; i < count; i++) {
auto chunk = ca->get_cell_of(cids[i]); auto chunk = ca->get_cell_of(cids[i]);
auto valid = chunk->isValid(offsets_in_chunk[i]); auto valid = chunk->isValid(offsets_in_chunk[i]);
@ -322,14 +322,14 @@ class ChunkedColumnBase : public ChunkedColumnInterface {
PinWrapper<Chunk*> PinWrapper<Chunk*>
GetChunk(int64_t chunk_id) const override { 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); auto chunk = ca->get_cell_of(chunk_id);
return PinWrapper<Chunk*>(ca, chunk); return PinWrapper<Chunk*>(ca, chunk);
} }
std::vector<PinWrapper<Chunk*>> std::vector<PinWrapper<Chunk*>>
GetAllChunks() const override { GetAllChunks() const override {
auto ca = SemiInlineGet(slot_->PinAllCells()); auto ca = SemiInlineGet(slot_->PinAllCells(nullptr));
std::vector<PinWrapper<Chunk*>> ret; std::vector<PinWrapper<Chunk*>> ret;
ret.reserve(num_chunks_); ret.reserve(num_chunks_);
for (size_t i = 0; i < num_chunks_; i++) { for (size_t i = 0; i < num_chunks_; i++) {
@ -373,7 +373,7 @@ class ChunkedColumn : public ChunkedColumnBase {
const int64_t* offsets, const int64_t* offsets,
int64_t count) override { int64_t count) override {
auto [cids, offsets_in_chunk] = ToChunkIdAndOffset(offsets, count); 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++) { for (int64_t i = 0; i < count; i++) {
fn(ca->get_cell_of(cids[i])->ValueAt(offsets_in_chunk[i]), 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) { BulkPrimitiveValueAtImpl(void* dst, const int64_t* offsets, int64_t count) {
static_assert(std::is_fundamental_v<S> && std::is_fundamental_v<T>); static_assert(std::is_fundamental_v<S> && std::is_fundamental_v<T>);
auto [cids, offsets_in_chunk] = ToChunkIdAndOffset(offsets, count); 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<T*>(dst); auto typed_dst = static_cast<T*>(dst);
for (int64_t i = 0; i < count; i++) { for (int64_t i = 0; i < count; i++) {
auto chunk = ca->get_cell_of(cids[i]); auto chunk = ca->get_cell_of(cids[i]);
@ -443,7 +443,7 @@ class ChunkedColumn : public ChunkedColumnBase {
int64_t element_sizeof, int64_t element_sizeof,
int64_t count) override { int64_t count) override {
auto [cids, offsets_in_chunk] = ToChunkIdAndOffset(offsets, count); 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<char*>(dst); auto dst_vec = reinterpret_cast<char*>(dst);
for (int64_t i = 0; i < count; i++) { for (int64_t i = 0; i < count; i++) {
auto chunk = ca->get_cell_of(cids[i]); auto chunk = ca->get_cell_of(cids[i]);
@ -454,7 +454,7 @@ class ChunkedColumn : public ChunkedColumnBase {
PinWrapper<SpanBase> PinWrapper<SpanBase>
Span(int64_t chunk_id) const override { 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); auto chunk = ca->get_cell_of(chunk_id);
return PinWrapper<SpanBase>( return PinWrapper<SpanBase>(
ca, static_cast<FixedWidthChunk*>(chunk)->Span()); ca, static_cast<FixedWidthChunk*>(chunk)->Span());
@ -479,7 +479,7 @@ class ChunkedVariableColumn : public ChunkedColumnBase {
StringViews(int64_t chunk_id, StringViews(int64_t chunk_id,
std::optional<std::pair<int64_t, int64_t>> offset_len = std::optional<std::pair<int64_t, int64_t>> offset_len =
std::nullopt) const override { 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); auto chunk = ca->get_cell_of(chunk_id);
return PinWrapper< return PinWrapper<
std::pair<std::vector<std::string_view>, FixedVector<bool>>>( std::pair<std::vector<std::string_view>, FixedVector<bool>>>(
@ -489,7 +489,7 @@ class ChunkedVariableColumn : public ChunkedColumnBase {
PinWrapper<std::pair<std::vector<std::string_view>, FixedVector<bool>>> PinWrapper<std::pair<std::vector<std::string_view>, FixedVector<bool>>>
StringViewsByOffsets(int64_t chunk_id, StringViewsByOffsets(int64_t chunk_id,
const FixedVector<int32_t>& offsets) const override { const FixedVector<int32_t>& 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); auto chunk = ca->get_cell_of(chunk_id);
return PinWrapper< return PinWrapper<
std::pair<std::vector<std::string_view>, FixedVector<bool>>>( std::pair<std::vector<std::string_view>, FixedVector<bool>>>(
@ -507,7 +507,7 @@ class ChunkedVariableColumn : public ChunkedColumnBase {
} }
std::shared_ptr<CellAccessor<Chunk>> ca{nullptr}; std::shared_ptr<CellAccessor<Chunk>> ca{nullptr};
if (offsets == nullptr) { if (offsets == nullptr) {
ca = SemiInlineGet(slot_->PinAllCells()); auto ca = SemiInlineGet(slot_->PinAllCells(nullptr));
for (int64_t i = 0; i < num_rows_; i++) { for (int64_t i = 0; i < num_rows_; i++) {
auto [cid, offset_in_chunk] = GetChunkIDByOffset(i); auto [cid, offset_in_chunk] = GetChunkIDByOffset(i);
auto chunk = ca->get_cell_of(cid); auto chunk = ca->get_cell_of(cid);
@ -519,7 +519,7 @@ class ChunkedVariableColumn : public ChunkedColumnBase {
} }
} else { } else {
auto [cids, offsets_in_chunk] = ToChunkIdAndOffset(offsets, count); 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++) { for (int64_t i = 0; i < count; i++) {
auto chunk = ca->get_cell_of(cids[i]); auto chunk = ca->get_cell_of(cids[i]);
auto valid = auto valid =
@ -545,7 +545,7 @@ class ChunkedVariableColumn : public ChunkedColumnBase {
return; return;
} }
auto [cids, offsets_in_chunk] = ToChunkIdAndOffset(offsets, count); 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++) { for (int64_t i = 0; i < count; i++) {
auto chunk = ca->get_cell_of(cids[i]); auto chunk = ca->get_cell_of(cids[i]);
auto valid = nullable_ ? chunk->isValid(offsets_in_chunk[i]) : true; 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"); "row_offsets and value_offsets must be provided");
auto [cids, offsets_in_chunk] = ToChunkIdAndOffset(row_offsets, count); 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++) { for (int64_t i = 0; i < count; i++) {
auto chunk = ca->get_cell_of(cids[i]); auto chunk = ca->get_cell_of(cids[i]);
auto str_view = static_cast<StringChunk*>(chunk)->operator[]( auto str_view = static_cast<StringChunk*>(chunk)->operator[](
@ -593,7 +593,7 @@ class ChunkedArrayColumn : public ChunkedColumnBase {
const int64_t* offsets, const int64_t* offsets,
int64_t count) const override { int64_t count) const override {
auto [cids, offsets_in_chunk] = ToChunkIdAndOffset(offsets, count); 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++) { for (int64_t i = 0; i < count; i++) {
auto array = static_cast<ArrayChunk*>(ca->get_cell_of(cids[i])) auto array = static_cast<ArrayChunk*>(ca->get_cell_of(cids[i]))
->View(offsets_in_chunk[i]) ->View(offsets_in_chunk[i])
@ -606,8 +606,8 @@ class ChunkedArrayColumn : public ChunkedColumnBase {
ArrayViews(int64_t chunk_id, ArrayViews(int64_t chunk_id,
std::optional<std::pair<int64_t, int64_t>> offset_len = std::optional<std::pair<int64_t, int64_t>> offset_len =
std::nullopt) const override { std::nullopt) const override {
auto ca = auto ca = SemiInlineGet(
SemiInlineGet(slot_->PinCells({static_cast<cid_t>(chunk_id)})); slot_->PinCells(nullptr, {static_cast<cid_t>(chunk_id)}));
auto chunk = ca->get_cell_of(chunk_id); auto chunk = ca->get_cell_of(chunk_id);
return PinWrapper<std::pair<std::vector<ArrayView>, FixedVector<bool>>>( return PinWrapper<std::pair<std::vector<ArrayView>, FixedVector<bool>>>(
ca, static_cast<ArrayChunk*>(chunk)->Views(offset_len)); ca, static_cast<ArrayChunk*>(chunk)->Views(offset_len));
@ -616,7 +616,7 @@ class ChunkedArrayColumn : public ChunkedColumnBase {
PinWrapper<std::pair<std::vector<ArrayView>, FixedVector<bool>>> PinWrapper<std::pair<std::vector<ArrayView>, FixedVector<bool>>>
ArrayViewsByOffsets(int64_t chunk_id, ArrayViewsByOffsets(int64_t chunk_id,
const FixedVector<int32_t>& offsets) const override { const FixedVector<int32_t>& 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); auto chunk = ca->get_cell_of(chunk_id);
return PinWrapper<std::pair<std::vector<ArrayView>, FixedVector<bool>>>( return PinWrapper<std::pair<std::vector<ArrayView>, FixedVector<bool>>>(
ca, static_cast<ArrayChunk*>(chunk)->ViewsByOffsets(offsets)); ca, static_cast<ArrayChunk*>(chunk)->ViewsByOffsets(offsets));
@ -636,7 +636,7 @@ class ChunkedVectorArrayColumn : public ChunkedColumnBase {
const int64_t* offsets, const int64_t* offsets,
int64_t count) const override { int64_t count) const override {
auto [cids, offsets_in_chunk] = ToChunkIdAndOffset(offsets, count); 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++) { for (int64_t i = 0; i < count; i++) {
auto array = auto array =
static_cast<VectorArrayChunk*>(ca->get_cell_of(cids[i])) static_cast<VectorArrayChunk*>(ca->get_cell_of(cids[i]))
@ -650,8 +650,8 @@ class ChunkedVectorArrayColumn : public ChunkedColumnBase {
VectorArrayViews(int64_t chunk_id, VectorArrayViews(int64_t chunk_id,
std::optional<std::pair<int64_t, int64_t>> offset_len = std::optional<std::pair<int64_t, int64_t>> offset_len =
std::nullopt) const override { std::nullopt) const override {
auto ca = auto ca = SemiInlineGet(
SemiInlineGet(slot_->PinCells({static_cast<cid_t>(chunk_id)})); slot_->PinCells(nullptr, {static_cast<cid_t>(chunk_id)}));
auto chunk = ca->get_cell_of(chunk_id); auto chunk = ca->get_cell_of(chunk_id);
return PinWrapper< return PinWrapper<
std::pair<std::vector<VectorArrayView>, FixedVector<bool>>>( std::pair<std::vector<VectorArrayView>, FixedVector<bool>>>(
@ -660,8 +660,8 @@ class ChunkedVectorArrayColumn : public ChunkedColumnBase {
PinWrapper<const size_t*> PinWrapper<const size_t*>
VectorArrayLims(int64_t chunk_id) const override { VectorArrayLims(int64_t chunk_id) const override {
auto ca = auto ca = SemiInlineGet(
SemiInlineGet(slot_->PinCells({static_cast<cid_t>(chunk_id)})); slot_->PinCells(nullptr, {static_cast<cid_t>(chunk_id)}));
auto chunk = ca->get_cell_of(chunk_id); auto chunk = ca->get_cell_of(chunk_id);
return PinWrapper<const size_t*>( return PinWrapper<const size_t*>(
ca, static_cast<VectorArrayChunk*>(chunk)->Lims()); ca, static_cast<VectorArrayChunk*>(chunk)->Lims());

View File

@ -67,20 +67,20 @@ class ChunkedColumnGroup {
PinWrapper<GroupChunk*> PinWrapper<GroupChunk*>
GetGroupChunk(int64_t chunk_id) const { 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); auto chunk = ca->get_cell_of(chunk_id);
return PinWrapper<GroupChunk*>(ca, chunk); return PinWrapper<GroupChunk*>(ca, chunk);
} }
std::shared_ptr<CellAccessor<GroupChunk>> std::shared_ptr<CellAccessor<GroupChunk>>
GetGroupChunks(std::vector<int64_t> chunk_ids) { GetGroupChunks(std::vector<int64_t> chunk_ids) {
return SemiInlineGet(slot_->PinCells(chunk_ids)); return SemiInlineGet(slot_->PinCells(nullptr, chunk_ids));
} }
// std::shared_ptr<CellAccessor<GroupChunk>> // std::shared_ptr<CellAccessor<GroupChunk>>
std::vector<PinWrapper<GroupChunk*>> std::vector<PinWrapper<GroupChunk*>>
GetAllGroupChunks() { GetAllGroupChunks() {
auto ca = SemiInlineGet(slot_->PinAllCells()); auto ca = SemiInlineGet(slot_->PinAllCells(nullptr));
std::vector<PinWrapper<GroupChunk*>> ret; std::vector<PinWrapper<GroupChunk*>> ret;
ret.reserve(num_chunks_); ret.reserve(num_chunks_);
for (size_t i = 0; i < num_chunks_; i++) { for (size_t i = 0; i < num_chunks_; i++) {

View File

@ -27,48 +27,6 @@
#include "common/Tracer.h" #include "common/Tracer.h"
namespace milvus::query { 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 <typename VectorType>
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 static SearchResult
empty_search_result(int64_t num_queries) { empty_search_result(int64_t num_queries) {
SearchResult final_result; SearchResult final_result;

View File

@ -121,7 +121,8 @@ BruteForceSearch(const dataset::SearchDataset& query_ds,
const std::map<std::string, std::string>& index_info, const std::map<std::string, std::string>& index_info,
const BitsetView& bitset, const BitsetView& bitset,
DataType data_type, DataType data_type,
DataType element_type) { DataType element_type,
milvus::OpContext* op_context) {
SubSearchResult sub_result(query_ds.num_queries, SubSearchResult sub_result(query_ds.num_queries,
query_ds.topk, query_ds.topk,
query_ds.metric_type, query_ds.metric_type,
@ -158,23 +159,23 @@ BruteForceSearch(const dataset::SearchDataset& query_ds,
knowhere::expected<knowhere::DataSetPtr> res; knowhere::expected<knowhere::DataSetPtr> res;
if (data_type == DataType::VECTOR_FLOAT) { if (data_type == DataType::VECTOR_FLOAT) {
res = knowhere::BruteForce::RangeSearch<float>( res = knowhere::BruteForce::RangeSearch<float>(
base_dataset, query_dataset, search_cfg, bitset); base_dataset, query_dataset, search_cfg, bitset, op_context);
} else if (data_type == DataType::VECTOR_FLOAT16) { } else if (data_type == DataType::VECTOR_FLOAT16) {
res = knowhere::BruteForce::RangeSearch<float16>( res = knowhere::BruteForce::RangeSearch<float16>(
base_dataset, query_dataset, search_cfg, bitset); base_dataset, query_dataset, search_cfg, bitset, op_context);
} else if (data_type == DataType::VECTOR_BFLOAT16) { } else if (data_type == DataType::VECTOR_BFLOAT16) {
res = knowhere::BruteForce::RangeSearch<bfloat16>( res = knowhere::BruteForce::RangeSearch<bfloat16>(
base_dataset, query_dataset, search_cfg, bitset); base_dataset, query_dataset, search_cfg, bitset, op_context);
} else if (data_type == DataType::VECTOR_BINARY) { } else if (data_type == DataType::VECTOR_BINARY) {
res = knowhere::BruteForce::RangeSearch<bin1>( res = knowhere::BruteForce::RangeSearch<bin1>(
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) { } else if (data_type == DataType::VECTOR_SPARSE_U32_F32) {
res = knowhere::BruteForce::RangeSearch< res = knowhere::BruteForce::RangeSearch<
knowhere::sparse::SparseRow<SparseValueType>>( knowhere::sparse::SparseRow<SparseValueType>>(
base_dataset, query_dataset, search_cfg, bitset); base_dataset, query_dataset, search_cfg, bitset, op_context);
} else if (data_type == DataType::VECTOR_INT8) { } else if (data_type == DataType::VECTOR_INT8) {
res = knowhere::BruteForce::RangeSearch<int8>( res = knowhere::BruteForce::RangeSearch<int8>(
base_dataset, query_dataset, search_cfg, bitset); base_dataset, query_dataset, search_cfg, bitset, op_context);
} else { } else {
ThrowInfo( ThrowInfo(
ErrorCode::Unsupported, ErrorCode::Unsupported,
@ -204,7 +205,8 @@ BruteForceSearch(const dataset::SearchDataset& query_ds,
sub_result.mutable_seg_offsets().data(), sub_result.mutable_seg_offsets().data(),
sub_result.mutable_distances().data(), sub_result.mutable_distances().data(),
search_cfg, search_cfg,
bitset); bitset,
op_context);
} else if (data_type == DataType::VECTOR_FLOAT16) { } else if (data_type == DataType::VECTOR_FLOAT16) {
stat = knowhere::BruteForce::SearchWithBuf<float16>( stat = knowhere::BruteForce::SearchWithBuf<float16>(
base_dataset, base_dataset,
@ -212,7 +214,8 @@ BruteForceSearch(const dataset::SearchDataset& query_ds,
sub_result.mutable_seg_offsets().data(), sub_result.mutable_seg_offsets().data(),
sub_result.mutable_distances().data(), sub_result.mutable_distances().data(),
search_cfg, search_cfg,
bitset); bitset,
op_context);
} else if (data_type == DataType::VECTOR_BFLOAT16) { } else if (data_type == DataType::VECTOR_BFLOAT16) {
stat = knowhere::BruteForce::SearchWithBuf<bfloat16>( stat = knowhere::BruteForce::SearchWithBuf<bfloat16>(
base_dataset, base_dataset,
@ -220,7 +223,8 @@ BruteForceSearch(const dataset::SearchDataset& query_ds,
sub_result.mutable_seg_offsets().data(), sub_result.mutable_seg_offsets().data(),
sub_result.mutable_distances().data(), sub_result.mutable_distances().data(),
search_cfg, search_cfg,
bitset); bitset,
op_context);
} else if (data_type == DataType::VECTOR_BINARY) { } else if (data_type == DataType::VECTOR_BINARY) {
stat = knowhere::BruteForce::SearchWithBuf<bin1>( stat = knowhere::BruteForce::SearchWithBuf<bin1>(
base_dataset, base_dataset,
@ -228,7 +232,8 @@ BruteForceSearch(const dataset::SearchDataset& query_ds,
sub_result.mutable_seg_offsets().data(), sub_result.mutable_seg_offsets().data(),
sub_result.mutable_distances().data(), sub_result.mutable_distances().data(),
search_cfg, search_cfg,
bitset); bitset,
op_context);
} else if (data_type == DataType::VECTOR_SPARSE_U32_F32) { } else if (data_type == DataType::VECTOR_SPARSE_U32_F32) {
stat = knowhere::BruteForce::SearchSparseWithBuf( stat = knowhere::BruteForce::SearchSparseWithBuf(
base_dataset, base_dataset,
@ -236,7 +241,8 @@ BruteForceSearch(const dataset::SearchDataset& query_ds,
sub_result.mutable_seg_offsets().data(), sub_result.mutable_seg_offsets().data(),
sub_result.mutable_distances().data(), sub_result.mutable_distances().data(),
search_cfg, search_cfg,
bitset); bitset,
op_context);
} else if (data_type == DataType::VECTOR_INT8) { } else if (data_type == DataType::VECTOR_INT8) {
stat = knowhere::BruteForce::SearchWithBuf<int8>( stat = knowhere::BruteForce::SearchWithBuf<int8>(
base_dataset, base_dataset,
@ -244,7 +250,8 @@ BruteForceSearch(const dataset::SearchDataset& query_ds,
sub_result.mutable_seg_offsets().data(), sub_result.mutable_seg_offsets().data(),
sub_result.mutable_distances().data(), sub_result.mutable_distances().data(),
search_cfg, search_cfg,
bitset); bitset,
op_context);
} else { } else {
ThrowInfo(ErrorCode::Unsupported, ThrowInfo(ErrorCode::Unsupported,
"Unsupported dataType for chunk brute force search:{}", "Unsupported dataType for chunk brute force search:{}",

View File

@ -14,6 +14,7 @@
#include "common/BitsetView.h" #include "common/BitsetView.h"
#include "common/FieldMeta.h" #include "common/FieldMeta.h"
#include "common/QueryInfo.h" #include "common/QueryInfo.h"
#include "common/OpContext.h"
#include "query/SubSearchResult.h" #include "query/SubSearchResult.h"
#include "query/helper.h" #include "query/helper.h"
@ -30,7 +31,8 @@ BruteForceSearch(const dataset::SearchDataset& query_ds,
const std::map<std::string, std::string>& index_info, const std::map<std::string, std::string>& index_info,
const BitsetView& bitset, const BitsetView& bitset,
DataType data_type, DataType data_type,
DataType element_type); DataType element_type,
milvus::OpContext* op_context);
knowhere::expected<std::vector<knowhere::IndexNode::IteratorPtr>> knowhere::expected<std::vector<knowhere::IndexNode::IteratorPtr>>
GetBruteForceSearchIterators( GetBruteForceSearchIterators(

View File

@ -115,7 +115,8 @@ class TestSparseFloatSearchBruteForce : public ::testing::Test {
index_info, index_info,
bitset_view, bitset_view,
DataType::VECTOR_SPARSE_U32_F32, DataType::VECTOR_SPARSE_U32_F32,
DataType::NONE)); DataType::NONE,
nullptr));
return; return;
} }
auto result = BruteForceSearch(query_dataset, auto result = BruteForceSearch(query_dataset,
@ -124,7 +125,8 @@ class TestSparseFloatSearchBruteForce : public ::testing::Test {
index_info, index_info,
bitset_view, bitset_view,
DataType::VECTOR_SPARSE_U32_F32, DataType::VECTOR_SPARSE_U32_F32,
DataType::NONE); DataType::NONE,
nullptr);
for (int i = 0; i < nq; i++) { for (int i = 0; i < nq; i++) {
auto ref = SearchRef(base.get(), *(query.get() + i), nb, topk); auto ref = SearchRef(base.get(), *(query.get() + i), nb, topk);
auto ans = result.get_seg_offsets() + i * topk; auto ans = result.get_seg_offsets() + i * topk;
@ -139,7 +141,8 @@ class TestSparseFloatSearchBruteForce : public ::testing::Test {
index_info, index_info,
bitset_view, bitset_view,
DataType::VECTOR_SPARSE_U32_F32, DataType::VECTOR_SPARSE_U32_F32,
DataType::NONE); DataType::NONE,
nullptr);
for (int i = 0; i < nq; i++) { for (int i = 0; i < nq; i++) {
auto ref = RangeSearchRef( auto ref = RangeSearchRef(
base.get(), *(query.get() + i), nb, 0.1, 0.5, topk); base.get(), *(query.get() + i), nb, 0.1, 0.5, topk);

View File

@ -142,7 +142,8 @@ class TestFloatSearchBruteForce : public ::testing::Test {
index_info, index_info,
bitset_view, bitset_view,
DataType::VECTOR_FLOAT, DataType::VECTOR_FLOAT,
DataType::NONE); DataType::NONE,
nullptr);
for (int i = 0; i < nq; i++) { for (int i = 0; i < nq; i++) {
auto ref = Ref(base.data(), auto ref = Ref(base.data(),
query.data() + i * dim, query.data() + i * dim,

View File

@ -31,6 +31,7 @@ FloatSegmentIndexSearch(const segcore::SegmentGrowingImpl& segment,
const void* query_data, const void* query_data,
int64_t num_queries, int64_t num_queries,
const BitsetView& bitset, const BitsetView& bitset,
milvus::OpContext* op_context,
SearchResult& search_result) { SearchResult& search_result) {
auto& schema = segment.get_schema(); auto& schema = segment.get_schema();
auto& indexing_record = segment.get_indexing_record(); auto& indexing_record = segment.get_indexing_record();
@ -62,6 +63,7 @@ FloatSegmentIndexSearch(const segcore::SegmentGrowingImpl& segment,
*vec_index, *vec_index,
search_conf, search_conf,
bitset, bitset,
op_context,
search_result, search_result,
is_sparse); is_sparse);
} }
@ -75,6 +77,7 @@ SearchOnGrowing(const segcore::SegmentGrowingImpl& segment,
int64_t num_queries, int64_t num_queries,
Timestamp timestamp, Timestamp timestamp,
const BitsetView& bitset, const BitsetView& bitset,
milvus::OpContext* op_context,
SearchResult& search_result) { SearchResult& search_result) {
auto& schema = segment.get_schema(); auto& schema = segment.get_schema();
auto& record = segment.get_insert_record(); 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 " "vector array(embedding list) is not supported for growing segment "
"indexing search"); "indexing search");
FloatSegmentIndexSearch( FloatSegmentIndexSearch(segment,
segment, info, query_data, num_queries, bitset, search_result); info,
query_data,
num_queries,
bitset,
op_context,
search_result);
} else { } else {
std::shared_lock<std::shared_mutex> read_chunk_mutex( std::shared_lock<std::shared_mutex> read_chunk_mutex(
segment.get_chunk_mutex()); segment.get_chunk_mutex());
@ -114,8 +122,13 @@ SearchOnGrowing(const segcore::SegmentGrowingImpl& segment,
"vector array(embedding list) is not supported for " "vector array(embedding list) is not supported for "
"growing segment indexing search"); "growing segment indexing search");
return FloatSegmentIndexSearch( return FloatSegmentIndexSearch(segment,
segment, info, query_data, num_queries, bitset, search_result); info,
query_data,
num_queries,
bitset,
op_context,
search_result);
} }
SubSearchResult final_qr(num_queries, topk, metric_type, round_decimal); SubSearchResult final_qr(num_queries, topk, metric_type, round_decimal);
// TODO(SPARSE): see todo in PlanImpl.h::PlaceHolder. // TODO(SPARSE): see todo in PlanImpl.h::PlaceHolder.
@ -233,7 +246,8 @@ SearchOnGrowing(const segcore::SegmentGrowingImpl& segment,
index_info, index_info,
bitset, bitset,
data_type, data_type,
element_type); element_type,
op_context);
final_qr.merge(sub_qr); final_qr.merge(sub_qr);
} }
} }

View File

@ -12,6 +12,7 @@
#pragma once #pragma once
#include "common/BitsetView.h" #include "common/BitsetView.h"
#include "common/OpContext.h"
#include "segcore/SegmentGrowingImpl.h" #include "segcore/SegmentGrowingImpl.h"
namespace milvus::query { namespace milvus::query {
@ -24,6 +25,7 @@ SearchOnGrowing(const segcore::SegmentGrowingImpl& segment,
int64_t num_queries, int64_t num_queries,
Timestamp timestamp, Timestamp timestamp,
const BitsetView& bitset, const BitsetView& bitset,
milvus::OpContext* op_context,
SearchResult& search_result); SearchResult& search_result);
} // namespace milvus::query } // namespace milvus::query

View File

@ -19,6 +19,7 @@ SearchOnIndex(const dataset::SearchDataset& search_dataset,
const index::VectorIndex& indexing, const index::VectorIndex& indexing,
const SearchInfo& search_conf, const SearchInfo& search_conf,
const BitsetView& bitset, const BitsetView& bitset,
milvus::OpContext* op_context,
SearchResult& search_result, SearchResult& search_result,
bool is_sparse) { bool is_sparse) {
auto num_queries = search_dataset.num_queries; auto num_queries = search_dataset.num_queries;
@ -43,7 +44,7 @@ SearchOnIndex(const dataset::SearchDataset& search_dataset,
return; return;
} }
indexing.Query(dataset, search_conf, bitset, search_result); indexing.Query(dataset, search_conf, bitset, op_context, search_result);
} }
} // namespace milvus::query } // namespace milvus::query

View File

@ -24,6 +24,7 @@ SearchOnIndex(const dataset::SearchDataset& search_dataset,
const index::VectorIndex& indexing, const index::VectorIndex& indexing,
const SearchInfo& search_conf, const SearchInfo& search_conf,
const BitsetView& bitset, const BitsetView& bitset,
milvus::OpContext* op_context,
SearchResult& search_result, SearchResult& search_result,
bool is_sparse = false); bool is_sparse = false);

View File

@ -34,6 +34,7 @@ SearchOnSealedIndex(const Schema& schema,
const size_t* query_lims, const size_t* query_lims,
int64_t num_queries, int64_t num_queries,
const BitsetView& bitset, const BitsetView& bitset,
milvus::OpContext* op_context,
SearchResult& search_result) { SearchResult& search_result) {
auto topK = search_info.topk_; auto topK = search_info.topk_;
auto round_decimal = search_info.round_decimal_; auto round_decimal = search_info.round_decimal_;
@ -66,7 +67,8 @@ SearchOnSealedIndex(const Schema& schema,
} }
dataset->SetIsSparse(is_sparse); dataset->SetIsSparse(is_sparse);
auto accessor = SemiInlineGet(field_indexing->indexing_->PinCells({0})); auto accessor =
SemiInlineGet(field_indexing->indexing_->PinCells(nullptr, {0}));
auto vec_index = auto vec_index =
dynamic_cast<index::VectorIndex*>(accessor->get_cell_of(0)); dynamic_cast<index::VectorIndex*>(accessor->get_cell_of(0));
@ -83,7 +85,8 @@ SearchOnSealedIndex(const Schema& schema,
search_result, search_result,
bitset, bitset,
*vec_index)) { *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(); float* distances = search_result.distances_.data();
auto total_num = num_queries * topK; auto total_num = num_queries * topK;
if (round_decimal != -1) { if (round_decimal != -1) {
@ -108,6 +111,7 @@ SearchOnSealedColumn(const Schema& schema,
int64_t num_queries, int64_t num_queries,
int64_t row_count, int64_t row_count,
const BitsetView& bitview, const BitsetView& bitview,
milvus::OpContext* op_context,
SearchResult& result) { SearchResult& result) {
auto field_id = search_info.field_id_; auto field_id = search_info.field_id_;
auto& field = schema[field_id]; auto& field = schema[field_id];
@ -182,7 +186,8 @@ SearchOnSealedColumn(const Schema& schema,
index_info, index_info,
bitview, bitview,
data_type, data_type,
element_type); element_type,
op_context);
final_qr.merge(sub_qr); final_qr.merge(sub_qr);
} }
offset += chunk_size; offset += chunk_size;

View File

@ -26,6 +26,7 @@ SearchOnSealedIndex(const Schema& schema,
const size_t* query_lims, const size_t* query_lims,
int64_t num_queries, int64_t num_queries,
const BitsetView& view, const BitsetView& view,
milvus::OpContext* op_context,
SearchResult& search_result); SearchResult& search_result);
void void
@ -38,6 +39,7 @@ SearchOnSealedColumn(const Schema& schema,
int64_t num_queries, int64_t num_queries,
int64_t row_count, int64_t row_count,
const BitsetView& bitset, const BitsetView& bitset,
milvus::OpContext* op_context,
SearchResult& result); SearchResult& result);
} // namespace milvus::query } // namespace milvus::query

View File

@ -685,7 +685,8 @@ ChunkedSegmentSealedImpl::GetNgramIndex(FieldId field_id) const {
auto slot = iter->second.get(); auto slot = iter->second.get();
lck.unlock(); lck.unlock();
auto ca = SemiInlineGet(slot->PinCells({0})); milvus::OpContext ctx;
auto ca = SemiInlineGet(slot->PinCells(&ctx, {0}));
auto index = dynamic_cast<index::NgramInvertedIndex*>(ca->get_cell_of(0)); auto index = dynamic_cast<index::NgramInvertedIndex*>(ca->get_cell_of(0));
AssertInfo(index != nullptr, AssertInfo(index != nullptr,
"ngram index cache is corrupted, field_id: {}", "ngram index cache is corrupted, field_id: {}",
@ -706,7 +707,8 @@ ChunkedSegmentSealedImpl::GetNgramIndexForJson(
auto slot = iter->second.at(nested_path).get(); 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 = auto index =
dynamic_cast<index::NgramInvertedIndex*>(ca->get_cell_of(0)); dynamic_cast<index::NgramInvertedIndex*>(ca->get_cell_of(0));
AssertInfo(index != nullptr, AssertInfo(index != nullptr,
@ -749,6 +751,7 @@ ChunkedSegmentSealedImpl::vector_search(SearchInfo& search_info,
int64_t query_count, int64_t query_count,
Timestamp timestamp, Timestamp timestamp,
const BitsetView& bitset, const BitsetView& bitset,
milvus::OpContext* op_context,
SearchResult& output) const { SearchResult& output) const {
AssertInfo(is_system_field_ready(), "System field is not ready"); AssertInfo(is_system_field_ready(), "System field is not ready");
auto field_id = search_info.field_id_; auto field_id = search_info.field_id_;
@ -774,6 +777,7 @@ ChunkedSegmentSealedImpl::vector_search(SearchInfo& search_info,
query_lims, query_lims,
query_count, query_count,
bitset, bitset,
op_context,
output); output);
milvus::tracer::AddEvent( milvus::tracer::AddEvent(
"finish_searching_vector_temperate_binlog_index"); "finish_searching_vector_temperate_binlog_index");
@ -788,6 +792,7 @@ ChunkedSegmentSealedImpl::vector_search(SearchInfo& search_info,
query_lims, query_lims,
query_count, query_count,
bitset, bitset,
op_context,
output); output);
milvus::tracer::AddEvent("finish_searching_vector_index"); milvus::tracer::AddEvent("finish_searching_vector_index");
} else { } else {
@ -816,6 +821,7 @@ ChunkedSegmentSealedImpl::vector_search(SearchInfo& search_info,
query_count, query_count,
row_count, row_count,
bitset, bitset,
op_context,
output); output);
milvus::tracer::AddEvent("finish_searching_vector_data"); milvus::tracer::AddEvent("finish_searching_vector_data");
} }
@ -837,7 +843,8 @@ ChunkedSegmentSealedImpl::get_vector(FieldId field_id,
"vector index is not ready"); "vector index is not ready");
auto field_indexing = vector_indexings_.get_field_indexing(field_id); auto field_indexing = vector_indexings_.get_field_indexing(field_id);
auto cache_index = field_indexing->indexing_; 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<index::VectorIndex*>(ca->get_cell_of(0)); auto vec_index = dynamic_cast<index::VectorIndex*>(ca->get_cell_of(0));
AssertInfo(vec_index, "invalid vector indexing"); AssertInfo(vec_index, "invalid vector indexing");
@ -1612,8 +1619,9 @@ ChunkedSegmentSealedImpl::CreateTextIndex(FieldId field_id) {
"index are found"); "index are found");
return iter; return iter;
}); });
milvus::OpContext ctx;
auto accessor = auto accessor =
SemiInlineGet(field_index_iter->second->PinCells({0})); SemiInlineGet(field_index_iter->second->PinCells(&ctx, {0}));
auto ptr = accessor->get_cell_of(0); auto ptr = accessor->get_cell_of(0);
AssertInfo(ptr->HasRawData(), AssertInfo(ptr->HasRawData(),
"text raw data not found, trying to create text index " "text raw data not found, trying to create text index "

View File

@ -92,7 +92,7 @@ class ChunkedSegmentSealedImpl : public SegmentSealed {
if (iter == scalar_indexings->end()) { if (iter == scalar_indexings->end()) {
return {}; return {};
} }
auto ca = SemiInlineGet(iter->second->PinCells({0})); auto ca = SemiInlineGet(iter->second->PinCells(nullptr, {0}));
auto index = ca->get_cell_of(0); auto index = ca->get_cell_of(0);
return {PinWrapper<const index::IndexBase*>(ca, index)}; return {PinWrapper<const index::IndexBase*>(ca, index)};
} }
@ -425,6 +425,7 @@ class ChunkedSegmentSealedImpl : public SegmentSealed {
int64_t query_count, int64_t query_count,
Timestamp timestamp, Timestamp timestamp,
const BitsetView& bitset, const BitsetView& bitset,
milvus::OpContext* op_context,
SearchResult& output) const override; SearchResult& output) const override;
void void

View File

@ -124,7 +124,7 @@ TEST(test_chunk_segment, TestSearchOnSealed) {
auto query_data = col_query_data.data(); auto query_data = col_query_data.data();
auto index_info = std::map<std::string, std::string>{}; auto index_info = std::map<std::string, std::string>{};
SearchResult search_result; SearchResult search_result;
milvus::OpContext op_context;
query::SearchOnSealedColumn(*schema, query::SearchOnSealedColumn(*schema,
column.get(), column.get(),
search_info, search_info,
@ -134,6 +134,7 @@ TEST(test_chunk_segment, TestSearchOnSealed) {
1, 1,
total_row_count, total_row_count,
bv, bv,
&op_context,
search_result); search_result);
std::set<int64_t> offsets; std::set<int64_t> offsets;
@ -160,6 +161,7 @@ TEST(test_chunk_segment, TestSearchOnSealed) {
1, 1,
total_row_count, total_row_count,
bv, bv,
&op_context,
search_result); search_result);
ASSERT_EQ(1, search_result.vector_iterators_->size()); ASSERT_EQ(1, search_result.vector_iterators_->size());

View File

@ -322,3 +322,101 @@ TEST(CApiTest, StreamReduceGroupBY) {
DeleteStreamSearchReducer(c_search_stream_reducer); DeleteStreamSearchReducer(c_search_stream_reducer);
DeleteStreamSearchReducer(nullptr); 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<int64_t> slice_nqs{num_queries};
std::vector<int64_t> 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);
}

View File

@ -679,6 +679,7 @@ SegmentGrowingImpl::vector_search(SearchInfo& search_info,
int64_t query_count, int64_t query_count,
Timestamp timestamp, Timestamp timestamp,
const BitsetView& bitset, const BitsetView& bitset,
milvus::OpContext* op_context,
SearchResult& output) const { SearchResult& output) const {
query::SearchOnGrowing(*this, query::SearchOnGrowing(*this,
search_info, search_info,
@ -687,6 +688,7 @@ SegmentGrowingImpl::vector_search(SearchInfo& search_info,
query_count, query_count,
timestamp, timestamp,
bitset, bitset,
op_context,
output); output);
} }

View File

@ -329,6 +329,7 @@ class SegmentGrowingImpl : public SegmentGrowing {
int64_t query_count, int64_t query_count,
Timestamp timestamp, Timestamp timestamp,
const BitsetView& bitset, const BitsetView& bitset,
milvus::OpContext* op_context,
SearchResult& output) const override; SearchResult& output) const override;
DataType DataType

View File

@ -23,6 +23,7 @@
#include "cachinglayer/CacheSlot.h" #include "cachinglayer/CacheSlot.h"
#include "common/EasyAssert.h" #include "common/EasyAssert.h"
#include "common/Json.h" #include "common/Json.h"
#include "common/OpContext.h"
#include "common/Schema.h" #include "common/Schema.h"
#include "common/Span.h" #include "common/Span.h"
#include "common/SystemProperty.h" #include "common/SystemProperty.h"
@ -363,6 +364,7 @@ class SegmentInternalInterface : public SegmentInterface {
int64_t query_count, int64_t query_count,
Timestamp timestamp, Timestamp timestamp,
const BitsetView& bitset, const BitsetView& bitset,
milvus::OpContext* op_context,
SearchResult& output) const = 0; SearchResult& output) const = 0;
virtual void virtual void

View File

@ -113,7 +113,7 @@ class SegmentSealed : public SegmentInternalInterface {
if (best_match == nullptr) { if (best_match == nullptr) {
return 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); auto index = ca->get_cell_of(0);
return PinWrapper<const index::IndexBase*>(ca, index); return PinWrapper<const index::IndexBase*>(ca, index);
}); });

View File

@ -244,7 +244,8 @@ Test_Indexing_Without_Predicate() {
auto search_plan = reinterpret_cast<milvus::query::Plan*>(plan); auto search_plan = reinterpret_cast<milvus::query::Plan*>(plan);
SearchInfo search_info = search_plan->plan_node_->search_info_; SearchInfo search_info = search_plan->plan_node_->search_info_;
SearchResult result_on_index; 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 ids = result_on_index.seg_offsets_.data();
auto dis = result_on_index.distances_.data(); auto dis = result_on_index.distances_.data();
std::vector<int64_t> vec_ids(ids, ids + TOPK * num_queries); std::vector<int64_t> vec_ids(ids, ids + TOPK * num_queries);
@ -400,7 +401,8 @@ TEST(CApiTest, Indexing_Expr_Without_Predicate) {
auto search_plan = reinterpret_cast<milvus::query::Plan*>(plan); auto search_plan = reinterpret_cast<milvus::query::Plan*>(plan);
SearchInfo search_info = search_plan->plan_node_->search_info_; SearchInfo search_info = search_plan->plan_node_->search_info_;
SearchResult result_on_index; 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 ids = result_on_index.seg_offsets_.data();
auto dis = result_on_index.distances_.data(); auto dis = result_on_index.distances_.data();
std::vector<int64_t> vec_ids(ids, ids + TOPK * num_queries); std::vector<int64_t> vec_ids(ids, ids + TOPK * num_queries);
@ -578,7 +580,8 @@ TEST(CApiTest, Indexing_With_float_Predicate_Range) {
auto search_plan = reinterpret_cast<milvus::query::Plan*>(plan); auto search_plan = reinterpret_cast<milvus::query::Plan*>(plan);
SearchInfo search_info = search_plan->plan_node_->search_info_; SearchInfo search_info = search_plan->plan_node_->search_info_;
SearchResult result_on_index; 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 ids = result_on_index.seg_offsets_.data();
auto dis = result_on_index.distances_.data(); auto dis = result_on_index.distances_.data();
std::vector<int64_t> vec_ids(ids, ids + TOPK * num_queries); std::vector<int64_t> vec_ids(ids, ids + TOPK * num_queries);
@ -758,7 +761,8 @@ TEST(CApiTest, Indexing_Expr_With_float_Predicate_Range) {
auto search_plan = reinterpret_cast<milvus::query::Plan*>(plan); auto search_plan = reinterpret_cast<milvus::query::Plan*>(plan);
SearchInfo search_info = search_plan->plan_node_->search_info_; SearchInfo search_info = search_plan->plan_node_->search_info_;
SearchResult result_on_index; 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 ids = result_on_index.seg_offsets_.data();
auto dis = result_on_index.distances_.data(); auto dis = result_on_index.distances_.data();
std::vector<int64_t> vec_ids(ids, ids + TOPK * num_queries); std::vector<int64_t> vec_ids(ids, ids + TOPK * num_queries);
@ -930,7 +934,8 @@ TEST(CApiTest, Indexing_With_float_Predicate_Term) {
auto search_plan = reinterpret_cast<milvus::query::Plan*>(plan); auto search_plan = reinterpret_cast<milvus::query::Plan*>(plan);
SearchInfo search_info = search_plan->plan_node_->search_info_; SearchInfo search_info = search_plan->plan_node_->search_info_;
SearchResult result_on_index; 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 ids = result_on_index.seg_offsets_.data();
auto dis = result_on_index.distances_.data(); auto dis = result_on_index.distances_.data();
std::vector<int64_t> vec_ids(ids, ids + TOPK * num_queries); std::vector<int64_t> vec_ids(ids, ids + TOPK * num_queries);
@ -1103,7 +1108,8 @@ TEST(CApiTest, Indexing_Expr_With_float_Predicate_Term) {
auto search_plan = reinterpret_cast<milvus::query::Plan*>(plan); auto search_plan = reinterpret_cast<milvus::query::Plan*>(plan);
SearchInfo search_info = search_plan->plan_node_->search_info_; SearchInfo search_info = search_plan->plan_node_->search_info_;
SearchResult result_on_index; 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 ids = result_on_index.seg_offsets_.data();
auto dis = result_on_index.distances_.data(); auto dis = result_on_index.distances_.data();
std::vector<int64_t> vec_ids(ids, ids + TOPK * num_queries); std::vector<int64_t> vec_ids(ids, ids + TOPK * num_queries);
@ -1285,7 +1291,8 @@ TEST(CApiTest, Indexing_With_binary_Predicate_Range) {
auto search_plan = reinterpret_cast<milvus::query::Plan*>(plan); auto search_plan = reinterpret_cast<milvus::query::Plan*>(plan);
SearchInfo search_info = search_plan->plan_node_->search_info_; SearchInfo search_info = search_plan->plan_node_->search_info_;
SearchResult result_on_index; 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 ids = result_on_index.seg_offsets_.data();
auto dis = result_on_index.distances_.data(); auto dis = result_on_index.distances_.data();
std::vector<int64_t> vec_ids(ids, ids + TOPK * num_queries); std::vector<int64_t> vec_ids(ids, ids + TOPK * num_queries);
@ -1467,7 +1474,8 @@ TEST(CApiTest, Indexing_Expr_With_binary_Predicate_Range) {
auto search_plan = reinterpret_cast<milvus::query::Plan*>(plan); auto search_plan = reinterpret_cast<milvus::query::Plan*>(plan);
SearchInfo search_info = search_plan->plan_node_->search_info_; SearchInfo search_info = search_plan->plan_node_->search_info_;
SearchResult result_on_index; 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 ids = result_on_index.seg_offsets_.data();
auto dis = result_on_index.distances_.data(); auto dis = result_on_index.distances_.data();
std::vector<int64_t> vec_ids(ids, ids + TOPK * num_queries); std::vector<int64_t> vec_ids(ids, ids + TOPK * num_queries);
@ -1643,7 +1651,8 @@ TEST(CApiTest, Indexing_With_binary_Predicate_Term) {
auto search_plan = reinterpret_cast<milvus::query::Plan*>(plan); auto search_plan = reinterpret_cast<milvus::query::Plan*>(plan);
SearchInfo search_info = search_plan->plan_node_->search_info_; SearchInfo search_info = search_plan->plan_node_->search_info_;
SearchResult result_on_index; 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 ids = result_on_index.seg_offsets_.data();
auto dis = result_on_index.distances_.data(); auto dis = result_on_index.distances_.data();
std::vector<int64_t> vec_ids(ids, ids + TOPK * num_queries); std::vector<int64_t> vec_ids(ids, ids + TOPK * num_queries);
@ -1842,7 +1851,8 @@ TEST(CApiTest, Indexing_Expr_With_binary_Predicate_Term) {
auto search_plan = reinterpret_cast<milvus::query::Plan*>(plan); auto search_plan = reinterpret_cast<milvus::query::Plan*>(plan);
SearchInfo search_info = search_plan->plan_node_->search_info_; SearchInfo search_info = search_plan->plan_node_->search_info_;
SearchResult result_on_index; 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 ids = result_on_index.seg_offsets_.data();
auto dis = result_on_index.distances_.data(); auto dis = result_on_index.distances_.data();
std::vector<int64_t> vec_ids(ids, ids + TOPK * num_queries); std::vector<int64_t> vec_ids(ids, ids + TOPK * num_queries);

View File

@ -37,6 +37,7 @@ ReduceHelper::Initialize() {
// prefix sum, get slices offsets // prefix sum, get slices offsets
AssertInfo(num_slices_ > 0, "empty slice_nqs is not allowed"); 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); slice_nqs_prefix_sum_.resize(num_slices_ + 1);
std::partial_sum(slice_nqs_.begin(), std::partial_sum(slice_nqs_.begin(),
slice_nqs_.end(), slice_nqs_.end(),
@ -55,10 +56,11 @@ ReduceHelper::Initialize() {
void void
ReduceHelper::Reduce() { ReduceHelper::Reduce() {
FillPrimaryKey(); GetTotalStorageCost();
FillPrimaryKey(); // retrieve primary keys, need to record the cost
ReduceResultData(); ReduceResultData();
RefreshSearchResults(); RefreshSearchResults();
FillEntryData(); FillEntryData(); // retrieve other scalar data, need to record the cost
} }
void void
@ -68,9 +70,12 @@ ReduceHelper::Marshal() {
search_result_data_blobs_ = search_result_data_blobs_ =
std::make_unique<milvus::segcore::SearchResultDataBlobs>(); std::make_unique<milvus::segcore::SearchResultDataBlobs>();
search_result_data_blobs_->blobs.resize(num_slices_); search_result_data_blobs_->blobs.resize(num_slices_);
search_result_data_blobs_->costs.resize(num_slices_);
for (int i = 0; i < num_slices_; i++) { for (int i = 0; i < num_slices_; i++) {
auto proto = GetSearchResultDataSlice(i); auto [proto, cost] =
search_result_data_blobs_->blobs[i] = proto; 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()); search_result->seg_offsets_.size());
auto segment = static_cast<SegmentInterface*>(search_result->segment_); auto segment = static_cast<SegmentInterface*>(search_result->segment_);
if (search_result->get_total_result_count() > 0) { if (search_result->get_total_result_count() > 0) {
// TODO: support storage usage recording in op_context
segment->FillPrimaryKeys(plan_, *search_result); segment->FillPrimaryKeys(plan_, *search_result);
search_results_[valid_index++] = search_result; search_results_[valid_index++] = search_result;
} }
@ -192,6 +198,7 @@ ReduceHelper::FillEntryData() {
search_result->segment_); search_result->segment_);
std::chrono::high_resolution_clock::time_point get_target_entry_start = std::chrono::high_resolution_clock::time_point get_target_entry_start =
std::chrono::high_resolution_clock::now(); std::chrono::high_resolution_clock::now();
// TODO: support storage usage recording in op_context
segment->FillTargetEntry(plan_, *search_result); segment->FillTargetEntry(plan_, *search_result);
std::chrono::high_resolution_clock::time_point get_target_entry_end = std::chrono::high_resolution_clock::time_point get_target_entry_end =
std::chrono::high_resolution_clock::now(); std::chrono::high_resolution_clock::now();
@ -307,8 +314,9 @@ ReduceHelper::FillOtherData(
//simple batch reduce do nothing for other data //simple batch reduce do nothing for other data
} }
std::vector<char> std::pair<std::vector<char>, StorageCost>
ReduceHelper::GetSearchResultDataSlice(int slice_index) { ReduceHelper::GetSearchResultDataSlice(const int slice_index,
const StorageCost& total_cost) {
auto nq_begin = slice_nqs_prefix_sum_[slice_index]; auto nq_begin = slice_nqs_prefix_sum_[slice_index];
auto nq_end = slice_nqs_prefix_sum_[slice_index + 1]; 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]; search_result->topk_per_nq_prefix_sum_[nq_begin];
all_search_count += search_result->total_data_cnt_; 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 = auto search_result_data =
std::make_unique<milvus::proto::schema::SearchResultData>(); std::make_unique<milvus::proto::schema::SearchResultData>();
@ -448,13 +458,19 @@ ReduceHelper::GetSearchResultDataSlice(int slice_index) {
search_result_data->mutable_fields_data()->AddAllocated( search_result_data->mutable_fields_data()->AddAllocated(
field_data.release()); field_data.release());
} }
// SearchResultData to blob // SearchResultData to blob
auto size = search_result_data->ByteSizeLong(); auto size = search_result_data->ByteSizeLong();
auto buffer = std::vector<char>(size); auto buffer = std::vector<char>(size);
search_result_data->SerializePartialToArray(buffer.data(), 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 } // namespace milvus::segcore

View File

@ -29,7 +29,8 @@ namespace milvus::segcore {
// SearchResultDataBlobs contains the marshal blobs of many `milvus::proto::schema::SearchResultData` // SearchResultDataBlobs contains the marshal blobs of many `milvus::proto::schema::SearchResultData`
struct SearchResultDataBlobs { struct SearchResultDataBlobs {
std::vector<std::vector<char>> blobs; std::vector<std::vector<char>> blobs; // the marshal blobs of each slice
std::vector<StorageCost> costs; // the cost of each slice
}; };
class ReduceHelper { class ReduceHelper {
@ -96,8 +97,12 @@ class ReduceHelper {
void void
FillEntryData(); FillEntryData();
std::vector<char> std::pair<std::vector<char>, StorageCost>
GetSearchResultDataSlice(int slice_index_); GetSearchResultDataSlice(const int slice_index,
const StorageCost& total_cost);
void
GetTotalStorageCost();
protected: protected:
std::vector<SearchResult*>& search_results_; std::vector<SearchResult*>& search_results_;
@ -117,6 +122,7 @@ class ReduceHelper {
// output // output
std::unique_ptr<SearchResultDataBlobs> search_result_data_blobs_; std::unique_ptr<SearchResultDataBlobs> search_result_data_blobs_;
tracer::TraceContext* trace_ctx_; tracer::TraceContext* trace_ctx_;
StorageCost total_search_storage_cost_;
}; };
} // namespace milvus::segcore } // namespace milvus::segcore

View File

@ -171,6 +171,7 @@ StreamReducerHelper::AssembleMergedResult() {
void void
StreamReducerHelper::MergeReduce() { StreamReducerHelper::MergeReduce() {
GetTotalStorageCost();
FilterSearchResults(); FilterSearchResults();
FillPrimaryKeys(); FillPrimaryKeys();
InitializeReduceRecords(); InitializeReduceRecords();
@ -189,9 +190,12 @@ StreamReducerHelper::SerializeMergedResult() {
"Wrong state for num_slice in streamReducer, num_slice:{}", "Wrong state for num_slice in streamReducer, num_slice:{}",
num_slice_); num_slice_);
search_result_blobs->blobs.resize(num_slice_); search_result_blobs->blobs.resize(num_slice_);
search_result_blobs->costs.resize(num_slice_);
for (int i = 0; i < num_slice_; i++) { for (int i = 0; i < num_slice_; i++) {
auto proto = GetSearchResultDataSlice(i); auto [proto, cost] =
search_result_blobs->blobs[i] = proto; 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(); return search_result_blobs.release();
} }
@ -527,8 +531,9 @@ StreamReducerHelper::RefreshSearchResult() {
} }
} }
std::vector<char> std::pair<std::vector<char>, StorageCost>
StreamReducerHelper::GetSearchResultDataSlice(int slice_index) { StreamReducerHelper::GetSearchResultDataSlice(int slice_index,
const StorageCost& total_cost) {
auto nq_begin = slice_nqs_prefix_sum_[slice_index]; auto nq_begin = slice_nqs_prefix_sum_[slice_index];
auto nq_end = slice_nqs_prefix_sum_[slice_index + 1]; 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] - result_count = merged_search_result->topk_per_nq_prefix_sum_[nq_end] -
merged_search_result->topk_per_nq_prefix_sum_[nq_begin]; 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 // `result_pairs` contains the SearchResult and result_offset info, used for filling output fields
std::vector<MergeBase> result_pairs(result_count); std::vector<MergeBase> result_pairs(result_count);
@ -690,7 +696,14 @@ StreamReducerHelper::GetSearchResultDataSlice(int slice_index) {
auto size = search_result_data->ByteSizeLong(); auto size = search_result_data->ByteSizeLong();
auto buffer = std::vector<char>(size); auto buffer = std::vector<char>(size);
search_result_data->SerializePartialToArray(buffer.data(), 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 void

View File

@ -152,6 +152,7 @@ class StreamReducerHelper {
slice_nqs_.end(), slice_nqs_.end(),
slice_nqs_prefix_sum_.begin() + 1); slice_nqs_prefix_sum_.begin() + 1);
total_nq_ = slice_nqs_prefix_sum_[num_slice_]; total_nq_ = slice_nqs_prefix_sum_[num_slice_];
AssertInfo(total_nq_ > 0, "empty nq is not allowed");
} }
void void
@ -196,8 +197,12 @@ class StreamReducerHelper {
void void
AssembleMergedResult(); AssembleMergedResult();
std::vector<char> std::pair<std::vector<char>, StorageCost>
GetSearchResultDataSlice(int slice_index); GetSearchResultDataSlice(const int slice_index,
const StorageCost& total_cost);
void
GetTotalStorageCost();
void void
CleanReduceStatus(); CleanReduceStatus();
@ -218,5 +223,6 @@ class StreamReducerHelper {
std::unordered_set<milvus::GroupByValueType> group_by_val_set_; std::unordered_set<milvus::GroupByValueType> group_by_val_set_;
std::vector<std::vector<std::vector<int64_t>>> final_search_records_; std::vector<std::vector<std::vector<int64_t>>> final_search_records_;
int64_t total_nq_{0}; int64_t total_nq_{0};
StorageCost total_search_storage_cost_;
}; };
} // namespace milvus::segcore } // namespace milvus::segcore

View File

@ -137,6 +137,8 @@ ReduceSearchResultsAndFillData(CTraceContext c_trace,
CStatus CStatus
GetSearchResultDataBlob(CProto* searchResultDataBlob, GetSearchResultDataBlob(CProto* searchResultDataBlob,
int64_t* scanned_remote_bytes,
int64_t* scanned_total_bytes,
CSearchResultDataBlobs cSearchResultDataBlobs, CSearchResultDataBlobs cSearchResultDataBlobs,
int32_t blob_index) { int32_t blob_index) {
SCOPE_CGO_CALL_METRIC(); SCOPE_CGO_CALL_METRIC();
@ -151,6 +153,10 @@ GetSearchResultDataBlob(CProto* searchResultDataBlob,
search_result_data_blobs->blobs[blob_index].data(); search_result_data_blobs->blobs[blob_index].data();
searchResultDataBlob->proto_size = searchResultDataBlob->proto_size =
search_result_data_blobs->blobs[blob_index].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(); return milvus::SuccessCStatus();
} catch (std::exception& e) { } catch (std::exception& e) {
searchResultDataBlob->proto_blob = nullptr; searchResultDataBlob->proto_blob = nullptr;

View File

@ -48,6 +48,8 @@ ReduceSearchResultsAndFillData(CTraceContext c_trace,
CStatus CStatus
GetSearchResultDataBlob(CProto* searchResultDataBlob, GetSearchResultDataBlob(CProto* searchResultDataBlob,
int64_t* scanned_remote_bytes,
int64_t* scanned_total_bytes,
CSearchResultDataBlobs cSearchResultDataBlobs, CSearchResultDataBlobs cSearchResultDataBlobs,
int32_t blob_index); int32_t blob_index);

View File

@ -1219,7 +1219,8 @@ TEST(CApiTest, SealedSegment_search_float_Predicate_Range) {
search_info.search_params_ = generate_search_conf( search_info.search_params_ = generate_search_conf(
IndexEnum::INDEX_FAISS_IVFSQ8, knowhere::metric::L2); IndexEnum::INDEX_FAISS_IVFSQ8, knowhere::metric::L2);
SearchResult result_on_index; 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); EXPECT_EQ(result_on_index.distances_.size(), num_queries * TOPK);
auto cm = milvus::storage::RemoteChunkManagerSingleton::GetInstance() auto cm = milvus::storage::RemoteChunkManagerSingleton::GetInstance()
@ -1454,7 +1455,8 @@ TEST(CApiTest, SealedSegment_search_float_With_Expr_Predicate_Range) {
auto search_plan = reinterpret_cast<milvus::query::Plan*>(plan); auto search_plan = reinterpret_cast<milvus::query::Plan*>(plan);
SearchInfo search_info = search_plan->plan_node_->search_info_; SearchInfo search_info = search_plan->plan_node_->search_info_;
SearchResult result_on_index; 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 ids = result_on_index.seg_offsets_.data();
auto dis = result_on_index.distances_.data(); auto dis = result_on_index.distances_.data();
std::vector<int64_t> vec_ids(ids, ids + TOPK * num_queries); std::vector<int64_t> vec_ids(ids, ids + TOPK * num_queries);

View File

@ -84,6 +84,13 @@ class ChunkTranslator : public milvus::cachinglayer::Translator<milvus::Chunk> {
return &meta_; return &meta_;
} }
// TODO: implement this
int64_t
cells_storage_bytes(
const std::vector<milvus::cachinglayer::cid_t>& cids) const override {
return 0;
}
private: private:
std::vector<FileInfo> file_infos_; std::vector<FileInfo> file_infos_;
int64_t segment_id_; int64_t segment_id_;

View File

@ -52,6 +52,13 @@ class DefaultValueChunkTranslator
return &meta_; return &meta_;
} }
// TODO: implement this
int64_t
cells_storage_bytes(
const std::vector<milvus::cachinglayer::cid_t>& cids) const override {
return 0;
}
private: private:
int64_t segment_id_; int64_t segment_id_;
std::string key_; std::string key_;

View File

@ -48,12 +48,13 @@ std::pair<milvus::cachinglayer::ResourceUsage,
milvus::cachinglayer::ResourceUsage> milvus::cachinglayer::ResourceUsage>
InterimSealedIndexTranslator::estimated_byte_size_of_cell( InterimSealedIndexTranslator::estimated_byte_size_of_cell(
milvus::cachinglayer::cid_t cid) const { milvus::cachinglayer::cid_t cid) const {
auto size = vec_data_->DataByteSize(); int64_t size = vec_data_->DataByteSize();
auto row_count = vec_data_->NumRows(); int64_t row_count = vec_data_->NumRows();
// TODO: hack, move these estimate logic to knowhere // TODO: hack, move these estimate logic to knowhere
// ignore the size of centroids // ignore the size of centroids
if (index_type_ == knowhere::IndexEnum::INDEX_FAISS_SCANN_DVR) { if (index_type_ == knowhere::IndexEnum::INDEX_FAISS_SCANN_DVR) {
auto vec_size = size_t(index::GetValueFromConfig<int>( int64_t vec_size =
int64_t(index::GetValueFromConfig<int>(
build_config_, knowhere::indexparam::SUB_DIM) build_config_, knowhere::indexparam::SUB_DIM)
.value() / .value() /
8 * dim_); 8 * dim_);
@ -70,7 +71,7 @@ InterimSealedIndexTranslator::estimated_byte_size_of_cell(
{static_cast<int64_t>(vec_size * row_count + size * 0.5), 0}}; {static_cast<int64_t>(vec_size * row_count + size * 0.5), 0}};
} else if (index_type_ == knowhere::IndexEnum::INDEX_FAISS_IVFFLAT_CC) { } else if (index_type_ == knowhere::IndexEnum::INDEX_FAISS_IVFFLAT_CC) {
// fp16/bf16 all use float32 to build index // 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}, return {{fp32_size, 0},
{static_cast<int64_t>(fp32_size + fp32_size * 0.5), 0}}; {static_cast<int64_t>(fp32_size + fp32_size * 0.5), 0}};
} else { } else {
@ -95,6 +96,7 @@ InterimSealedIndexTranslator::get_cells(
vec_data_](size_t id) { vec_data_](size_t id) {
const void* data; const void* data;
int64_t data_id = id; int64_t data_id = id;
field_raw_data_ptr->BulkValueAt( field_raw_data_ptr->BulkValueAt(
[&data, &data_id](const char* value, size_t i) { [&data, &data_id](const char* value, size_t i) {
data = static_cast<const void*>(value); data = static_cast<const void*>(value);

View File

@ -44,6 +44,13 @@ class InterimSealedIndexTranslator
Meta* Meta*
meta() override; meta() override;
// TODO: implement this
int64_t
cells_storage_bytes(
const std::vector<milvus::cachinglayer::cid_t>& cids) const override {
return 0;
}
private: private:
std::shared_ptr<ChunkedColumnInterface> vec_data_; std::shared_ptr<ChunkedColumnInterface> vec_data_;
std::string segment_id_; std::string segment_id_;

View File

@ -75,8 +75,10 @@ SealedIndexTranslator::estimated_byte_size_of_cell(
index_load_info_.num_rows, index_load_info_.num_rows,
index_load_info_.dim); index_load_info_.dim);
// this is an estimation, error could be up to 20%. // this is an estimation, error could be up to 20%.
return {{request.final_memory_cost, request.final_disk_cost}, return {milvus::cachinglayer::ResourceUsage(request.final_memory_cost,
{request.max_memory_cost, request.max_disk_cost}}; request.final_disk_cost),
milvus::cachinglayer::ResourceUsage(request.max_memory_cost,
request.max_disk_cost)};
} }
const std::string& const std::string&
@ -100,7 +102,8 @@ SealedIndexTranslator::get_cells(const std::vector<cid_t>& cids) {
index_load_info_.enable_mmap, index_load_info_.enable_mmap,
index_load_info_.num_rows, index_load_info_.num_rows,
index_load_info_.dim); 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()) { if (index_load_info_.enable_mmap && index->IsMmapSupported()) {
AssertInfo(!index_load_info_.mmap_dir_path.empty(), AssertInfo(!index_load_info_.mmap_dir_path.empty(),
"mmap directory path is empty"); "mmap directory path is empty");

View File

@ -41,6 +41,13 @@ class SealedIndexTranslator
Meta* Meta*
meta() override; meta() override;
// TODO: implement this
int64_t
cells_storage_bytes(
const std::vector<milvus::cachinglayer::cid_t>& cids) const override {
return 0;
}
private: private:
struct IndexLoadInfo { struct IndexLoadInfo {
bool enable_mmap; bool enable_mmap;

View File

@ -40,6 +40,13 @@ class V1SealedIndexTranslator : public Translator<milvus::index::IndexBase> {
Meta* Meta*
meta() override; meta() override;
// TODO: implement this
int64_t
cells_storage_bytes(
const std::vector<milvus::cachinglayer::cid_t>& cids) const override {
return 0;
}
private: private:
struct IndexLoadInfo { struct IndexLoadInfo {
bool enable_mmap; bool enable_mmap;

View File

@ -75,6 +75,12 @@ class GroupChunkTranslator
return &meta_; return &meta_;
} }
int64_t
cells_storage_bytes(
const std::vector<milvus::cachinglayer::cid_t>& cids) const override {
return 0;
}
private: private:
std::unique_ptr<milvus::GroupChunk> std::unique_ptr<milvus::GroupChunk>
load_group_chunk(const std::shared_ptr<arrow::Table>& table, load_group_chunk(const std::shared_ptr<arrow::Table>& table,

View File

@ -14,7 +14,7 @@
# Update KNOWHERE_VERSION for the first occurrence # Update KNOWHERE_VERSION for the first occurrence
milvus_add_pkg_config("knowhere") milvus_add_pkg_config("knowhere")
set_property(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY INCLUDE_DIRECTORIES "") 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") set( GIT_REPOSITORY "https://github.com/zilliztech/knowhere.git")
message(STATUS "Knowhere repo: ${GIT_REPOSITORY}") message(STATUS "Knowhere repo: ${GIT_REPOSITORY}")

View File

@ -13,7 +13,7 @@
milvus_add_pkg_config("milvus-common") milvus_add_pkg_config("milvus-common")
set_property(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY INCLUDE_DIRECTORIES "") 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") set( GIT_REPOSITORY "https://github.com/zilliztech/milvus-common.git")
message(STATUS "milvus-common repo: ${GIT_REPOSITORY}") message(STATUS "milvus-common repo: ${GIT_REPOSITORY}")

View File

@ -186,7 +186,7 @@ TEST_P(IndexWrapperTest, BuildAndQuery) {
auto xb_data = dataset.get_col<float>(milvus::FieldId(100)); auto xb_data = dataset.get_col<float>(milvus::FieldId(100));
auto xq_dataset = auto xq_dataset =
knowhere::GenDataSet(NQ, DIM, xb_data.data() + DIM * query_offset); 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) { } else if (vec_field_data_type == DataType::VECTOR_SPARSE_U32_F32) {
auto dataset = GenFieldData(NQ, metric_type, vec_field_data_type); auto dataset = GenFieldData(NQ, metric_type, vec_field_data_type);
auto xb_data = auto xb_data =
@ -196,7 +196,7 @@ TEST_P(IndexWrapperTest, BuildAndQuery) {
auto xq_dataset = auto xq_dataset =
knowhere::GenDataSet(NQ, kTestSparseDim, xb_data.data()); knowhere::GenDataSet(NQ, kTestSparseDim, xb_data.data());
xq_dataset->SetIsSparse(true); xq_dataset->SetIsSparse(true);
result = vec_index->Query(xq_dataset, search_info, nullptr); result = vec_index->Query(xq_dataset, search_info, nullptr, nullptr);
} else { } else {
auto nb_for_nq = NQ + query_offset; auto nb_for_nq = NQ + query_offset;
auto dataset = GenFieldData( auto dataset = GenFieldData(
@ -207,7 +207,7 @@ TEST_P(IndexWrapperTest, BuildAndQuery) {
NQ, NQ,
BINARY_DIM, BINARY_DIM,
xb_bin_data.data() + ((BINARY_DIM + 7) / 8) * query_offset); 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); EXPECT_EQ(result->total_nq_, NQ);

View File

@ -185,7 +185,8 @@ TEST(Indexing, BinaryBruteForce) {
index_info, index_info,
nullptr, nullptr,
DataType::VECTOR_BINARY, DataType::VECTOR_BINARY,
DataType::NONE); DataType::NONE,
nullptr);
SearchResult sr; SearchResult sr;
sr.total_nq_ = num_queries; sr.total_nq_ = num_queries;
@ -296,7 +297,7 @@ TEST(Indexing, Naive) {
searchInfo.search_params_ = search_conf; searchInfo.search_params_ = search_conf;
auto vec_index = dynamic_cast<index::VectorIndex*>(index.get()); auto vec_index = dynamic_cast<index::VectorIndex*>(index.get());
SearchResult result; 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) { for (int i = 0; i < TOPK; ++i) {
ASSERT_FALSE(result.seg_offsets_[i] < N / 2); ASSERT_FALSE(result.seg_offsets_[i] < N / 2);
@ -519,7 +520,7 @@ TEST_P(IndexTest, BuildAndQuery) {
search_info.metric_type_ = metric_type; search_info.metric_type_ = metric_type;
search_info.search_params_ = search_conf; search_info.search_params_ = search_conf;
SearchResult result; 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.total_nq_, NQ);
EXPECT_EQ(result.unity_topK_, K); EXPECT_EQ(result.unity_topK_, K);
EXPECT_EQ(result.distances_.size(), NQ * K); EXPECT_EQ(result.distances_.size(), NQ * K);
@ -535,7 +536,7 @@ TEST_P(IndexTest, BuildAndQuery) {
if (!is_sparse) { if (!is_sparse) {
// sparse doesn't support range search yet // sparse doesn't support range search yet
search_info.search_params_ = range_search_conf; 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.metric_type_ = metric_type;
search_info.search_params_ = search_conf; search_info.search_params_ = search_conf;
SearchResult result; 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.total_nq_, NQ);
EXPECT_EQ(result.unity_topK_, K); EXPECT_EQ(result.unity_topK_, K);
EXPECT_EQ(result.distances_.size(), NQ * K); EXPECT_EQ(result.distances_.size(), NQ * K);
@ -599,7 +600,7 @@ TEST_P(IndexTest, Mmap) {
EXPECT_EQ(result.seg_offsets_[0], query_offset); EXPECT_EQ(result.seg_offsets_[0], query_offset);
} }
search_info.search_params_ = range_search_conf; 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) { TEST_P(IndexTest, GetVector) {
@ -842,7 +843,8 @@ TEST(Indexing, SearchDiskAnnWithInvalidParam) {
{milvus::index::DISK_ANN_QUERY_LIST, K - 1}, {milvus::index::DISK_ANN_QUERY_LIST, K - 1},
}; };
SearchResult result; SearchResult result;
EXPECT_THROW(vec_index->Query(xq_dataset, search_info, nullptr, result), EXPECT_THROW(
vec_index->Query(xq_dataset, search_info, nullptr, nullptr, result),
std::runtime_error); std::runtime_error);
} }
@ -928,7 +930,8 @@ TEST(Indexing, SearchDiskAnnWithFloat16) {
{milvus::index::DISK_ANN_QUERY_LIST, K * 2}, {milvus::index::DISK_ANN_QUERY_LIST, K * 2},
}; };
SearchResult result; 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) { TEST(Indexing, SearchDiskAnnWithBFloat16) {
@ -1013,7 +1016,8 @@ TEST(Indexing, SearchDiskAnnWithBFloat16) {
{milvus::index::DISK_ANN_QUERY_LIST, K * 2}, {milvus::index::DISK_ANN_QUERY_LIST, K * 2},
}; };
SearchResult result; 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 #endif

View File

@ -125,7 +125,7 @@ TEST(Sealed, without_predicate) {
searchInfo.metric_type_ = knowhere::metric::L2; searchInfo.metric_type_ = knowhere::metric::L2;
searchInfo.search_params_ = search_conf; searchInfo.search_params_ = search_conf;
SearchResult result; SearchResult result;
vec_index->Query(query_dataset, searchInfo, nullptr, result); vec_index->Query(query_dataset, searchInfo, nullptr, nullptr, result);
auto ref_result = SearchResultToJson(result); auto ref_result = SearchResultToJson(result);
LoadIndexInfo load_info; LoadIndexInfo load_info;
@ -330,7 +330,7 @@ TEST(Sealed, with_predicate) {
searchInfo.metric_type_ = knowhere::metric::L2; searchInfo.metric_type_ = knowhere::metric::L2;
searchInfo.search_params_ = search_conf; searchInfo.search_params_ = search_conf;
SearchResult result; SearchResult result;
vec_index->Query(query_dataset, searchInfo, nullptr, result); vec_index->Query(query_dataset, searchInfo, nullptr, nullptr, result);
LoadIndexInfo load_info; LoadIndexInfo load_info;
load_info.field_id = fake_id.get(); load_info.field_id = fake_id.get();
@ -2460,7 +2460,7 @@ TEST(Sealed, SearchVectorArray) {
searchInfo.metric_type_ = knowhere::metric::MAX_SIM; searchInfo.metric_type_ = knowhere::metric::MAX_SIM;
searchInfo.search_params_ = search_conf; searchInfo.search_params_ = search_conf;
SearchResult result; SearchResult result;
vec_index->Query(query_dataset, searchInfo, nullptr, result); vec_index->Query(query_dataset, searchInfo, nullptr, nullptr, result);
auto ref_result = SearchResultToJson(result); auto ref_result = SearchResultToJson(result);
std::cout << ref_result.dump(1) << std::endl; std::cout << ref_result.dump(1) << std::endl;
EXPECT_EQ(result.total_nq_, 2); EXPECT_EQ(result.total_nq_, 2);

View File

@ -1563,7 +1563,8 @@ TEST(AlwaysTrueStringPlan, SearchWithOutputFields) {
index_info, index_info,
nullptr, nullptr,
DataType::VECTOR_FLOAT, DataType::VECTOR_FLOAT,
DataType::NONE); DataType::NONE,
nullptr);
auto sr = segment->Search(plan.get(), ph_group.get(), MAX_TIMESTAMP); auto sr = segment->Search(plan.get(), ph_group.get(), MAX_TIMESTAMP);
segment->FillPrimaryKeys(plan.get(), *sr); segment->FillPrimaryKeys(plan.get(), *sr);

View File

@ -77,6 +77,11 @@ class TestChunkTranslator : public Translator<milvus::Chunk> {
return {{0, 0}, {0, 0}}; return {{0, 0}, {0, 0}};
} }
int64_t
cells_storage_bytes(const std::vector<cid_t>& cids) const override {
return 0;
}
const std::string& const std::string&
key() const override { key() const override {
return key_; return key_;
@ -148,6 +153,11 @@ class TestGroupChunkTranslator : public Translator<milvus::GroupChunk> {
return {{0, 0}, {0, 0}}; return {{0, 0}, {0, 0}};
} }
int64_t
cells_storage_bytes(const std::vector<cid_t>& cids) const override {
return 0;
}
const std::string& const std::string&
key() const override { key() const override {
return key_; return key_;
@ -208,6 +218,11 @@ class TestIndexTranslator : public Translator<milvus::index::IndexBase> {
return {{0, 0}, {0, 0}}; return {{0, 0}, {0, 0}};
} }
int64_t
cells_storage_bytes(const std::vector<cid_t>& cids) const override {
return 0;
}
const std::string& const std::string&
key() const override { key() const override {
return key_; return key_;

View File

@ -1092,7 +1092,7 @@ func CheckSearchResult(ctx context.Context, nq int64, plan *segcore.SearchPlan,
} }
for i := 0; i < len(sInfo.SliceNQs); i++ { 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 { if err != nil {
return err return err
} }

View File

@ -47,6 +47,7 @@ import (
"github.com/milvus-io/milvus/internal/types" "github.com/milvus-io/milvus/internal/types"
"github.com/milvus-io/milvus/internal/util/analyzer" "github.com/milvus-io/milvus/internal/util/analyzer"
"github.com/milvus-io/milvus/internal/util/hookutil" "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/common"
"github.com/milvus-io/milvus/pkg/v2/log" "github.com/milvus-io/milvus/pkg/v2/log"
"github.com/milvus-io/milvus/pkg/v2/metrics" "github.com/milvus-io/milvus/pkg/v2/metrics"
@ -2880,6 +2881,20 @@ func (node *Proxy) search(ctx context.Context, request *milvuspb.SearchRequest,
collectionName, collectionName,
).Observe(float64(searchDur)) ).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 { if qt.result != nil {
username := GetCurUserFromContextOrDefault(ctx) username := GetCurUserFromContextOrDefault(ctx)
sentSize := proto.Size(qt.result) 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(), hookutil.RelatedCntKey: qt.result.GetResults().GetAllSearchCount(),
}) })
SetReportValue(qt.result.GetStatus(), v) SetReportValue(qt.result.GetStatus(), v)
SetStorageCost(qt.result.GetStatus(), qt.storageCost)
if merr.Ok(qt.result.GetStatus()) { if merr.Ok(qt.result.GetStatus()) {
metrics.ProxyReportValue.WithLabelValues(nodeID, hookutil.OpTypeSearch, dbName, username).Add(float64(v)) 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, collectionName,
).Observe(float64(searchDur)) ).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 { if qt.result != nil {
sentSize := proto.Size(qt.result) sentSize := proto.Size(qt.result)
username := GetCurUserFromContextOrDefault(ctx) username := GetCurUserFromContextOrDefault(ctx)
@ -3099,6 +3129,7 @@ func (node *Proxy) hybridSearch(ctx context.Context, request *milvuspb.HybridSea
hookutil.RelatedCntKey: qt.result.GetResults().GetAllSearchCount(), hookutil.RelatedCntKey: qt.result.GetResults().GetAllSearchCount(),
}) })
SetReportValue(qt.result.GetStatus(), v) SetReportValue(qt.result.GetStatus(), v)
SetStorageCost(qt.result.GetStatus(), qt.storageCost)
if merr.Ok(qt.result.GetStatus()) { if merr.Ok(qt.result.GetStatus()) {
metrics.ProxyReportValue.WithLabelValues(nodeID, hookutil.OpTypeHybridSearch, dbName, username).Add(float64(v)) 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. // 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 request := qt.request
method := "Query" method := "Query"
if err := merr.CheckHealthy(node.GetStateCode()); err != nil { if err := merr.CheckHealthy(node.GetStateCode()); err != nil {
return &milvuspb.QueryResults{ return &milvuspb.QueryResults{
Status: merr.Status(err), Status: merr.Status(err),
}, nil }, segcore.StorageCost{}, nil
} }
log := log.Ctx(ctx).With( 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{ return &milvuspb.QueryResults{
Status: merr.Status(err), Status: merr.Status(err),
}, nil }, segcore.StorageCost{}, nil
} }
tr.CtxRecord(ctx, "query request enqueue") 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{ return &milvuspb.QueryResults{
Status: merr.Status(err), Status: merr.Status(err),
}, nil }, segcore.StorageCost{}, nil
} }
if !qt.reQuery { if !qt.reQuery {
@ -3327,9 +3358,23 @@ func (node *Proxy) query(ctx context.Context, qt *queryTask, sp trace.Span) (*mi
request.DbName, request.DbName,
request.CollectionName, request.CollectionName,
).Observe(float64(tr.ElapseSpan().Milliseconds())) ).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. // Query get the records by primary keys.
@ -3376,7 +3421,7 @@ func (node *Proxy) Query(ctx context.Context, request *milvuspb.QueryRequest) (*
defer sp.End() defer sp.End()
method := "Query" method := "Query"
res, err := node.query(ctx, qt, sp) res, storageCost, err := node.query(ctx, qt, sp)
if err != nil || !merr.Ok(res.Status) { if err != nil || !merr.Ok(res.Status) {
return res, err return res, err
} }
@ -3394,6 +3439,7 @@ func (node *Proxy) Query(ctx context.Context, request *milvuspb.QueryRequest) (*
hookutil.RelatedCntKey: qt.allQueryCnt, hookutil.RelatedCntKey: qt.allQueryCnt,
}) })
SetReportValue(res.Status, v) SetReportValue(res.Status, v)
SetStorageCost(res.Status, storageCost)
metrics.ProxyReportValue.WithLabelValues(nodeID, hookutil.OpTypeQuery, request.DbName, username).Add(float64(v)) metrics.ProxyReportValue.WithLabelValues(nodeID, hookutil.OpTypeQuery, request.DbName, username).Add(float64(v))
if log.Ctx(ctx).Core().Enabled(zap.DebugLevel) && matchCountRule(request.GetOutputFields()) { if log.Ctx(ctx).Core().Enabled(zap.DebugLevel) && matchCountRule(request.GetOutputFields()) {

View File

@ -32,6 +32,7 @@ import (
"github.com/milvus-io/milvus/internal/parser/planparserv2" "github.com/milvus-io/milvus/internal/parser/planparserv2"
"github.com/milvus-io/milvus/internal/types" "github.com/milvus-io/milvus/internal/types"
"github.com/milvus-io/milvus/internal/util/function/rerank" "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/log"
"github.com/milvus-io/milvus/pkg/v2/proto/internalpb" "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/proto/planpb"
@ -243,7 +244,6 @@ func (op *hybridSearchReduceOperator) run(ctx context.Context, span trace.Span,
if err != nil { if err != nil {
return nil, err return nil, err
} }
searchMetrics = append(searchMetrics, subMetricType) searchMetrics = append(searchMetrics, subMetricType)
multipleMilvusResults[index] = result 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) { func (op *requeryOperator) run(ctx context.Context, span trace.Span, inputs ...any) ([]any, error) {
allIDs := inputs[0].(*schemapb.IDs) allIDs := inputs[0].(*schemapb.IDs)
storageCostFromLastOp := inputs[1].(segcore.StorageCost)
if typeutil.GetSizeOfIDs(allIDs) == 0 { 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 { if err != nil {
return nil, err 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{ queryReq := &milvuspb.QueryRequest{
Base: &commonpb.MsgBase{ Base: &commonpb.MsgBase{
MsgType: commonpb.MsgType_Retrieve, MsgType: commonpb.MsgType_Retrieve,
@ -409,15 +412,15 @@ func (op *requeryOperator) requery(ctx context.Context, span trace.Span, ids *sc
fastSkip: true, fastSkip: true,
reQuery: 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 { if err != nil {
return nil, err return nil, segcore.StorageCost{}, err
} }
if queryResult.GetStatus().GetErrorCode() != commonpb.ErrorCode_Success { 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 { type organizeOperator struct {
@ -632,20 +635,21 @@ func newPipeline(pipeDef *pipelineDef, t *searchTask) (*pipeline, error) {
return &pipeline{name: pipeDef.name, nodes: nodes}, nil 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())) log.Ctx(ctx).Debug("SearchPipeline run", zap.String("pipeline", p.String()))
msg := opMsg{} msg := opMsg{}
msg["input"] = toReduceResults msg["input"] = toReduceResults
msg["storage_cost"] = storageCost
for _, node := range p.nodes { for _, node := range p.nodes {
var err error var err error
log.Ctx(ctx).Debug("SearchPipeline run node", zap.String("node", node.name)) log.Ctx(ctx).Debug("SearchPipeline run node", zap.String("node", node.name))
msg, err = node.Run(ctx, span, msg) msg, err = node.Run(ctx, span, msg)
if err != nil { if err != nil {
log.Ctx(ctx).Error("Run node failed: ", zap.String("err", err.Error())) 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 { func (p *pipeline) String() string {
@ -666,7 +670,7 @@ var searchPipe = &pipelineDef{
nodes: []*nodeDef{ nodes: []*nodeDef{
{ {
name: "reduce", name: "reduce",
inputs: []string{"input"}, inputs: []string{"input", "storage_cost"},
outputs: []string{"reduced", "metrics"}, outputs: []string{"reduced", "metrics"},
opName: searchReduceOp, opName: searchReduceOp,
}, },
@ -696,7 +700,7 @@ var searchWithRequeryPipe = &pipelineDef{
nodes: []*nodeDef{ nodes: []*nodeDef{
{ {
name: "reduce", name: "reduce",
inputs: []string{"input"}, inputs: []string{"input", "storage_cost"},
outputs: []string{"reduced", "metrics"}, outputs: []string{"reduced", "metrics"},
opName: searchReduceOp, opName: searchReduceOp,
}, },
@ -711,8 +715,8 @@ var searchWithRequeryPipe = &pipelineDef{
}, },
{ {
name: "requery", name: "requery",
inputs: []string{"unique_ids"}, inputs: []string{"unique_ids", "storage_cost"},
outputs: []string{"fields"}, outputs: []string{"fields", "storage_cost"},
opName: requeryOp, opName: requeryOp,
}, },
{ {
@ -760,7 +764,7 @@ var searchWithRerankPipe = &pipelineDef{
nodes: []*nodeDef{ nodes: []*nodeDef{
{ {
name: "reduce", name: "reduce",
inputs: []string{"input"}, inputs: []string{"input", "storage_cost"},
outputs: []string{"reduced", "metrics"}, outputs: []string{"reduced", "metrics"},
opName: searchReduceOp, opName: searchReduceOp,
}, },
@ -818,7 +822,7 @@ var searchWithRerankRequeryPipe = &pipelineDef{
nodes: []*nodeDef{ nodes: []*nodeDef{
{ {
name: "reduce", name: "reduce",
inputs: []string{"input"}, inputs: []string{"input", "storage_cost"},
outputs: []string{"reduced", "metrics"}, outputs: []string{"reduced", "metrics"},
opName: searchReduceOp, opName: searchReduceOp,
}, },
@ -843,8 +847,8 @@ var searchWithRerankRequeryPipe = &pipelineDef{
}, },
{ {
name: "requery", name: "requery",
inputs: []string{"ids"}, inputs: []string{"ids", "storage_cost"},
outputs: []string{"fields"}, outputs: []string{"fields", "storage_cost"},
opName: requeryOp, opName: requeryOp,
}, },
{ {
@ -892,7 +896,7 @@ var hybridSearchPipe = &pipelineDef{
nodes: []*nodeDef{ nodes: []*nodeDef{
{ {
name: "reduce", name: "reduce",
inputs: []string{"input"}, inputs: []string{"input", "storage_cost"},
outputs: []string{"reduced", "metrics"}, outputs: []string{"reduced", "metrics"},
opName: hybridSearchReduceOp, opName: hybridSearchReduceOp,
}, },
@ -910,7 +914,7 @@ var hybridSearchWithRequeryPipe = &pipelineDef{
nodes: []*nodeDef{ nodes: []*nodeDef{
{ {
name: "reduce", name: "reduce",
inputs: []string{"input"}, inputs: []string{"input", "storage_cost"},
outputs: []string{"reduced", "metrics"}, outputs: []string{"reduced", "metrics"},
opName: hybridSearchReduceOp, opName: hybridSearchReduceOp,
}, },
@ -925,8 +929,8 @@ var hybridSearchWithRequeryPipe = &pipelineDef{
}, },
{ {
name: "requery", name: "requery",
inputs: []string{"ids"}, inputs: []string{"ids", "storage_cost"},
outputs: []string{"fields"}, outputs: []string{"fields", "storage_cost"},
opName: requeryOp, opName: requeryOp,
}, },
{ {

View File

@ -32,6 +32,7 @@ import (
"github.com/milvus-io/milvus-proto/go-api/v2/milvuspb" "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-proto/go-api/v2/schemapb"
"github.com/milvus-io/milvus/internal/util/function/rerank" "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/internalpb"
"github.com/milvus-io/milvus/pkg/v2/proto/planpb" "github.com/milvus-io/milvus/pkg/v2/proto/planpb"
"github.com/milvus-io/milvus/pkg/v2/util/testutils" "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{ mocker := mockey.Mock((*requeryOperator).requery).Return(&milvuspb.QueryResults{
FieldsData: []*schemapb.FieldData{f1}, FieldsData: []*schemapb.FieldData{f1},
}, nil).Build() }, segcore.StorageCost{}, nil).Build()
defer mocker.UnPatch() defer mocker.UnPatch()
op := requeryOperator{ 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) s.NoError(err)
} }
@ -296,9 +297,8 @@ func (s *SearchPipelineSuite) TestSearchPipeline() {
} }
pipeline, err := newPipeline(searchPipe, task) pipeline, err := newPipeline(searchPipe, task)
s.NoError(err) s.NoError(err)
results, err := pipeline.Run(context.Background(), s.span, []*internalpb.SearchResults{ sr := genTestSearchResultData(2, 10, schemapb.DataType_Int64, "intField", 101, false)
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.NoError(err)
s.NotNil(results) s.NotNil(results)
s.NotNil(results.Results) s.NotNil(results.Results)
@ -314,6 +314,8 @@ func (s *SearchPipelineSuite) TestSearchPipeline() {
s.Len(results.Results.FieldsData, 1) // One output field s.Len(results.Results.FieldsData, 1) // One output field
s.Equal("intField", results.Results.FieldsData[0].FieldName) s.Equal("intField", results.Results.FieldsData[0].FieldName)
s.Equal(int64(101), results.Results.FieldsData[0].FieldId) s.Equal(int64(101), results.Results.FieldsData[0].FieldId)
s.Equal(int64(100), storageCost.ScannedRemoteBytes)
s.Equal(int64(250), storageCost.ScannedTotalBytes)
fmt.Println(results) fmt.Println(results)
} }
@ -355,14 +357,14 @@ func (s *SearchPipelineSuite) TestSearchPipelineWithRequery() {
f2.FieldId = 100 f2.FieldId = 100
mocker := mockey.Mock((*requeryOperator).requery).Return(&milvuspb.QueryResults{ mocker := mockey.Mock((*requeryOperator).requery).Return(&milvuspb.QueryResults{
FieldsData: []*schemapb.FieldData{f1, f2}, FieldsData: []*schemapb.FieldData{f1, f2},
}, nil).Build() }, segcore.StorageCost{ScannedRemoteBytes: 100, ScannedTotalBytes: 200}, nil).Build()
defer mocker.UnPatch() defer mocker.UnPatch()
pipeline, err := newPipeline(searchWithRequeryPipe, task) pipeline, err := newPipeline(searchWithRequeryPipe, task)
s.NoError(err) 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), genTestSearchResultData(2, 10, schemapb.DataType_Int64, "intField", 101, false),
}) }, segcore.StorageCost{ScannedRemoteBytes: 100, ScannedTotalBytes: 200})
s.NoError(err) s.NoError(err)
s.NotNil(results) s.NotNil(results)
s.NotNil(results.Results) s.NotNil(results.Results)
@ -378,6 +380,8 @@ func (s *SearchPipelineSuite) TestSearchPipelineWithRequery() {
s.Len(results.Results.FieldsData, 1) // One output field s.Len(results.Results.FieldsData, 1) // One output field
s.Equal("intField", results.Results.FieldsData[0].FieldName) s.Equal("intField", results.Results.FieldsData[0].FieldName)
s.Equal(int64(101), results.Results.FieldsData[0].FieldId) 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() { func (s *SearchPipelineSuite) TestSearchWithRerankPipe() {
@ -431,7 +435,7 @@ func (s *SearchPipelineSuite) TestSearchWithRerankPipe() {
s.NoError(err) s.NoError(err)
searchResults := genTestSearchResultData(2, 10, schemapb.DataType_Int64, "intField", 101, false) 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.NoError(err)
s.NotNil(results) s.NotNil(results)
@ -506,14 +510,14 @@ func (s *SearchPipelineSuite) TestSearchWithRerankRequeryPipe() {
f2.FieldId = 100 f2.FieldId = 100
mocker := mockey.Mock((*requeryOperator).requery).Return(&milvuspb.QueryResults{ mocker := mockey.Mock((*requeryOperator).requery).Return(&milvuspb.QueryResults{
FieldsData: []*schemapb.FieldData{f1, f2}, FieldsData: []*schemapb.FieldData{f1, f2},
}, nil).Build() }, segcore.StorageCost{}, nil).Build()
defer mocker.UnPatch() defer mocker.UnPatch()
pipeline, err := newPipeline(searchWithRerankRequeryPipe, task) pipeline, err := newPipeline(searchWithRerankRequeryPipe, task)
s.NoError(err) s.NoError(err)
searchResults := genTestSearchResultData(2, 10, schemapb.DataType_Int64, "intField", 101, false) 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.NoError(err)
s.NotNil(results) s.NotNil(results)
@ -530,6 +534,8 @@ func (s *SearchPipelineSuite) TestSearchWithRerankRequeryPipe() {
s.Len(results.Results.FieldsData, 1) // One output field s.Len(results.Results.FieldsData, 1) // One output field
s.Equal("intField", results.Results.FieldsData[0].FieldName) s.Equal("intField", results.Results.FieldsData[0].FieldName)
s.Equal(int64(101), results.Results.FieldsData[0].FieldId) 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() { func (s *SearchPipelineSuite) TestHybridSearchPipe() {
@ -545,7 +551,7 @@ func (s *SearchPipelineSuite) TestHybridSearchPipe() {
f1 := genTestSearchResultData(2, 10, schemapb.DataType_Int64, "intField", 101, true) f1 := genTestSearchResultData(2, 10, schemapb.DataType_Int64, "intField", 101, true)
f2 := 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.NoError(err)
s.NotNil(results) s.NotNil(results)
@ -558,6 +564,8 @@ func (s *SearchPipelineSuite) TestHybridSearchPipe() {
s.Len(results.Results.Ids.GetIntId().Data, 20) // 2 queries * 10 topk s.Len(results.Results.Ids.GetIntId().Data, 20) // 2 queries * 10 topk
s.NotNil(results.Results.Scores) s.NotNil(results.Results.Scores)
s.Len(results.Results.Scores, 20) // 2 queries * 10 topk 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() { func (s *SearchPipelineSuite) TestFilterFieldOperatorWithStructArrayFields() {
@ -647,7 +655,7 @@ func (s *SearchPipelineSuite) TestHybridSearchWithRequeryPipe() {
f2.FieldId = 100 f2.FieldId = 100
mocker := mockey.Mock((*requeryOperator).requery).Return(&milvuspb.QueryResults{ mocker := mockey.Mock((*requeryOperator).requery).Return(&milvuspb.QueryResults{
FieldsData: []*schemapb.FieldData{f1, f2}, FieldsData: []*schemapb.FieldData{f1, f2},
}, nil).Build() }, segcore.StorageCost{}, nil).Build()
defer mocker.UnPatch() defer mocker.UnPatch()
pipeline, err := newPipeline(hybridSearchWithRequeryPipe, task) pipeline, err := newPipeline(hybridSearchWithRequeryPipe, task)
@ -655,7 +663,7 @@ func (s *SearchPipelineSuite) TestHybridSearchWithRequeryPipe() {
d1 := genTestSearchResultData(2, 10, schemapb.DataType_Int64, "intField", 101, true) d1 := genTestSearchResultData(2, 10, schemapb.DataType_Int64, "intField", 101, true)
d2 := 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.NoError(err)
s.NotNil(results) s.NotNil(results)

View File

@ -19,6 +19,7 @@ import (
"github.com/milvus-io/milvus/internal/types" "github.com/milvus-io/milvus/internal/types"
"github.com/milvus-io/milvus/internal/util/exprutil" "github.com/milvus-io/milvus/internal/util/exprutil"
"github.com/milvus-io/milvus/internal/util/reduce" "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" typeutil2 "github.com/milvus-io/milvus/internal/util/typeutil"
"github.com/milvus-io/milvus/pkg/v2/common" "github.com/milvus-io/milvus/pkg/v2/common"
"github.com/milvus-io/milvus/pkg/v2/log" "github.com/milvus-io/milvus/pkg/v2/log"
@ -75,6 +76,8 @@ type queryTask struct {
allQueryCnt int64 allQueryCnt int64
totalRelatedDataSize int64 totalRelatedDataSize int64
mustUsePartitionKey bool mustUsePartitionKey bool
storageCost segcore.StorageCost
} }
type queryParams struct { type queryParams struct {
@ -624,6 +627,7 @@ func (t *queryTask) PostExecute(ctx context.Context) error {
toReduceResults := make([]*internalpb.RetrieveResults, 0) toReduceResults := make([]*internalpb.RetrieveResults, 0)
t.allQueryCnt = 0 t.allQueryCnt = 0
t.totalRelatedDataSize = 0 t.totalRelatedDataSize = 0
t.storageCost = segcore.StorageCost{}
select { select {
case <-t.TraceCtx().Done(): case <-t.TraceCtx().Done():
log.Warn("proxy", zap.Int64("Query: wait to finish failed, timeout!, msgID:", t.ID())) 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 { t.resultBuf.Range(func(res *internalpb.RetrieveResults) bool {
toReduceResults = append(toReduceResults, res) toReduceResults = append(toReduceResults, res)
t.allQueryCnt += res.GetAllRetrieveCount() t.allQueryCnt += res.GetAllRetrieveCount()
t.storageCost.ScannedRemoteBytes += res.GetScannedRemoteBytes()
t.storageCost.ScannedTotalBytes += res.GetScannedTotalBytes()
t.totalRelatedDataSize += res.GetCostAggregation().GetTotalRelatedDataSize() t.totalRelatedDataSize += res.GetCostAggregation().GetTotalRelatedDataSize()
log.Debug("proxy receives one query result", zap.Int64("sourceID", res.GetBase().GetSourceID())) log.Debug("proxy receives one query result", zap.Int64("sourceID", res.GetBase().GetSourceID()))
return true return true

View File

@ -21,6 +21,7 @@ import (
"github.com/milvus-io/milvus/internal/util/exprutil" "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/embedding"
"github.com/milvus-io/milvus/internal/util/function/rerank" "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/log"
"github.com/milvus-io/milvus/pkg/v2/metrics" "github.com/milvus-io/milvus/pkg/v2/metrics"
"github.com/milvus-io/milvus/pkg/v2/proto/internalpb" "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. // 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. // if the user explicitly set pk field in output fields, we add it back to the result.
userRequestedPkFieldExplicitly bool userRequestedPkFieldExplicitly bool
storageCost segcore.StorageCost
} }
func (t *searchTask) CanSkipAllocTimestamp() bool { func (t *searchTask) CanSkipAllocTimestamp() bool {
@ -739,6 +742,7 @@ func (t *searchTask) PostExecute(ctx context.Context) error {
t.relatedDataSize = 0 t.relatedDataSize = 0
isTopkReduce := false isTopkReduce := false
isRecallEvaluation := false isRecallEvaluation := false
storageCost := segcore.StorageCost{}
for _, r := range toReduceResults { for _, r := range toReduceResults {
if r.GetIsTopkReduce() { if r.GetIsTopkReduce() {
isTopkReduce = true isTopkReduce = true
@ -750,6 +754,8 @@ func (t *searchTask) PostExecute(ctx context.Context) error {
for ch, ts := range r.GetChannelsMvcc() { for ch, ts := range r.GetChannelsMvcc() {
t.queryChannelsTs[ch] = ts t.queryChannelsTs[ch] = ts
} }
storageCost.ScannedRemoteBytes += r.GetScannedRemoteBytes()
storageCost.ScannedTotalBytes += r.GetScannedTotalBytes()
} }
t.isTopkReduce = isTopkReduce t.isTopkReduce = isTopkReduce
@ -761,7 +767,7 @@ func (t *searchTask) PostExecute(ctx context.Context) error {
log.Warn("Faild to create post process pipeline") log.Warn("Faild to create post process pipeline")
return err 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 return err
} }
t.fillResult() t.fillResult()

View File

@ -43,6 +43,7 @@ import (
"github.com/milvus-io/milvus/internal/util/dependency" "github.com/milvus-io/milvus/internal/util/dependency"
"github.com/milvus-io/milvus/internal/util/function/embedding" "github.com/milvus-io/milvus/internal/util/function/embedding"
"github.com/milvus-io/milvus/internal/util/reduce" "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/common"
"github.com/milvus-io/milvus/pkg/v2/proto/internalpb" "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/proto/planpb"
@ -395,7 +396,7 @@ func TestSearchTask_PostExecute(t *testing.T) {
mocker := mockey.Mock((*requeryOperator).requery).Return(&milvuspb.QueryResults{ mocker := mockey.Mock((*requeryOperator).requery).Return(&milvuspb.QueryResults{
FieldsData: []*schemapb.FieldData{f1, f2, f3}, FieldsData: []*schemapb.FieldData{f1, f2, f3},
}, nil).Build() }, segcore.StorageCost{}, nil).Build()
defer mocker.UnPatch() defer mocker.UnPatch()
err := qt.PostExecute(context.TODO()) err := qt.PostExecute(context.TODO())
@ -435,7 +436,7 @@ func TestSearchTask_PostExecute(t *testing.T) {
mocker := mockey.Mock((*requeryOperator).requery).Return(&milvuspb.QueryResults{ mocker := mockey.Mock((*requeryOperator).requery).Return(&milvuspb.QueryResults{
FieldsData: []*schemapb.FieldData{f1, f2, f3}, FieldsData: []*schemapb.FieldData{f1, f2, f3},
}, nil).Build() }, segcore.StorageCost{}, nil).Build()
defer mocker.UnPatch() defer mocker.UnPatch()
err := qt.PostExecute(context.TODO()) err := qt.PostExecute(context.TODO())
@ -475,7 +476,7 @@ func TestSearchTask_PostExecute(t *testing.T) {
f4.FieldId = fieldNameId[testFloatField] f4.FieldId = fieldNameId[testFloatField]
mocker := mockey.Mock((*requeryOperator).requery).Return(&milvuspb.QueryResults{ mocker := mockey.Mock((*requeryOperator).requery).Return(&milvuspb.QueryResults{
FieldsData: []*schemapb.FieldData{f1, f2, f3, f4}, FieldsData: []*schemapb.FieldData{f1, f2, f3, f4},
}, nil).Build() }, segcore.StorageCost{}, nil).Build()
defer mocker.UnPatch() defer mocker.UnPatch()
err := qt.PostExecute(context.TODO()) err := qt.PostExecute(context.TODO())
@ -4154,8 +4155,10 @@ func TestSearchTask_Requery(t *testing.T) {
} }
op, err := newRequeryOperator(qt, nil) op, err := newRequeryOperator(qt, nil)
assert.NoError(t, err) 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.NoError(t, err)
assert.Equal(t, int64(0), storageCost.ScannedRemoteBytes)
assert.Equal(t, int64(0), storageCost.ScannedTotalBytes)
assert.Len(t, queryResult.FieldsData, 2) assert.Len(t, queryResult.FieldsData, 2)
for _, field := range qt.result.Results.FieldsData { for _, field := range qt.result.Results.FieldsData {
fieldName := field.GetFieldName() fieldName := field.GetFieldName()
@ -4219,7 +4222,7 @@ func TestSearchTask_Requery(t *testing.T) {
op, err := newRequeryOperator(qt, nil) op, err := newRequeryOperator(qt, nil)
assert.NoError(t, err) 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) t.Logf("err = %s", err)
assert.Error(t, err) assert.Error(t, err)
}) })

View File

@ -223,7 +223,8 @@ func retrieveByPKs(ctx context.Context, t *upsertTask, ids *schemapb.IDs, output
defer func() { defer func() {
sp.End() 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 { if err := merr.CheckRPCCall(queryResult.GetStatus(), err); err != nil {
return nil, err return nil, err
} }

View File

@ -33,6 +33,7 @@ import (
"github.com/milvus-io/milvus/internal/mocks" "github.com/milvus-io/milvus/internal/mocks"
"github.com/milvus-io/milvus/internal/parser/planparserv2" "github.com/milvus-io/milvus/internal/parser/planparserv2"
"github.com/milvus-io/milvus/internal/util/function/embedding" "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/mq/msgstream"
"github.com/milvus-io/milvus/pkg/v2/proto/planpb" "github.com/milvus-io/milvus/pkg/v2/proto/planpb"
"github.com/milvus-io/milvus/pkg/v2/proto/rootcoordpb" "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{} globalMetaCache = &MetaCache{}
mockey.Mock(globalMetaCache.GetPartitionID).Return(int64(1002), nil).Build() 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{ mockey.Mock((*Proxy).query).Return(&milvuspb.QueryResults{
Status: merr.Success(), Status: merr.Success(),
FieldsData: []*schemapb.FieldData{}, FieldsData: []*schemapb.FieldData{},
}, nil).Build() }, segcore.StorageCost{}, nil).Build()
task := createTestUpdateTask() task := createTestUpdateTask()
task.partitionKeyMode = true task.partitionKeyMode = true

View File

@ -42,6 +42,7 @@ import (
"github.com/milvus-io/milvus/internal/util/function/embedding" "github.com/milvus-io/milvus/internal/util/function/embedding"
"github.com/milvus-io/milvus/internal/util/hookutil" "github.com/milvus-io/milvus/internal/util/hookutil"
"github.com/milvus-io/milvus/internal/util/indexparamcheck" "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" typeutil2 "github.com/milvus-io/milvus/internal/util/typeutil"
"github.com/milvus-io/milvus/pkg/v2/common" "github.com/milvus-io/milvus/pkg/v2/common"
"github.com/milvus-io/milvus/pkg/v2/log" "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) 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 { func GetCostValue(status *commonpb.Status) int {
if status == nil || status.ExtraInfo == nil { if status == nil || status.ExtraInfo == nil {
return 0 return 0

View File

@ -15,9 +15,13 @@ func (r *cntReducer) Reduce(ctx context.Context, results []*internalpb.RetrieveR
cnt := int64(0) cnt := int64(0)
allRetrieveCount := int64(0) allRetrieveCount := int64(0)
relatedDataSize := int64(0) relatedDataSize := int64(0)
scannedRemoteBytes := int64(0)
scannedTotalBytes := int64(0)
for _, res := range results { for _, res := range results {
allRetrieveCount += res.GetAllRetrieveCount() allRetrieveCount += res.GetAllRetrieveCount()
relatedDataSize += res.GetCostAggregation().GetTotalRelatedDataSize() relatedDataSize += res.GetCostAggregation().GetTotalRelatedDataSize()
scannedRemoteBytes += res.GetScannedRemoteBytes()
scannedTotalBytes += res.GetScannedTotalBytes()
c, err := funcutil.CntOfInternalResult(res) c, err := funcutil.CntOfInternalResult(res)
if err != nil { if err != nil {
return nil, err return nil, err
@ -29,6 +33,8 @@ func (r *cntReducer) Reduce(ctx context.Context, results []*internalpb.RetrieveR
res.CostAggregation = &internalpb.CostAggregation{ res.CostAggregation = &internalpb.CostAggregation{
TotalRelatedDataSize: relatedDataSize, TotalRelatedDataSize: relatedDataSize,
} }
res.ScannedRemoteBytes = scannedRemoteBytes
res.ScannedTotalBytes = scannedTotalBytes
return res, nil 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) { func (r *cntReducerSegCore) Reduce(ctx context.Context, results []*segcorepb.RetrieveResults, _ []Segment, _ *segcore.RetrievePlan) (*segcorepb.RetrieveResults, error) {
cnt := int64(0) cnt := int64(0)
allRetrieveCount := int64(0) allRetrieveCount := int64(0)
scannedRemoteBytes := int64(0)
scannedTotalBytes := int64(0)
for _, res := range results { for _, res := range results {
allRetrieveCount += res.GetAllRetrieveCount() allRetrieveCount += res.GetAllRetrieveCount()
scannedRemoteBytes += res.GetScannedRemoteBytes()
scannedTotalBytes += res.GetScannedTotalBytes()
c, err := funcutil.CntOfSegCoreResult(res) c, err := funcutil.CntOfSegCoreResult(res)
if err != nil { if err != nil {
return nil, err return nil, err
@ -47,5 +57,7 @@ func (r *cntReducerSegCore) Reduce(ctx context.Context, results []*segcorepb.Ret
} }
res := funcutil.WrapCntToSegCoreResult(cnt) res := funcutil.WrapCntToSegCoreResult(cnt)
res.AllRetrieveCount = allRetrieveCount res.AllRetrieveCount = allRetrieveCount
res.ScannedRemoteBytes = scannedRemoteBytes
res.ScannedTotalBytes = scannedTotalBytes
return res, nil return res, nil
} }

View File

@ -125,10 +125,17 @@ func ReduceSearchResults(ctx context.Context, results []*internalpb.SearchResult
relatedDataSize := lo.Reduce(results, func(acc int64, result *internalpb.SearchResults, _ int) int64 { relatedDataSize := lo.Reduce(results, func(acc int64, result *internalpb.SearchResults, _ int) int64 {
return acc + result.GetCostAggregation().GetTotalRelatedDataSize() return acc + result.GetCostAggregation().GetTotalRelatedDataSize()
}, 0) }, 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.CostAggregation.TotalRelatedDataSize = relatedDataSize
searchResults.ChannelsMvcc = channelsMvcc searchResults.ChannelsMvcc = channelsMvcc
searchResults.IsTopkReduce = isTopkReduce searchResults.IsTopkReduce = isTopkReduce
searchResults.IsRecallEvaluation = isRecallEvaluation searchResults.IsRecallEvaluation = isRecallEvaluation
searchResults.ScannedRemoteBytes = storageCost.ScannedRemoteBytes
searchResults.ScannedTotalBytes = storageCost.ScannedTotalBytes
return searchResults, nil return searchResults, nil
} }
@ -142,12 +149,14 @@ func ReduceAdvancedSearchResults(ctx context.Context, results []*internalpb.Sear
searchResults := &internalpb.SearchResults{ searchResults := &internalpb.SearchResults{
IsAdvanced: true, IsAdvanced: true,
} }
storageCost := segcore.StorageCost{}
for index, result := range results { for index, result := range results {
if result.GetIsTopkReduce() { if result.GetIsTopkReduce() {
isTopkReduce = true isTopkReduce = true
} }
relatedDataSize += result.GetCostAggregation().GetTotalRelatedDataSize() relatedDataSize += result.GetCostAggregation().GetTotalRelatedDataSize()
storageCost.ScannedRemoteBytes += result.GetScannedRemoteBytes()
storageCost.ScannedTotalBytes += result.GetScannedTotalBytes()
for ch, ts := range result.GetChannelsMvcc() { for ch, ts := range result.GetChannelsMvcc() {
channelsMvcc[ch] = ts channelsMvcc[ch] = ts
} }
@ -178,6 +187,8 @@ func ReduceAdvancedSearchResults(ctx context.Context, results []*internalpb.Sear
} }
searchResults.CostAggregation.TotalRelatedDataSize = relatedDataSize searchResults.CostAggregation.TotalRelatedDataSize = relatedDataSize
searchResults.IsTopkReduce = isTopkReduce searchResults.IsTopkReduce = isTopkReduce
searchResults.ScannedRemoteBytes = storageCost.ScannedRemoteBytes
searchResults.ScannedTotalBytes = storageCost.ScannedTotalBytes
return searchResults, nil return searchResults, nil
} }
@ -231,7 +242,6 @@ func DecodeSearchResults(ctx context.Context, searchResults []*internalpb.Search
if err != nil { if err != nil {
return nil, err return nil, err
} }
results = append(results, &partialResultData) results = append(results, &partialResultData)
} }
return results, nil return results, nil
@ -286,6 +296,8 @@ func MergeInternalRetrieveResult(ctx context.Context, retrieveResults []*interna
hasMoreResult := false hasMoreResult := false
for _, r := range retrieveResults { for _, r := range retrieveResults {
ret.AllRetrieveCount += r.GetAllRetrieveCount() ret.AllRetrieveCount += r.GetAllRetrieveCount()
ret.ScannedRemoteBytes += r.GetScannedRemoteBytes()
ret.ScannedTotalBytes += r.GetScannedTotalBytes()
relatedDataSize += r.GetCostAggregation().GetTotalRelatedDataSize() relatedDataSize += r.GetCostAggregation().GetTotalRelatedDataSize()
size := typeutil.GetSizeOfIDs(r.GetIds()) size := typeutil.GetSizeOfIDs(r.GetIds())
if r == nil || len(r.GetFieldsData()) == 0 || size == 0 { 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 { for i, r := range retrieveResults {
size := typeutil.GetSizeOfIDs(r.GetIds()) size := typeutil.GetSizeOfIDs(r.GetIds())
ret.AllRetrieveCount += r.GetAllRetrieveCount() ret.AllRetrieveCount += r.GetAllRetrieveCount()
ret.ScannedRemoteBytes += r.GetScannedRemoteBytes()
ret.ScannedTotalBytes += r.GetScannedTotalBytes()
if r == nil || len(r.GetOffset()) == 0 || size == 0 { if r == nil || len(r.GetOffset()) == 0 || size == 0 {
log.Debug("filter out invalid retrieve result") log.Debug("filter out invalid retrieve result")
continue continue

View File

@ -955,6 +955,8 @@ func (suite *ResultSuite) TestReduceSearchOnQueryNode() {
NumQueries: nq, NumQueries: nq,
TopK: topK, TopK: topK,
SlicedBlob: mockBlob, SlicedBlob: mockBlob,
ScannedRemoteBytes: 100,
ScannedTotalBytes: 200,
} }
results = append(results, subRes1) results = append(results, subRes1)
} }
@ -964,6 +966,8 @@ func (suite *ResultSuite) TestReduceSearchOnQueryNode() {
NumQueries: nq, NumQueries: nq,
TopK: topK, TopK: topK,
SlicedBlob: mockBlob, SlicedBlob: mockBlob,
ScannedRemoteBytes: 100,
ScannedTotalBytes: 200,
} }
results = append(results, subRes2) results = append(results, subRes2)
} }
@ -977,6 +981,44 @@ func (suite *ResultSuite) TestReduceSearchOnQueryNode() {
suite.Equal(nq, subRes1.GetNumQueries()) suite.Equal(nq, subRes1.GetNumQueries())
suite.Equal(topK, subRes1.GetTopK()) suite.Equal(topK, subRes1.GetTopK())
suite.Equal(mockBlob, subRes1.GetSlicedBlob()) 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) { func TestResult_MergeRequestCost(t *testing.T) {

View File

@ -147,6 +147,8 @@ func retrieveOnSegmentsWithStream(ctx context.Context, mgr *Manager, segments []
}, },
SealedSegmentIDsRetrieved: []int64{segment.ID()}, SealedSegmentIDsRetrieved: []int64{segment.ID()},
AllRetrieveCount: result.GetAllRetrieveCount(), AllRetrieveCount: result.GetAllRetrieveCount(),
ScannedRemoteBytes: result.GetScannedRemoteBytes(),
ScannedTotalBytes: result.GetScannedTotalBytes(),
}); err != nil { }); err != nil {
errs[i] = err errs[i] = err
} }

View File

@ -160,6 +160,8 @@ func (t *QueryTask) Execute() error {
}, },
AllRetrieveCount: reducedResult.GetAllRetrieveCount(), AllRetrieveCount: reducedResult.GetAllRetrieveCount(),
HasMoreResult: reducedResult.HasMoreResult, HasMoreResult: reducedResult.HasMoreResult,
ScannedRemoteBytes: reducedResult.GetScannedRemoteBytes(),
ScannedTotalBytes: reducedResult.GetScannedTotalBytes(),
} }
return nil return nil
} }

View File

@ -236,7 +236,7 @@ func (t *SearchTask) Execute() error {
metrics.BatchReduce). metrics.BatchReduce).
Observe(float64(tr.RecordSpan().Milliseconds())) Observe(float64(tr.RecordSpan().Milliseconds()))
for i := range t.originNqs { 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 { if err != nil {
return err return err
} }
@ -267,6 +267,8 @@ func (t *SearchTask) Execute() error {
ServiceTime: tr.ElapseSpan().Milliseconds(), ServiceTime: tr.ElapseSpan().Milliseconds(),
TotalRelatedDataSize: relatedDataSize, TotalRelatedDataSize: relatedDataSize,
}, },
ScannedRemoteBytes: cost.ScannedRemoteBytes,
ScannedTotalBytes: cost.ScannedTotalBytes,
} }
} }
@ -516,7 +518,7 @@ func (t *StreamingSearchTask) Execute() error {
// 2. reorganize blobs to original search request // 2. reorganize blobs to original search request
for i := range t.originNqs { 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 { if err != nil {
return err return err
} }
@ -547,6 +549,8 @@ func (t *StreamingSearchTask) Execute() error {
ServiceTime: tr.ElapseSpan().Milliseconds(), ServiceTime: tr.ElapseSpan().Milliseconds(),
TotalRelatedDataSize: relatedDataSize, TotalRelatedDataSize: relatedDataSize,
}, },
ScannedRemoteBytes: cost.ScannedRemoteBytes,
ScannedTotalBytes: cost.ScannedTotalBytes,
} }
} }
@ -578,6 +582,8 @@ func (t *StreamingSearchTask) maybeReturnForEmptyResults(results []*segments.Sea
CostAggregation: &internalpb.CostAggregation{ CostAggregation: &internalpb.CostAggregation{
ServiceTime: tr.ElapseSpan().Milliseconds(), ServiceTime: tr.ElapseSpan().Milliseconds(),
}, },
ScannedRemoteBytes: 0,
ScannedTotalBytes: 0,
} }
} }
return true return true

View File

@ -42,6 +42,11 @@ type (
StreamSearchReducer = C.CSearchStreamReducer StreamSearchReducer = C.CSearchStreamReducer
) )
type StorageCost struct {
ScannedRemoteBytes int64
ScannedTotalBytes int64
}
func ParseSliceInfo(originNQs []int64, originTopKs []int64, nqPerSlice int64) *SliceInfo { func ParseSliceInfo(originNQs []int64, originTopKs []int64, nqPerSlice int64) *SliceInfo {
sInfo := &SliceInfo{ sInfo := &SliceInfo{
SliceNQs: make([]int64, 0), SliceNQs: make([]int64, 0),
@ -152,13 +157,15 @@ func ReduceSearchResultsAndFillData(ctx context.Context, plan *SearchPlan, searc
return cSearchResultDataBlobs, nil 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 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 { 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) { func DeleteSearchResultDataBlobs(cSearchResultDataBlobs SearchResultDataBlobs) {

View File

@ -89,6 +89,8 @@ func (c *RetrieveResultCache) merge(result *internalpb.RetrieveResults) {
} }
c.result.AllRetrieveCount = c.result.AllRetrieveCount + result.AllRetrieveCount c.result.AllRetrieveCount = c.result.AllRetrieveCount + result.AllRetrieveCount
c.result.CostAggregation = mergeCostAggregation(c.result.GetCostAggregation(), result.GetCostAggregation()) 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) 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].AllRetrieveCount = result.AllRetrieveCount
results[len(results)-1].ScannedRemoteBytes = result.GetScannedRemoteBytes()
results[len(results)-1].ScannedTotalBytes = result.GetScannedTotalBytes()
results[len(results)-1].CostAggregation = result.CostAggregation results[len(results)-1].CostAggregation = result.CostAggregation
return results return results
} }

View File

@ -464,6 +464,22 @@ var (
Help: "latency of function call", Help: "latency of function call",
Buckets: buckets, Buckets: buckets,
}, []string{nodeIDLabelName, collectionName, functionTypeName, functionProvider, functionName}) }, []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 // RegisterProxy registers Proxy metrics
@ -534,6 +550,8 @@ func RegisterProxy(registry *prometheus.Registry) {
registry.MustRegister(ProxyFunctionlatency) registry.MustRegister(ProxyFunctionlatency)
registry.MustRegister(ProxyScannedRemoteBytes)
registry.MustRegister(ProxyScannedTotalBytes)
RegisterStreamingServiceClient(registry) RegisterStreamingServiceClient(registry)
} }
@ -696,4 +714,28 @@ func CleanupProxyCollectionMetrics(nodeID int64, dbName string, collection strin
databaseLabelName: dbName, databaseLabelName: dbName,
collectionName: collection, 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,
})
} }

View File

@ -171,6 +171,8 @@ message SearchResults {
int64 all_search_count = 17; int64 all_search_count = 17;
bool is_topk_reduce = 18; bool is_topk_reduce = 18;
bool is_recall_evaluation = 19; bool is_recall_evaluation = 19;
int64 scanned_remote_bytes = 20;
int64 scanned_total_bytes = 21;
} }
message CostAggregation { message CostAggregation {
@ -218,6 +220,8 @@ message RetrieveResults {
CostAggregation costAggregation = 13; CostAggregation costAggregation = 13;
int64 all_retrieve_count = 14; int64 all_retrieve_count = 14;
bool has_more_result = 15; bool has_more_result = 15;
int64 scanned_remote_bytes = 16;
int64 scanned_total_bytes = 17;
} }
message LoadIndex { message LoadIndex {

View File

@ -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"` 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"` 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"` 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() { func (x *SearchResults) Reset() {
@ -1688,6 +1690,20 @@ func (x *SearchResults) GetIsRecallEvaluation() bool {
return false 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 { type CostAggregation struct {
state protoimpl.MessageState state protoimpl.MessageState
sizeCache protoimpl.SizeCache sizeCache protoimpl.SizeCache
@ -1975,6 +1991,8 @@ type RetrieveResults struct {
CostAggregation *CostAggregation `protobuf:"bytes,13,opt,name=costAggregation,proto3" json:"costAggregation,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"` 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"` 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() { func (x *RetrieveResults) Reset() {
@ -2086,6 +2104,20 @@ func (x *RetrieveResults) GetHasMoreResult() bool {
return false 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 { type LoadIndex struct {
state protoimpl.MessageState state protoimpl.MessageState
sizeCache protoimpl.SizeCache 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 0x63, 0x61, 0x6c, 0x6c, 0x45, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x30,
0x0a, 0x11, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x4d, 0x76, 0x63, 0x63, 0x45, 0x6e, 0x0a, 0x14, 0x73, 0x63, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x5f, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65,
0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x14, 0x20, 0x01, 0x28, 0x03, 0x52, 0x12, 0x73, 0x63,
0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x42, 0x79, 0x74, 0x65, 0x73,
0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x12, 0x2e, 0x0a, 0x13, 0x73, 0x63, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x5f, 0x74, 0x6f, 0x74, 0x61,
0xa5, 0x01, 0x0a, 0x0f, 0x43, 0x6f, 0x73, 0x74, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x6c, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x15, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, 0x73,
0x69, 0x6f, 0x6e, 0x12, 0x22, 0x0a, 0x0c, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x54, 0x63, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x42, 0x79, 0x74, 0x65, 0x73,
0x69, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x4d, 0x76, 0x63, 0x63,
0x6e, 0x73, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01,
0x63, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x73, 0x65, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65,
0x72, 0x76, 0x69, 0x63, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x6f, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38,
0x61, 0x6c, 0x4e, 0x51, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x74, 0x6f, 0x74, 0x61, 0x01, 0x22, 0xa5, 0x01, 0x0a, 0x0f, 0x43, 0x6f, 0x73, 0x74, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67,
0x6c, 0x4e, 0x51, 0x12, 0x32, 0x0a, 0x14, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x52, 0x65, 0x6c, 0x61, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x22, 0x0a, 0x0c, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
0x74, 0x65, 0x64, 0x44, 0x61, 0x74, 0x61, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x72, 0x65, 0x73,
0x03, 0x52, 0x14, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x52, 0x65, 0x6c, 0x61, 0x74, 0x65, 0x64, 0x44, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x73, 0x65, 0x72,
0x61, 0x74, 0x61, 0x53, 0x69, 0x7a, 0x65, 0x22, 0xd3, 0x06, 0x0a, 0x0f, 0x52, 0x65, 0x74, 0x72, 0x76, 0x69, 0x63, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b,
0x69, 0x65, 0x76, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x30, 0x0a, 0x04, 0x62, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x74,
0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6d, 0x69, 0x6c, 0x76, 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, 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, 0x43, 0x6f, 0x6e, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x4c, 0x65, 0x76, 0x65, 0x6c,
0x05, 0x72, 0x65, 0x71, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x72, 0x65, 0x52, 0x10, 0x63, 0x6f, 0x6e, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x4c, 0x65, 0x76,
0x71, 0x49, 0x44, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x62, 0x49, 0x44, 0x18, 0x03, 0x20, 0x01, 0x28, 0x65, 0x6c, 0x12, 0x1f, 0x0a, 0x0b, 0x69, 0x73, 0x5f, 0x69, 0x74, 0x65, 0x72, 0x61, 0x74, 0x6f,
0x03, 0x52, 0x04, 0x64, 0x62, 0x49, 0x44, 0x12, 0x22, 0x0a, 0x0c, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x18, 0x13, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x69, 0x73, 0x49, 0x74, 0x65, 0x72, 0x61,
0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x3a, 0x0a, 0x19, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f,
0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x12, 0x22, 0x0a, 0x0c, 0x70, 0x6e, 0x5f, 0x74, 0x74, 0x6c, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x73,
0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x18, 0x14, 0x20, 0x01, 0x28, 0x04, 0x52, 0x17, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69,
0x03, 0x52, 0x0c, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x73, 0x12, 0x6f, 0x6e, 0x54, 0x74, 0x6c, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x73, 0x22,
0x30, 0x0a, 0x14, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x65, 0x78, 0xb2, 0x05, 0x0a, 0x0f, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x52, 0x65, 0x73, 0x75,
0x70, 0x72, 0x5f, 0x70, 0x6c, 0x61, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x12, 0x73, 0x6c, 0x74, 0x73, 0x12, 0x30, 0x0a, 0x04, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28,
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,
0x0b, 0x32, 0x1c, 0x2e, 0x6d, 0x69, 0x6c, 0x76, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 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, 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, 0x04, 0x62, 0x61, 0x73, 0x65, 0x12, 0x33, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18,
0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x33, 0x0a, 0x06, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x6d, 0x69, 0x6c, 0x76, 0x75, 0x73, 0x2e, 0x70,
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,
0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x53, 0x74, 0x61, 0x74, 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, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x65,
0x62, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6a, 0x6f, 0x62, 0x49, 0x44, 0x71, 0x49, 0x44, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x72, 0x65, 0x71, 0x49, 0x44,
0x22, 0x49, 0x0a, 0x18, 0x47, 0x65, 0x74, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x50, 0x72, 0x6f, 0x12, 0x2a, 0x0a, 0x03, 0x69, 0x64, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e,
0x67, 0x72, 0x65, 0x73, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x6d, 0x69, 0x6c, 0x76, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x73, 0x63, 0x68,
0x64, 0x62, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x64, 0x65, 0x6d, 0x61, 0x2e, 0x49, 0x44, 0x73, 0x52, 0x03, 0x69, 0x64, 0x73, 0x12, 0x3f, 0x0a, 0x0b,
0x62, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6a, 0x6f, 0x62, 0x49, 0x44, 0x18, 0x02, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x03, 0x28,
0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6a, 0x6f, 0x62, 0x49, 0x44, 0x22, 0x81, 0x02, 0x0a, 0x12, 0x0b, 0x32, 0x1e, 0x2e, 0x6d, 0x69, 0x6c, 0x76, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x44, 0x61, 0x74,
0x73, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x61, 0x52, 0x0a, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x44, 0x61, 0x74, 0x61, 0x12, 0x3e, 0x0a,
0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1b, 0x73, 0x65, 0x61, 0x6c, 0x65, 0x64, 0x5f, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x49,
0x1b, 0x0a, 0x09, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x44, 0x73, 0x5f, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x64, 0x18, 0x06, 0x20, 0x03,
0x28, 0x03, 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x28, 0x03, 0x52, 0x19, 0x73, 0x65, 0x61, 0x6c, 0x65, 0x64, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e,
0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x74, 0x49, 0x44, 0x73, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x64, 0x12, 0x31, 0x0a,
0x61, 0x73, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x14, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x44, 0x73, 0x5f, 0x72, 0x65, 0x74, 0x72,
0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x69, 0x65, 0x76, 0x65, 0x64, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x13, 0x63, 0x68, 0x61,
0x12, 0x23, 0x0a, 0x0d, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x44, 0x73, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x64,
0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x12, 0x38, 0x0a, 0x18, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x5f, 0x73, 0x65, 0x61, 0x6c, 0x65,
0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x06, 0x64, 0x5f, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x44, 0x73, 0x18, 0x08, 0x20, 0x03,
0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x69, 0x28, 0x03, 0x52, 0x16, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x53, 0x65, 0x61, 0x6c, 0x65, 0x64,
0x6d, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x5f, 0x72, 0x6f, 0x77, 0x73, 0x18, 0x07, 0x20, 0x01, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x44, 0x73, 0x12, 0x50, 0x0a, 0x0f, 0x63, 0x6f,
0x28, 0x03, 0x52, 0x0c, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x52, 0x6f, 0x77, 0x73, 0x73, 0x74, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0d, 0x20,
0x12, 0x1d, 0x0a, 0x0a, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x72, 0x6f, 0x77, 0x73, 0x18, 0x08, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x6d, 0x69, 0x6c, 0x76, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f,
0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x52, 0x6f, 0x77, 0x73, 0x22, 0x74, 0x6f, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x43, 0x6f, 0x73, 0x74,
0xc6, 0x03, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x50, 0x72, 0x6f, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0f, 0x63, 0x6f, 0x73,
0x67, 0x72, 0x65, 0x73, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x33, 0x0a, 0x74, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2c, 0x0a, 0x12,
0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x61, 0x6c, 0x6c, 0x5f, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x5f, 0x63, 0x6f, 0x75,
0x6d, 0x69, 0x6c, 0x76, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x63, 0x6f, 0x6d, 0x6e, 0x74, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, 0x61, 0x6c, 0x6c, 0x52, 0x65, 0x74,
0x6d, 0x6f, 0x6e, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x26, 0x0a, 0x0f, 0x68, 0x61,
0x75, 0x73, 0x12, 0x3b, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x73, 0x5f, 0x6d, 0x6f, 0x72, 0x65, 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x0f, 0x20,
0x0e, 0x32, 0x25, 0x2e, 0x6d, 0x69, 0x6c, 0x76, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x68, 0x61, 0x73, 0x4d, 0x6f, 0x72, 0x65, 0x52, 0x65, 0x73, 0x75,
0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x6c, 0x74, 0x12, 0x30, 0x0a, 0x14, 0x73, 0x63, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x5f, 0x72, 0x65,
0x4a, 0x6f, 0x62, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x6d, 0x6f, 0x74, 0x65, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x10, 0x20, 0x01, 0x28, 0x03,
0x16, 0x0a, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x52, 0x12, 0x73, 0x63, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x42,
0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x79, 0x74, 0x65, 0x73, 0x12, 0x2e, 0x0a, 0x13, 0x73, 0x63, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x5f,
0x65, 0x73, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x11, 0x20, 0x01, 0x28,
0x65, 0x73, 0x73, 0x12, 0x27, 0x0a, 0x0f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x03, 0x52, 0x11, 0x73, 0x63, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x42,
0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x63, 0x6f, 0x79, 0x74, 0x65, 0x73, 0x22, 0xfa, 0x01, 0x0a, 0x09, 0x4c, 0x6f, 0x61, 0x64, 0x49, 0x6e, 0x64,
0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x65, 0x78, 0x12, 0x30, 0x0a, 0x04, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b,
0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x32, 0x1c, 0x2e, 0x6d, 0x69, 0x6c, 0x76, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e,
0x01, 0x28, 0x09, 0x52, 0x0c, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4d, 0x73, 0x67, 0x42, 0x61, 0x73, 0x65, 0x52, 0x04,
0x65, 0x12, 0x52, 0x0a, 0x0f, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x62, 0x61, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x49,
0x73, 0x73, 0x65, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x6d, 0x69, 0x6c, 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, 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, 0x61, 0x6c, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x0a, 0x69,
0x67, 0x72, 0x65, 0x73, 0x73, 0x52, 0x0e, 0x74, 0x61, 0x73, 0x6b, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x6e, 0x64, 0x65, 0x78, 0x53, 0x74, 0x61, 0x74, 0x73, 0x22, 0x95, 0x01, 0x0a, 0x0c, 0x53, 0x65,
0x65, 0x73, 0x73, 0x65, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x65,
0x64, 0x5f, 0x72, 0x6f, 0x77, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x69, 0x6d, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x73,
0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x52, 0x6f, 0x77, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x74, 0x6f, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x44, 0x12, 0x1f, 0x0a, 0x0b, 0x6d, 0x65, 0x6d, 0x6f,
0x74, 0x61, 0x6c, 0x5f, 0x72, 0x6f, 0x77, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x72, 0x79, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x6d,
0x74, 0x6f, 0x74, 0x61, 0x6c, 0x52, 0x6f, 0x77, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x6e, 0x75, 0x6d,
0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x5f, 0x72, 0x6f, 0x77, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x6e, 0x75, 0x6d,
0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x22, 0x54, 0x0a, 0x1a, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x6f, 0x77, 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x72, 0x65, 0x63, 0x65, 0x6e, 0x74, 0x6c, 0x79,
0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x49, 0x6e, 0x5f, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52,
0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x62, 0x49, 0x44, 0x18, 0x01, 0x10, 0x72, 0x65, 0x63, 0x65, 0x6e, 0x74, 0x6c, 0x79, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65,
0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x64, 0x62, 0x49, 0x44, 0x12, 0x22, 0x0a, 0x0c, 0x63, 0x6f, 0x64, 0x22, 0xb7, 0x01, 0x0a, 0x12, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x54, 0x69, 0x6d,
0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x65, 0x54, 0x69, 0x63, 0x6b, 0x4d, 0x73, 0x67, 0x12, 0x30, 0x0a, 0x04, 0x62, 0x61, 0x73, 0x65,
0x52, 0x0c, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x22, 0x56, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6d, 0x69, 0x6c, 0x76, 0x75, 0x73, 0x2e,
0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x52, 0x65, 0x71, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4d, 0x73, 0x67,
0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x64, 0x62, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x42, 0x61, 0x73, 0x65, 0x52, 0x04, 0x62, 0x61, 0x73, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x63, 0x68,
0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x64, 0x62, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x27, 0x0a, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09,
0x0f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x52, 0x0c, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x1e,
0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x0a, 0x0a, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x73, 0x18, 0x03, 0x20, 0x03,
0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x86, 0x02, 0x0a, 0x13, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x28, 0x04, 0x52, 0x0a, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x73, 0x12, 0x2b,
0x6d, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x33, 0x0a, 0x11, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74,
0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x61, 0x6d, 0x70, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x10, 0x64, 0x65, 0x66, 0x61, 0x75,
0x2e, 0x6d, 0x69, 0x6c, 0x76, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x63, 0x6f, 0x6c, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0xd4, 0x01, 0x0a, 0x0e,
0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1a,
0x74, 0x75, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x6a, 0x6f, 0x62, 0x49, 0x44, 0x73, 0x18, 0x02, 0x20, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,
0x03, 0x28, 0x09, 0x52, 0x06, 0x6a, 0x6f, 0x62, 0x49, 0x44, 0x73, 0x12, 0x3d, 0x0a, 0x06, 0x73, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2d, 0x0a, 0x12, 0x65, 0x6e,
0x74, 0x61, 0x74, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x25, 0x2e, 0x6d, 0x69, 0x63, 0x72, 0x79, 0x70, 0x74, 0x65, 0x64, 0x5f, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64,
0x6c, 0x76, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x65,
0x6e, 0x61, 0x6c, 0x2e, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x4a, 0x6f, 0x62, 0x53, 0x74, 0x61, 0x64, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x65, 0x6e,
0x74, 0x65, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x65, 0x61, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x6e, 0x61, 0x6e,
0x61, 0x73, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x72, 0x65, 0x61, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x69, 0x73, 0x5f, 0x73, 0x75, 0x70, 0x65, 0x72, 0x18, 0x04, 0x20,
0x73, 0x6f, 0x6e, 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x01, 0x28, 0x08, 0x52, 0x07, 0x69, 0x73, 0x53, 0x75, 0x70, 0x65, 0x72, 0x12, 0x27, 0x0a, 0x0f,
0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x03, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x68, 0x61, 0x32, 0x35, 0x36, 0x5f, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18,
0x73, 0x73, 0x65, 0x73, 0x12, 0x29, 0x0a, 0x10, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x73, 0x68, 0x61, 0x32, 0x35, 0x36, 0x50, 0x61, 0x73,
0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0f, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x74, 0x69,
0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x22, 0x63, 0x6b, 0x18, 0x06, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x74, 0x69, 0x6d, 0x65, 0x54, 0x69,
0x74, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x49, 0x6e, 0x63, 0x6b, 0x22, 0x45, 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79,
0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x64, 0x62, 0x4e, 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, 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, 0x65, 0x12, 0x27, 0x0a, 0x0f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f,
0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x63, 0x6f, 0x6c, 0x6c,
0x69, 0x6f, 0x6e, 0x49, 0x44, 0x12, 0x1e, 0x0a, 0x0a, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x70, 0x61,
0x49, 0x44, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x03, 0x52, 0x0a, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01,
0x6e, 0x74, 0x49, 0x44, 0x73, 0x22, 0x3f, 0x0a, 0x0b, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x42, 0x69, 0x28, 0x09, 0x52, 0x0d, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d,
0x6e, 0x6c, 0x6f, 0x67, 0x12, 0x18, 0x0a, 0x07, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x49, 0x44, 0x18, 0x65, 0x12, 0x37, 0x0a, 0x05, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b,
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, 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, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x46,
0x61, 0x74, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x37, 0x0a, 0x05, 0x6c, 0x65, 0x69, 0x6c, 0x65, 0x52, 0x05, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x3b, 0x0a, 0x07, 0x6f, 0x70,
0x76, 0x65, 0x6c, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x21, 0x2e, 0x6d, 0x69, 0x6c, 0x76, 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, 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, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14,
0x76, 0x65, 0x6c, 0x12, 0x1b, 0x0a, 0x09, 0x69, 0x73, 0x5f, 0x73, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x0a, 0x05, 0x6a, 0x6f, 0x62, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6a,
0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x69, 0x73, 0x53, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x6f, 0x62, 0x49, 0x44, 0x22, 0x49, 0x0a, 0x18, 0x47, 0x65, 0x74, 0x49, 0x6d, 0x70, 0x6f, 0x72,
0x12, 0x43, 0x0a, 0x0b, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x5f, 0x6c, 0x6f, 0x67, 0x73, 0x18, 0x74, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x6d, 0x69, 0x6c, 0x76, 0x75, 0x73, 0x2e, 0x70, 0x12, 0x17, 0x0a, 0x07, 0x64, 0x62, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28,
0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x46, 0x69, 0x09, 0x52, 0x06, 0x64, 0x62, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6a, 0x6f, 0x62,
0x65, 0x6c, 0x64, 0x42, 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x52, 0x0a, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6a, 0x6f, 0x62, 0x49, 0x44, 0x22,
0x74, 0x4c, 0x6f, 0x67, 0x73, 0x12, 0x41, 0x0a, 0x0a, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x5f, 0x6c, 0x81, 0x02, 0x0a, 0x12, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x50, 0x72,
0x6f, 0x67, 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x6d, 0x69, 0x6c, 0x76, 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, 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, 0x6c, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x42, 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x52, 0x0a, 0x69,
0x65, 0x6c, 0x74, 0x61, 0x4c, 0x6f, 0x67, 0x73, 0x12, 0x41, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x74, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x12, 0x41, 0x0a, 0x0a, 0x64, 0x65, 0x6c,
0x73, 0x5f, 0x6c, 0x6f, 0x67, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x6d, 0x74, 0x61, 0x5f, 0x6c, 0x6f, 0x67, 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e,
0x69, 0x6c, 0x76, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x6d, 0x69, 0x6c, 0x76, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x69, 0x6e, 0x74,
0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x42, 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x42, 0x69, 0x6e, 0x6c, 0x6f,
0x52, 0x09, 0x73, 0x74, 0x61, 0x74, 0x73, 0x4c, 0x6f, 0x67, 0x73, 0x22, 0x96, 0x01, 0x0a, 0x17, 0x67, 0x52, 0x09, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x4c, 0x6f, 0x67, 0x73, 0x12, 0x41, 0x0a, 0x0a,
0x47, 0x65, 0x74, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x73, 0x74, 0x61, 0x74, 0x73, 0x5f, 0x6c, 0x6f, 0x67, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0b,
0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x33, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x32, 0x22, 0x2e, 0x6d, 0x69, 0x6c, 0x76, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e,
0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x6d, 0x69, 0x6c, 0x76, 0x75, 0x73, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x42, 0x69,
0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x53, 0x74, 0x6e, 0x6c, 0x6f, 0x67, 0x52, 0x09, 0x73, 0x74, 0x61, 0x74, 0x73, 0x4c, 0x6f, 0x67, 0x73, 0x22,
0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x46, 0x0a, 0x0c, 0x96, 0x01, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x49,
0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x73, 0x18, 0x02, 0x20, 0x03, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x33, 0x0a, 0x06, 0x73,
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, 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, 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, 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, 0x12, 0x46, 0x0a, 0x0c, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x73,
0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x49, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x6d, 0x69, 0x6c, 0x76, 0x75, 0x73, 0x2e,
0x6e, 0x66, 0x6f, 0x2a, 0x45, 0x0a, 0x09, 0x52, 0x61, 0x74, 0x65, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x53,
0x12, 0x0b, 0x0a, 0x07, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x10, 0x00, 0x12, 0x0c, 0x0a, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0c, 0x73, 0x65, 0x67, 0x6d,
0x08, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x10, 0x01, 0x12, 0x0e, 0x0a, 0x0a, 0x43, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x73, 0x22, 0x4a, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x51,
0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x50, 0x75, 0x6f, 0x74, 0x61, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65,
0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x10, 0x03, 0x2a, 0xc4, 0x01, 0x0a, 0x08, 0x52, 0x73, 0x74, 0x12, 0x30, 0x0a, 0x04, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b,
0x61, 0x74, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x11, 0x0a, 0x0d, 0x44, 0x44, 0x4c, 0x43, 0x6f, 0x32, 0x1c, 0x2e, 0x6d, 0x69, 0x6c, 0x76, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e,
0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x10, 0x00, 0x12, 0x10, 0x0a, 0x0c, 0x44, 0x44, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4d, 0x73, 0x67, 0x42, 0x61, 0x73, 0x65, 0x52, 0x04,
0x4c, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x10, 0x01, 0x12, 0x0c, 0x0a, 0x08, 0x62, 0x61, 0x73, 0x65, 0x22, 0x71, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x51, 0x75, 0x6f, 0x74, 0x61,
0x44, 0x44, 0x4c, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x10, 0x02, 0x12, 0x0c, 0x0a, 0x08, 0x44, 0x44, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12,
0x4c, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x10, 0x03, 0x12, 0x11, 0x0a, 0x0d, 0x44, 0x44, 0x4c, 0x43, 0x33, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32,
0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x10, 0x04, 0x12, 0x0d, 0x0a, 0x09, 0x44, 0x1b, 0x2e, 0x6d, 0x69, 0x6c, 0x76, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x63,
0x4d, 0x4c, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x10, 0x05, 0x12, 0x0d, 0x0a, 0x09, 0x44, 0x4d, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74,
0x4c, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x10, 0x06, 0x12, 0x0f, 0x0a, 0x0b, 0x44, 0x4d, 0x4c, 0x61, 0x74, 0x75, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f,
0x42, 0x75, 0x6c, 0x6b, 0x4c, 0x6f, 0x61, 0x64, 0x10, 0x07, 0x12, 0x0d, 0x0a, 0x09, 0x44, 0x51, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x6d, 0x65, 0x74, 0x72,
0x4c, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x10, 0x08, 0x12, 0x0c, 0x0a, 0x08, 0x44, 0x51, 0x4c, 0x69, 0x63, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x2a, 0x45, 0x0a, 0x09, 0x52, 0x61, 0x74, 0x65, 0x53,
0x51, 0x75, 0x65, 0x72, 0x79, 0x10, 0x09, 0x12, 0x0d, 0x0a, 0x09, 0x44, 0x4d, 0x4c, 0x55, 0x70, 0x63, 0x6f, 0x70, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x10,
0x73, 0x65, 0x72, 0x74, 0x10, 0x0a, 0x12, 0x09, 0x0a, 0x05, 0x44, 0x44, 0x4c, 0x44, 0x42, 0x10, 0x00, 0x12, 0x0c, 0x0a, 0x08, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x10, 0x01, 0x12,
0x0b, 0x2a, 0x83, 0x01, 0x0a, 0x0e, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x4a, 0x6f, 0x62, 0x53, 0x0e, 0x0a, 0x0a, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x10, 0x02, 0x12,
0x74, 0x61, 0x74, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x6f, 0x6e, 0x65, 0x10, 0x00, 0x12, 0x0b, 0x0d, 0x0a, 0x09, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x10, 0x03, 0x2a, 0xc4,
0x0a, 0x07, 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x10, 0x01, 0x12, 0x10, 0x0a, 0x0c, 0x50, 0x01, 0x0a, 0x08, 0x52, 0x61, 0x74, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x11, 0x0a, 0x0d, 0x44,
0x72, 0x65, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x44, 0x4c, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x10, 0x00, 0x12, 0x10,
0x09, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x10, 0x03, 0x12, 0x0a, 0x0a, 0x06, 0x0a, 0x0c, 0x44, 0x44, 0x4c, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x10, 0x01,
0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x10, 0x04, 0x12, 0x0d, 0x0a, 0x09, 0x43, 0x6f, 0x6d, 0x70, 0x12, 0x0c, 0x0a, 0x08, 0x44, 0x44, 0x4c, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x10, 0x02, 0x12, 0x0c,
0x6c, 0x65, 0x74, 0x65, 0x64, 0x10, 0x05, 0x12, 0x11, 0x0a, 0x0d, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x0a, 0x08, 0x44, 0x44, 0x4c, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x10, 0x03, 0x12, 0x11, 0x0a, 0x0d,
0x42, 0x75, 0x69, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x10, 0x06, 0x12, 0x0b, 0x0a, 0x07, 0x53, 0x6f, 0x44, 0x44, 0x4c, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x10, 0x04, 0x12,
0x72, 0x74, 0x69, 0x6e, 0x67, 0x10, 0x07, 0x42, 0x35, 0x5a, 0x33, 0x67, 0x69, 0x74, 0x68, 0x75, 0x0d, 0x0a, 0x09, 0x44, 0x4d, 0x4c, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x10, 0x05, 0x12, 0x0d,
0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6d, 0x69, 0x6c, 0x76, 0x75, 0x73, 0x2d, 0x69, 0x6f, 0x2f, 0x0a, 0x09, 0x44, 0x4d, 0x4c, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x10, 0x06, 0x12, 0x0f, 0x0a,
0x6d, 0x69, 0x6c, 0x76, 0x75, 0x73, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x76, 0x32, 0x2f, 0x70, 0x72, 0x0b, 0x44, 0x4d, 0x4c, 0x42, 0x75, 0x6c, 0x6b, 0x4c, 0x6f, 0x61, 0x64, 0x10, 0x07, 0x12, 0x0d,
0x6f, 0x74, 0x6f, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x70, 0x62, 0x62, 0x06, 0x0a, 0x09, 0x44, 0x51, 0x4c, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x10, 0x08, 0x12, 0x0c, 0x0a,
0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, 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 ( var (

View File

@ -11,6 +11,8 @@ message RetrieveResults {
repeated schema.FieldData fields_data = 3; repeated schema.FieldData fields_data = 3;
int64 all_retrieve_count = 4; int64 all_retrieve_count = 4;
bool has_more_result = 5; bool has_more_result = 5;
int64 scanned_remote_bytes = 6;
int64 scanned_total_bytes = 7;
} }
message LoadFieldMeta { message LoadFieldMeta {

View File

@ -32,6 +32,8 @@ type RetrieveResults struct {
FieldsData []*schemapb.FieldData `protobuf:"bytes,3,rep,name=fields_data,json=fieldsData,proto3" json:"fields_data,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"` 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"` 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() { func (x *RetrieveResults) Reset() {
@ -101,6 +103,20 @@ func (x *RetrieveResults) GetHasMoreResult() bool {
return false 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 { type LoadFieldMeta struct {
state protoimpl.MessageState state protoimpl.MessageState
sizeCache protoimpl.SizeCache 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 0x12, 0x30, 0x0a, 0x14, 0x73, 0x63, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x5f, 0x72, 0x65, 0x6d, 0x6f,
0x61, 0x12, 0x23, 0x0a, 0x0d, 0x6d, 0x69, 0x6e, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x74, 0x65, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x12,
0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x6d, 0x69, 0x6e, 0x54, 0x69, 0x6d, 0x73, 0x63, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x42, 0x79, 0x74,
0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x23, 0x0a, 0x0d, 0x6d, 0x61, 0x78, 0x5f, 0x74, 0x69, 0x65, 0x73, 0x12, 0x2e, 0x0a, 0x13, 0x73, 0x63, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x5f, 0x74, 0x6f,
0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x6d, 0x74, 0x61, 0x6c, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x52,
0x61, 0x78, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x1b, 0x0a, 0x09, 0x72, 0x11, 0x73, 0x63, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x42, 0x79, 0x74,
0x6f, 0x77, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x65, 0x73, 0x22, 0x76, 0x0a, 0x0d, 0x4c, 0x6f, 0x61, 0x64, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4d,
0x72, 0x6f, 0x77, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x6b, 0x0a, 0x0f, 0x4c, 0x6f, 0x61, 0x64, 0x65, 0x74, 0x61, 0x12, 0x23, 0x0a, 0x0d, 0x6d, 0x69, 0x6e, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73,
0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x39, 0x0a, 0x05, 0x6d, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x6d, 0x69, 0x6e, 0x54,
0x65, 0x74, 0x61, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x6d, 0x69, 0x6c, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x23, 0x0a, 0x0d, 0x6d, 0x61, 0x78, 0x5f,
0x76, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x73, 0x65, 0x67, 0x63, 0x6f, 0x72, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52,
0x65, 0x2e, 0x4c, 0x6f, 0x61, 0x64, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4d, 0x65, 0x74, 0x61, 0x52, 0x0c, 0x6d, 0x61, 0x78, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x1b, 0x0a,
0x05, 0x6d, 0x65, 0x74, 0x61, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x09, 0x72, 0x6f, 0x77, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03,
0x73, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x6f, 0x74, 0x61, 0x52, 0x08, 0x72, 0x6f, 0x77, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x6b, 0x0a, 0x0f, 0x4c, 0x6f,
0x6c, 0x53, 0x69, 0x7a, 0x65, 0x22, 0x6a, 0x0a, 0x0c, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x52, 0x61, 0x64, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x39, 0x0a,
0x65, 0x63, 0x6f, 0x72, 0x64, 0x12, 0x3f, 0x0a, 0x0b, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x5f, 0x05, 0x6d, 0x65, 0x74, 0x61, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x6d,
0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x6d, 0x69, 0x6c, 0x69, 0x6c, 0x76, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x73, 0x65, 0x67, 0x63,
0x76, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x6f, 0x72, 0x65, 0x2e, 0x4c, 0x6f, 0x61, 0x64, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4d, 0x65, 0x74,
0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x44, 0x61, 0x74, 0x61, 0x52, 0x0a, 0x66, 0x69, 0x65, 0x6c, 0x61, 0x52, 0x05, 0x6d, 0x65, 0x74, 0x61, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x74, 0x6f, 0x74, 0x61,
0x64, 0x73, 0x44, 0x61, 0x74, 0x61, 0x12, 0x19, 0x0a, 0x08, 0x6e, 0x75, 0x6d, 0x5f, 0x72, 0x6f, 0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x6f,
0x77, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x6e, 0x75, 0x6d, 0x52, 0x6f, 0x77, 0x74, 0x61, 0x6c, 0x53, 0x69, 0x7a, 0x65, 0x22, 0x6a, 0x0a, 0x0c, 0x49, 0x6e, 0x73, 0x65, 0x72,
0x73, 0x22, 0xea, 0x02, 0x0a, 0x0e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x12, 0x3f, 0x0a, 0x0b, 0x66, 0x69, 0x65, 0x6c, 0x64,
0x4d, 0x65, 0x74, 0x61, 0x12, 0x18, 0x0a, 0x07, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x49, 0x44, 0x18, 0x73, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x6d,
0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x49, 0x44, 0x12, 0x22, 0x69, 0x6c, 0x76, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x73, 0x63, 0x68, 0x65,
0x0a, 0x0c, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x18, 0x02, 0x6d, 0x61, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x44, 0x61, 0x74, 0x61, 0x52, 0x0a, 0x66, 0x69,
0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x65, 0x6c, 0x64, 0x73, 0x44, 0x61, 0x74, 0x61, 0x12, 0x19, 0x0a, 0x08, 0x6e, 0x75, 0x6d, 0x5f,
0x49, 0x44, 0x12, 0x1d, 0x0a, 0x0a, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x72, 0x6f, 0x77, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x6e, 0x75, 0x6d, 0x52,
0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4e, 0x61, 0x6d, 0x6f, 0x77, 0x73, 0x22, 0xea, 0x02, 0x0a, 0x0e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x49, 0x6e, 0x64,
0x65, 0x12, 0x42, 0x0a, 0x0b, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x65, 0x78, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x18, 0x0a, 0x07, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x49,
0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6d, 0x69, 0x6c, 0x76, 0x75, 0x73, 0x2e, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x49, 0x44,
0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4b, 0x65, 0x79, 0x12, 0x22, 0x0a, 0x0c, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44,
0x56, 0x61, 0x6c, 0x75, 0x65, 0x50, 0x61, 0x69, 0x72, 0x52, 0x0a, 0x74, 0x79, 0x70, 0x65, 0x50, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69,
0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x44, 0x0a, 0x0c, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5f, 0x70, 0x6f, 0x6e, 0x49, 0x44, 0x12, 0x1d, 0x0a, 0x0a, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5f, 0x6e, 0x61,
0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6d, 0x69, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4e,
0x6c, 0x76, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x61, 0x6d, 0x65, 0x12, 0x42, 0x0a, 0x0b, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x70, 0x61, 0x72, 0x61,
0x6e, 0x2e, 0x4b, 0x65, 0x79, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x50, 0x61, 0x69, 0x72, 0x52, 0x0b, 0x6d, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6d, 0x69, 0x6c, 0x76, 0x75,
0x69, 0x6e, 0x64, 0x65, 0x78, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x22, 0x0a, 0x0d, 0x69, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4b,
0x73, 0x5f, 0x61, 0x75, 0x74, 0x6f, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x06, 0x20, 0x01, 0x65, 0x79, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x50, 0x61, 0x69, 0x72, 0x52, 0x0a, 0x74, 0x79, 0x70,
0x28, 0x08, 0x52, 0x0b, 0x69, 0x73, 0x41, 0x75, 0x74, 0x6f, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x65, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x44, 0x0a, 0x0c, 0x69, 0x6e, 0x64, 0x65, 0x78,
0x4d, 0x0a, 0x11, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5f, 0x70, 0x61, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e,
0x72, 0x61, 0x6d, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6d, 0x69, 0x6c, 0x6d, 0x69, 0x6c, 0x76, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x63, 0x6f, 0x6d,
0x76, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x6d, 0x6f, 0x6e, 0x2e, 0x4b, 0x65, 0x79, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x50, 0x61, 0x69, 0x72,
0x2e, 0x4b, 0x65, 0x79, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x50, 0x61, 0x69, 0x72, 0x52, 0x0f, 0x75, 0x52, 0x0b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x22, 0x0a,
0x73, 0x65, 0x72, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x22, 0x88, 0x0d, 0x69, 0x73, 0x5f, 0x61, 0x75, 0x74, 0x6f, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x06,
0x01, 0x0a, 0x13, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x69, 0x73, 0x41, 0x75, 0x74, 0x6f, 0x49, 0x6e, 0x64, 0x65,
0x65, 0x78, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x2a, 0x0a, 0x10, 0x6d, 0x61, 0x78, 0x49, 0x6e, 0x64, 0x78, 0x12, 0x4d, 0x0a, 0x11, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5f,
0x65, 0x78, 0x52, 0x6f, 0x77, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6d,
0x52, 0x10, 0x6d, 0x61, 0x78, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x6f, 0x77, 0x43, 0x6f, 0x75, 0x69, 0x6c, 0x76, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d,
0x6e, 0x74, 0x12, 0x45, 0x0a, 0x0b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x6f, 0x6e, 0x2e, 0x4b, 0x65, 0x79, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x50, 0x61, 0x69, 0x72, 0x52,
0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x6d, 0x69, 0x6c, 0x76, 0x75, 0x73, 0x0f, 0x75, 0x73, 0x65, 0x72, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73,
0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x73, 0x65, 0x67, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x46, 0x22, 0x88, 0x01, 0x0a, 0x13, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49,
0x69, 0x65, 0x6c, 0x64, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4d, 0x65, 0x74, 0x61, 0x52, 0x0a, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x2a, 0x0a, 0x10, 0x6d, 0x61, 0x78, 0x49,
0x6e, 0x64, 0x65, 0x78, 0x4d, 0x65, 0x74, 0x61, 0x73, 0x42, 0x34, 0x5a, 0x32, 0x67, 0x69, 0x74, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x6f, 0x77, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01,
0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6d, 0x69, 0x6c, 0x76, 0x75, 0x73, 0x2d, 0x69, 0x28, 0x03, 0x52, 0x10, 0x6d, 0x61, 0x78, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x6f, 0x77, 0x43,
0x6f, 0x2f, 0x6d, 0x69, 0x6c, 0x76, 0x75, 0x73, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x76, 0x32, 0x2f, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x45, 0x0a, 0x0b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5f, 0x6d, 0x65,
0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x73, 0x65, 0x67, 0x63, 0x6f, 0x72, 0x65, 0x70, 0x62, 0x62, 0x74, 0x61, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x6d, 0x69, 0x6c, 0x76,
0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, 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 ( var (

View File

@ -28,8 +28,8 @@ pytest-parallel
pytest-random-order pytest-random-order
# pymilvus # pymilvus
pymilvus==2.7.0rc29 pymilvus==2.7.0rc33
pymilvus[bulk_writer]==2.7.0rc29 pymilvus[bulk_writer]==2.7.0rc33
# for protobuf # for protobuf
protobuf>=5.29.5 protobuf>=5.29.5