mirror of
https://gitee.com/milvus-io/milvus.git
synced 2024-12-03 04:19:18 +08:00
#266 Rpc request source code refactor
This commit is contained in:
commit
f3ae1bf155
@ -8,21 +8,25 @@ Please mark all change in change log and use the ticket from JIRA.
|
||||
- \#246 - Exclude src/external folder from code coverage for jenkin ci
|
||||
- \#248 - Reside src/external in thirdparty
|
||||
- \#316 - Some files not merged after vectors added
|
||||
- \#327 - Search does not use GPU when index type is FLAT
|
||||
- \#340 - Test cases run failed on 0.6.0
|
||||
- \#353 - Rename config.h.in to version.h.in
|
||||
- \#374 - sdk_simple return empty result
|
||||
|
||||
## Feature
|
||||
- \#12 - Pure CPU version for Milvus
|
||||
- \#77 - Support table partition
|
||||
- \#226 - Experimental shards middleware for Milvus
|
||||
- \#127 - Support new Index type IVFPQ
|
||||
|
||||
## Improvement
|
||||
- \#275 - Rename C++ SDK IndexType
|
||||
- \#284 - Change C++ SDK to shared library
|
||||
- \#260 - C++ SDK README
|
||||
- \#266 - Rpc request source code refactor
|
||||
- \#314 - add Find FAISS in CMake
|
||||
- \#310 - Add Q&A for 'protocol https not supported or disable in libcurl' issue
|
||||
- \#322 - Add option to enable / disable prometheus
|
||||
- \#322 - Add option to enable / disable prometheus
|
||||
- \#358 - Add more information in build.sh and install.md
|
||||
|
||||
## Task
|
||||
|
@ -75,7 +75,13 @@ set(thirdparty_files
|
||||
)
|
||||
|
||||
aux_source_directory(${MILVUS_ENGINE_SRC}/server server_files)
|
||||
aux_source_directory(${MILVUS_ENGINE_SRC}/server/grpc_impl grpc_server_files)
|
||||
aux_source_directory(${MILVUS_ENGINE_SRC}/server/grpc_impl/request grpc_request_files)
|
||||
aux_source_directory(${MILVUS_ENGINE_SRC}/server/grpc_impl grpc_impl_files)
|
||||
set(grpc_server_files
|
||||
${grpc_request_files}
|
||||
${grpc_impl_files}
|
||||
)
|
||||
|
||||
aux_source_directory(${MILVUS_ENGINE_SRC}/utils utils_files)
|
||||
aux_source_directory(${MILVUS_ENGINE_SRC}/wrapper wrapper_files)
|
||||
|
||||
|
@ -26,6 +26,7 @@
|
||||
namespace milvus {
|
||||
namespace engine {
|
||||
|
||||
// TODO(linxj): replace with VecIndex::IndexType
|
||||
enum class EngineType {
|
||||
INVALID = 0,
|
||||
FAISS_IDMAP = 1,
|
||||
@ -33,7 +34,8 @@ enum class EngineType {
|
||||
FAISS_IVFSQ8,
|
||||
NSG_MIX,
|
||||
FAISS_IVFSQ8H,
|
||||
MAX_VALUE = FAISS_IVFSQ8H,
|
||||
FAISS_PQ,
|
||||
MAX_VALUE = FAISS_PQ,
|
||||
};
|
||||
|
||||
enum class MetricType {
|
||||
|
@ -116,6 +116,14 @@ ExecutionEngineImpl::CreatetVecIndex(EngineType type) {
|
||||
index = GetVecIndexFactory(IndexType::FAISS_IVFSQ8_HYBRID);
|
||||
break;
|
||||
}
|
||||
case EngineType::FAISS_PQ: {
|
||||
#ifdef MILVUS_CPU_VERSION
|
||||
index = GetVecIndexFactory(IndexType::FAISS_IVFPQ_CPU);
|
||||
#else
|
||||
index = GetVecIndexFactory(IndexType::FAISS_IVFPQ_MIX);
|
||||
#endif
|
||||
break;
|
||||
}
|
||||
default: {
|
||||
ENGINE_LOG_ERROR << "Unsupported index type";
|
||||
return nullptr;
|
||||
|
@ -1321,7 +1321,8 @@ class RowRecord :
|
||||
void clear_vector_data();
|
||||
float vector_data(int index) const;
|
||||
void set_vector_data(int index, float value);
|
||||
void add_vector_data(float value);
|
||||
// void add_vector_data(float value);
|
||||
void add_vector_data(std::vector<float>::const_iterator begin, std::vector<float>::const_iterator end);
|
||||
const ::PROTOBUF_NAMESPACE_ID::RepeatedField< float >&
|
||||
vector_data() const;
|
||||
::PROTOBUF_NAMESPACE_ID::RepeatedField< float >*
|
||||
@ -1473,7 +1474,9 @@ class InsertParam :
|
||||
void clear_row_id_array();
|
||||
::PROTOBUF_NAMESPACE_ID::int64 row_id_array(int index) const;
|
||||
void set_row_id_array(int index, ::PROTOBUF_NAMESPACE_ID::int64 value);
|
||||
void add_row_id_array(::PROTOBUF_NAMESPACE_ID::int64 value);
|
||||
// void add_row_id_array(::PROTOBUF_NAMESPACE_ID::int64 value);
|
||||
void add_row_id_array(std::vector<::PROTOBUF_NAMESPACE_ID::int64>::const_iterator begin,
|
||||
std::vector<::PROTOBUF_NAMESPACE_ID::int64>::const_iterator end);
|
||||
const ::PROTOBUF_NAMESPACE_ID::RepeatedField< ::PROTOBUF_NAMESPACE_ID::int64 >&
|
||||
row_id_array() const;
|
||||
::PROTOBUF_NAMESPACE_ID::RepeatedField< ::PROTOBUF_NAMESPACE_ID::int64 >*
|
||||
@ -2136,7 +2139,9 @@ class TopKQueryResult :
|
||||
void clear_ids();
|
||||
::PROTOBUF_NAMESPACE_ID::int64 ids(int index) const;
|
||||
void set_ids(int index, ::PROTOBUF_NAMESPACE_ID::int64 value);
|
||||
void add_ids(::PROTOBUF_NAMESPACE_ID::int64 value);
|
||||
// void add_ids(::PROTOBUF_NAMESPACE_ID::int64 value);
|
||||
void add_ids(std::vector<::PROTOBUF_NAMESPACE_ID::int64>::const_iterator begin,
|
||||
std::vector<::PROTOBUF_NAMESPACE_ID::int64>::const_iterator end);
|
||||
const ::PROTOBUF_NAMESPACE_ID::RepeatedField< ::PROTOBUF_NAMESPACE_ID::int64 >&
|
||||
ids() const;
|
||||
::PROTOBUF_NAMESPACE_ID::RepeatedField< ::PROTOBUF_NAMESPACE_ID::int64 >*
|
||||
@ -2147,7 +2152,8 @@ class TopKQueryResult :
|
||||
void clear_distances();
|
||||
float distances(int index) const;
|
||||
void set_distances(int index, float value);
|
||||
void add_distances(float value);
|
||||
// void add_distances(float value);
|
||||
void add_distances(std::vector<float>::const_iterator begin, std::vector<float>::const_iterator end);
|
||||
const ::PROTOBUF_NAMESPACE_ID::RepeatedField< float >&
|
||||
distances() const;
|
||||
::PROTOBUF_NAMESPACE_ID::RepeatedField< float >*
|
||||
@ -3922,9 +3928,14 @@ inline void RowRecord::set_vector_data(int index, float value) {
|
||||
vector_data_.Set(index, value);
|
||||
// @@protoc_insertion_point(field_set:milvus.grpc.RowRecord.vector_data)
|
||||
}
|
||||
inline void RowRecord::add_vector_data(float value) {
|
||||
vector_data_.Add(value);
|
||||
// @@protoc_insertion_point(field_add:milvus.grpc.RowRecord.vector_data)
|
||||
//inline void RowRecord::add_vector_data(float value) {
|
||||
// vector_data_.Add(value);
|
||||
// // @@protoc_insertion_point(field_add:milvus.grpc.RowRecord.vector_data)
|
||||
//}
|
||||
inline void RowRecord::add_vector_data(std::vector<float>::const_iterator begin,
|
||||
std::vector<float>::const_iterator end) {
|
||||
vector_data_.Add(begin, end);
|
||||
// @@protoc_insertion_point(field_add:milvus.grpc.RowRecord.vector_data)
|
||||
}
|
||||
inline const ::PROTOBUF_NAMESPACE_ID::RepeatedField< float >&
|
||||
RowRecord::vector_data() const {
|
||||
@ -4037,9 +4048,14 @@ inline void InsertParam::set_row_id_array(int index, ::PROTOBUF_NAMESPACE_ID::in
|
||||
row_id_array_.Set(index, value);
|
||||
// @@protoc_insertion_point(field_set:milvus.grpc.InsertParam.row_id_array)
|
||||
}
|
||||
inline void InsertParam::add_row_id_array(::PROTOBUF_NAMESPACE_ID::int64 value) {
|
||||
row_id_array_.Add(value);
|
||||
// @@protoc_insertion_point(field_add:milvus.grpc.InsertParam.row_id_array)
|
||||
//inline void InsertParam::add_row_id_array(::PROTOBUF_NAMESPACE_ID::int64 value) {
|
||||
// row_id_array_.Add(value);
|
||||
// // @@protoc_insertion_point(field_add:milvus.grpc.InsertParam.row_id_array)
|
||||
//}
|
||||
inline void InsertParam::add_row_id_array(std::vector<::PROTOBUF_NAMESPACE_ID::int64>::const_iterator begin,
|
||||
std::vector<::PROTOBUF_NAMESPACE_ID::int64>::const_iterator end) {
|
||||
row_id_array_.Add(begin, end);
|
||||
// @@protoc_insertion_point(field_add:milvus.grpc.InsertParam.row_id_array)
|
||||
}
|
||||
inline const ::PROTOBUF_NAMESPACE_ID::RepeatedField< ::PROTOBUF_NAMESPACE_ID::int64 >&
|
||||
InsertParam::row_id_array() const {
|
||||
@ -4588,9 +4604,14 @@ inline void TopKQueryResult::set_ids(int index, ::PROTOBUF_NAMESPACE_ID::int64 v
|
||||
ids_.Set(index, value);
|
||||
// @@protoc_insertion_point(field_set:milvus.grpc.TopKQueryResult.ids)
|
||||
}
|
||||
inline void TopKQueryResult::add_ids(::PROTOBUF_NAMESPACE_ID::int64 value) {
|
||||
ids_.Add(value);
|
||||
// @@protoc_insertion_point(field_add:milvus.grpc.TopKQueryResult.ids)
|
||||
//inline void TopKQueryResult::add_ids(::PROTOBUF_NAMESPACE_ID::int64 value) {
|
||||
// ids_.Add(value);
|
||||
// // @@protoc_insertion_point(field_add:milvus.grpc.TopKQueryResult.ids)
|
||||
//}
|
||||
inline void TopKQueryResult::add_ids(std::vector<::PROTOBUF_NAMESPACE_ID::int64>::const_iterator begin,
|
||||
std::vector<::PROTOBUF_NAMESPACE_ID::int64>::const_iterator end) {
|
||||
ids_.Add(begin,end);
|
||||
// @@protoc_insertion_point(field_add:milvus.grpc.TopKQueryResult.ids)
|
||||
}
|
||||
inline const ::PROTOBUF_NAMESPACE_ID::RepeatedField< ::PROTOBUF_NAMESPACE_ID::int64 >&
|
||||
TopKQueryResult::ids() const {
|
||||
@ -4618,9 +4639,13 @@ inline void TopKQueryResult::set_distances(int index, float value) {
|
||||
distances_.Set(index, value);
|
||||
// @@protoc_insertion_point(field_set:milvus.grpc.TopKQueryResult.distances)
|
||||
}
|
||||
inline void TopKQueryResult::add_distances(float value) {
|
||||
distances_.Add(value);
|
||||
// @@protoc_insertion_point(field_add:milvus.grpc.TopKQueryResult.distances)
|
||||
//inline void TopKQueryResult::add_distances(float value) {
|
||||
// distances_.Add(value);
|
||||
// // @@protoc_insertion_point(field_add:milvus.grpc.TopKQueryResult.distances)
|
||||
//}
|
||||
inline void TopKQueryResult::add_distances(std::vector<float>::const_iterator begin, std::vector<float>::const_iterator end) {
|
||||
distances_.Add(begin, end);
|
||||
// @@protoc_insertion_point(field_add:milvus.grpc.TopKQueryResult.distances)
|
||||
}
|
||||
inline const ::PROTOBUF_NAMESPACE_ID::RepeatedField< float >&
|
||||
TopKQueryResult::distances() const {
|
||||
|
@ -39,17 +39,19 @@ GPUIVFPQ::Train(const DatasetPtr& dataset, const Config& config) {
|
||||
|
||||
GETTENSOR(dataset)
|
||||
|
||||
// TODO(linxj): set device here.
|
||||
// TODO(linxj): set gpu resource here.
|
||||
faiss::gpu::StandardGpuResources res;
|
||||
faiss::gpu::GpuIndexIVFPQ device_index(&res, dim, build_cfg->nlist, build_cfg->m, build_cfg->nbits,
|
||||
GetMetricType(build_cfg->metric_type)); // IP not support
|
||||
device_index.train(rows, (float*)p_data);
|
||||
|
||||
std::shared_ptr<faiss::Index> host_index = nullptr;
|
||||
host_index.reset(faiss::gpu::index_gpu_to_cpu(&device_index));
|
||||
|
||||
return std::make_shared<IVFIndexModel>(host_index);
|
||||
auto temp_resource = FaissGpuResourceMgr::GetInstance().GetRes(gpu_id_);
|
||||
if (temp_resource != nullptr) {
|
||||
ResScope rs(temp_resource, gpu_id_, true);
|
||||
auto device_index = new faiss::gpu::GpuIndexIVFPQ(temp_resource->faiss_res.get(), dim, build_cfg->nlist,
|
||||
build_cfg->m, build_cfg->nbits,
|
||||
GetMetricType(build_cfg->metric_type)); // IP not support
|
||||
device_index->train(rows, (float*)p_data);
|
||||
std::shared_ptr<faiss::Index> host_index = nullptr;
|
||||
host_index.reset(faiss::gpu::index_gpu_to_cpu(device_index));
|
||||
return std::make_shared<IVFIndexModel>(host_index);
|
||||
} else {
|
||||
KNOWHERE_THROW_MSG("Build IVFSQ can't get gpu resource");
|
||||
}
|
||||
}
|
||||
|
||||
std::shared_ptr<faiss::IVFSearchParameters>
|
||||
@ -66,7 +68,14 @@ GPUIVFPQ::GenParams(const Config& config) {
|
||||
|
||||
VectorIndexPtr
|
||||
GPUIVFPQ::CopyGpuToCpu(const Config& config) {
|
||||
KNOWHERE_THROW_MSG("not support yet");
|
||||
std::lock_guard<std::mutex> lk(mutex_);
|
||||
|
||||
faiss::Index* device_index = index_.get();
|
||||
faiss::Index* host_index = faiss::gpu::index_gpu_to_cpu(device_index);
|
||||
|
||||
std::shared_ptr<faiss::Index> new_index;
|
||||
new_index.reset(host_index);
|
||||
return std::make_shared<IVFPQ>(new_index);
|
||||
}
|
||||
|
||||
} // namespace knowhere
|
||||
|
@ -18,6 +18,7 @@
|
||||
#pragma once
|
||||
|
||||
#include <memory>
|
||||
#include <utility>
|
||||
|
||||
#include "IndexGPUIVF.h"
|
||||
|
||||
@ -28,6 +29,10 @@ class GPUIVFPQ : public GPUIVF {
|
||||
explicit GPUIVFPQ(const int& device_id) : GPUIVF(device_id) {
|
||||
}
|
||||
|
||||
GPUIVFPQ(std::shared_ptr<faiss::Index> index, const int64_t& device_id, ResPtr& resource)
|
||||
: GPUIVF(std::move(index), device_id, resource) {
|
||||
}
|
||||
|
||||
IndexModelPtr
|
||||
Train(const DatasetPtr& dataset, const Config& config) override;
|
||||
|
||||
|
@ -17,11 +17,19 @@
|
||||
|
||||
#include <faiss/IndexFlat.h>
|
||||
#include <faiss/IndexIVFPQ.h>
|
||||
#ifdef MILVUS_GPU_VERSION
|
||||
#include <faiss/gpu/GpuCloner.h>
|
||||
#endif
|
||||
|
||||
#include <memory>
|
||||
#include <utility>
|
||||
|
||||
#include "knowhere/adapter/VectorAdapter.h"
|
||||
#include "knowhere/common/Exception.h"
|
||||
#ifdef MILVUS_GPU_VERSION
|
||||
#include "knowhere/index/vector_index/IndexGPUIVF.h"
|
||||
#include "knowhere/index/vector_index/IndexGPUIVFPQ.h"
|
||||
#endif
|
||||
#include "knowhere/index/vector_index/IndexIVFPQ.h"
|
||||
|
||||
namespace knowhere {
|
||||
@ -60,4 +68,22 @@ IVFPQ::Clone_impl(const std::shared_ptr<faiss::Index>& index) {
|
||||
return std::make_shared<IVFPQ>(index);
|
||||
}
|
||||
|
||||
VectorIndexPtr
|
||||
IVFPQ::CopyCpuToGpu(const int64_t& device_id, const Config& config) {
|
||||
#ifdef MILVUS_GPU_VERSION
|
||||
if (auto res = FaissGpuResourceMgr::GetInstance().GetRes(device_id)) {
|
||||
ResScope rs(res, device_id, false);
|
||||
auto gpu_index = faiss::gpu::index_cpu_to_gpu(res->faiss_res.get(), device_id, index_.get());
|
||||
|
||||
std::shared_ptr<faiss::Index> device_index;
|
||||
device_index.reset(gpu_index);
|
||||
return std::make_shared<GPUIVFPQ>(device_index, device_id, res);
|
||||
} else {
|
||||
KNOWHERE_THROW_MSG("CopyCpuToGpu Error, can't get gpu_resource");
|
||||
}
|
||||
#else
|
||||
KNOWHERE_THROW_MSG("Calling IVFPQ::CopyCpuToGpu when we are using CPU version");
|
||||
#endif
|
||||
}
|
||||
|
||||
} // namespace knowhere
|
||||
|
@ -34,6 +34,9 @@ class IVFPQ : public IVF {
|
||||
IndexModelPtr
|
||||
Train(const DatasetPtr& dataset, const Config& config) override;
|
||||
|
||||
VectorIndexPtr
|
||||
CopyCpuToGpu(const int64_t& device_id, const Config& config) override;
|
||||
|
||||
protected:
|
||||
std::shared_ptr<faiss::IVFSearchParameters>
|
||||
GenParams(const Config& config) override;
|
||||
|
@ -49,7 +49,7 @@ CopyCpuToGpu(const VectorIndexPtr& index, const int64_t& device_id, const Config
|
||||
if (auto cpu_index = std::dynamic_pointer_cast<IVFSQ>(index)) {
|
||||
return cpu_index->CopyCpuToGpu(device_id, config);
|
||||
} else if (auto cpu_index = std::dynamic_pointer_cast<IVFPQ>(index)) {
|
||||
KNOWHERE_THROW_MSG("IVFPQ not support transfer to gpu");
|
||||
return cpu_index->CopyCpuToGpu(device_id, config);
|
||||
} else if (auto cpu_index = std::dynamic_pointer_cast<IVF>(index)) {
|
||||
return cpu_index->CopyCpuToGpu(device_id, config);
|
||||
} else if (auto cpu_index = std::dynamic_pointer_cast<IDMAP>(index)) {
|
||||
|
@ -213,7 +213,7 @@ TEST_P(IVFTest, clone_test) {
|
||||
|
||||
{
|
||||
// copy from gpu to cpu
|
||||
std::vector<std::string> support_idx_vec{"GPUIVF", "GPUIVFSQ", "IVFSQHybrid"};
|
||||
std::vector<std::string> support_idx_vec{"GPUIVF", "GPUIVFSQ", "GPUIVFPQ", "IVFSQHybrid"};
|
||||
auto finder = std::find(support_idx_vec.cbegin(), support_idx_vec.cend(), index_type);
|
||||
if (finder != support_idx_vec.cend()) {
|
||||
EXPECT_NO_THROW({
|
||||
@ -238,7 +238,7 @@ TEST_P(IVFTest, clone_test) {
|
||||
|
||||
{
|
||||
// copy to gpu
|
||||
std::vector<std::string> support_idx_vec{"IVF", "GPUIVF", "IVFSQ", "GPUIVFSQ"};
|
||||
std::vector<std::string> support_idx_vec{"IVF", "GPUIVF", "IVFSQ", "GPUIVFSQ", "IVFPQ", "GPUIVFPQ"};
|
||||
auto finder = std::find(support_idx_vec.cbegin(), support_idx_vec.cend(), index_type);
|
||||
if (finder != support_idx_vec.cend()) {
|
||||
EXPECT_NO_THROW({
|
||||
|
@ -33,8 +33,7 @@ namespace milvus {
|
||||
namespace interface {
|
||||
|
||||
struct dumpable {
|
||||
virtual ~dumpable() {
|
||||
}
|
||||
virtual ~dumpable() = default;
|
||||
|
||||
virtual json
|
||||
Dump() const = 0;
|
||||
|
@ -34,7 +34,8 @@ OnlyGPUPass::Run(const TaskPtr& task) {
|
||||
|
||||
auto search_task = std::static_pointer_cast<XSearchTask>(task);
|
||||
if (search_task->file_->engine_type_ != (int)engine::EngineType::FAISS_IVFSQ8 &&
|
||||
search_task->file_->engine_type_ != (int)engine::EngineType::FAISS_IVFFLAT) {
|
||||
search_task->file_->engine_type_ != (int)engine::EngineType::FAISS_IVFFLAT &&
|
||||
search_task->file_->engine_type_ != (int)engine::EngineType::FAISS_IDMAP) {
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -32,13 +32,6 @@ UriCheck(const std::string& uri) {
|
||||
return (index != std::string::npos);
|
||||
}
|
||||
|
||||
void
|
||||
CopyRowRecord(::milvus::grpc::RowRecord* target, const RowRecord& src) {
|
||||
auto vector_data = target->mutable_vector_data();
|
||||
vector_data->Resize(static_cast<int>(src.data.size()), 0.0);
|
||||
memcpy(vector_data->mutable_data(), src.data.data(), src.data.size() * sizeof(float));
|
||||
}
|
||||
|
||||
Status
|
||||
ClientProxy::Connect(const ConnectParam& param) {
|
||||
std::string uri = param.ip_address + ":" + param.port;
|
||||
@ -196,17 +189,14 @@ ClientProxy::Insert(const std::string& table_name, const std::string& partition_
|
||||
|
||||
for (auto& record : record_array) {
|
||||
::milvus::grpc::RowRecord* grpc_record = insert_param.add_row_record_array();
|
||||
CopyRowRecord(grpc_record, record);
|
||||
grpc_record->add_vector_data(record.data.begin(), record.data.end());
|
||||
}
|
||||
|
||||
// Single thread
|
||||
::milvus::grpc::VectorIds vector_ids;
|
||||
if (!id_array.empty()) {
|
||||
/* set user's ids */
|
||||
auto row_ids = insert_param.mutable_row_id_array();
|
||||
row_ids->Reserve(static_cast<int>(id_array.size()));
|
||||
memcpy(row_ids->mutable_data(), id_array.data(), id_array.size() * sizeof(int64_t));
|
||||
|
||||
insert_param.add_row_id_array(id_array.begin(), id_array.end());
|
||||
client_ptr_->Insert(vector_ids, insert_param, status);
|
||||
} else {
|
||||
client_ptr_->Insert(vector_ids, insert_param, status);
|
||||
@ -236,7 +226,7 @@ ClientProxy::Search(const std::string& table_name, const std::vector<std::string
|
||||
}
|
||||
for (auto& record : query_record_array) {
|
||||
::milvus::grpc::RowRecord* row_record = search_param.add_query_record_array();
|
||||
CopyRowRecord(row_record, record);
|
||||
row_record->add_vector_data(record.data.begin(), record.data.end());
|
||||
}
|
||||
|
||||
// step 2: convert range array
|
||||
|
@ -16,7 +16,24 @@
|
||||
// under the License.
|
||||
|
||||
#include "server/grpc_impl/GrpcRequestHandler.h"
|
||||
#include "server/grpc_impl/GrpcRequestTask.h"
|
||||
#include "server/grpc_impl/GrpcRequestScheduler.h"
|
||||
#include "server/grpc_impl/request/CmdRequest.h"
|
||||
#include "server/grpc_impl/request/CountTableRequest.h"
|
||||
#include "server/grpc_impl/request/CreateIndexRequest.h"
|
||||
#include "server/grpc_impl/request/CreatePartitionRequest.h"
|
||||
#include "server/grpc_impl/request/CreateTableRequest.h"
|
||||
#include "server/grpc_impl/request/DeleteByDateRequest.h"
|
||||
#include "server/grpc_impl/request/DescribeIndexRequest.h"
|
||||
#include "server/grpc_impl/request/DescribeTableRequest.h"
|
||||
#include "server/grpc_impl/request/DropIndexRequest.h"
|
||||
#include "server/grpc_impl/request/DropPartitionRequest.h"
|
||||
#include "server/grpc_impl/request/DropTableRequest.h"
|
||||
#include "server/grpc_impl/request/HasTableRequest.h"
|
||||
#include "server/grpc_impl/request/InsertRequest.h"
|
||||
#include "server/grpc_impl/request/PreloadTableRequest.h"
|
||||
#include "server/grpc_impl/request/SearchRequest.h"
|
||||
#include "server/grpc_impl/request/ShowPartitionsRequest.h"
|
||||
#include "server/grpc_impl/request/ShowTablesRequest.h"
|
||||
#include "utils/TimeRecorder.h"
|
||||
|
||||
#include <vector>
|
||||
@ -28,8 +45,8 @@ namespace grpc {
|
||||
::grpc::Status
|
||||
GrpcRequestHandler::CreateTable(::grpc::ServerContext* context, const ::milvus::grpc::TableSchema* request,
|
||||
::milvus::grpc::Status* response) {
|
||||
BaseTaskPtr task_ptr = CreateTableTask::Create(request);
|
||||
GrpcRequestScheduler::ExecTask(task_ptr, response);
|
||||
BaseRequestPtr request_ptr = CreateTableRequest::Create(request);
|
||||
GrpcRequestScheduler::ExecRequest(request_ptr, response);
|
||||
return ::grpc::Status::OK;
|
||||
}
|
||||
|
||||
@ -37,9 +54,9 @@ GrpcRequestHandler::CreateTable(::grpc::ServerContext* context, const ::milvus::
|
||||
GrpcRequestHandler::HasTable(::grpc::ServerContext* context, const ::milvus::grpc::TableName* request,
|
||||
::milvus::grpc::BoolReply* response) {
|
||||
bool has_table = false;
|
||||
BaseTaskPtr task_ptr = HasTableTask::Create(request->table_name(), has_table);
|
||||
BaseRequestPtr request_ptr = HasTableRequest::Create(request->table_name(), has_table);
|
||||
::milvus::grpc::Status grpc_status;
|
||||
GrpcRequestScheduler::ExecTask(task_ptr, &grpc_status);
|
||||
GrpcRequestScheduler::ExecRequest(request_ptr, &grpc_status);
|
||||
response->set_bool_reply(has_table);
|
||||
response->mutable_status()->set_reason(grpc_status.reason());
|
||||
response->mutable_status()->set_error_code(grpc_status.error_code());
|
||||
@ -49,25 +66,25 @@ GrpcRequestHandler::HasTable(::grpc::ServerContext* context, const ::milvus::grp
|
||||
::grpc::Status
|
||||
GrpcRequestHandler::DropTable(::grpc::ServerContext* context, const ::milvus::grpc::TableName* request,
|
||||
::milvus::grpc::Status* response) {
|
||||
BaseTaskPtr task_ptr = DropTableTask::Create(request->table_name());
|
||||
GrpcRequestScheduler::ExecTask(task_ptr, response);
|
||||
BaseRequestPtr request_ptr = DropTableRequest::Create(request->table_name());
|
||||
GrpcRequestScheduler::ExecRequest(request_ptr, response);
|
||||
return ::grpc::Status::OK;
|
||||
}
|
||||
|
||||
::grpc::Status
|
||||
GrpcRequestHandler::CreateIndex(::grpc::ServerContext* context, const ::milvus::grpc::IndexParam* request,
|
||||
::milvus::grpc::Status* response) {
|
||||
BaseTaskPtr task_ptr = CreateIndexTask::Create(request);
|
||||
GrpcRequestScheduler::ExecTask(task_ptr, response);
|
||||
BaseRequestPtr request_ptr = CreateIndexRequest::Create(request);
|
||||
GrpcRequestScheduler::ExecRequest(request_ptr, response);
|
||||
return ::grpc::Status::OK;
|
||||
}
|
||||
|
||||
::grpc::Status
|
||||
GrpcRequestHandler::Insert(::grpc::ServerContext* context, const ::milvus::grpc::InsertParam* request,
|
||||
::milvus::grpc::VectorIds* response) {
|
||||
BaseTaskPtr task_ptr = InsertTask::Create(request, response);
|
||||
BaseRequestPtr request_ptr = InsertRequest::Create(request, response);
|
||||
::milvus::grpc::Status grpc_status;
|
||||
GrpcRequestScheduler::ExecTask(task_ptr, &grpc_status);
|
||||
GrpcRequestScheduler::ExecRequest(request_ptr, &grpc_status);
|
||||
response->mutable_status()->set_reason(grpc_status.reason());
|
||||
response->mutable_status()->set_error_code(grpc_status.error_code());
|
||||
return ::grpc::Status::OK;
|
||||
@ -77,9 +94,9 @@ GrpcRequestHandler::Insert(::grpc::ServerContext* context, const ::milvus::grpc:
|
||||
GrpcRequestHandler::Search(::grpc::ServerContext* context, const ::milvus::grpc::SearchParam* request,
|
||||
::milvus::grpc::TopKQueryResult* response) {
|
||||
std::vector<std::string> file_id_array;
|
||||
BaseTaskPtr task_ptr = SearchTask::Create(request, file_id_array, response);
|
||||
BaseRequestPtr request_ptr = SearchRequest::Create(request, file_id_array, response);
|
||||
::milvus::grpc::Status grpc_status;
|
||||
GrpcRequestScheduler::ExecTask(task_ptr, &grpc_status);
|
||||
GrpcRequestScheduler::ExecRequest(request_ptr, &grpc_status);
|
||||
response->mutable_status()->set_error_code(grpc_status.error_code());
|
||||
response->mutable_status()->set_reason(grpc_status.reason());
|
||||
return ::grpc::Status::OK;
|
||||
@ -93,9 +110,10 @@ GrpcRequestHandler::SearchInFiles(::grpc::ServerContext* context, const ::milvus
|
||||
file_id_array.push_back(request->file_id_array(i));
|
||||
}
|
||||
::milvus::grpc::SearchInFilesParam* request_mutable = const_cast<::milvus::grpc::SearchInFilesParam*>(request);
|
||||
BaseTaskPtr task_ptr = SearchTask::Create(request_mutable->mutable_search_param(), file_id_array, response);
|
||||
BaseRequestPtr request_ptr =
|
||||
SearchRequest::Create(request_mutable->mutable_search_param(), file_id_array, response);
|
||||
::milvus::grpc::Status grpc_status;
|
||||
GrpcRequestScheduler::ExecTask(task_ptr, &grpc_status);
|
||||
GrpcRequestScheduler::ExecRequest(request_ptr, &grpc_status);
|
||||
response->mutable_status()->set_error_code(grpc_status.error_code());
|
||||
response->mutable_status()->set_reason(grpc_status.reason());
|
||||
return ::grpc::Status::OK;
|
||||
@ -104,9 +122,9 @@ GrpcRequestHandler::SearchInFiles(::grpc::ServerContext* context, const ::milvus
|
||||
::grpc::Status
|
||||
GrpcRequestHandler::DescribeTable(::grpc::ServerContext* context, const ::milvus::grpc::TableName* request,
|
||||
::milvus::grpc::TableSchema* response) {
|
||||
BaseTaskPtr task_ptr = DescribeTableTask::Create(request->table_name(), response);
|
||||
BaseRequestPtr request_ptr = DescribeTableRequest::Create(request->table_name(), response);
|
||||
::milvus::grpc::Status grpc_status;
|
||||
GrpcRequestScheduler::ExecTask(task_ptr, &grpc_status);
|
||||
GrpcRequestScheduler::ExecRequest(request_ptr, &grpc_status);
|
||||
response->mutable_status()->set_error_code(grpc_status.error_code());
|
||||
response->mutable_status()->set_reason(grpc_status.reason());
|
||||
return ::grpc::Status::OK;
|
||||
@ -116,9 +134,9 @@ GrpcRequestHandler::DescribeTable(::grpc::ServerContext* context, const ::milvus
|
||||
GrpcRequestHandler::CountTable(::grpc::ServerContext* context, const ::milvus::grpc::TableName* request,
|
||||
::milvus::grpc::TableRowCount* response) {
|
||||
int64_t row_count = 0;
|
||||
BaseTaskPtr task_ptr = CountTableTask::Create(request->table_name(), row_count);
|
||||
BaseRequestPtr request_ptr = CountTableRequest::Create(request->table_name(), row_count);
|
||||
::milvus::grpc::Status grpc_status;
|
||||
GrpcRequestScheduler::ExecTask(task_ptr, &grpc_status);
|
||||
GrpcRequestScheduler::ExecRequest(request_ptr, &grpc_status);
|
||||
response->set_table_row_count(row_count);
|
||||
response->mutable_status()->set_reason(grpc_status.reason());
|
||||
response->mutable_status()->set_error_code(grpc_status.error_code());
|
||||
@ -128,9 +146,9 @@ GrpcRequestHandler::CountTable(::grpc::ServerContext* context, const ::milvus::g
|
||||
::grpc::Status
|
||||
GrpcRequestHandler::ShowTables(::grpc::ServerContext* context, const ::milvus::grpc::Command* request,
|
||||
::milvus::grpc::TableNameList* response) {
|
||||
BaseTaskPtr task_ptr = ShowTablesTask::Create(response);
|
||||
BaseRequestPtr request_ptr = ShowTablesRequest::Create(response);
|
||||
::milvus::grpc::Status grpc_status;
|
||||
GrpcRequestScheduler::ExecTask(task_ptr, &grpc_status);
|
||||
GrpcRequestScheduler::ExecRequest(request_ptr, &grpc_status);
|
||||
response->mutable_status()->set_error_code(grpc_status.error_code());
|
||||
response->mutable_status()->set_reason(grpc_status.reason());
|
||||
return ::grpc::Status::OK;
|
||||
@ -140,9 +158,9 @@ GrpcRequestHandler::ShowTables(::grpc::ServerContext* context, const ::milvus::g
|
||||
GrpcRequestHandler::Cmd(::grpc::ServerContext* context, const ::milvus::grpc::Command* request,
|
||||
::milvus::grpc::StringReply* response) {
|
||||
std::string result;
|
||||
BaseTaskPtr task_ptr = CmdTask::Create(request->cmd(), result);
|
||||
BaseRequestPtr request_ptr = CmdRequest::Create(request->cmd(), result);
|
||||
::milvus::grpc::Status grpc_status;
|
||||
GrpcRequestScheduler::ExecTask(task_ptr, &grpc_status);
|
||||
GrpcRequestScheduler::ExecRequest(request_ptr, &grpc_status);
|
||||
response->set_string_reply(result);
|
||||
response->mutable_status()->set_reason(grpc_status.reason());
|
||||
response->mutable_status()->set_error_code(grpc_status.error_code());
|
||||
@ -152,9 +170,9 @@ GrpcRequestHandler::Cmd(::grpc::ServerContext* context, const ::milvus::grpc::Co
|
||||
::grpc::Status
|
||||
GrpcRequestHandler::DeleteByDate(::grpc::ServerContext* context, const ::milvus::grpc::DeleteByDateParam* request,
|
||||
::milvus::grpc::Status* response) {
|
||||
BaseTaskPtr task_ptr = DeleteByDateTask::Create(request);
|
||||
BaseRequestPtr request_ptr = DeleteByDateRequest::Create(request);
|
||||
::milvus::grpc::Status grpc_status;
|
||||
GrpcRequestScheduler::ExecTask(task_ptr, &grpc_status);
|
||||
GrpcRequestScheduler::ExecRequest(request_ptr, &grpc_status);
|
||||
response->set_error_code(grpc_status.error_code());
|
||||
response->set_reason(grpc_status.reason());
|
||||
return ::grpc::Status::OK;
|
||||
@ -163,9 +181,9 @@ GrpcRequestHandler::DeleteByDate(::grpc::ServerContext* context, const ::milvus:
|
||||
::grpc::Status
|
||||
GrpcRequestHandler::PreloadTable(::grpc::ServerContext* context, const ::milvus::grpc::TableName* request,
|
||||
::milvus::grpc::Status* response) {
|
||||
BaseTaskPtr task_ptr = PreloadTableTask::Create(request->table_name());
|
||||
BaseRequestPtr request_ptr = PreloadTableRequest::Create(request->table_name());
|
||||
::milvus::grpc::Status grpc_status;
|
||||
GrpcRequestScheduler::ExecTask(task_ptr, &grpc_status);
|
||||
GrpcRequestScheduler::ExecRequest(request_ptr, &grpc_status);
|
||||
response->set_reason(grpc_status.reason());
|
||||
response->set_error_code(grpc_status.error_code());
|
||||
return ::grpc::Status::OK;
|
||||
@ -174,9 +192,9 @@ GrpcRequestHandler::PreloadTable(::grpc::ServerContext* context, const ::milvus:
|
||||
::grpc::Status
|
||||
GrpcRequestHandler::DescribeIndex(::grpc::ServerContext* context, const ::milvus::grpc::TableName* request,
|
||||
::milvus::grpc::IndexParam* response) {
|
||||
BaseTaskPtr task_ptr = DescribeIndexTask::Create(request->table_name(), response);
|
||||
BaseRequestPtr request_ptr = DescribeIndexRequest::Create(request->table_name(), response);
|
||||
::milvus::grpc::Status grpc_status;
|
||||
GrpcRequestScheduler::ExecTask(task_ptr, &grpc_status);
|
||||
GrpcRequestScheduler::ExecRequest(request_ptr, &grpc_status);
|
||||
response->mutable_status()->set_reason(grpc_status.reason());
|
||||
response->mutable_status()->set_error_code(grpc_status.error_code());
|
||||
return ::grpc::Status::OK;
|
||||
@ -185,9 +203,9 @@ GrpcRequestHandler::DescribeIndex(::grpc::ServerContext* context, const ::milvus
|
||||
::grpc::Status
|
||||
GrpcRequestHandler::DropIndex(::grpc::ServerContext* context, const ::milvus::grpc::TableName* request,
|
||||
::milvus::grpc::Status* response) {
|
||||
BaseTaskPtr task_ptr = DropIndexTask::Create(request->table_name());
|
||||
BaseRequestPtr request_ptr = DropIndexRequest::Create(request->table_name());
|
||||
::milvus::grpc::Status grpc_status;
|
||||
GrpcRequestScheduler::ExecTask(task_ptr, &grpc_status);
|
||||
GrpcRequestScheduler::ExecRequest(request_ptr, &grpc_status);
|
||||
response->set_reason(grpc_status.reason());
|
||||
response->set_error_code(grpc_status.error_code());
|
||||
return ::grpc::Status::OK;
|
||||
@ -196,17 +214,17 @@ GrpcRequestHandler::DropIndex(::grpc::ServerContext* context, const ::milvus::gr
|
||||
::grpc::Status
|
||||
GrpcRequestHandler::CreatePartition(::grpc::ServerContext* context, const ::milvus::grpc::PartitionParam* request,
|
||||
::milvus::grpc::Status* response) {
|
||||
BaseTaskPtr task_ptr = CreatePartitionTask::Create(request);
|
||||
GrpcRequestScheduler::ExecTask(task_ptr, response);
|
||||
BaseRequestPtr request_ptr = CreatePartitionRequest::Create(request);
|
||||
GrpcRequestScheduler::ExecRequest(request_ptr, response);
|
||||
return ::grpc::Status::OK;
|
||||
}
|
||||
|
||||
::grpc::Status
|
||||
GrpcRequestHandler::ShowPartitions(::grpc::ServerContext* context, const ::milvus::grpc::TableName* request,
|
||||
::milvus::grpc::PartitionList* response) {
|
||||
BaseTaskPtr task_ptr = ShowPartitionsTask::Create(request->table_name(), response);
|
||||
BaseRequestPtr request_ptr = ShowPartitionsRequest::Create(request->table_name(), response);
|
||||
::milvus::grpc::Status grpc_status;
|
||||
GrpcRequestScheduler::ExecTask(task_ptr, &grpc_status);
|
||||
GrpcRequestScheduler::ExecRequest(request_ptr, &grpc_status);
|
||||
response->mutable_status()->set_reason(grpc_status.reason());
|
||||
response->mutable_status()->set_error_code(grpc_status.error_code());
|
||||
return ::grpc::Status::OK;
|
||||
@ -215,9 +233,9 @@ GrpcRequestHandler::ShowPartitions(::grpc::ServerContext* context, const ::milvu
|
||||
::grpc::Status
|
||||
GrpcRequestHandler::DropPartition(::grpc::ServerContext* context, const ::milvus::grpc::PartitionParam* request,
|
||||
::milvus::grpc::Status* response) {
|
||||
BaseTaskPtr task_ptr = DropPartitionTask::Create(request);
|
||||
BaseRequestPtr request_ptr = DropPartitionRequest::Create(request);
|
||||
::milvus::grpc::Status grpc_status;
|
||||
GrpcRequestScheduler::ExecTask(task_ptr, &grpc_status);
|
||||
GrpcRequestScheduler::ExecRequest(request_ptr, &grpc_status);
|
||||
response->set_reason(grpc_status.reason());
|
||||
response->set_error_code(grpc_status.error_code());
|
||||
return ::grpc::Status::OK;
|
||||
|
@ -70,43 +70,6 @@ ErrorMap(ErrorCode code) {
|
||||
}
|
||||
} // namespace
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
GrpcBaseTask::GrpcBaseTask(const std::string& task_group, bool async)
|
||||
: task_group_(task_group), async_(async), done_(false) {
|
||||
}
|
||||
|
||||
GrpcBaseTask::~GrpcBaseTask() {
|
||||
WaitToFinish();
|
||||
}
|
||||
|
||||
Status
|
||||
GrpcBaseTask::Execute() {
|
||||
status_ = OnExecute();
|
||||
Done();
|
||||
return status_;
|
||||
}
|
||||
|
||||
void
|
||||
GrpcBaseTask::Done() {
|
||||
done_ = true;
|
||||
finish_cond_.notify_all();
|
||||
}
|
||||
|
||||
Status
|
||||
GrpcBaseTask::SetStatus(ErrorCode error_code, const std::string& error_msg) {
|
||||
status_ = Status(error_code, error_msg);
|
||||
SERVER_LOG_ERROR << error_msg;
|
||||
return status_;
|
||||
}
|
||||
|
||||
Status
|
||||
GrpcBaseTask::WaitToFinish() {
|
||||
std::unique_lock<std::mutex> lock(finish_mtx_);
|
||||
finish_cond_.wait(lock, [this] { return done_; });
|
||||
|
||||
return status_;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
GrpcRequestScheduler::GrpcRequestScheduler() : stopped_(false) {
|
||||
Start();
|
||||
@ -117,17 +80,17 @@ GrpcRequestScheduler::~GrpcRequestScheduler() {
|
||||
}
|
||||
|
||||
void
|
||||
GrpcRequestScheduler::ExecTask(BaseTaskPtr& task_ptr, ::milvus::grpc::Status* grpc_status) {
|
||||
if (task_ptr == nullptr) {
|
||||
GrpcRequestScheduler::ExecRequest(BaseRequestPtr& request_ptr, ::milvus::grpc::Status* grpc_status) {
|
||||
if (request_ptr == nullptr) {
|
||||
return;
|
||||
}
|
||||
|
||||
GrpcRequestScheduler& scheduler = GrpcRequestScheduler::GetInstance();
|
||||
scheduler.ExecuteTask(task_ptr);
|
||||
scheduler.ExecuteRequest(request_ptr);
|
||||
|
||||
if (!task_ptr->IsAsync()) {
|
||||
task_ptr->WaitToFinish();
|
||||
const Status& status = task_ptr->status();
|
||||
if (!request_ptr->IsAsync()) {
|
||||
request_ptr->WaitToFinish();
|
||||
const Status& status = request_ptr->status();
|
||||
if (!status.ok()) {
|
||||
grpc_status->set_reason(status.message());
|
||||
grpc_status->set_error_code(ErrorMap(status.code()));
|
||||
@ -153,7 +116,7 @@ GrpcRequestScheduler::Stop() {
|
||||
SERVER_LOG_INFO << "Scheduler gonna stop...";
|
||||
{
|
||||
std::lock_guard<std::mutex> lock(queue_mtx_);
|
||||
for (auto iter : task_groups_) {
|
||||
for (auto iter : request_groups_) {
|
||||
if (iter.second != nullptr) {
|
||||
iter.second->Put(nullptr);
|
||||
}
|
||||
@ -171,64 +134,64 @@ GrpcRequestScheduler::Stop() {
|
||||
}
|
||||
|
||||
Status
|
||||
GrpcRequestScheduler::ExecuteTask(const BaseTaskPtr& task_ptr) {
|
||||
if (task_ptr == nullptr) {
|
||||
GrpcRequestScheduler::ExecuteRequest(const BaseRequestPtr& request_ptr) {
|
||||
if (request_ptr == nullptr) {
|
||||
return Status::OK();
|
||||
}
|
||||
|
||||
auto status = PutTaskToQueue(task_ptr);
|
||||
auto status = PutToQueue(request_ptr);
|
||||
if (!status.ok()) {
|
||||
SERVER_LOG_ERROR << "Put task to queue failed with code: " << status.ToString();
|
||||
SERVER_LOG_ERROR << "Put request to queue failed with code: " << status.ToString();
|
||||
return status;
|
||||
}
|
||||
|
||||
if (task_ptr->IsAsync()) {
|
||||
if (request_ptr->IsAsync()) {
|
||||
return Status::OK(); // async execution, caller need to call WaitToFinish at somewhere
|
||||
}
|
||||
|
||||
return task_ptr->WaitToFinish(); // sync execution
|
||||
return request_ptr->WaitToFinish(); // sync execution
|
||||
}
|
||||
|
||||
void
|
||||
GrpcRequestScheduler::TakeTaskToExecute(TaskQueuePtr task_queue) {
|
||||
if (task_queue == nullptr) {
|
||||
GrpcRequestScheduler::TakeToExecute(RequestQueuePtr request_queue) {
|
||||
if (request_queue == nullptr) {
|
||||
return;
|
||||
}
|
||||
|
||||
while (true) {
|
||||
BaseTaskPtr task = task_queue->Take();
|
||||
if (task == nullptr) {
|
||||
SERVER_LOG_ERROR << "Take null from task queue, stop thread";
|
||||
BaseRequestPtr request = request_queue->Take();
|
||||
if (request == nullptr) {
|
||||
SERVER_LOG_ERROR << "Take null from request queue, stop thread";
|
||||
break; // stop the thread
|
||||
}
|
||||
|
||||
try {
|
||||
auto status = task->Execute();
|
||||
auto status = request->Execute();
|
||||
if (!status.ok()) {
|
||||
SERVER_LOG_ERROR << "Task failed with code: " << status.ToString();
|
||||
SERVER_LOG_ERROR << "Request failed with code: " << status.ToString();
|
||||
}
|
||||
} catch (std::exception& ex) {
|
||||
SERVER_LOG_ERROR << "Task failed to execute: " << ex.what();
|
||||
SERVER_LOG_ERROR << "Request failed to execute: " << ex.what();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Status
|
||||
GrpcRequestScheduler::PutTaskToQueue(const BaseTaskPtr& task_ptr) {
|
||||
GrpcRequestScheduler::PutToQueue(const BaseRequestPtr& request_ptr) {
|
||||
std::lock_guard<std::mutex> lock(queue_mtx_);
|
||||
|
||||
std::string group_name = task_ptr->TaskGroup();
|
||||
if (task_groups_.count(group_name) > 0) {
|
||||
task_groups_[group_name]->Put(task_ptr);
|
||||
std::string group_name = request_ptr->RequestGroup();
|
||||
if (request_groups_.count(group_name) > 0) {
|
||||
request_groups_[group_name]->Put(request_ptr);
|
||||
} else {
|
||||
TaskQueuePtr queue = std::make_shared<TaskQueue>();
|
||||
queue->Put(task_ptr);
|
||||
task_groups_.insert(std::make_pair(group_name, queue));
|
||||
RequestQueuePtr queue = std::make_shared<RequestQueue>();
|
||||
queue->Put(request_ptr);
|
||||
request_groups_.insert(std::make_pair(group_name, queue));
|
||||
|
||||
// start a thread
|
||||
ThreadPtr thread = std::make_shared<std::thread>(&GrpcRequestScheduler::TakeTaskToExecute, this, queue);
|
||||
ThreadPtr thread = std::make_shared<std::thread>(&GrpcRequestScheduler::TakeToExecute, this, queue);
|
||||
execute_threads_.push_back(thread);
|
||||
SERVER_LOG_INFO << "Create new thread for task group: " << group_name;
|
||||
SERVER_LOG_INFO << "Create new thread for request group: " << group_name;
|
||||
}
|
||||
|
||||
return Status::OK();
|
||||
|
@ -19,6 +19,7 @@
|
||||
|
||||
#include "grpc/gen-status/status.grpc.pb.h"
|
||||
#include "grpc/gen-status/status.pb.h"
|
||||
#include "server/grpc_impl/request/GrpcBaseRequest.h"
|
||||
#include "utils/BlockingQueue.h"
|
||||
#include "utils/Status.h"
|
||||
|
||||
@ -32,57 +33,8 @@ namespace milvus {
|
||||
namespace server {
|
||||
namespace grpc {
|
||||
|
||||
class GrpcBaseTask {
|
||||
protected:
|
||||
explicit GrpcBaseTask(const std::string& task_group, bool async = false);
|
||||
|
||||
virtual ~GrpcBaseTask();
|
||||
|
||||
public:
|
||||
Status
|
||||
Execute();
|
||||
|
||||
void
|
||||
Done();
|
||||
|
||||
Status
|
||||
WaitToFinish();
|
||||
|
||||
std::string
|
||||
TaskGroup() const {
|
||||
return task_group_;
|
||||
}
|
||||
|
||||
const Status&
|
||||
status() const {
|
||||
return status_;
|
||||
}
|
||||
|
||||
bool
|
||||
IsAsync() const {
|
||||
return async_;
|
||||
}
|
||||
|
||||
protected:
|
||||
virtual Status
|
||||
OnExecute() = 0;
|
||||
|
||||
Status
|
||||
SetStatus(ErrorCode error_code, const std::string& error_msg);
|
||||
|
||||
protected:
|
||||
mutable std::mutex finish_mtx_;
|
||||
std::condition_variable finish_cond_;
|
||||
|
||||
std::string task_group_;
|
||||
bool async_;
|
||||
bool done_;
|
||||
Status status_;
|
||||
};
|
||||
|
||||
using BaseTaskPtr = std::shared_ptr<GrpcBaseTask>;
|
||||
using TaskQueue = BlockingQueue<BaseTaskPtr>;
|
||||
using TaskQueuePtr = std::shared_ptr<TaskQueue>;
|
||||
using RequestQueue = BlockingQueue<BaseRequestPtr>;
|
||||
using RequestQueuePtr = std::shared_ptr<RequestQueue>;
|
||||
using ThreadPtr = std::shared_ptr<std::thread>;
|
||||
|
||||
class GrpcRequestScheduler {
|
||||
@ -100,10 +52,10 @@ class GrpcRequestScheduler {
|
||||
Stop();
|
||||
|
||||
Status
|
||||
ExecuteTask(const BaseTaskPtr& task_ptr);
|
||||
ExecuteRequest(const BaseRequestPtr& request_ptr);
|
||||
|
||||
static void
|
||||
ExecTask(BaseTaskPtr& task_ptr, ::milvus::grpc::Status* grpc_status);
|
||||
ExecRequest(BaseRequestPtr& request_ptr, ::milvus::grpc::Status* grpc_status);
|
||||
|
||||
protected:
|
||||
GrpcRequestScheduler();
|
||||
@ -111,15 +63,15 @@ class GrpcRequestScheduler {
|
||||
virtual ~GrpcRequestScheduler();
|
||||
|
||||
void
|
||||
TakeTaskToExecute(TaskQueuePtr task_queue);
|
||||
TakeToExecute(RequestQueuePtr request_queue);
|
||||
|
||||
Status
|
||||
PutTaskToQueue(const BaseTaskPtr& task_ptr);
|
||||
PutToQueue(const BaseRequestPtr& request_ptr);
|
||||
|
||||
private:
|
||||
mutable std::mutex queue_mtx_;
|
||||
|
||||
std::map<std::string, TaskQueuePtr> task_groups_;
|
||||
std::map<std::string, RequestQueuePtr> request_groups_;
|
||||
|
||||
std::vector<ThreadPtr> execute_threads_;
|
||||
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -1,321 +0,0 @@
|
||||
// Licensed to the Apache Software Foundation (ASF) under one
|
||||
// or more contributor license agreements. See the NOTICE file
|
||||
// distributed with this work for additional information
|
||||
// regarding copyright ownership. The ASF licenses this file
|
||||
// to you under the Apache License, Version 2.0 (the
|
||||
// "License"); you may not use this file except in compliance
|
||||
// with the License. You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing,
|
||||
// software distributed under the License is distributed on an
|
||||
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
// KIND, either express or implied. See the License for the
|
||||
// specific language governing permissions and limitations
|
||||
// under the License.
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "db/Types.h"
|
||||
#include "server/grpc_impl/GrpcRequestScheduler.h"
|
||||
#include "utils/Status.h"
|
||||
|
||||
#include "grpc/gen-milvus/milvus.grpc.pb.h"
|
||||
#include "grpc/gen-status/status.pb.h"
|
||||
|
||||
#include <condition_variable>
|
||||
#include <memory>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
namespace milvus {
|
||||
namespace server {
|
||||
namespace grpc {
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
class CreateTableTask : public GrpcBaseTask {
|
||||
public:
|
||||
static BaseTaskPtr
|
||||
Create(const ::milvus::grpc::TableSchema* schema);
|
||||
|
||||
protected:
|
||||
explicit CreateTableTask(const ::milvus::grpc::TableSchema* schema);
|
||||
|
||||
Status
|
||||
OnExecute() override;
|
||||
|
||||
private:
|
||||
const ::milvus::grpc::TableSchema* schema_;
|
||||
};
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
class HasTableTask : public GrpcBaseTask {
|
||||
public:
|
||||
static BaseTaskPtr
|
||||
Create(const std::string& table_name, bool& has_table);
|
||||
|
||||
protected:
|
||||
HasTableTask(const std::string& table_name, bool& has_table);
|
||||
|
||||
Status
|
||||
OnExecute() override;
|
||||
|
||||
private:
|
||||
std::string table_name_;
|
||||
bool& has_table_;
|
||||
};
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
class DescribeTableTask : public GrpcBaseTask {
|
||||
public:
|
||||
static BaseTaskPtr
|
||||
Create(const std::string& table_name, ::milvus::grpc::TableSchema* schema);
|
||||
|
||||
protected:
|
||||
DescribeTableTask(const std::string& table_name, ::milvus::grpc::TableSchema* schema);
|
||||
|
||||
Status
|
||||
OnExecute() override;
|
||||
|
||||
private:
|
||||
std::string table_name_;
|
||||
::milvus::grpc::TableSchema* schema_;
|
||||
};
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
class DropTableTask : public GrpcBaseTask {
|
||||
public:
|
||||
static BaseTaskPtr
|
||||
Create(const std::string& table_name);
|
||||
|
||||
protected:
|
||||
explicit DropTableTask(const std::string& table_name);
|
||||
|
||||
Status
|
||||
OnExecute() override;
|
||||
|
||||
private:
|
||||
std::string table_name_;
|
||||
};
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
class CreateIndexTask : public GrpcBaseTask {
|
||||
public:
|
||||
static BaseTaskPtr
|
||||
Create(const ::milvus::grpc::IndexParam* index_param);
|
||||
|
||||
protected:
|
||||
explicit CreateIndexTask(const ::milvus::grpc::IndexParam* index_param);
|
||||
|
||||
Status
|
||||
OnExecute() override;
|
||||
|
||||
private:
|
||||
const ::milvus::grpc::IndexParam* index_param_;
|
||||
};
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
class ShowTablesTask : public GrpcBaseTask {
|
||||
public:
|
||||
static BaseTaskPtr
|
||||
Create(::milvus::grpc::TableNameList* table_name_list);
|
||||
|
||||
protected:
|
||||
explicit ShowTablesTask(::milvus::grpc::TableNameList* table_name_list);
|
||||
|
||||
Status
|
||||
OnExecute() override;
|
||||
|
||||
private:
|
||||
::milvus::grpc::TableNameList* table_name_list_;
|
||||
};
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
class InsertTask : public GrpcBaseTask {
|
||||
public:
|
||||
static BaseTaskPtr
|
||||
Create(const ::milvus::grpc::InsertParam* insert_param, ::milvus::grpc::VectorIds* record_ids);
|
||||
|
||||
protected:
|
||||
InsertTask(const ::milvus::grpc::InsertParam* insert_param, ::milvus::grpc::VectorIds* record_ids);
|
||||
|
||||
Status
|
||||
OnExecute() override;
|
||||
|
||||
private:
|
||||
const ::milvus::grpc::InsertParam* insert_param_;
|
||||
::milvus::grpc::VectorIds* record_ids_;
|
||||
};
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
class SearchTask : public GrpcBaseTask {
|
||||
public:
|
||||
static BaseTaskPtr
|
||||
Create(const ::milvus::grpc::SearchParam* search_param, const std::vector<std::string>& file_id_array,
|
||||
::milvus::grpc::TopKQueryResult* response);
|
||||
|
||||
protected:
|
||||
SearchTask(const ::milvus::grpc::SearchParam* search_param, const std::vector<std::string>& file_id_array,
|
||||
::milvus::grpc::TopKQueryResult* response);
|
||||
|
||||
Status
|
||||
OnExecute() override;
|
||||
|
||||
private:
|
||||
const ::milvus::grpc::SearchParam* search_param_;
|
||||
std::vector<std::string> file_id_array_;
|
||||
::milvus::grpc::TopKQueryResult* topk_result_;
|
||||
};
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
class CountTableTask : public GrpcBaseTask {
|
||||
public:
|
||||
static BaseTaskPtr
|
||||
Create(const std::string& table_name, int64_t& row_count);
|
||||
|
||||
protected:
|
||||
CountTableTask(const std::string& table_name, int64_t& row_count);
|
||||
|
||||
Status
|
||||
OnExecute() override;
|
||||
|
||||
private:
|
||||
std::string table_name_;
|
||||
int64_t& row_count_;
|
||||
};
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
class CmdTask : public GrpcBaseTask {
|
||||
public:
|
||||
static BaseTaskPtr
|
||||
Create(const std::string& cmd, std::string& result);
|
||||
|
||||
protected:
|
||||
CmdTask(const std::string& cmd, std::string& result);
|
||||
|
||||
Status
|
||||
OnExecute() override;
|
||||
|
||||
private:
|
||||
std::string cmd_;
|
||||
std::string& result_;
|
||||
};
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
class DeleteByDateTask : public GrpcBaseTask {
|
||||
public:
|
||||
static BaseTaskPtr
|
||||
Create(const ::milvus::grpc::DeleteByDateParam* delete_by_range_param);
|
||||
|
||||
protected:
|
||||
explicit DeleteByDateTask(const ::milvus::grpc::DeleteByDateParam* delete_by_range_param);
|
||||
|
||||
Status
|
||||
OnExecute() override;
|
||||
|
||||
private:
|
||||
const ::milvus::grpc::DeleteByDateParam* delete_by_range_param_;
|
||||
};
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
class PreloadTableTask : public GrpcBaseTask {
|
||||
public:
|
||||
static BaseTaskPtr
|
||||
Create(const std::string& table_name);
|
||||
|
||||
protected:
|
||||
explicit PreloadTableTask(const std::string& table_name);
|
||||
|
||||
Status
|
||||
OnExecute() override;
|
||||
|
||||
private:
|
||||
std::string table_name_;
|
||||
};
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
class DescribeIndexTask : public GrpcBaseTask {
|
||||
public:
|
||||
static BaseTaskPtr
|
||||
Create(const std::string& table_name, ::milvus::grpc::IndexParam* index_param);
|
||||
|
||||
protected:
|
||||
DescribeIndexTask(const std::string& table_name, ::milvus::grpc::IndexParam* index_param);
|
||||
|
||||
Status
|
||||
OnExecute() override;
|
||||
|
||||
private:
|
||||
std::string table_name_;
|
||||
::milvus::grpc::IndexParam* index_param_;
|
||||
};
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
class DropIndexTask : public GrpcBaseTask {
|
||||
public:
|
||||
static BaseTaskPtr
|
||||
Create(const std::string& table_name);
|
||||
|
||||
protected:
|
||||
explicit DropIndexTask(const std::string& table_name);
|
||||
|
||||
Status
|
||||
OnExecute() override;
|
||||
|
||||
private:
|
||||
std::string table_name_;
|
||||
};
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
class CreatePartitionTask : public GrpcBaseTask {
|
||||
public:
|
||||
static BaseTaskPtr
|
||||
Create(const ::milvus::grpc::PartitionParam* partition_param);
|
||||
|
||||
protected:
|
||||
explicit CreatePartitionTask(const ::milvus::grpc::PartitionParam* partition_param);
|
||||
|
||||
Status
|
||||
OnExecute() override;
|
||||
|
||||
private:
|
||||
const ::milvus::grpc::PartitionParam* partition_param_;
|
||||
};
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
class ShowPartitionsTask : public GrpcBaseTask {
|
||||
public:
|
||||
static BaseTaskPtr
|
||||
Create(const std::string& table_name, ::milvus::grpc::PartitionList* partition_list);
|
||||
|
||||
protected:
|
||||
ShowPartitionsTask(const std::string& table_name, ::milvus::grpc::PartitionList* partition_list);
|
||||
|
||||
Status
|
||||
OnExecute() override;
|
||||
|
||||
private:
|
||||
std::string table_name_;
|
||||
::milvus::grpc::PartitionList* partition_list_;
|
||||
};
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
class DropPartitionTask : public GrpcBaseTask {
|
||||
public:
|
||||
static BaseTaskPtr
|
||||
Create(const ::milvus::grpc::PartitionParam* partition_param);
|
||||
|
||||
protected:
|
||||
explicit DropPartitionTask(const ::milvus::grpc::PartitionParam* partition_param);
|
||||
|
||||
Status
|
||||
OnExecute() override;
|
||||
|
||||
private:
|
||||
const ::milvus::grpc::PartitionParam* partition_param_;
|
||||
};
|
||||
|
||||
} // namespace grpc
|
||||
} // namespace server
|
||||
} // namespace milvus
|
51
core/src/server/grpc_impl/request/CmdRequest.cpp
Normal file
51
core/src/server/grpc_impl/request/CmdRequest.cpp
Normal file
@ -0,0 +1,51 @@
|
||||
// Licensed to the Apache Software Foundation (ASF) under one
|
||||
// or more contributor license agreements. See the NOTICE file
|
||||
// distributed with this work for additional information
|
||||
// regarding copyright ownership. The ASF licenses this file
|
||||
// to you under the Apache License, Version 2.0 (the
|
||||
// "License"); you may not use this file except in compliance
|
||||
// with the License. You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing,
|
||||
// software distributed under the License is distributed on an
|
||||
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
// KIND, either express or implied. See the License for the
|
||||
// specific language governing permissions and limitations
|
||||
// under the License.
|
||||
|
||||
#include "server/grpc_impl/request/CmdRequest.h"
|
||||
#include "scheduler/SchedInst.h"
|
||||
|
||||
#include <memory>
|
||||
|
||||
namespace milvus {
|
||||
namespace server {
|
||||
namespace grpc {
|
||||
|
||||
CmdRequest::CmdRequest(const std::string& cmd, std::string& result)
|
||||
: GrpcBaseRequest(INFO_REQUEST_GROUP), cmd_(cmd), result_(result) {
|
||||
}
|
||||
|
||||
BaseRequestPtr
|
||||
CmdRequest::Create(const std::string& cmd, std::string& result) {
|
||||
return std::shared_ptr<GrpcBaseRequest>(new CmdRequest(cmd, result));
|
||||
}
|
||||
|
||||
Status
|
||||
CmdRequest::OnExecute() {
|
||||
if (cmd_ == "version") {
|
||||
result_ = MILVUS_VERSION;
|
||||
} else if (cmd_ == "tasktable") {
|
||||
result_ = scheduler::ResMgrInst::GetInstance()->DumpTaskTables();
|
||||
} else {
|
||||
result_ = "OK";
|
||||
}
|
||||
|
||||
return Status::OK();
|
||||
}
|
||||
|
||||
} // namespace grpc
|
||||
} // namespace server
|
||||
} // namespace milvus
|
46
core/src/server/grpc_impl/request/CmdRequest.h
Normal file
46
core/src/server/grpc_impl/request/CmdRequest.h
Normal file
@ -0,0 +1,46 @@
|
||||
// Licensed to the Apache Software Foundation (ASF) under one
|
||||
// or more contributor license agreements. See the NOTICE file
|
||||
// distributed with this work for additional information
|
||||
// regarding copyright ownership. The ASF licenses this file
|
||||
// to you under the Apache License, Version 2.0 (the
|
||||
// "License"); you may not use this file except in compliance
|
||||
// with the License. You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing,
|
||||
// software distributed under the License is distributed on an
|
||||
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
// KIND, either express or implied. See the License for the
|
||||
// specific language governing permissions and limitations
|
||||
// under the License.
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "server/grpc_impl/request/GrpcBaseRequest.h"
|
||||
|
||||
#include <string>
|
||||
|
||||
namespace milvus {
|
||||
namespace server {
|
||||
namespace grpc {
|
||||
|
||||
class CmdRequest : public GrpcBaseRequest {
|
||||
public:
|
||||
static BaseRequestPtr
|
||||
Create(const std::string& cmd, std::string& result);
|
||||
|
||||
protected:
|
||||
CmdRequest(const std::string& cmd, std::string& result);
|
||||
|
||||
Status
|
||||
OnExecute() override;
|
||||
|
||||
private:
|
||||
std::string cmd_;
|
||||
std::string& result_;
|
||||
};
|
||||
|
||||
} // namespace grpc
|
||||
} // namespace server
|
||||
} // namespace milvus
|
73
core/src/server/grpc_impl/request/CountTableRequest.cpp
Normal file
73
core/src/server/grpc_impl/request/CountTableRequest.cpp
Normal file
@ -0,0 +1,73 @@
|
||||
// Licensed to the Apache Software Foundation (ASF) under one
|
||||
// or more contributor license agreements. See the NOTICE file
|
||||
// distributed with this work for additional information
|
||||
// regarding copyright ownership. The ASF licenses this file
|
||||
// to you under the Apache License, Version 2.0 (the
|
||||
// "License"); you may not use this file except in compliance
|
||||
// with the License. You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing,
|
||||
// software distributed under the License is distributed on an
|
||||
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
// KIND, either express or implied. See the License for the
|
||||
// specific language governing permissions and limitations
|
||||
// under the License.
|
||||
|
||||
#include "server/grpc_impl/request/CountTableRequest.h"
|
||||
#include "server/DBWrapper.h"
|
||||
#include "utils/Log.h"
|
||||
#include "utils/TimeRecorder.h"
|
||||
#include "utils/ValidationUtil.h"
|
||||
|
||||
#include <memory>
|
||||
|
||||
namespace milvus {
|
||||
namespace server {
|
||||
namespace grpc {
|
||||
|
||||
CountTableRequest::CountTableRequest(const std::string& table_name, int64_t& row_count)
|
||||
: GrpcBaseRequest(INFO_REQUEST_GROUP), table_name_(table_name), row_count_(row_count) {
|
||||
}
|
||||
|
||||
BaseRequestPtr
|
||||
CountTableRequest::Create(const std::string& table_name, int64_t& row_count) {
|
||||
return std::shared_ptr<GrpcBaseRequest>(new CountTableRequest(table_name, row_count));
|
||||
}
|
||||
|
||||
Status
|
||||
CountTableRequest::OnExecute() {
|
||||
try {
|
||||
TimeRecorder rc("CountTableRequest");
|
||||
|
||||
// step 1: check arguments
|
||||
auto status = ValidationUtil::ValidateTableName(table_name_);
|
||||
if (!status.ok()) {
|
||||
return status;
|
||||
}
|
||||
|
||||
// step 2: get row count
|
||||
uint64_t row_count = 0;
|
||||
status = DBWrapper::DB()->GetTableRowCount(table_name_, row_count);
|
||||
if (!status.ok()) {
|
||||
if (status.code(), DB_NOT_FOUND) {
|
||||
return Status(SERVER_TABLE_NOT_EXIST, TableNotExistMsg(table_name_));
|
||||
} else {
|
||||
return status;
|
||||
}
|
||||
}
|
||||
|
||||
row_count_ = static_cast<int64_t>(row_count);
|
||||
|
||||
rc.ElapseFromBegin("total cost");
|
||||
} catch (std::exception& ex) {
|
||||
return Status(SERVER_UNEXPECTED_ERROR, ex.what());
|
||||
}
|
||||
|
||||
return Status::OK();
|
||||
}
|
||||
|
||||
} // namespace grpc
|
||||
} // namespace server
|
||||
} // namespace milvus
|
46
core/src/server/grpc_impl/request/CountTableRequest.h
Normal file
46
core/src/server/grpc_impl/request/CountTableRequest.h
Normal file
@ -0,0 +1,46 @@
|
||||
// Licensed to the Apache Software Foundation (ASF) under one
|
||||
// or more contributor license agreements. See the NOTICE file
|
||||
// distributed with this work for additional information
|
||||
// regarding copyright ownership. The ASF licenses this file
|
||||
// to you under the Apache License, Version 2.0 (the
|
||||
// "License"); you may not use this file except in compliance
|
||||
// with the License. You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing,
|
||||
// software distributed under the License is distributed on an
|
||||
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
// KIND, either express or implied. See the License for the
|
||||
// specific language governing permissions and limitations
|
||||
// under the License.
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "server/grpc_impl/request/GrpcBaseRequest.h"
|
||||
|
||||
#include <string>
|
||||
|
||||
namespace milvus {
|
||||
namespace server {
|
||||
namespace grpc {
|
||||
|
||||
class CountTableRequest : public GrpcBaseRequest {
|
||||
public:
|
||||
static BaseRequestPtr
|
||||
Create(const std::string& table_name, int64_t& row_count);
|
||||
|
||||
protected:
|
||||
CountTableRequest(const std::string& table_name, int64_t& row_count);
|
||||
|
||||
Status
|
||||
OnExecute() override;
|
||||
|
||||
private:
|
||||
std::string table_name_;
|
||||
int64_t& row_count_;
|
||||
};
|
||||
|
||||
} // namespace grpc
|
||||
} // namespace server
|
||||
} // namespace milvus
|
96
core/src/server/grpc_impl/request/CreateIndexRequest.cpp
Normal file
96
core/src/server/grpc_impl/request/CreateIndexRequest.cpp
Normal file
@ -0,0 +1,96 @@
|
||||
// Licensed to the Apache Software Foundation (ASF) under one
|
||||
// or more contributor license agreements. See the NOTICE file
|
||||
// distributed with this work for additional information
|
||||
// regarding copyright ownership. The ASF licenses this file
|
||||
// to you under the Apache License, Version 2.0 (the
|
||||
// "License"); you may not use this file except in compliance
|
||||
// with the License. You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing,
|
||||
// software distributed under the License is distributed on an
|
||||
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
// KIND, either express or implied. See the License for the
|
||||
// specific language governing permissions and limitations
|
||||
// under the License.
|
||||
|
||||
#include "server/grpc_impl/request/CreateIndexRequest.h"
|
||||
#include "server/DBWrapper.h"
|
||||
#include "utils/Log.h"
|
||||
#include "utils/TimeRecorder.h"
|
||||
#include "utils/ValidationUtil.h"
|
||||
|
||||
#include <memory>
|
||||
#include <string>
|
||||
|
||||
namespace milvus {
|
||||
namespace server {
|
||||
namespace grpc {
|
||||
|
||||
CreateIndexRequest::CreateIndexRequest(const ::milvus::grpc::IndexParam* index_param)
|
||||
: GrpcBaseRequest(DDL_DML_REQUEST_GROUP), index_param_(index_param) {
|
||||
}
|
||||
|
||||
BaseRequestPtr
|
||||
CreateIndexRequest::Create(const ::milvus::grpc::IndexParam* index_param) {
|
||||
if (index_param == nullptr) {
|
||||
SERVER_LOG_ERROR << "grpc input is null!";
|
||||
return nullptr;
|
||||
}
|
||||
return std::shared_ptr<GrpcBaseRequest>(new CreateIndexRequest(index_param));
|
||||
}
|
||||
|
||||
Status
|
||||
CreateIndexRequest::OnExecute() {
|
||||
try {
|
||||
TimeRecorder rc("CreateIndexRequest");
|
||||
|
||||
// step 1: check arguments
|
||||
std::string table_name_ = index_param_->table_name();
|
||||
auto status = ValidationUtil::ValidateTableName(table_name_);
|
||||
if (!status.ok()) {
|
||||
return status;
|
||||
}
|
||||
|
||||
bool has_table = false;
|
||||
status = DBWrapper::DB()->HasTable(table_name_, has_table);
|
||||
if (!status.ok()) {
|
||||
return status;
|
||||
}
|
||||
|
||||
if (!has_table) {
|
||||
return Status(SERVER_TABLE_NOT_EXIST, TableNotExistMsg(table_name_));
|
||||
}
|
||||
|
||||
auto& grpc_index = index_param_->index();
|
||||
status = ValidationUtil::ValidateTableIndexType(grpc_index.index_type());
|
||||
if (!status.ok()) {
|
||||
return status;
|
||||
}
|
||||
|
||||
status = ValidationUtil::ValidateTableIndexNlist(grpc_index.nlist());
|
||||
if (!status.ok()) {
|
||||
return status;
|
||||
}
|
||||
|
||||
// step 2: check table existence
|
||||
engine::TableIndex index;
|
||||
index.engine_type_ = grpc_index.index_type();
|
||||
index.nlist_ = grpc_index.nlist();
|
||||
status = DBWrapper::DB()->CreateIndex(table_name_, index);
|
||||
if (!status.ok()) {
|
||||
return status;
|
||||
}
|
||||
|
||||
rc.ElapseFromBegin("totally cost");
|
||||
} catch (std::exception& ex) {
|
||||
return Status(SERVER_UNEXPECTED_ERROR, ex.what());
|
||||
}
|
||||
|
||||
return Status::OK();
|
||||
}
|
||||
|
||||
} // namespace grpc
|
||||
} // namespace server
|
||||
} // namespace milvus
|
43
core/src/server/grpc_impl/request/CreateIndexRequest.h
Normal file
43
core/src/server/grpc_impl/request/CreateIndexRequest.h
Normal file
@ -0,0 +1,43 @@
|
||||
// Licensed to the Apache Software Foundation (ASF) under one
|
||||
// or more contributor license agreements. See the NOTICE file
|
||||
// distributed with this work for additional information
|
||||
// regarding copyright ownership. The ASF licenses this file
|
||||
// to you under the Apache License, Version 2.0 (the
|
||||
// "License"); you may not use this file except in compliance
|
||||
// with the License. You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing,
|
||||
// software distributed under the License is distributed on an
|
||||
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
// KIND, either express or implied. See the License for the
|
||||
// specific language governing permissions and limitations
|
||||
// under the License.
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "server/grpc_impl/request/GrpcBaseRequest.h"
|
||||
|
||||
namespace milvus {
|
||||
namespace server {
|
||||
namespace grpc {
|
||||
|
||||
class CreateIndexRequest : public GrpcBaseRequest {
|
||||
public:
|
||||
static BaseRequestPtr
|
||||
Create(const ::milvus::grpc::IndexParam* index_param);
|
||||
|
||||
protected:
|
||||
explicit CreateIndexRequest(const ::milvus::grpc::IndexParam* index_param);
|
||||
|
||||
Status
|
||||
OnExecute() override;
|
||||
|
||||
private:
|
||||
const ::milvus::grpc::IndexParam* index_param_;
|
||||
};
|
||||
|
||||
} // namespace grpc
|
||||
} // namespace server
|
||||
} // namespace milvus
|
85
core/src/server/grpc_impl/request/CreatePartitionRequest.cpp
Normal file
85
core/src/server/grpc_impl/request/CreatePartitionRequest.cpp
Normal file
@ -0,0 +1,85 @@
|
||||
// Licensed to the Apache Software Foundation (ASF) under one
|
||||
// or more contributor license agreements. See the NOTICE file
|
||||
// distributed with this work for additional information
|
||||
// regarding copyright ownership. The ASF licenses this file
|
||||
// to you under the Apache License, Version 2.0 (the
|
||||
// "License"); you may not use this file except in compliance
|
||||
// with the License. You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing,
|
||||
// software distributed under the License is distributed on an
|
||||
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
// KIND, either express or implied. See the License for the
|
||||
// specific language governing permissions and limitations
|
||||
// under the License.
|
||||
|
||||
#include "server/grpc_impl/request/CreatePartitionRequest.h"
|
||||
#include "server/DBWrapper.h"
|
||||
#include "utils/Log.h"
|
||||
#include "utils/TimeRecorder.h"
|
||||
#include "utils/ValidationUtil.h"
|
||||
|
||||
#include <memory>
|
||||
|
||||
namespace milvus {
|
||||
namespace server {
|
||||
namespace grpc {
|
||||
|
||||
CreatePartitionRequest::CreatePartitionRequest(const ::milvus::grpc::PartitionParam* partition_param)
|
||||
: GrpcBaseRequest(DDL_DML_REQUEST_GROUP), partition_param_(partition_param) {
|
||||
}
|
||||
|
||||
BaseRequestPtr
|
||||
CreatePartitionRequest::Create(const ::milvus::grpc::PartitionParam* partition_param) {
|
||||
if (partition_param == nullptr) {
|
||||
SERVER_LOG_ERROR << "grpc input is null!";
|
||||
return nullptr;
|
||||
}
|
||||
return std::shared_ptr<GrpcBaseRequest>(new CreatePartitionRequest(partition_param));
|
||||
}
|
||||
|
||||
Status
|
||||
CreatePartitionRequest::OnExecute() {
|
||||
TimeRecorder rc("CreatePartitionRequest");
|
||||
|
||||
try {
|
||||
// step 1: check arguments
|
||||
auto status = ValidationUtil::ValidateTableName(partition_param_->table_name());
|
||||
if (!status.ok()) {
|
||||
return status;
|
||||
}
|
||||
|
||||
status = ValidationUtil::ValidateTableName(partition_param_->partition_name());
|
||||
if (!status.ok()) {
|
||||
return status;
|
||||
}
|
||||
|
||||
status = ValidationUtil::ValidatePartitionTags({partition_param_->tag()});
|
||||
if (!status.ok()) {
|
||||
return status;
|
||||
}
|
||||
|
||||
// step 2: create partition
|
||||
status = DBWrapper::DB()->CreatePartition(partition_param_->table_name(), partition_param_->partition_name(),
|
||||
partition_param_->tag());
|
||||
if (!status.ok()) {
|
||||
// partition could exist
|
||||
if (status.code() == DB_ALREADY_EXIST) {
|
||||
return Status(SERVER_INVALID_TABLE_NAME, status.message());
|
||||
}
|
||||
return status;
|
||||
}
|
||||
} catch (std::exception& ex) {
|
||||
return Status(SERVER_UNEXPECTED_ERROR, ex.what());
|
||||
}
|
||||
|
||||
rc.ElapseFromBegin("totally cost");
|
||||
|
||||
return Status::OK();
|
||||
}
|
||||
|
||||
} // namespace grpc
|
||||
} // namespace server
|
||||
} // namespace milvus
|
43
core/src/server/grpc_impl/request/CreatePartitionRequest.h
Normal file
43
core/src/server/grpc_impl/request/CreatePartitionRequest.h
Normal file
@ -0,0 +1,43 @@
|
||||
// Licensed to the Apache Software Foundation (ASF) under one
|
||||
// or more contributor license agreements. See the NOTICE file
|
||||
// distributed with this work for additional information
|
||||
// regarding copyright ownership. The ASF licenses this file
|
||||
// to you under the Apache License, Version 2.0 (the
|
||||
// "License"); you may not use this file except in compliance
|
||||
// with the License. You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing,
|
||||
// software distributed under the License is distributed on an
|
||||
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
// KIND, either express or implied. See the License for the
|
||||
// specific language governing permissions and limitations
|
||||
// under the License.
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "server/grpc_impl/request/GrpcBaseRequest.h"
|
||||
|
||||
namespace milvus {
|
||||
namespace server {
|
||||
namespace grpc {
|
||||
|
||||
class CreatePartitionRequest : public GrpcBaseRequest {
|
||||
public:
|
||||
static BaseRequestPtr
|
||||
Create(const ::milvus::grpc::PartitionParam* partition_param);
|
||||
|
||||
protected:
|
||||
explicit CreatePartitionRequest(const ::milvus::grpc::PartitionParam* partition_param);
|
||||
|
||||
Status
|
||||
OnExecute() override;
|
||||
|
||||
private:
|
||||
const ::milvus::grpc::PartitionParam* partition_param_;
|
||||
};
|
||||
|
||||
} // namespace grpc
|
||||
} // namespace server
|
||||
} // namespace milvus
|
96
core/src/server/grpc_impl/request/CreateTableRequest.cpp
Normal file
96
core/src/server/grpc_impl/request/CreateTableRequest.cpp
Normal file
@ -0,0 +1,96 @@
|
||||
// Licensed to the Apache Software Foundation (ASF) under one
|
||||
// or more contributor license agreements. See the NOTICE file
|
||||
// distributed with this work for additional information
|
||||
// regarding copyright ownership. The ASF licenses this file
|
||||
// to you under the Apache License, Version 2.0 (the
|
||||
// "License"); you may not use this file except in compliance
|
||||
// with the License. You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing,
|
||||
// software distributed under the License is distributed on an
|
||||
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
// KIND, either express or implied. See the License for the
|
||||
// specific language governing permissions and limitations
|
||||
// under the License.
|
||||
|
||||
#include "server/grpc_impl/request/CreateTableRequest.h"
|
||||
#include "server/DBWrapper.h"
|
||||
#include "utils/Log.h"
|
||||
#include "utils/TimeRecorder.h"
|
||||
#include "utils/ValidationUtil.h"
|
||||
|
||||
#include <memory>
|
||||
|
||||
namespace milvus {
|
||||
namespace server {
|
||||
namespace grpc {
|
||||
|
||||
CreateTableRequest::CreateTableRequest(const ::milvus::grpc::TableSchema* schema)
|
||||
: GrpcBaseRequest(DDL_DML_REQUEST_GROUP), schema_(schema) {
|
||||
}
|
||||
|
||||
BaseRequestPtr
|
||||
CreateTableRequest::Create(const ::milvus::grpc::TableSchema* schema) {
|
||||
if (schema == nullptr) {
|
||||
SERVER_LOG_ERROR << "grpc input is null!";
|
||||
return nullptr;
|
||||
}
|
||||
return std::shared_ptr<GrpcBaseRequest>(new CreateTableRequest(schema));
|
||||
}
|
||||
|
||||
Status
|
||||
CreateTableRequest::OnExecute() {
|
||||
TimeRecorder rc("CreateTableRequest");
|
||||
|
||||
try {
|
||||
// step 1: check arguments
|
||||
auto status = ValidationUtil::ValidateTableName(schema_->table_name());
|
||||
if (!status.ok()) {
|
||||
return status;
|
||||
}
|
||||
|
||||
status = ValidationUtil::ValidateTableDimension(schema_->dimension());
|
||||
if (!status.ok()) {
|
||||
return status;
|
||||
}
|
||||
|
||||
status = ValidationUtil::ValidateTableIndexFileSize(schema_->index_file_size());
|
||||
if (!status.ok()) {
|
||||
return status;
|
||||
}
|
||||
|
||||
status = ValidationUtil::ValidateTableIndexMetricType(schema_->metric_type());
|
||||
if (!status.ok()) {
|
||||
return status;
|
||||
}
|
||||
|
||||
// step 2: construct table schema
|
||||
engine::meta::TableSchema table_info;
|
||||
table_info.table_id_ = schema_->table_name();
|
||||
table_info.dimension_ = static_cast<uint16_t>(schema_->dimension());
|
||||
table_info.index_file_size_ = schema_->index_file_size();
|
||||
table_info.metric_type_ = schema_->metric_type();
|
||||
|
||||
// step 3: create table
|
||||
status = DBWrapper::DB()->CreateTable(table_info);
|
||||
if (!status.ok()) {
|
||||
// table could exist
|
||||
if (status.code() == DB_ALREADY_EXIST) {
|
||||
return Status(SERVER_INVALID_TABLE_NAME, status.message());
|
||||
}
|
||||
return status;
|
||||
}
|
||||
} catch (std::exception& ex) {
|
||||
return Status(SERVER_UNEXPECTED_ERROR, ex.what());
|
||||
}
|
||||
|
||||
rc.ElapseFromBegin("totally cost");
|
||||
|
||||
return Status::OK();
|
||||
}
|
||||
|
||||
} // namespace grpc
|
||||
} // namespace server
|
||||
} // namespace milvus
|
43
core/src/server/grpc_impl/request/CreateTableRequest.h
Normal file
43
core/src/server/grpc_impl/request/CreateTableRequest.h
Normal file
@ -0,0 +1,43 @@
|
||||
// Licensed to the Apache Software Foundation (ASF) under one
|
||||
// or more contributor license agreements. See the NOTICE file
|
||||
// distributed with this work for additional information
|
||||
// regarding copyright ownership. The ASF licenses this file
|
||||
// to you under the Apache License, Version 2.0 (the
|
||||
// "License"); you may not use this file except in compliance
|
||||
// with the License. You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing,
|
||||
// software distributed under the License is distributed on an
|
||||
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
// KIND, either express or implied. See the License for the
|
||||
// specific language governing permissions and limitations
|
||||
// under the License.
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "server/grpc_impl/request/GrpcBaseRequest.h"
|
||||
|
||||
namespace milvus {
|
||||
namespace server {
|
||||
namespace grpc {
|
||||
|
||||
class CreateTableRequest : public GrpcBaseRequest {
|
||||
public:
|
||||
static BaseRequestPtr
|
||||
Create(const ::milvus::grpc::TableSchema* schema);
|
||||
|
||||
protected:
|
||||
explicit CreateTableRequest(const ::milvus::grpc::TableSchema* schema);
|
||||
|
||||
Status
|
||||
OnExecute() override;
|
||||
|
||||
private:
|
||||
const ::milvus::grpc::TableSchema* schema_;
|
||||
};
|
||||
|
||||
} // namespace grpc
|
||||
} // namespace server
|
||||
} // namespace milvus
|
101
core/src/server/grpc_impl/request/DeleteByDateRequest.cpp
Normal file
101
core/src/server/grpc_impl/request/DeleteByDateRequest.cpp
Normal file
@ -0,0 +1,101 @@
|
||||
// Licensed to the Apache Software Foundation (ASF) under one
|
||||
// or more contributor license agreements. See the NOTICE file
|
||||
// distributed with this work for additional information
|
||||
// regarding copyright ownership. The ASF licenses this file
|
||||
// to you under the Apache License, Version 2.0 (the
|
||||
// "License"); you may not use this file except in compliance
|
||||
// with the License. You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing,
|
||||
// software distributed under the License is distributed on an
|
||||
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
// KIND, either express or implied. See the License for the
|
||||
// specific language governing permissions and limitations
|
||||
// under the License.
|
||||
|
||||
#include "server/grpc_impl/request/DeleteByDateRequest.h"
|
||||
#include "server/DBWrapper.h"
|
||||
#include "utils/Log.h"
|
||||
#include "utils/TimeRecorder.h"
|
||||
#include "utils/ValidationUtil.h"
|
||||
|
||||
#include <memory>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
namespace milvus {
|
||||
namespace server {
|
||||
namespace grpc {
|
||||
|
||||
DeleteByDateRequest::DeleteByDateRequest(const ::milvus::grpc::DeleteByDateParam* delete_by_range_param)
|
||||
: GrpcBaseRequest(DDL_DML_REQUEST_GROUP), delete_by_range_param_(delete_by_range_param) {
|
||||
}
|
||||
|
||||
BaseRequestPtr
|
||||
DeleteByDateRequest::Create(const ::milvus::grpc::DeleteByDateParam* delete_by_range_param) {
|
||||
if (delete_by_range_param == nullptr) {
|
||||
SERVER_LOG_ERROR << "grpc input is null!";
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
return std::shared_ptr<GrpcBaseRequest>(new DeleteByDateRequest(delete_by_range_param));
|
||||
}
|
||||
|
||||
Status
|
||||
DeleteByDateRequest::OnExecute() {
|
||||
try {
|
||||
TimeRecorder rc("DeleteByDateRequest");
|
||||
|
||||
// step 1: check arguments
|
||||
std::string table_name = delete_by_range_param_->table_name();
|
||||
auto status = ValidationUtil::ValidateTableName(table_name);
|
||||
if (!status.ok()) {
|
||||
return status;
|
||||
}
|
||||
|
||||
// step 2: check table existence
|
||||
engine::meta::TableSchema table_info;
|
||||
table_info.table_id_ = table_name;
|
||||
status = DBWrapper::DB()->DescribeTable(table_info);
|
||||
if (!status.ok()) {
|
||||
if (status.code(), DB_NOT_FOUND) {
|
||||
return Status(SERVER_TABLE_NOT_EXIST, TableNotExistMsg(table_name));
|
||||
} else {
|
||||
return status;
|
||||
}
|
||||
}
|
||||
|
||||
rc.ElapseFromBegin("check validation");
|
||||
|
||||
// step 3: check date range, and convert to db dates
|
||||
std::vector<DB_DATE> dates;
|
||||
ErrorCode error_code = SERVER_SUCCESS;
|
||||
std::string error_msg;
|
||||
|
||||
std::vector<::milvus::grpc::Range> range_array;
|
||||
range_array.emplace_back(delete_by_range_param_->range());
|
||||
status = ConvertTimeRangeToDBDates(range_array, dates);
|
||||
if (!status.ok()) {
|
||||
return status;
|
||||
}
|
||||
|
||||
#ifdef MILVUS_ENABLE_PROFILING
|
||||
std::string fname = "/tmp/search_nq_" + this->delete_by_range_param_->table_name() + ".profiling";
|
||||
ProfilerStart(fname.c_str());
|
||||
#endif
|
||||
status = DBWrapper::DB()->DropTable(table_name, dates);
|
||||
if (!status.ok()) {
|
||||
return status;
|
||||
}
|
||||
} catch (std::exception& ex) {
|
||||
return Status(SERVER_UNEXPECTED_ERROR, ex.what());
|
||||
}
|
||||
|
||||
return Status::OK();
|
||||
}
|
||||
|
||||
} // namespace grpc
|
||||
} // namespace server
|
||||
} // namespace milvus
|
43
core/src/server/grpc_impl/request/DeleteByDateRequest.h
Normal file
43
core/src/server/grpc_impl/request/DeleteByDateRequest.h
Normal file
@ -0,0 +1,43 @@
|
||||
// Licensed to the Apache Software Foundation (ASF) under one
|
||||
// or more contributor license agreements. See the NOTICE file
|
||||
// distributed with this work for additional information
|
||||
// regarding copyright ownership. The ASF licenses this file
|
||||
// to you under the Apache License, Version 2.0 (the
|
||||
// "License"); you may not use this file except in compliance
|
||||
// with the License. You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing,
|
||||
// software distributed under the License is distributed on an
|
||||
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
// KIND, either express or implied. See the License for the
|
||||
// specific language governing permissions and limitations
|
||||
// under the License.
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "server/grpc_impl/request/GrpcBaseRequest.h"
|
||||
|
||||
namespace milvus {
|
||||
namespace server {
|
||||
namespace grpc {
|
||||
|
||||
class DeleteByDateRequest : public GrpcBaseRequest {
|
||||
public:
|
||||
static BaseRequestPtr
|
||||
Create(const ::milvus::grpc::DeleteByDateParam* delete_by_range_param);
|
||||
|
||||
protected:
|
||||
explicit DeleteByDateRequest(const ::milvus::grpc::DeleteByDateParam* delete_by_range_param);
|
||||
|
||||
Status
|
||||
OnExecute() override;
|
||||
|
||||
private:
|
||||
const ::milvus::grpc::DeleteByDateParam* delete_by_range_param_;
|
||||
};
|
||||
|
||||
} // namespace grpc
|
||||
} // namespace server
|
||||
} // namespace milvus
|
71
core/src/server/grpc_impl/request/DescribeIndexRequest.cpp
Normal file
71
core/src/server/grpc_impl/request/DescribeIndexRequest.cpp
Normal file
@ -0,0 +1,71 @@
|
||||
// Licensed to the Apache Software Foundation (ASF) under one
|
||||
// or more contributor license agreements. See the NOTICE file
|
||||
// distributed with this work for additional information
|
||||
// regarding copyright ownership. The ASF licenses this file
|
||||
// to you under the Apache License, Version 2.0 (the
|
||||
// "License"); you may not use this file except in compliance
|
||||
// with the License. You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing,
|
||||
// software distributed under the License is distributed on an
|
||||
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
// KIND, either express or implied. See the License for the
|
||||
// specific language governing permissions and limitations
|
||||
// under the License.
|
||||
|
||||
#include "server/grpc_impl/request/DescribeIndexRequest.h"
|
||||
#include "server/DBWrapper.h"
|
||||
#include "utils/Log.h"
|
||||
#include "utils/TimeRecorder.h"
|
||||
#include "utils/ValidationUtil.h"
|
||||
|
||||
#include <memory>
|
||||
|
||||
namespace milvus {
|
||||
namespace server {
|
||||
namespace grpc {
|
||||
|
||||
DescribeIndexRequest::DescribeIndexRequest(const std::string& table_name, ::milvus::grpc::IndexParam* index_param)
|
||||
: GrpcBaseRequest(INFO_REQUEST_GROUP), table_name_(table_name), index_param_(index_param) {
|
||||
}
|
||||
|
||||
BaseRequestPtr
|
||||
DescribeIndexRequest::Create(const std::string& table_name, ::milvus::grpc::IndexParam* index_param) {
|
||||
return std::shared_ptr<GrpcBaseRequest>(new DescribeIndexRequest(table_name, index_param));
|
||||
}
|
||||
|
||||
Status
|
||||
DescribeIndexRequest::OnExecute() {
|
||||
try {
|
||||
TimeRecorder rc("DescribeIndexRequest");
|
||||
|
||||
// step 1: check arguments
|
||||
auto status = ValidationUtil::ValidateTableName(table_name_);
|
||||
if (!status.ok()) {
|
||||
return status;
|
||||
}
|
||||
|
||||
// step 2: check table existence
|
||||
engine::TableIndex index;
|
||||
status = DBWrapper::DB()->DescribeIndex(table_name_, index);
|
||||
if (!status.ok()) {
|
||||
return status;
|
||||
}
|
||||
|
||||
index_param_->set_table_name(table_name_);
|
||||
index_param_->mutable_index()->set_index_type(index.engine_type_);
|
||||
index_param_->mutable_index()->set_nlist(index.nlist_);
|
||||
|
||||
rc.ElapseFromBegin("totally cost");
|
||||
} catch (std::exception& ex) {
|
||||
return Status(SERVER_UNEXPECTED_ERROR, ex.what());
|
||||
}
|
||||
|
||||
return Status::OK();
|
||||
}
|
||||
|
||||
} // namespace grpc
|
||||
} // namespace server
|
||||
} // namespace milvus
|
46
core/src/server/grpc_impl/request/DescribeIndexRequest.h
Normal file
46
core/src/server/grpc_impl/request/DescribeIndexRequest.h
Normal file
@ -0,0 +1,46 @@
|
||||
// Licensed to the Apache Software Foundation (ASF) under one
|
||||
// or more contributor license agreements. See the NOTICE file
|
||||
// distributed with this work for additional information
|
||||
// regarding copyright ownership. The ASF licenses this file
|
||||
// to you under the Apache License, Version 2.0 (the
|
||||
// "License"); you may not use this file except in compliance
|
||||
// with the License. You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing,
|
||||
// software distributed under the License is distributed on an
|
||||
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
// KIND, either express or implied. See the License for the
|
||||
// specific language governing permissions and limitations
|
||||
// under the License.
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "server/grpc_impl/request/GrpcBaseRequest.h"
|
||||
|
||||
#include <string>
|
||||
|
||||
namespace milvus {
|
||||
namespace server {
|
||||
namespace grpc {
|
||||
|
||||
class DescribeIndexRequest : public GrpcBaseRequest {
|
||||
public:
|
||||
static BaseRequestPtr
|
||||
Create(const std::string& table_name, ::milvus::grpc::IndexParam* index_param);
|
||||
|
||||
protected:
|
||||
DescribeIndexRequest(const std::string& table_name, ::milvus::grpc::IndexParam* index_param);
|
||||
|
||||
Status
|
||||
OnExecute() override;
|
||||
|
||||
private:
|
||||
std::string table_name_;
|
||||
::milvus::grpc::IndexParam* index_param_;
|
||||
};
|
||||
|
||||
} // namespace grpc
|
||||
} // namespace server
|
||||
} // namespace milvus
|
73
core/src/server/grpc_impl/request/DescribeTableRequest.cpp
Normal file
73
core/src/server/grpc_impl/request/DescribeTableRequest.cpp
Normal file
@ -0,0 +1,73 @@
|
||||
// Licensed to the Apache Software Foundation (ASF) under one
|
||||
// or more contributor license agreements. See the NOTICE file
|
||||
// distributed with this work for additional information
|
||||
// regarding copyright ownership. The ASF licenses this file
|
||||
// to you under the Apache License, Version 2.0 (the
|
||||
// "License"); you may not use this file except in compliance
|
||||
// with the License. You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing,
|
||||
// software distributed under the License is distributed on an
|
||||
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
// KIND, either express or implied. See the License for the
|
||||
// specific language governing permissions and limitations
|
||||
// under the License.
|
||||
|
||||
#include "server/grpc_impl/request/DescribeTableRequest.h"
|
||||
#include "server/DBWrapper.h"
|
||||
#include "utils/Log.h"
|
||||
#include "utils/TimeRecorder.h"
|
||||
#include "utils/ValidationUtil.h"
|
||||
|
||||
#include <memory>
|
||||
|
||||
namespace milvus {
|
||||
namespace server {
|
||||
namespace grpc {
|
||||
|
||||
DescribeTableRequest::DescribeTableRequest(const std::string& table_name, ::milvus::grpc::TableSchema* schema)
|
||||
: GrpcBaseRequest(INFO_REQUEST_GROUP), table_name_(table_name), schema_(schema) {
|
||||
}
|
||||
|
||||
BaseRequestPtr
|
||||
DescribeTableRequest::Create(const std::string& table_name, ::milvus::grpc::TableSchema* schema) {
|
||||
return std::shared_ptr<GrpcBaseRequest>(new DescribeTableRequest(table_name, schema));
|
||||
}
|
||||
|
||||
Status
|
||||
DescribeTableRequest::OnExecute() {
|
||||
TimeRecorder rc("DescribeTableRequest");
|
||||
|
||||
try {
|
||||
// step 1: check arguments
|
||||
auto status = ValidationUtil::ValidateTableName(table_name_);
|
||||
if (!status.ok()) {
|
||||
return status;
|
||||
}
|
||||
|
||||
// step 2: get table info
|
||||
engine::meta::TableSchema table_info;
|
||||
table_info.table_id_ = table_name_;
|
||||
status = DBWrapper::DB()->DescribeTable(table_info);
|
||||
if (!status.ok()) {
|
||||
return status;
|
||||
}
|
||||
|
||||
schema_->set_table_name(table_info.table_id_);
|
||||
schema_->set_dimension(table_info.dimension_);
|
||||
schema_->set_index_file_size(table_info.index_file_size_);
|
||||
schema_->set_metric_type(table_info.metric_type_);
|
||||
} catch (std::exception& ex) {
|
||||
return Status(SERVER_UNEXPECTED_ERROR, ex.what());
|
||||
}
|
||||
|
||||
rc.ElapseFromBegin("totally cost");
|
||||
|
||||
return Status::OK();
|
||||
}
|
||||
|
||||
} // namespace grpc
|
||||
} // namespace server
|
||||
} // namespace milvus
|
46
core/src/server/grpc_impl/request/DescribeTableRequest.h
Normal file
46
core/src/server/grpc_impl/request/DescribeTableRequest.h
Normal file
@ -0,0 +1,46 @@
|
||||
// Licensed to the Apache Software Foundation (ASF) under one
|
||||
// or more contributor license agreements. See the NOTICE file
|
||||
// distributed with this work for additional information
|
||||
// regarding copyright ownership. The ASF licenses this file
|
||||
// to you under the Apache License, Version 2.0 (the
|
||||
// "License"); you may not use this file except in compliance
|
||||
// with the License. You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing,
|
||||
// software distributed under the License is distributed on an
|
||||
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
// KIND, either express or implied. See the License for the
|
||||
// specific language governing permissions and limitations
|
||||
// under the License.
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "server/grpc_impl/request/GrpcBaseRequest.h"
|
||||
|
||||
#include <string>
|
||||
|
||||
namespace milvus {
|
||||
namespace server {
|
||||
namespace grpc {
|
||||
|
||||
class DescribeTableRequest : public GrpcBaseRequest {
|
||||
public:
|
||||
static BaseRequestPtr
|
||||
Create(const std::string& table_name, ::milvus::grpc::TableSchema* schema);
|
||||
|
||||
protected:
|
||||
DescribeTableRequest(const std::string& table_name, ::milvus::grpc::TableSchema* schema);
|
||||
|
||||
Status
|
||||
OnExecute() override;
|
||||
|
||||
private:
|
||||
std::string table_name_;
|
||||
::milvus::grpc::TableSchema* schema_;
|
||||
};
|
||||
|
||||
} // namespace grpc
|
||||
} // namespace server
|
||||
} // namespace milvus
|
76
core/src/server/grpc_impl/request/DropIndexRequest.cpp
Normal file
76
core/src/server/grpc_impl/request/DropIndexRequest.cpp
Normal file
@ -0,0 +1,76 @@
|
||||
// Licensed to the Apache Software Foundation (ASF) under one
|
||||
// or more contributor license agreements. See the NOTICE file
|
||||
// distributed with this work for additional information
|
||||
// regarding copyright ownership. The ASF licenses this file
|
||||
// to you under the Apache License, Version 2.0 (the
|
||||
// "License"); you may not use this file except in compliance
|
||||
// with the License. You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing,
|
||||
// software distributed under the License is distributed on an
|
||||
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
// KIND, either express or implied. See the License for the
|
||||
// specific language governing permissions and limitations
|
||||
// under the License.
|
||||
|
||||
#include "server/grpc_impl/request/DropIndexRequest.h"
|
||||
#include "server/DBWrapper.h"
|
||||
#include "utils/Log.h"
|
||||
#include "utils/TimeRecorder.h"
|
||||
#include "utils/ValidationUtil.h"
|
||||
|
||||
#include <memory>
|
||||
|
||||
namespace milvus {
|
||||
namespace server {
|
||||
namespace grpc {
|
||||
|
||||
DropIndexRequest::DropIndexRequest(const std::string& table_name)
|
||||
: GrpcBaseRequest(DDL_DML_REQUEST_GROUP), table_name_(table_name) {
|
||||
}
|
||||
|
||||
BaseRequestPtr
|
||||
DropIndexRequest::Create(const std::string& table_name) {
|
||||
return std::shared_ptr<GrpcBaseRequest>(new DropIndexRequest(table_name));
|
||||
}
|
||||
|
||||
Status
|
||||
DropIndexRequest::OnExecute() {
|
||||
try {
|
||||
TimeRecorder rc("DropIndexRequest");
|
||||
|
||||
// step 1: check arguments
|
||||
auto status = ValidationUtil::ValidateTableName(table_name_);
|
||||
if (!status.ok()) {
|
||||
return status;
|
||||
}
|
||||
|
||||
bool has_table = false;
|
||||
status = DBWrapper::DB()->HasTable(table_name_, has_table);
|
||||
if (!status.ok()) {
|
||||
return status;
|
||||
}
|
||||
|
||||
if (!has_table) {
|
||||
return Status(SERVER_TABLE_NOT_EXIST, TableNotExistMsg(table_name_));
|
||||
}
|
||||
|
||||
// step 2: check table existence
|
||||
status = DBWrapper::DB()->DropIndex(table_name_);
|
||||
if (!status.ok()) {
|
||||
return status;
|
||||
}
|
||||
|
||||
rc.ElapseFromBegin("totally cost");
|
||||
} catch (std::exception& ex) {
|
||||
return Status(SERVER_UNEXPECTED_ERROR, ex.what());
|
||||
}
|
||||
|
||||
return Status::OK();
|
||||
}
|
||||
|
||||
} // namespace grpc
|
||||
} // namespace server
|
||||
} // namespace milvus
|
45
core/src/server/grpc_impl/request/DropIndexRequest.h
Normal file
45
core/src/server/grpc_impl/request/DropIndexRequest.h
Normal file
@ -0,0 +1,45 @@
|
||||
// Licensed to the Apache Software Foundation (ASF) under one
|
||||
// or more contributor license agreements. See the NOTICE file
|
||||
// distributed with this work for additional information
|
||||
// regarding copyright ownership. The ASF licenses this file
|
||||
// to you under the Apache License, Version 2.0 (the
|
||||
// "License"); you may not use this file except in compliance
|
||||
// with the License. You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing,
|
||||
// software distributed under the License is distributed on an
|
||||
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
// KIND, either express or implied. See the License for the
|
||||
// specific language governing permissions and limitations
|
||||
// under the License.
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "server/grpc_impl/request/GrpcBaseRequest.h"
|
||||
|
||||
#include <string>
|
||||
|
||||
namespace milvus {
|
||||
namespace server {
|
||||
namespace grpc {
|
||||
|
||||
class DropIndexRequest : public GrpcBaseRequest {
|
||||
public:
|
||||
static BaseRequestPtr
|
||||
Create(const std::string& table_name);
|
||||
|
||||
protected:
|
||||
explicit DropIndexRequest(const std::string& table_name);
|
||||
|
||||
Status
|
||||
OnExecute() override;
|
||||
|
||||
private:
|
||||
std::string table_name_;
|
||||
};
|
||||
|
||||
} // namespace grpc
|
||||
} // namespace server
|
||||
} // namespace milvus
|
63
core/src/server/grpc_impl/request/DropPartitionRequest.cpp
Normal file
63
core/src/server/grpc_impl/request/DropPartitionRequest.cpp
Normal file
@ -0,0 +1,63 @@
|
||||
// Licensed to the Apache Software Foundation (ASF) under one
|
||||
// or more contributor license agreements. See the NOTICE file
|
||||
// distributed with this work for additional information
|
||||
// regarding copyright ownership. The ASF licenses this file
|
||||
// to you under the Apache License, Version 2.0 (the
|
||||
// "License"); you may not use this file except in compliance
|
||||
// with the License. You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing,
|
||||
// software distributed under the License is distributed on an
|
||||
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
// KIND, either express or implied. See the License for the
|
||||
// specific language governing permissions and limitations
|
||||
// under the License.
|
||||
|
||||
#include "server/grpc_impl/request/DropPartitionRequest.h"
|
||||
#include "server/DBWrapper.h"
|
||||
#include "utils/Log.h"
|
||||
#include "utils/TimeRecorder.h"
|
||||
#include "utils/ValidationUtil.h"
|
||||
|
||||
#include <memory>
|
||||
|
||||
namespace milvus {
|
||||
namespace server {
|
||||
namespace grpc {
|
||||
|
||||
DropPartitionRequest::DropPartitionRequest(const ::milvus::grpc::PartitionParam* partition_param)
|
||||
: GrpcBaseRequest(DDL_DML_REQUEST_GROUP), partition_param_(partition_param) {
|
||||
}
|
||||
|
||||
BaseRequestPtr
|
||||
DropPartitionRequest::Create(const ::milvus::grpc::PartitionParam* partition_param) {
|
||||
return std::shared_ptr<GrpcBaseRequest>(new DropPartitionRequest(partition_param));
|
||||
}
|
||||
|
||||
Status
|
||||
DropPartitionRequest::OnExecute() {
|
||||
if (!partition_param_->partition_name().empty()) {
|
||||
auto status = ValidationUtil::ValidateTableName(partition_param_->partition_name());
|
||||
if (!status.ok()) {
|
||||
return status;
|
||||
}
|
||||
return DBWrapper::DB()->DropPartition(partition_param_->partition_name());
|
||||
} else {
|
||||
auto status = ValidationUtil::ValidateTableName(partition_param_->table_name());
|
||||
if (!status.ok()) {
|
||||
return status;
|
||||
}
|
||||
|
||||
status = ValidationUtil::ValidatePartitionTags({partition_param_->tag()});
|
||||
if (!status.ok()) {
|
||||
return status;
|
||||
}
|
||||
return DBWrapper::DB()->DropPartitionByTag(partition_param_->table_name(), partition_param_->tag());
|
||||
}
|
||||
}
|
||||
|
||||
} // namespace grpc
|
||||
} // namespace server
|
||||
} // namespace milvus
|
43
core/src/server/grpc_impl/request/DropPartitionRequest.h
Normal file
43
core/src/server/grpc_impl/request/DropPartitionRequest.h
Normal file
@ -0,0 +1,43 @@
|
||||
// Licensed to the Apache Software Foundation (ASF) under one
|
||||
// or more contributor license agreements. See the NOTICE file
|
||||
// distributed with this work for additional information
|
||||
// regarding copyright ownership. The ASF licenses this file
|
||||
// to you under the Apache License, Version 2.0 (the
|
||||
// "License"); you may not use this file except in compliance
|
||||
// with the License. You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing,
|
||||
// software distributed under the License is distributed on an
|
||||
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
// KIND, either express or implied. See the License for the
|
||||
// specific language governing permissions and limitations
|
||||
// under the License.
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "server/grpc_impl/request/GrpcBaseRequest.h"
|
||||
|
||||
namespace milvus {
|
||||
namespace server {
|
||||
namespace grpc {
|
||||
|
||||
class DropPartitionRequest : public GrpcBaseRequest {
|
||||
public:
|
||||
static BaseRequestPtr
|
||||
Create(const ::milvus::grpc::PartitionParam* partition_param);
|
||||
|
||||
protected:
|
||||
explicit DropPartitionRequest(const ::milvus::grpc::PartitionParam* partition_param);
|
||||
|
||||
Status
|
||||
OnExecute() override;
|
||||
|
||||
private:
|
||||
const ::milvus::grpc::PartitionParam* partition_param_;
|
||||
};
|
||||
|
||||
} // namespace grpc
|
||||
} // namespace server
|
||||
} // namespace milvus
|
82
core/src/server/grpc_impl/request/DropTableRequest.cpp
Normal file
82
core/src/server/grpc_impl/request/DropTableRequest.cpp
Normal file
@ -0,0 +1,82 @@
|
||||
// Licensed to the Apache Software Foundation (ASF) under one
|
||||
// or more contributor license agreements. See the NOTICE file
|
||||
// distributed with this work for additional information
|
||||
// regarding copyright ownership. The ASF licenses this file
|
||||
// to you under the Apache License, Version 2.0 (the
|
||||
// "License"); you may not use this file except in compliance
|
||||
// with the License. You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing,
|
||||
// software distributed under the License is distributed on an
|
||||
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
// KIND, either express or implied. See the License for the
|
||||
// specific language governing permissions and limitations
|
||||
// under the License.
|
||||
|
||||
#include "server/grpc_impl/request/DropTableRequest.h"
|
||||
#include "server/DBWrapper.h"
|
||||
#include "utils/Log.h"
|
||||
#include "utils/TimeRecorder.h"
|
||||
#include "utils/ValidationUtil.h"
|
||||
|
||||
#include <memory>
|
||||
#include <vector>
|
||||
|
||||
namespace milvus {
|
||||
namespace server {
|
||||
namespace grpc {
|
||||
|
||||
DropTableRequest::DropTableRequest(const std::string& table_name)
|
||||
: GrpcBaseRequest(DDL_DML_REQUEST_GROUP), table_name_(table_name) {
|
||||
}
|
||||
|
||||
BaseRequestPtr
|
||||
DropTableRequest::Create(const std::string& table_name) {
|
||||
return std::shared_ptr<GrpcBaseRequest>(new DropTableRequest(table_name));
|
||||
}
|
||||
|
||||
Status
|
||||
DropTableRequest::OnExecute() {
|
||||
try {
|
||||
TimeRecorder rc("DropTableRequest");
|
||||
|
||||
// step 1: check arguments
|
||||
auto status = ValidationUtil::ValidateTableName(table_name_);
|
||||
if (!status.ok()) {
|
||||
return status;
|
||||
}
|
||||
|
||||
// step 2: check table existence
|
||||
engine::meta::TableSchema table_info;
|
||||
table_info.table_id_ = table_name_;
|
||||
status = DBWrapper::DB()->DescribeTable(table_info);
|
||||
if (!status.ok()) {
|
||||
if (status.code() == DB_NOT_FOUND) {
|
||||
return Status(SERVER_TABLE_NOT_EXIST, TableNotExistMsg(table_name_));
|
||||
} else {
|
||||
return status;
|
||||
}
|
||||
}
|
||||
|
||||
rc.ElapseFromBegin("check validation");
|
||||
|
||||
// step 3: Drop table
|
||||
std::vector<DB_DATE> dates;
|
||||
status = DBWrapper::DB()->DropTable(table_name_, dates);
|
||||
if (!status.ok()) {
|
||||
return status;
|
||||
}
|
||||
|
||||
rc.ElapseFromBegin("total cost");
|
||||
} catch (std::exception& ex) {
|
||||
return Status(SERVER_UNEXPECTED_ERROR, ex.what());
|
||||
}
|
||||
|
||||
return Status::OK();
|
||||
}
|
||||
|
||||
} // namespace grpc
|
||||
} // namespace server
|
||||
} // namespace milvus
|
45
core/src/server/grpc_impl/request/DropTableRequest.h
Normal file
45
core/src/server/grpc_impl/request/DropTableRequest.h
Normal file
@ -0,0 +1,45 @@
|
||||
// Licensed to the Apache Software Foundation (ASF) under one
|
||||
// or more contributor license agreements. See the NOTICE file
|
||||
// distributed with this work for additional information
|
||||
// regarding copyright ownership. The ASF licenses this file
|
||||
// to you under the Apache License, Version 2.0 (the
|
||||
// "License"); you may not use this file except in compliance
|
||||
// with the License. You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing,
|
||||
// software distributed under the License is distributed on an
|
||||
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
// KIND, either express or implied. See the License for the
|
||||
// specific language governing permissions and limitations
|
||||
// under the License.
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "server/grpc_impl/request/GrpcBaseRequest.h"
|
||||
|
||||
#include <string>
|
||||
|
||||
namespace milvus {
|
||||
namespace server {
|
||||
namespace grpc {
|
||||
|
||||
class DropTableRequest : public GrpcBaseRequest {
|
||||
public:
|
||||
static BaseRequestPtr
|
||||
Create(const std::string& table_name);
|
||||
|
||||
protected:
|
||||
explicit DropTableRequest(const std::string& table_name);
|
||||
|
||||
Status
|
||||
OnExecute() override;
|
||||
|
||||
private:
|
||||
std::string table_name_;
|
||||
};
|
||||
|
||||
} // namespace grpc
|
||||
} // namespace server
|
||||
} // namespace milvus
|
107
core/src/server/grpc_impl/request/GrpcBaseRequest.cpp
Normal file
107
core/src/server/grpc_impl/request/GrpcBaseRequest.cpp
Normal file
@ -0,0 +1,107 @@
|
||||
// Licensed to the Apache Software Foundation (ASF) under one
|
||||
// or more contributor license agreements. See the NOTICE file
|
||||
// distributed with this work for additional information
|
||||
// regarding copyright ownership. The ASF licenses this file
|
||||
// to you under the Apache License, Version 2.0 (the
|
||||
// "License"); you may not use this file except in compliance
|
||||
// with the License. You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing,
|
||||
// software distributed under the License is distributed on an
|
||||
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
// KIND, either express or implied. See the License for the
|
||||
// specific language governing permissions and limitations
|
||||
// under the License.
|
||||
|
||||
#include "server/grpc_impl/request/GrpcBaseRequest.h"
|
||||
#include "utils/CommonUtil.h"
|
||||
#include "utils/Log.h"
|
||||
|
||||
namespace milvus {
|
||||
namespace server {
|
||||
namespace grpc {
|
||||
|
||||
constexpr int64_t DAY_SECONDS = 24 * 60 * 60;
|
||||
|
||||
Status
|
||||
ConvertTimeRangeToDBDates(const std::vector<::milvus::grpc::Range>& range_array, std::vector<DB_DATE>& dates) {
|
||||
dates.clear();
|
||||
for (auto& range : range_array) {
|
||||
time_t tt_start, tt_end;
|
||||
tm tm_start, tm_end;
|
||||
if (!CommonUtil::TimeStrToTime(range.start_value(), tt_start, tm_start)) {
|
||||
return Status(SERVER_INVALID_TIME_RANGE, "Invalid time range: " + range.start_value());
|
||||
}
|
||||
|
||||
if (!CommonUtil::TimeStrToTime(range.end_value(), tt_end, tm_end)) {
|
||||
return Status(SERVER_INVALID_TIME_RANGE, "Invalid time range: " + range.start_value());
|
||||
}
|
||||
|
||||
int64_t days = (tt_end - tt_start) / DAY_SECONDS;
|
||||
if (days <= 0) {
|
||||
return Status(SERVER_INVALID_TIME_RANGE,
|
||||
"Invalid time range: The start-date should be smaller than end-date!");
|
||||
}
|
||||
|
||||
// range: [start_day, end_day)
|
||||
for (int64_t i = 0; i < days; i++) {
|
||||
time_t tt_day = tt_start + DAY_SECONDS * i;
|
||||
tm tm_day;
|
||||
CommonUtil::ConvertTime(tt_day, tm_day);
|
||||
|
||||
int64_t date = tm_day.tm_year * 10000 + tm_day.tm_mon * 100 + tm_day.tm_mday; // according to db logic
|
||||
dates.push_back(date);
|
||||
}
|
||||
}
|
||||
|
||||
return Status::OK();
|
||||
}
|
||||
|
||||
GrpcBaseRequest::GrpcBaseRequest(const std::string& request_group, bool async)
|
||||
: request_group_(request_group), async_(async), done_(false) {
|
||||
}
|
||||
|
||||
GrpcBaseRequest::~GrpcBaseRequest() {
|
||||
WaitToFinish();
|
||||
}
|
||||
|
||||
Status
|
||||
GrpcBaseRequest::Execute() {
|
||||
status_ = OnExecute();
|
||||
Done();
|
||||
return status_;
|
||||
}
|
||||
|
||||
void
|
||||
GrpcBaseRequest::Done() {
|
||||
done_ = true;
|
||||
finish_cond_.notify_all();
|
||||
}
|
||||
|
||||
Status
|
||||
GrpcBaseRequest::SetStatus(ErrorCode error_code, const std::string& error_msg) {
|
||||
status_ = Status(error_code, error_msg);
|
||||
SERVER_LOG_ERROR << error_msg;
|
||||
return status_;
|
||||
}
|
||||
|
||||
std::string
|
||||
GrpcBaseRequest::TableNotExistMsg(const std::string& table_name) {
|
||||
return "Table " + table_name +
|
||||
" not exist. Use milvus.has_table to verify whether the table exists. You also can check if the table name "
|
||||
"exists.";
|
||||
}
|
||||
|
||||
Status
|
||||
GrpcBaseRequest::WaitToFinish() {
|
||||
std::unique_lock<std::mutex> lock(finish_mtx_);
|
||||
finish_cond_.wait(lock, [this] { return done_; });
|
||||
|
||||
return status_;
|
||||
}
|
||||
|
||||
} // namespace grpc
|
||||
} // namespace server
|
||||
} // namespace milvus
|
101
core/src/server/grpc_impl/request/GrpcBaseRequest.h
Normal file
101
core/src/server/grpc_impl/request/GrpcBaseRequest.h
Normal file
@ -0,0 +1,101 @@
|
||||
// Licensed to the Apache Software Foundation (ASF) under one
|
||||
// or more contributor license agreements. See the NOTICE file
|
||||
// distributed with this work for additional information
|
||||
// regarding copyright ownership. The ASF licenses this file
|
||||
// to you under the Apache License, Version 2.0 (the
|
||||
// "License"); you may not use this file except in compliance
|
||||
// with the License. You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing,
|
||||
// software distributed under the License is distributed on an
|
||||
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
// KIND, either express or implied. See the License for the
|
||||
// specific language governing permissions and limitations
|
||||
// under the License.
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "db/meta/MetaTypes.h"
|
||||
#include "grpc/gen-milvus/milvus.grpc.pb.h"
|
||||
#include "grpc/gen-status/status.grpc.pb.h"
|
||||
#include "grpc/gen-status/status.pb.h"
|
||||
#include "utils/Status.h"
|
||||
|
||||
#include <condition_variable>
|
||||
//#include <gperftools/profiler.h>
|
||||
#include <memory>
|
||||
#include <string>
|
||||
#include <thread>
|
||||
#include <vector>
|
||||
|
||||
namespace milvus {
|
||||
namespace server {
|
||||
namespace grpc {
|
||||
|
||||
static const char* DQL_REQUEST_GROUP = "dql";
|
||||
static const char* DDL_DML_REQUEST_GROUP = "ddl_dml";
|
||||
static const char* INFO_REQUEST_GROUP = "info";
|
||||
|
||||
using DB_DATE = milvus::engine::meta::DateT;
|
||||
|
||||
Status
|
||||
ConvertTimeRangeToDBDates(const std::vector<::milvus::grpc::Range>& range_array, std::vector<DB_DATE>& dates);
|
||||
|
||||
class GrpcBaseRequest {
|
||||
protected:
|
||||
explicit GrpcBaseRequest(const std::string& request_group, bool async = false);
|
||||
|
||||
virtual ~GrpcBaseRequest();
|
||||
|
||||
public:
|
||||
Status
|
||||
Execute();
|
||||
|
||||
void
|
||||
Done();
|
||||
|
||||
Status
|
||||
WaitToFinish();
|
||||
|
||||
std::string
|
||||
RequestGroup() const {
|
||||
return request_group_;
|
||||
}
|
||||
|
||||
const Status&
|
||||
status() const {
|
||||
return status_;
|
||||
}
|
||||
|
||||
bool
|
||||
IsAsync() const {
|
||||
return async_;
|
||||
}
|
||||
|
||||
protected:
|
||||
virtual Status
|
||||
OnExecute() = 0;
|
||||
|
||||
Status
|
||||
SetStatus(ErrorCode error_code, const std::string& error_msg);
|
||||
|
||||
std::string
|
||||
TableNotExistMsg(const std::string& table_name);
|
||||
|
||||
protected:
|
||||
mutable std::mutex finish_mtx_;
|
||||
std::condition_variable finish_cond_;
|
||||
|
||||
std::string request_group_;
|
||||
bool async_;
|
||||
bool done_;
|
||||
Status status_;
|
||||
};
|
||||
|
||||
using BaseRequestPtr = std::shared_ptr<GrpcBaseRequest>;
|
||||
|
||||
} // namespace grpc
|
||||
} // namespace server
|
||||
} // namespace milvus
|
66
core/src/server/grpc_impl/request/HasTableRequest.cpp
Normal file
66
core/src/server/grpc_impl/request/HasTableRequest.cpp
Normal file
@ -0,0 +1,66 @@
|
||||
// Licensed to the Apache Software Foundation (ASF) under one
|
||||
// or more contributor license agreements. See the NOTICE file
|
||||
// distributed with this work for additional information
|
||||
// regarding copyright ownership. The ASF licenses this file
|
||||
// to you under the Apache License, Version 2.0 (the
|
||||
// "License"); you may not use this file except in compliance
|
||||
// with the License. You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing,
|
||||
// software distributed under the License is distributed on an
|
||||
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
// KIND, either express or implied. See the License for the
|
||||
// specific language governing permissions and limitations
|
||||
// under the License.
|
||||
|
||||
#include "server/grpc_impl/request/HasTableRequest.h"
|
||||
#include "server/DBWrapper.h"
|
||||
#include "utils/Log.h"
|
||||
#include "utils/TimeRecorder.h"
|
||||
#include "utils/ValidationUtil.h"
|
||||
|
||||
#include <memory>
|
||||
|
||||
namespace milvus {
|
||||
namespace server {
|
||||
namespace grpc {
|
||||
|
||||
HasTableRequest::HasTableRequest(const std::string& table_name, bool& has_table)
|
||||
: GrpcBaseRequest(INFO_REQUEST_GROUP), table_name_(table_name), has_table_(has_table) {
|
||||
}
|
||||
|
||||
BaseRequestPtr
|
||||
HasTableRequest::Create(const std::string& table_name, bool& has_table) {
|
||||
return std::shared_ptr<GrpcBaseRequest>(new HasTableRequest(table_name, has_table));
|
||||
}
|
||||
|
||||
Status
|
||||
HasTableRequest::OnExecute() {
|
||||
try {
|
||||
TimeRecorder rc("HasTableRequest");
|
||||
|
||||
// step 1: check arguments
|
||||
auto status = ValidationUtil::ValidateTableName(table_name_);
|
||||
if (!status.ok()) {
|
||||
return status;
|
||||
}
|
||||
|
||||
// step 2: check table existence
|
||||
status = DBWrapper::DB()->HasTable(table_name_, has_table_);
|
||||
if (!status.ok()) {
|
||||
return status;
|
||||
}
|
||||
|
||||
rc.ElapseFromBegin("totally cost");
|
||||
} catch (std::exception& ex) {
|
||||
return Status(SERVER_UNEXPECTED_ERROR, ex.what());
|
||||
}
|
||||
|
||||
return Status::OK();
|
||||
}
|
||||
|
||||
} // namespace grpc
|
||||
} // namespace server
|
||||
} // namespace milvus
|
46
core/src/server/grpc_impl/request/HasTableRequest.h
Normal file
46
core/src/server/grpc_impl/request/HasTableRequest.h
Normal file
@ -0,0 +1,46 @@
|
||||
// Licensed to the Apache Software Foundation (ASF) under one
|
||||
// or more contributor license agreements. See the NOTICE file
|
||||
// distributed with this work for additional information
|
||||
// regarding copyright ownership. The ASF licenses this file
|
||||
// to you under the Apache License, Version 2.0 (the
|
||||
// "License"); you may not use this file except in compliance
|
||||
// with the License. You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing,
|
||||
// software distributed under the License is distributed on an
|
||||
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
// KIND, either express or implied. See the License for the
|
||||
// specific language governing permissions and limitations
|
||||
// under the License.
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "server/grpc_impl/request/GrpcBaseRequest.h"
|
||||
|
||||
#include <string>
|
||||
|
||||
namespace milvus {
|
||||
namespace server {
|
||||
namespace grpc {
|
||||
|
||||
class HasTableRequest : public GrpcBaseRequest {
|
||||
public:
|
||||
static BaseRequestPtr
|
||||
Create(const std::string& table_name, bool& has_table);
|
||||
|
||||
protected:
|
||||
HasTableRequest(const std::string& table_name, bool& has_table);
|
||||
|
||||
Status
|
||||
OnExecute() override;
|
||||
|
||||
private:
|
||||
std::string table_name_;
|
||||
bool& has_table_;
|
||||
};
|
||||
|
||||
} // namespace grpc
|
||||
} // namespace server
|
||||
} // namespace milvus
|
170
core/src/server/grpc_impl/request/InsertRequest.cpp
Normal file
170
core/src/server/grpc_impl/request/InsertRequest.cpp
Normal file
@ -0,0 +1,170 @@
|
||||
// Licensed to the Apache Software Foundation (ASF) under one
|
||||
// or more contributor license agreements. See the NOTICE file
|
||||
// distributed with this work for additional information
|
||||
// regarding copyright ownership. The ASF licenses this file
|
||||
// to you under the Apache License, Version 2.0 (the
|
||||
// "License"); you may not use this file except in compliance
|
||||
// with the License. You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing,
|
||||
// software distributed under the License is distributed on an
|
||||
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
// KIND, either express or implied. See the License for the
|
||||
// specific language governing permissions and limitations
|
||||
// under the License.
|
||||
|
||||
#include "server/grpc_impl/request/InsertRequest.h"
|
||||
#include "server/DBWrapper.h"
|
||||
#include "utils/Log.h"
|
||||
#include "utils/TimeRecorder.h"
|
||||
#include "utils/ValidationUtil.h"
|
||||
|
||||
#include <memory>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
namespace milvus {
|
||||
namespace server {
|
||||
namespace grpc {
|
||||
|
||||
InsertRequest::InsertRequest(const ::milvus::grpc::InsertParam* insert_param, ::milvus::grpc::VectorIds* record_ids)
|
||||
: GrpcBaseRequest(DDL_DML_REQUEST_GROUP), insert_param_(insert_param), record_ids_(record_ids) {
|
||||
}
|
||||
|
||||
BaseRequestPtr
|
||||
InsertRequest::Create(const ::milvus::grpc::InsertParam* insert_param, ::milvus::grpc::VectorIds* record_ids) {
|
||||
if (insert_param == nullptr) {
|
||||
SERVER_LOG_ERROR << "grpc input is null!";
|
||||
return nullptr;
|
||||
}
|
||||
return std::shared_ptr<GrpcBaseRequest>(new InsertRequest(insert_param, record_ids));
|
||||
}
|
||||
|
||||
Status
|
||||
InsertRequest::OnExecute() {
|
||||
try {
|
||||
TimeRecorder rc("InsertRequest");
|
||||
|
||||
// step 1: check arguments
|
||||
auto status = ValidationUtil::ValidateTableName(insert_param_->table_name());
|
||||
if (!status.ok()) {
|
||||
return status;
|
||||
}
|
||||
if (insert_param_->row_record_array().empty()) {
|
||||
return Status(SERVER_INVALID_ROWRECORD_ARRAY,
|
||||
"The vector array is empty. Make sure you have entered vector records.");
|
||||
}
|
||||
|
||||
if (!insert_param_->row_id_array().empty()) {
|
||||
if (insert_param_->row_id_array().size() != insert_param_->row_record_array_size()) {
|
||||
return Status(SERVER_ILLEGAL_VECTOR_ID,
|
||||
"The size of vector ID array must be equal to the size of the vector.");
|
||||
}
|
||||
}
|
||||
|
||||
// step 2: check table existence
|
||||
engine::meta::TableSchema table_info;
|
||||
table_info.table_id_ = insert_param_->table_name();
|
||||
status = DBWrapper::DB()->DescribeTable(table_info);
|
||||
if (!status.ok()) {
|
||||
if (status.code() == DB_NOT_FOUND) {
|
||||
return Status(SERVER_TABLE_NOT_EXIST, TableNotExistMsg(insert_param_->table_name()));
|
||||
} else {
|
||||
return status;
|
||||
}
|
||||
}
|
||||
|
||||
// step 3: check table flag
|
||||
// all user provide id, or all internal id
|
||||
bool user_provide_ids = !insert_param_->row_id_array().empty();
|
||||
// user already provided id before, all insert action require user id
|
||||
if ((table_info.flag_ & engine::meta::FLAG_MASK_HAS_USERID) != 0 && !user_provide_ids) {
|
||||
return Status(SERVER_ILLEGAL_VECTOR_ID,
|
||||
"Table vector IDs are user-defined. Please provide IDs for all vectors of this table.");
|
||||
}
|
||||
|
||||
// user didn't provided id before, no need to provide user id
|
||||
if ((table_info.flag_ & engine::meta::FLAG_MASK_NO_USERID) != 0 && user_provide_ids) {
|
||||
return Status(
|
||||
SERVER_ILLEGAL_VECTOR_ID,
|
||||
"Table vector IDs are auto-generated. All vectors of this table must use auto-generated IDs.");
|
||||
}
|
||||
|
||||
rc.RecordSection("check validation");
|
||||
|
||||
#ifdef MILVUS_ENABLE_PROFILING
|
||||
std::string fname =
|
||||
"/tmp/insert_" + std::to_string(this->insert_param_->row_record_array_size()) + ".profiling";
|
||||
ProfilerStart(fname.c_str());
|
||||
#endif
|
||||
|
||||
// step 4: prepare float data
|
||||
std::vector<float> vec_f(insert_param_->row_record_array_size() * table_info.dimension_, 0);
|
||||
|
||||
// TODO(yk): change to one dimension array or use multiple-thread to copy the data
|
||||
for (size_t i = 0; i < insert_param_->row_record_array_size(); i++) {
|
||||
if (insert_param_->row_record_array(i).vector_data().empty()) {
|
||||
return Status(SERVER_INVALID_ROWRECORD_ARRAY,
|
||||
"The vector dimension must be equal to the table dimension.");
|
||||
}
|
||||
uint64_t vec_dim = insert_param_->row_record_array(i).vector_data().size();
|
||||
if (vec_dim != table_info.dimension_) {
|
||||
ErrorCode error_code = SERVER_INVALID_VECTOR_DIMENSION;
|
||||
std::string error_msg = "The vector dimension must be equal to the table dimension.";
|
||||
return Status(error_code, error_msg);
|
||||
}
|
||||
memcpy(&vec_f[i * table_info.dimension_], insert_param_->row_record_array(i).vector_data().data(),
|
||||
table_info.dimension_ * sizeof(float));
|
||||
}
|
||||
|
||||
rc.ElapseFromBegin("prepare vectors data");
|
||||
|
||||
// step 5: insert vectors
|
||||
auto vec_count = static_cast<uint64_t>(insert_param_->row_record_array_size());
|
||||
std::vector<int64_t> vec_ids(insert_param_->row_id_array_size(), 0);
|
||||
if (!insert_param_->row_id_array().empty()) {
|
||||
const int64_t* src_data = insert_param_->row_id_array().data();
|
||||
int64_t* target_data = vec_ids.data();
|
||||
memcpy(target_data, src_data, static_cast<size_t>(sizeof(int64_t) * insert_param_->row_id_array_size()));
|
||||
}
|
||||
|
||||
status = DBWrapper::DB()->InsertVectors(insert_param_->table_name(), insert_param_->partition_tag(), vec_count,
|
||||
vec_f.data(), vec_ids);
|
||||
rc.ElapseFromBegin("add vectors to engine");
|
||||
if (!status.ok()) {
|
||||
return status;
|
||||
}
|
||||
for (int64_t id : vec_ids) {
|
||||
record_ids_->add_vector_id_array(id);
|
||||
}
|
||||
|
||||
auto ids_size = record_ids_->vector_id_array_size();
|
||||
if (ids_size != vec_count) {
|
||||
std::string msg =
|
||||
"Add " + std::to_string(vec_count) + " vectors but only return " + std::to_string(ids_size) + " id";
|
||||
return Status(SERVER_ILLEGAL_VECTOR_ID, msg);
|
||||
}
|
||||
|
||||
// step 6: update table flag
|
||||
user_provide_ids ? table_info.flag_ |= engine::meta::FLAG_MASK_HAS_USERID
|
||||
: table_info.flag_ |= engine::meta::FLAG_MASK_NO_USERID;
|
||||
status = DBWrapper::DB()->UpdateTableFlag(insert_param_->table_name(), table_info.flag_);
|
||||
|
||||
#ifdef MILVUS_ENABLE_PROFILING
|
||||
ProfilerStop();
|
||||
#endif
|
||||
|
||||
rc.RecordSection("add vectors to engine");
|
||||
rc.ElapseFromBegin("total cost");
|
||||
} catch (std::exception& ex) {
|
||||
return Status(SERVER_UNEXPECTED_ERROR, ex.what());
|
||||
}
|
||||
|
||||
return Status::OK();
|
||||
}
|
||||
|
||||
} // namespace grpc
|
||||
} // namespace server
|
||||
} // namespace milvus
|
44
core/src/server/grpc_impl/request/InsertRequest.h
Normal file
44
core/src/server/grpc_impl/request/InsertRequest.h
Normal file
@ -0,0 +1,44 @@
|
||||
// Licensed to the Apache Software Foundation (ASF) under one
|
||||
// or more contributor license agreements. See the NOTICE file
|
||||
// distributed with this work for additional information
|
||||
// regarding copyright ownership. The ASF licenses this file
|
||||
// to you under the Apache License, Version 2.0 (the
|
||||
// "License"); you may not use this file except in compliance
|
||||
// with the License. You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing,
|
||||
// software distributed under the License is distributed on an
|
||||
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
// KIND, either express or implied. See the License for the
|
||||
// specific language governing permissions and limitations
|
||||
// under the License.
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "server/grpc_impl/request/GrpcBaseRequest.h"
|
||||
|
||||
namespace milvus {
|
||||
namespace server {
|
||||
namespace grpc {
|
||||
|
||||
class InsertRequest : public GrpcBaseRequest {
|
||||
public:
|
||||
static BaseRequestPtr
|
||||
Create(const ::milvus::grpc::InsertParam* insert_param, ::milvus::grpc::VectorIds* record_ids);
|
||||
|
||||
protected:
|
||||
InsertRequest(const ::milvus::grpc::InsertParam* insert_param, ::milvus::grpc::VectorIds* record_ids);
|
||||
|
||||
Status
|
||||
OnExecute() override;
|
||||
|
||||
private:
|
||||
const ::milvus::grpc::InsertParam* insert_param_;
|
||||
::milvus::grpc::VectorIds* record_ids_;
|
||||
};
|
||||
|
||||
} // namespace grpc
|
||||
} // namespace server
|
||||
} // namespace milvus
|
66
core/src/server/grpc_impl/request/PreloadTableRequest.cpp
Normal file
66
core/src/server/grpc_impl/request/PreloadTableRequest.cpp
Normal file
@ -0,0 +1,66 @@
|
||||
// Licensed to the Apache Software Foundation (ASF) under one
|
||||
// or more contributor license agreements. See the NOTICE file
|
||||
// distributed with this work for additional information
|
||||
// regarding copyright ownership. The ASF licenses this file
|
||||
// to you under the Apache License, Version 2.0 (the
|
||||
// "License"); you may not use this file except in compliance
|
||||
// with the License. You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing,
|
||||
// software distributed under the License is distributed on an
|
||||
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
// KIND, either express or implied. See the License for the
|
||||
// specific language governing permissions and limitations
|
||||
// under the License.
|
||||
|
||||
#include "server/grpc_impl/request/PreloadTableRequest.h"
|
||||
#include "server/DBWrapper.h"
|
||||
#include "utils/Log.h"
|
||||
#include "utils/TimeRecorder.h"
|
||||
#include "utils/ValidationUtil.h"
|
||||
|
||||
#include <memory>
|
||||
|
||||
namespace milvus {
|
||||
namespace server {
|
||||
namespace grpc {
|
||||
|
||||
PreloadTableRequest::PreloadTableRequest(const std::string& table_name)
|
||||
: GrpcBaseRequest(DQL_REQUEST_GROUP), table_name_(table_name) {
|
||||
}
|
||||
|
||||
BaseRequestPtr
|
||||
PreloadTableRequest::Create(const std::string& table_name) {
|
||||
return std::shared_ptr<GrpcBaseRequest>(new PreloadTableRequest(table_name));
|
||||
}
|
||||
|
||||
Status
|
||||
PreloadTableRequest::OnExecute() {
|
||||
try {
|
||||
TimeRecorder rc("PreloadTableRequest");
|
||||
|
||||
// step 1: check arguments
|
||||
auto status = ValidationUtil::ValidateTableName(table_name_);
|
||||
if (!status.ok()) {
|
||||
return status;
|
||||
}
|
||||
|
||||
// step 2: check table existence
|
||||
status = DBWrapper::DB()->PreloadTable(table_name_);
|
||||
if (!status.ok()) {
|
||||
return status;
|
||||
}
|
||||
|
||||
rc.ElapseFromBegin("totally cost");
|
||||
} catch (std::exception& ex) {
|
||||
return Status(SERVER_UNEXPECTED_ERROR, ex.what());
|
||||
}
|
||||
|
||||
return Status::OK();
|
||||
}
|
||||
|
||||
} // namespace grpc
|
||||
} // namespace server
|
||||
} // namespace milvus
|
45
core/src/server/grpc_impl/request/PreloadTableRequest.h
Normal file
45
core/src/server/grpc_impl/request/PreloadTableRequest.h
Normal file
@ -0,0 +1,45 @@
|
||||
// Licensed to the Apache Software Foundation (ASF) under one
|
||||
// or more contributor license agreements. See the NOTICE file
|
||||
// distributed with this work for additional information
|
||||
// regarding copyright ownership. The ASF licenses this file
|
||||
// to you under the Apache License, Version 2.0 (the
|
||||
// "License"); you may not use this file except in compliance
|
||||
// with the License. You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing,
|
||||
// software distributed under the License is distributed on an
|
||||
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
// KIND, either express or implied. See the License for the
|
||||
// specific language governing permissions and limitations
|
||||
// under the License.
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "server/grpc_impl/request/GrpcBaseRequest.h"
|
||||
|
||||
#include <string>
|
||||
|
||||
namespace milvus {
|
||||
namespace server {
|
||||
namespace grpc {
|
||||
|
||||
class PreloadTableRequest : public GrpcBaseRequest {
|
||||
public:
|
||||
static BaseRequestPtr
|
||||
Create(const std::string& table_name);
|
||||
|
||||
protected:
|
||||
explicit PreloadTableRequest(const std::string& table_name);
|
||||
|
||||
Status
|
||||
OnExecute() override;
|
||||
|
||||
private:
|
||||
std::string table_name_;
|
||||
};
|
||||
|
||||
} // namespace grpc
|
||||
} // namespace server
|
||||
} // namespace milvus
|
188
core/src/server/grpc_impl/request/SearchRequest.cpp
Normal file
188
core/src/server/grpc_impl/request/SearchRequest.cpp
Normal file
@ -0,0 +1,188 @@
|
||||
// Licensed to the Apache Software Foundation (ASF) under one
|
||||
// or more contributor license agreements. See the NOTICE file
|
||||
// distributed with this work for additional information
|
||||
// regarding copyright ownership. The ASF licenses this file
|
||||
// to you under the Apache License, Version 2.0 (the
|
||||
// "License"); you may not use this file except in compliance
|
||||
// with the License. You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing,
|
||||
// software distributed under the License is distributed on an
|
||||
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
// KIND, either express or implied. See the License for the
|
||||
// specific language governing permissions and limitations
|
||||
// under the License.
|
||||
|
||||
#include "server/grpc_impl/request/SearchRequest.h"
|
||||
#include "server/DBWrapper.h"
|
||||
#include "utils/Log.h"
|
||||
#include "utils/TimeRecorder.h"
|
||||
#include "utils/ValidationUtil.h"
|
||||
|
||||
#include <memory>
|
||||
|
||||
namespace milvus {
|
||||
namespace server {
|
||||
namespace grpc {
|
||||
|
||||
SearchRequest::SearchRequest(const ::milvus::grpc::SearchParam* search_vector_infos,
|
||||
const std::vector<std::string>& file_id_array, ::milvus::grpc::TopKQueryResult* response)
|
||||
: GrpcBaseRequest(DQL_REQUEST_GROUP),
|
||||
search_param_(search_vector_infos),
|
||||
file_id_array_(file_id_array),
|
||||
topk_result_(response) {
|
||||
}
|
||||
|
||||
BaseRequestPtr
|
||||
SearchRequest::Create(const ::milvus::grpc::SearchParam* search_vector_infos,
|
||||
const std::vector<std::string>& file_id_array, ::milvus::grpc::TopKQueryResult* response) {
|
||||
if (search_vector_infos == nullptr) {
|
||||
SERVER_LOG_ERROR << "grpc input is null!";
|
||||
return nullptr;
|
||||
}
|
||||
return std::shared_ptr<GrpcBaseRequest>(new SearchRequest(search_vector_infos, file_id_array, response));
|
||||
}
|
||||
|
||||
Status
|
||||
SearchRequest::OnExecute() {
|
||||
try {
|
||||
int64_t top_k = search_param_->topk();
|
||||
int64_t nprobe = search_param_->nprobe();
|
||||
|
||||
std::string hdr = "SearchRequest(k=" + std::to_string(top_k) + ", nprob=" + std::to_string(nprobe) + ")";
|
||||
TimeRecorder rc(hdr);
|
||||
|
||||
// step 1: check table name
|
||||
std::string table_name_ = search_param_->table_name();
|
||||
auto status = ValidationUtil::ValidateTableName(table_name_);
|
||||
if (!status.ok()) {
|
||||
return status;
|
||||
}
|
||||
|
||||
// step 2: check table existence
|
||||
engine::meta::TableSchema table_info;
|
||||
table_info.table_id_ = table_name_;
|
||||
status = DBWrapper::DB()->DescribeTable(table_info);
|
||||
if (!status.ok()) {
|
||||
if (status.code() == DB_NOT_FOUND) {
|
||||
return Status(SERVER_TABLE_NOT_EXIST, TableNotExistMsg(table_name_));
|
||||
} else {
|
||||
return status;
|
||||
}
|
||||
}
|
||||
|
||||
// step 3: check search parameter
|
||||
status = ValidationUtil::ValidateSearchTopk(top_k, table_info);
|
||||
if (!status.ok()) {
|
||||
return status;
|
||||
}
|
||||
|
||||
status = ValidationUtil::ValidateSearchNprobe(nprobe, table_info);
|
||||
if (!status.ok()) {
|
||||
return status;
|
||||
}
|
||||
|
||||
if (search_param_->query_record_array().empty()) {
|
||||
return Status(SERVER_INVALID_ROWRECORD_ARRAY,
|
||||
"The vector array is empty. Make sure you have entered vector records.");
|
||||
}
|
||||
|
||||
// step 4: check date range, and convert to db dates
|
||||
std::vector<DB_DATE> dates;
|
||||
std::vector<::milvus::grpc::Range> range_array;
|
||||
for (size_t i = 0; i < search_param_->query_range_array_size(); i++) {
|
||||
range_array.emplace_back(search_param_->query_range_array(i));
|
||||
}
|
||||
|
||||
status = ConvertTimeRangeToDBDates(range_array, dates);
|
||||
if (!status.ok()) {
|
||||
return status;
|
||||
}
|
||||
|
||||
rc.RecordSection("check validation");
|
||||
|
||||
// step 5: prepare float data
|
||||
auto record_array_size = search_param_->query_record_array_size();
|
||||
std::vector<float> vec_f(record_array_size * table_info.dimension_, 0);
|
||||
for (size_t i = 0; i < record_array_size; i++) {
|
||||
if (search_param_->query_record_array(i).vector_data().empty()) {
|
||||
return Status(SERVER_INVALID_ROWRECORD_ARRAY,
|
||||
"The vector dimension must be equal to the table dimension.");
|
||||
}
|
||||
uint64_t query_vec_dim = search_param_->query_record_array(i).vector_data().size();
|
||||
if (query_vec_dim != table_info.dimension_) {
|
||||
ErrorCode error_code = SERVER_INVALID_VECTOR_DIMENSION;
|
||||
std::string error_msg = "The vector dimension must be equal to the table dimension.";
|
||||
return Status(error_code, error_msg);
|
||||
}
|
||||
|
||||
memcpy(&vec_f[i * table_info.dimension_], search_param_->query_record_array(i).vector_data().data(),
|
||||
table_info.dimension_ * sizeof(float));
|
||||
}
|
||||
rc.RecordSection("prepare vector data");
|
||||
|
||||
// step 6: search vectors
|
||||
engine::ResultIds result_ids;
|
||||
engine::ResultDistances result_distances;
|
||||
auto record_count = (uint64_t)search_param_->query_record_array().size();
|
||||
|
||||
#ifdef MILVUS_ENABLE_PROFILING
|
||||
std::string fname =
|
||||
"/tmp/search_nq_" + std::to_string(this->search_param_->query_record_array_size()) + ".profiling";
|
||||
ProfilerStart(fname.c_str());
|
||||
#endif
|
||||
|
||||
if (file_id_array_.empty()) {
|
||||
std::vector<std::string> partition_tags;
|
||||
for (size_t i = 0; i < search_param_->partition_tag_array_size(); i++) {
|
||||
partition_tags.emplace_back(search_param_->partition_tag_array(i));
|
||||
}
|
||||
|
||||
status = ValidationUtil::ValidatePartitionTags(partition_tags);
|
||||
if (!status.ok()) {
|
||||
return status;
|
||||
}
|
||||
|
||||
status = DBWrapper::DB()->Query(table_name_, partition_tags, (size_t)top_k, record_count, nprobe,
|
||||
vec_f.data(), dates, result_ids, result_distances);
|
||||
} else {
|
||||
status = DBWrapper::DB()->QueryByFileID(table_name_, file_id_array_, (size_t)top_k, record_count, nprobe,
|
||||
vec_f.data(), dates, result_ids, result_distances);
|
||||
}
|
||||
|
||||
#ifdef MILVUS_ENABLE_PROFILING
|
||||
ProfilerStop();
|
||||
#endif
|
||||
|
||||
rc.RecordSection("search vectors from engine");
|
||||
if (!status.ok()) {
|
||||
return status;
|
||||
}
|
||||
|
||||
if (result_ids.empty()) {
|
||||
return Status::OK(); // empty table
|
||||
}
|
||||
|
||||
// step 7: construct result array
|
||||
topk_result_->set_row_num(record_count);
|
||||
topk_result_->mutable_ids()->Resize(static_cast<int>(result_ids.size()), 0);
|
||||
memcpy(topk_result_->mutable_ids()->mutable_data(), result_ids.data(), result_ids.size() * sizeof(int64_t));
|
||||
topk_result_->mutable_distances()->Resize(static_cast<int>(result_distances.size()), 0.0);
|
||||
memcpy(topk_result_->mutable_distances()->mutable_data(), result_distances.data(),
|
||||
result_distances.size() * sizeof(float));
|
||||
|
||||
// step 8: print time cost percent
|
||||
rc.RecordSection("construct result and send");
|
||||
rc.ElapseFromBegin("totally cost");
|
||||
} catch (std::exception& ex) {
|
||||
return Status(SERVER_UNEXPECTED_ERROR, ex.what());
|
||||
}
|
||||
|
||||
return Status::OK();
|
||||
}
|
||||
|
||||
} // namespace grpc
|
||||
} // namespace server
|
||||
} // namespace milvus
|
50
core/src/server/grpc_impl/request/SearchRequest.h
Normal file
50
core/src/server/grpc_impl/request/SearchRequest.h
Normal file
@ -0,0 +1,50 @@
|
||||
// Licensed to the Apache Software Foundation (ASF) under one
|
||||
// or more contributor license agreements. See the NOTICE file
|
||||
// distributed with this work for additional information
|
||||
// regarding copyright ownership. The ASF licenses this file
|
||||
// to you under the Apache License, Version 2.0 (the
|
||||
// "License"); you may not use this file except in compliance
|
||||
// with the License. You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing,
|
||||
// software distributed under the License is distributed on an
|
||||
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
// KIND, either express or implied. See the License for the
|
||||
// specific language governing permissions and limitations
|
||||
// under the License.
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "server/grpc_impl/request/GrpcBaseRequest.h"
|
||||
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
namespace milvus {
|
||||
namespace server {
|
||||
namespace grpc {
|
||||
|
||||
class SearchRequest : public GrpcBaseRequest {
|
||||
public:
|
||||
static BaseRequestPtr
|
||||
Create(const ::milvus::grpc::SearchParam* search_param, const std::vector<std::string>& file_id_array,
|
||||
::milvus::grpc::TopKQueryResult* response);
|
||||
|
||||
protected:
|
||||
SearchRequest(const ::milvus::grpc::SearchParam* search_param, const std::vector<std::string>& file_id_array,
|
||||
::milvus::grpc::TopKQueryResult* response);
|
||||
|
||||
Status
|
||||
OnExecute() override;
|
||||
|
||||
private:
|
||||
const ::milvus::grpc::SearchParam* search_param_;
|
||||
std::vector<std::string> file_id_array_;
|
||||
::milvus::grpc::TopKQueryResult* topk_result_;
|
||||
};
|
||||
|
||||
} // namespace grpc
|
||||
} // namespace server
|
||||
} // namespace milvus
|
65
core/src/server/grpc_impl/request/ShowPartitionsRequest.cpp
Normal file
65
core/src/server/grpc_impl/request/ShowPartitionsRequest.cpp
Normal file
@ -0,0 +1,65 @@
|
||||
// Licensed to the Apache Software Foundation (ASF) under one
|
||||
// or more contributor license agreements. See the NOTICE file
|
||||
// distributed with this work for additional information
|
||||
// regarding copyright ownership. The ASF licenses this file
|
||||
// to you under the Apache License, Version 2.0 (the
|
||||
// "License"); you may not use this file except in compliance
|
||||
// with the License. You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing,
|
||||
// software distributed under the License is distributed on an
|
||||
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
// KIND, either express or implied. See the License for the
|
||||
// specific language governing permissions and limitations
|
||||
// under the License.
|
||||
|
||||
#include "server/grpc_impl/request/ShowPartitionsRequest.h"
|
||||
#include "server/DBWrapper.h"
|
||||
#include "utils/Log.h"
|
||||
#include "utils/TimeRecorder.h"
|
||||
#include "utils/ValidationUtil.h"
|
||||
|
||||
#include <memory>
|
||||
#include <vector>
|
||||
|
||||
namespace milvus {
|
||||
namespace server {
|
||||
namespace grpc {
|
||||
|
||||
ShowPartitionsRequest::ShowPartitionsRequest(const std::string& table_name,
|
||||
::milvus::grpc::PartitionList* partition_list)
|
||||
: GrpcBaseRequest(INFO_REQUEST_GROUP), table_name_(table_name), partition_list_(partition_list) {
|
||||
}
|
||||
|
||||
BaseRequestPtr
|
||||
ShowPartitionsRequest::Create(const std::string& table_name, ::milvus::grpc::PartitionList* partition_list) {
|
||||
return std::shared_ptr<GrpcBaseRequest>(new ShowPartitionsRequest(table_name, partition_list));
|
||||
}
|
||||
|
||||
Status
|
||||
ShowPartitionsRequest::OnExecute() {
|
||||
auto status = ValidationUtil::ValidateTableName(table_name_);
|
||||
if (!status.ok()) {
|
||||
return status;
|
||||
}
|
||||
|
||||
std::vector<engine::meta::TableSchema> schema_array;
|
||||
auto statuts = DBWrapper::DB()->ShowPartitions(table_name_, schema_array);
|
||||
if (!statuts.ok()) {
|
||||
return statuts;
|
||||
}
|
||||
|
||||
for (auto& schema : schema_array) {
|
||||
::milvus::grpc::PartitionParam* param = partition_list_->add_partition_array();
|
||||
param->set_table_name(schema.owner_table_);
|
||||
param->set_partition_name(schema.table_id_);
|
||||
param->set_tag(schema.partition_tag_);
|
||||
}
|
||||
return Status::OK();
|
||||
}
|
||||
|
||||
} // namespace grpc
|
||||
} // namespace server
|
||||
} // namespace milvus
|
46
core/src/server/grpc_impl/request/ShowPartitionsRequest.h
Normal file
46
core/src/server/grpc_impl/request/ShowPartitionsRequest.h
Normal file
@ -0,0 +1,46 @@
|
||||
// Licensed to the Apache Software Foundation (ASF) under one
|
||||
// or more contributor license agreements. See the NOTICE file
|
||||
// distributed with this work for additional information
|
||||
// regarding copyright ownership. The ASF licenses this file
|
||||
// to you under the Apache License, Version 2.0 (the
|
||||
// "License"); you may not use this file except in compliance
|
||||
// with the License. You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing,
|
||||
// software distributed under the License is distributed on an
|
||||
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
// KIND, either express or implied. See the License for the
|
||||
// specific language governing permissions and limitations
|
||||
// under the License.
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "server/grpc_impl/request/GrpcBaseRequest.h"
|
||||
|
||||
#include <string>
|
||||
|
||||
namespace milvus {
|
||||
namespace server {
|
||||
namespace grpc {
|
||||
|
||||
class ShowPartitionsRequest : public GrpcBaseRequest {
|
||||
public:
|
||||
static BaseRequestPtr
|
||||
Create(const std::string& table_name, ::milvus::grpc::PartitionList* partition_list);
|
||||
|
||||
protected:
|
||||
ShowPartitionsRequest(const std::string& table_name, ::milvus::grpc::PartitionList* partition_list);
|
||||
|
||||
Status
|
||||
OnExecute() override;
|
||||
|
||||
private:
|
||||
std::string table_name_;
|
||||
::milvus::grpc::PartitionList* partition_list_;
|
||||
};
|
||||
|
||||
} // namespace grpc
|
||||
} // namespace server
|
||||
} // namespace milvus
|
55
core/src/server/grpc_impl/request/ShowTablesRequest.cpp
Normal file
55
core/src/server/grpc_impl/request/ShowTablesRequest.cpp
Normal file
@ -0,0 +1,55 @@
|
||||
// Licensed to the Apache Software Foundation (ASF) under one
|
||||
// or more contributor license agreements. See the NOTICE file
|
||||
// distributed with this work for additional information
|
||||
// regarding copyright ownership. The ASF licenses this file
|
||||
// to you under the Apache License, Version 2.0 (the
|
||||
// "License"); you may not use this file except in compliance
|
||||
// with the License. You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing,
|
||||
// software distributed under the License is distributed on an
|
||||
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
// KIND, either express or implied. See the License for the
|
||||
// specific language governing permissions and limitations
|
||||
// under the License.
|
||||
|
||||
#include "server/grpc_impl/request/ShowTablesRequest.h"
|
||||
#include "server/DBWrapper.h"
|
||||
#include "utils/Log.h"
|
||||
#include "utils/TimeRecorder.h"
|
||||
|
||||
#include <memory>
|
||||
#include <vector>
|
||||
|
||||
namespace milvus {
|
||||
namespace server {
|
||||
namespace grpc {
|
||||
|
||||
ShowTablesRequest::ShowTablesRequest(::milvus::grpc::TableNameList* table_name_list)
|
||||
: GrpcBaseRequest(INFO_REQUEST_GROUP), table_name_list_(table_name_list) {
|
||||
}
|
||||
|
||||
BaseRequestPtr
|
||||
ShowTablesRequest::Create(::milvus::grpc::TableNameList* table_name_list) {
|
||||
return std::shared_ptr<GrpcBaseRequest>(new ShowTablesRequest(table_name_list));
|
||||
}
|
||||
|
||||
Status
|
||||
ShowTablesRequest::OnExecute() {
|
||||
std::vector<engine::meta::TableSchema> schema_array;
|
||||
auto statuts = DBWrapper::DB()->AllTables(schema_array);
|
||||
if (!statuts.ok()) {
|
||||
return statuts;
|
||||
}
|
||||
|
||||
for (auto& schema : schema_array) {
|
||||
table_name_list_->add_table_names(schema.table_id_);
|
||||
}
|
||||
return Status::OK();
|
||||
}
|
||||
|
||||
} // namespace grpc
|
||||
} // namespace server
|
||||
} // namespace milvus
|
43
core/src/server/grpc_impl/request/ShowTablesRequest.h
Normal file
43
core/src/server/grpc_impl/request/ShowTablesRequest.h
Normal file
@ -0,0 +1,43 @@
|
||||
// Licensed to the Apache Software Foundation (ASF) under one
|
||||
// or more contributor license agreements. See the NOTICE file
|
||||
// distributed with this work for additional information
|
||||
// regarding copyright ownership. The ASF licenses this file
|
||||
// to you under the Apache License, Version 2.0 (the
|
||||
// "License"); you may not use this file except in compliance
|
||||
// with the License. You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing,
|
||||
// software distributed under the License is distributed on an
|
||||
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
// KIND, either express or implied. See the License for the
|
||||
// specific language governing permissions and limitations
|
||||
// under the License.
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "server/grpc_impl/request/GrpcBaseRequest.h"
|
||||
|
||||
namespace milvus {
|
||||
namespace server {
|
||||
namespace grpc {
|
||||
|
||||
class ShowTablesRequest : public GrpcBaseRequest {
|
||||
public:
|
||||
static BaseRequestPtr
|
||||
Create(::milvus::grpc::TableNameList* table_name_list);
|
||||
|
||||
protected:
|
||||
explicit ShowTablesRequest(::milvus::grpc::TableNameList* table_name_list);
|
||||
|
||||
Status
|
||||
OnExecute() override;
|
||||
|
||||
private:
|
||||
::milvus::grpc::TableNameList* table_name_list_;
|
||||
};
|
||||
|
||||
} // namespace grpc
|
||||
} // namespace server
|
||||
} // namespace milvus
|
@ -16,6 +16,7 @@
|
||||
// under the License.
|
||||
|
||||
#include "wrapper/ConfAdapter.h"
|
||||
#include "WrapperException.h"
|
||||
#include "knowhere/index/vector_index/helpers/IndexParameter.h"
|
||||
#include "utils/Log.h"
|
||||
|
||||
@ -76,7 +77,7 @@ IVFConfAdapter::MatchNlist(const int64_t& size, const int64_t& nlist) {
|
||||
if (size <= TYPICAL_COUNT / 16384 + 1) {
|
||||
// handle less row count, avoid nlist set to 0
|
||||
return 1;
|
||||
} else if (int(size / TYPICAL_COUNT) * nlist == 0) {
|
||||
} else if (int(size / TYPICAL_COUNT) * nlist <= 0) {
|
||||
// calculate a proper nlist if nlist not specified or size less than TYPICAL_COUNT
|
||||
return int(size / TYPICAL_COUNT * 16384);
|
||||
}
|
||||
@ -87,7 +88,11 @@ knowhere::Config
|
||||
IVFConfAdapter::MatchSearch(const TempMetaConf& metaconf, const IndexType& type) {
|
||||
auto conf = std::make_shared<knowhere::IVFCfg>();
|
||||
conf->k = metaconf.k;
|
||||
conf->nprobe = metaconf.nprobe;
|
||||
|
||||
if (metaconf.nprobe <= 0)
|
||||
conf->nprobe = 16; // hardcode here
|
||||
else
|
||||
conf->nprobe = metaconf.nprobe;
|
||||
|
||||
switch (type) {
|
||||
case IndexType::FAISS_IVFFLAT_GPU:
|
||||
@ -123,11 +128,47 @@ IVFPQConfAdapter::Match(const TempMetaConf& metaconf) {
|
||||
conf->metric_type = metaconf.metric_type;
|
||||
conf->gpu_id = conf->gpu_id;
|
||||
conf->nbits = 8;
|
||||
conf->m = 8;
|
||||
|
||||
if (!(conf->d % 4))
|
||||
conf->m = conf->d / 4; // compression radio = 16
|
||||
else if (!(conf->d % 2))
|
||||
conf->m = conf->d / 2; // compression radio = 8
|
||||
else if (!(conf->d % 3))
|
||||
conf->m = conf->d / 3; // compression radio = 12
|
||||
else
|
||||
conf->m = conf->d; // same as SQ8, compression radio = 4
|
||||
|
||||
MatchBase(conf);
|
||||
return conf;
|
||||
}
|
||||
|
||||
knowhere::Config
|
||||
IVFPQConfAdapter::MatchSearch(const TempMetaConf& metaconf, const IndexType& type) {
|
||||
auto conf = std::make_shared<knowhere::IVFPQCfg>();
|
||||
conf->k = metaconf.k;
|
||||
|
||||
if (metaconf.nprobe <= 0) {
|
||||
WRAPPER_LOG_ERROR << "The nprobe of PQ is wrong!";
|
||||
throw WrapperException("The nprobe of PQ is wrong!");
|
||||
} else {
|
||||
conf->nprobe = metaconf.nprobe;
|
||||
}
|
||||
|
||||
return conf;
|
||||
}
|
||||
|
||||
int64_t
|
||||
IVFPQConfAdapter::MatchNlist(const int64_t& size, const int64_t& nlist) {
|
||||
if (size <= TYPICAL_COUNT / 16384 + 1) {
|
||||
// handle less row count, avoid nlist set to 0
|
||||
return 1;
|
||||
} else if (int(size / TYPICAL_COUNT) * nlist <= 0) {
|
||||
// calculate a proper nlist if nlist not specified or size less than TYPICAL_COUNT
|
||||
return int(size / TYPICAL_COUNT * 16384);
|
||||
}
|
||||
return nlist;
|
||||
}
|
||||
|
||||
knowhere::Config
|
||||
NSGConfAdapter::Match(const TempMetaConf& metaconf) {
|
||||
auto conf = std::make_shared<knowhere::NSGCfg>();
|
||||
@ -136,13 +177,14 @@ NSGConfAdapter::Match(const TempMetaConf& metaconf) {
|
||||
conf->metric_type = metaconf.metric_type;
|
||||
conf->gpu_id = conf->gpu_id;
|
||||
|
||||
double factor = metaconf.size / TYPICAL_COUNT;
|
||||
auto scale_factor = round(metaconf.dim / 128.0);
|
||||
scale_factor = scale_factor >= 4 ? 4 : scale_factor;
|
||||
conf->nprobe = 6 + 10 * scale_factor;
|
||||
conf->knng = 100 + 100 * scale_factor;
|
||||
conf->search_length = 40 + 5 * scale_factor;
|
||||
conf->out_degree = 50 + 5 * scale_factor;
|
||||
conf->candidate_pool_size = 200 + 100 * scale_factor;
|
||||
conf->nprobe = conf->nlist > 10000 ? conf->nlist * 0.02 : conf->nlist * 0.1;
|
||||
conf->knng = (100 + 100 * scale_factor) * factor;
|
||||
conf->search_length = (40 + 5 * scale_factor) * factor;
|
||||
conf->out_degree = (50 + 5 * scale_factor) * factor;
|
||||
conf->candidate_pool_size = (200 + 100 * scale_factor) * factor;
|
||||
MatchBase(conf);
|
||||
|
||||
// WRAPPER_LOG_DEBUG << "nlist: " << conf->nlist
|
||||
@ -156,6 +198,9 @@ NSGConfAdapter::MatchSearch(const TempMetaConf& metaconf, const IndexType& type)
|
||||
auto conf = std::make_shared<knowhere::NSGCfg>();
|
||||
conf->k = metaconf.k;
|
||||
conf->search_length = metaconf.search_length;
|
||||
if (metaconf.search_length == TEMPMETA_DEFAULT_VALUE) {
|
||||
conf->search_length = 30; // TODO(linxj): hardcode here.
|
||||
}
|
||||
return conf;
|
||||
}
|
||||
|
||||
|
@ -79,6 +79,13 @@ class IVFPQConfAdapter : public IVFConfAdapter {
|
||||
public:
|
||||
knowhere::Config
|
||||
Match(const TempMetaConf& metaconf) override;
|
||||
|
||||
knowhere::Config
|
||||
MatchSearch(const TempMetaConf& metaconf, const IndexType& type) override;
|
||||
|
||||
protected:
|
||||
static int64_t
|
||||
MatchNlist(const int64_t& size, const int64_t& nlist);
|
||||
};
|
||||
|
||||
class NSGConfAdapter : public IVFConfAdapter {
|
||||
|
@ -53,6 +53,7 @@ AdapterMgr::RegisterAdapter() {
|
||||
|
||||
REGISTER_CONF_ADAPTER(IVFPQConfAdapter, IndexType::FAISS_IVFPQ_CPU, ivfpq_cpu);
|
||||
REGISTER_CONF_ADAPTER(IVFPQConfAdapter, IndexType::FAISS_IVFPQ_GPU, ivfpq_gpu);
|
||||
REGISTER_CONF_ADAPTER(IVFPQConfAdapter, IndexType::FAISS_IVFPQ_MIX, ivfpq_mix);
|
||||
|
||||
REGISTER_CONF_ADAPTER(NSGConfAdapter, IndexType::NSG_MIX, nsg_mix);
|
||||
}
|
||||
|
@ -145,6 +145,10 @@ GetVecIndexFactory(const IndexType& type, const Config& cfg) {
|
||||
index = std::make_shared<knowhere::GPUIVFPQ>(gpu_device);
|
||||
break;
|
||||
}
|
||||
case IndexType::FAISS_IVFPQ_MIX: {
|
||||
index = std::make_shared<knowhere::GPUIVFPQ>(gpu_device);
|
||||
return std::make_shared<IVFMixIndex>(index, IndexType::FAISS_IVFPQ_MIX);
|
||||
}
|
||||
case IndexType::FAISS_IVFSQ8_MIX: {
|
||||
index = std::make_shared<knowhere::GPUIVFSQ>(gpu_device);
|
||||
return std::make_shared<IVFMixIndex>(index, IndexType::FAISS_IVFSQ8_MIX);
|
||||
@ -276,6 +280,10 @@ ConvertToCpuIndexType(const IndexType& type) {
|
||||
case IndexType::FAISS_IVFSQ8_MIX: {
|
||||
return IndexType::FAISS_IVFSQ8_CPU;
|
||||
}
|
||||
case IndexType::FAISS_IVFPQ_GPU:
|
||||
case IndexType::FAISS_IVFPQ_MIX: {
|
||||
return IndexType::FAISS_IVFPQ_CPU;
|
||||
}
|
||||
default: { return type; }
|
||||
}
|
||||
}
|
||||
@ -291,9 +299,12 @@ ConvertToGpuIndexType(const IndexType& type) {
|
||||
case IndexType::FAISS_IVFSQ8_CPU: {
|
||||
return IndexType::FAISS_IVFSQ8_GPU;
|
||||
}
|
||||
case IndexType::FAISS_IVFPQ_MIX:
|
||||
case IndexType::FAISS_IVFPQ_CPU: {
|
||||
return IndexType::FAISS_IVFPQ_GPU;
|
||||
}
|
||||
default: { return type; }
|
||||
}
|
||||
}
|
||||
|
||||
} // namespace engine
|
||||
} // namespace milvus
|
||||
|
@ -33,6 +33,7 @@ namespace engine {
|
||||
|
||||
using Config = knowhere::Config;
|
||||
|
||||
// TODO(linxj): replace with string, Do refactor serialization
|
||||
enum class IndexType {
|
||||
INVALID = 0,
|
||||
FAISS_IDMAP = 1,
|
||||
@ -47,6 +48,7 @@ enum class IndexType {
|
||||
FAISS_IVFSQ8_GPU,
|
||||
FAISS_IVFSQ8_HYBRID, // only support build on gpu.
|
||||
NSG_MIX,
|
||||
FAISS_IVFPQ_MIX,
|
||||
};
|
||||
|
||||
class VecIndex;
|
||||
|
@ -66,7 +66,13 @@ set(thirdparty_files
|
||||
)
|
||||
|
||||
aux_source_directory(${MILVUS_ENGINE_SRC}/server server_files)
|
||||
aux_source_directory(${MILVUS_ENGINE_SRC}/server/grpc_impl grpc_server_files)
|
||||
aux_source_directory(${MILVUS_ENGINE_SRC}/server/grpc_impl/request grpc_request_files)
|
||||
aux_source_directory(${MILVUS_ENGINE_SRC}/server/grpc_impl grpc_impl_files)
|
||||
set(grpc_server_files
|
||||
${grpc_request_files}
|
||||
${grpc_impl_files}
|
||||
)
|
||||
|
||||
aux_source_directory(${MILVUS_ENGINE_SRC}/utils utils_files)
|
||||
aux_source_directory(${MILVUS_ENGINE_SRC}/wrapper wrapper_files)
|
||||
|
||||
|
@ -22,7 +22,7 @@
|
||||
#include "server/Server.h"
|
||||
#include "server/grpc_impl/GrpcRequestHandler.h"
|
||||
#include "server/grpc_impl/GrpcRequestScheduler.h"
|
||||
#include "server/grpc_impl/GrpcRequestTask.h"
|
||||
#include "server/grpc_impl/request/GrpcBaseRequest.h"
|
||||
#include "src/version.h"
|
||||
|
||||
#include "grpc/gen-milvus/milvus.grpc.pb.h"
|
||||
@ -453,20 +453,20 @@ TEST_F(RpcHandlerTest, DELETE_BY_RANGE_TEST) {
|
||||
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
namespace {
|
||||
class DummyTask : public milvus::server::grpc::GrpcBaseTask {
|
||||
class DummyRequest : public milvus::server::grpc::GrpcBaseRequest {
|
||||
public:
|
||||
milvus::Status
|
||||
OnExecute() override {
|
||||
return milvus::Status::OK();
|
||||
}
|
||||
|
||||
static milvus::server::grpc::BaseTaskPtr
|
||||
static milvus::server::grpc::BaseRequestPtr
|
||||
Create(std::string& dummy) {
|
||||
return std::shared_ptr<milvus::server::grpc::GrpcBaseTask>(new DummyTask(dummy));
|
||||
return std::shared_ptr<milvus::server::grpc::GrpcBaseRequest>(new DummyRequest(dummy));
|
||||
}
|
||||
|
||||
public:
|
||||
explicit DummyTask(std::string& dummy) : GrpcBaseTask(dummy) {
|
||||
explicit DummyRequest(std::string& dummy) : GrpcBaseRequest(dummy) {
|
||||
}
|
||||
};
|
||||
|
||||
@ -475,27 +475,27 @@ class RpcSchedulerTest : public testing::Test {
|
||||
void
|
||||
SetUp() override {
|
||||
std::string dummy = "dql";
|
||||
task_ptr = std::make_shared<DummyTask>(dummy);
|
||||
request_ptr = std::make_shared<DummyRequest>(dummy);
|
||||
}
|
||||
|
||||
std::shared_ptr<DummyTask> task_ptr;
|
||||
std::shared_ptr<DummyRequest> request_ptr;
|
||||
};
|
||||
|
||||
} // namespace
|
||||
|
||||
TEST_F(RpcSchedulerTest, BASE_TASK_TEST) {
|
||||
auto status = task_ptr->Execute();
|
||||
auto status = request_ptr->Execute();
|
||||
ASSERT_TRUE(status.ok());
|
||||
|
||||
milvus::server::grpc::GrpcRequestScheduler::GetInstance().Start();
|
||||
::milvus::grpc::Status grpc_status;
|
||||
std::string dummy = "dql";
|
||||
milvus::server::grpc::BaseTaskPtr base_task_ptr = DummyTask::Create(dummy);
|
||||
milvus::server::grpc::GrpcRequestScheduler::GetInstance().ExecTask(base_task_ptr, &grpc_status);
|
||||
milvus::server::grpc::BaseRequestPtr base_task_ptr = DummyRequest::Create(dummy);
|
||||
milvus::server::grpc::GrpcRequestScheduler::GetInstance().ExecRequest(base_task_ptr, &grpc_status);
|
||||
|
||||
milvus::server::grpc::GrpcRequestScheduler::GetInstance().ExecuteTask(task_ptr);
|
||||
task_ptr = nullptr;
|
||||
milvus::server::grpc::GrpcRequestScheduler::GetInstance().ExecuteTask(task_ptr);
|
||||
milvus::server::grpc::GrpcRequestScheduler::GetInstance().ExecuteRequest(request_ptr);
|
||||
request_ptr = nullptr;
|
||||
milvus::server::grpc::GrpcRequestScheduler::GetInstance().ExecuteRequest(request_ptr);
|
||||
|
||||
milvus::server::grpc::GrpcRequestScheduler::GetInstance().Stop();
|
||||
}
|
||||
|
@ -29,33 +29,40 @@
|
||||
|
||||
INITIALIZE_EASYLOGGINGPP
|
||||
|
||||
using ::testing::Combine;
|
||||
using ::testing::TestWithParam;
|
||||
using ::testing::Values;
|
||||
using ::testing::Combine;
|
||||
|
||||
class KnowhereWrapperTest
|
||||
: public DataGenBase,
|
||||
public TestWithParam<::std::tuple<milvus::engine::IndexType, std::string, int, int, int, int>> {
|
||||
: public DataGenBase,
|
||||
public TestWithParam<::std::tuple<milvus::engine::IndexType, std::string, int, int, int, int>> {
|
||||
protected:
|
||||
void
|
||||
SetUp() override {
|
||||
void SetUp() override {
|
||||
#ifdef MILVUS_GPU_VERSION
|
||||
knowhere::FaissGpuResourceMgr::GetInstance().InitDevice(DEVICEID, PINMEM, TEMPMEM, RESNUM);
|
||||
#endif
|
||||
|
||||
std::string generator_type;
|
||||
std::tie(index_type, generator_type, dim, nb, nq, k) = GetParam();
|
||||
GenData(dim, nb, nq, xb, xq, ids, k, gt_ids, gt_dis);
|
||||
|
||||
milvus::engine::TempMetaConf tempconf;
|
||||
tempconf.metric_type = knowhere::METRICTYPE::L2;
|
||||
tempconf.gpu_id = DEVICEID;
|
||||
tempconf.size = nb;
|
||||
tempconf.dim = dim;
|
||||
tempconf.k = k;
|
||||
tempconf.nprobe = 16;
|
||||
|
||||
index_ = GetVecIndexFactory(index_type);
|
||||
conf = ParamGenerator::GetInstance().Gen(index_type);
|
||||
conf->k = k;
|
||||
conf->d = dim;
|
||||
conf->gpu_id = DEVICEID;
|
||||
conf = ParamGenerator::GetInstance().GenBuild(index_type, tempconf);
|
||||
searchconf = ParamGenerator::GetInstance().GenSearchConf(index_type, tempconf);
|
||||
|
||||
// conf->k = k;
|
||||
// conf->d = dim;
|
||||
// conf->gpu_id = DEVICEID;
|
||||
}
|
||||
|
||||
void
|
||||
TearDown() override {
|
||||
void TearDown() override {
|
||||
#ifdef MILVUS_GPU_VERSION
|
||||
knowhere::FaissGpuResourceMgr::GetInstance().Free();
|
||||
#endif
|
||||
@ -65,24 +72,27 @@ class KnowhereWrapperTest
|
||||
milvus::engine::IndexType index_type;
|
||||
milvus::engine::VecIndexPtr index_ = nullptr;
|
||||
knowhere::Config conf;
|
||||
knowhere::Config searchconf;
|
||||
};
|
||||
|
||||
INSTANTIATE_TEST_CASE_P(
|
||||
WrapperParam, KnowhereWrapperTest,
|
||||
Values(
|
||||
//["Index type", "Generator type", "dim", "nb", "nq", "k", "build config", "search config"]
|
||||
INSTANTIATE_TEST_CASE_P(WrapperParam, KnowhereWrapperTest,
|
||||
Values(
|
||||
//["Index type", "Generator type", "dim", "nb", "nq", "k", "build config", "search config"]
|
||||
|
||||
#ifdef MILVUS_GPU_VERSION
|
||||
std::make_tuple(milvus::engine::IndexType::FAISS_IVFFLAT_GPU, "Default", DIM, NB, 10, 10),
|
||||
std::make_tuple(milvus::engine::IndexType::FAISS_IVFFLAT_MIX, "Default", 64, 100000, 10, 10),
|
||||
std::make_tuple(milvus::engine::IndexType::FAISS_IVFFLAT_MIX, "Default", 64, 1000, 10, 10),
|
||||
// std::make_tuple(milvus::engine::IndexType::FAISS_IVFSQ8_GPU, "Default", DIM, NB,
|
||||
// 10, 10),
|
||||
std::make_tuple(milvus::engine::IndexType::FAISS_IVFSQ8_GPU, "Default", DIM, NB, 10, 10),
|
||||
std::make_tuple(milvus::engine::IndexType::FAISS_IVFSQ8_MIX, "Default", DIM, NB, 10, 10),
|
||||
std::make_tuple(milvus::engine::IndexType::FAISS_IVFPQ_MIX, "Default", 64, 1000, 10, 10),
|
||||
|
||||
// std::make_tuple(IndexType::NSG_MIX, "Default", 128, 250000, 10, 10),
|
||||
#endif
|
||||
// std::make_tuple(IndexType::SPTAG_KDT_RNT_CPU, "Default", 128, 250000, 10, 10),
|
||||
std::make_tuple(milvus::engine::IndexType::FAISS_IDMAP, "Default", 64, 100000, 10, 10),
|
||||
std::make_tuple(milvus::engine::IndexType::FAISS_IVFFLAT_CPU, "Default", 64, 100000, 10, 10),
|
||||
std::make_tuple(milvus::engine::IndexType::FAISS_IDMAP, "Default", 64, 1000, 10, 10),
|
||||
std::make_tuple(milvus::engine::IndexType::FAISS_IVFFLAT_CPU, "Default", 64, 1000, 10, 10),
|
||||
std::make_tuple(milvus::engine::IndexType::FAISS_IVFSQ8_CPU, "Default", DIM, NB, 10, 10)));
|
||||
|
||||
TEST_P(KnowhereWrapperTest, BASE_TEST) {
|
||||
@ -93,12 +103,11 @@ TEST_P(KnowhereWrapperTest, BASE_TEST) {
|
||||
std::vector<float> res_dis(elems);
|
||||
|
||||
index_->BuildAll(nb, xb.data(), ids.data(), conf);
|
||||
index_->Search(nq, xq.data(), res_dis.data(), res_ids.data(), conf);
|
||||
index_->Search(nq, xq.data(), res_dis.data(), res_ids.data(), searchconf);
|
||||
AssertResult(res_ids, res_dis);
|
||||
}
|
||||
|
||||
#ifdef MILVUS_GPU_VERSION
|
||||
|
||||
TEST_P(KnowhereWrapperTest, TO_GPU_TEST) {
|
||||
EXPECT_EQ(index_->GetType(), index_type);
|
||||
|
||||
@ -107,13 +116,13 @@ TEST_P(KnowhereWrapperTest, TO_GPU_TEST) {
|
||||
std::vector<float> res_dis(elems);
|
||||
|
||||
index_->BuildAll(nb, xb.data(), ids.data(), conf);
|
||||
index_->Search(nq, xq.data(), res_dis.data(), res_ids.data(), conf);
|
||||
index_->Search(nq, xq.data(), res_dis.data(), res_ids.data(), searchconf);
|
||||
AssertResult(res_ids, res_dis);
|
||||
|
||||
{
|
||||
auto dev_idx = index_->CopyToGpu(DEVICEID);
|
||||
for (int i = 0; i < 10; ++i) {
|
||||
dev_idx->Search(nq, xq.data(), res_dis.data(), res_ids.data(), conf);
|
||||
dev_idx->Search(nq, xq.data(), res_dis.data(), res_ids.data(), searchconf);
|
||||
}
|
||||
AssertResult(res_ids, res_dis);
|
||||
}
|
||||
@ -125,7 +134,7 @@ TEST_P(KnowhereWrapperTest, TO_GPU_TEST) {
|
||||
|
||||
auto dev_idx = new_index->CopyToGpu(DEVICEID);
|
||||
for (int i = 0; i < 10; ++i) {
|
||||
dev_idx->Search(nq, xq.data(), res_dis.data(), res_ids.data(), conf);
|
||||
dev_idx->Search(nq, xq.data(), res_dis.data(), res_ids.data(), searchconf);
|
||||
}
|
||||
AssertResult(res_ids, res_dis);
|
||||
}
|
||||
@ -139,7 +148,7 @@ TEST_P(KnowhereWrapperTest, SERIALIZE_TEST) {
|
||||
std::vector<int64_t> res_ids(elems);
|
||||
std::vector<float> res_dis(elems);
|
||||
index_->BuildAll(nb, xb.data(), ids.data(), conf);
|
||||
index_->Search(nq, xq.data(), res_dis.data(), res_ids.data(), conf);
|
||||
index_->Search(nq, xq.data(), res_dis.data(), res_ids.data(), searchconf);
|
||||
AssertResult(res_ids, res_dis);
|
||||
|
||||
{
|
||||
@ -152,7 +161,7 @@ TEST_P(KnowhereWrapperTest, SERIALIZE_TEST) {
|
||||
|
||||
std::vector<int64_t> res_ids(elems);
|
||||
std::vector<float> res_dis(elems);
|
||||
new_index->Search(nq, xq.data(), res_dis.data(), res_ids.data(), conf);
|
||||
new_index->Search(nq, xq.data(), res_dis.data(), res_ids.data(), searchconf);
|
||||
AssertResult(res_ids, res_dis);
|
||||
}
|
||||
|
||||
@ -166,7 +175,7 @@ TEST_P(KnowhereWrapperTest, SERIALIZE_TEST) {
|
||||
|
||||
std::vector<int64_t> res_ids(elems);
|
||||
std::vector<float> res_dis(elems);
|
||||
new_index->Search(nq, xq.data(), res_dis.data(), res_ids.data(), conf);
|
||||
new_index->Search(nq, xq.data(), res_dis.data(), res_ids.data(), searchconf);
|
||||
AssertResult(res_ids, res_dis);
|
||||
}
|
||||
}
|
||||
|
@ -15,18 +15,22 @@
|
||||
// specific language governing permissions and limitations
|
||||
// under the License.
|
||||
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <gtest/gtest.h>
|
||||
#include <cstdio>
|
||||
#include <cstdlib>
|
||||
#include <fstream>
|
||||
#include <memory>
|
||||
#include <vector>
|
||||
#include <cstdlib>
|
||||
#include <cstdio>
|
||||
#include <fstream>
|
||||
|
||||
|
||||
#include "knowhere/index/vector_index/helpers/IndexParameter.h"
|
||||
#include "wrapper/VecIndex.h"
|
||||
#include "wrapper/utils.h"
|
||||
#include "knowhere/index/vector_index/helpers/IndexParameter.h"
|
||||
#include "wrapper/ConfAdapterMgr.h"
|
||||
#include "wrapper/ConfAdapter.h"
|
||||
|
||||
class DataGenBase;
|
||||
|
||||
@ -40,29 +44,31 @@ constexpr int64_t PINMEM = 1024 * 1024 * 200;
|
||||
constexpr int64_t TEMPMEM = 1024 * 1024 * 300;
|
||||
constexpr int64_t RESNUM = 2;
|
||||
|
||||
static const char* CONFIG_PATH = "/tmp/milvus_test";
|
||||
static const char* CONFIG_FILE = "/server_config.yaml";
|
||||
static const char *CONFIG_PATH = "/tmp/milvus_test";
|
||||
static const char *CONFIG_FILE = "/server_config.yaml";
|
||||
|
||||
class KnowhereTest : public ::testing::Test {
|
||||
protected:
|
||||
void
|
||||
SetUp() override;
|
||||
void
|
||||
TearDown() override;
|
||||
void SetUp() override;
|
||||
void TearDown() override;
|
||||
};
|
||||
|
||||
class DataGenBase {
|
||||
public:
|
||||
virtual void
|
||||
GenData(const int& dim, const int& nb, const int& nq, float* xb, float* xq, int64_t* ids, const int& k,
|
||||
int64_t* gt_ids, float* gt_dis);
|
||||
virtual void GenData(const int& dim, const int& nb, const int& nq, float* xb, float* xq, int64_t* ids,
|
||||
const int& k, int64_t* gt_ids, float* gt_dis);
|
||||
|
||||
virtual void
|
||||
GenData(const int& dim, const int& nb, const int& nq, std::vector<float>& xb, std::vector<float>& xq,
|
||||
std::vector<int64_t>& ids, const int& k, std::vector<int64_t>& gt_ids, std::vector<float>& gt_dis);
|
||||
virtual void GenData(const int& dim,
|
||||
const int& nb,
|
||||
const int& nq,
|
||||
std::vector<float>& xb,
|
||||
std::vector<float>& xq,
|
||||
std::vector<int64_t>& ids,
|
||||
const int& k,
|
||||
std::vector<int64_t>& gt_ids,
|
||||
std::vector<float>& gt_dis);
|
||||
|
||||
void
|
||||
AssertResult(const std::vector<int64_t>& ids, const std::vector<float>& dis);
|
||||
void AssertResult(const std::vector<int64_t>& ids, const std::vector<float>& dis);
|
||||
|
||||
int dim = DIM;
|
||||
int nb = NB;
|
||||
@ -79,14 +85,22 @@ class DataGenBase {
|
||||
|
||||
class ParamGenerator {
|
||||
public:
|
||||
static ParamGenerator&
|
||||
GetInstance() {
|
||||
static ParamGenerator& GetInstance() {
|
||||
static ParamGenerator instance;
|
||||
return instance;
|
||||
}
|
||||
|
||||
knowhere::Config
|
||||
Gen(const milvus::engine::IndexType& type) {
|
||||
knowhere::Config GenSearchConf(const milvus::engine::IndexType& type, const milvus::engine::TempMetaConf& conf) {
|
||||
auto adapter = milvus::engine::AdapterMgr::GetInstance().GetAdapter(type);
|
||||
return adapter->MatchSearch(conf, type);
|
||||
}
|
||||
|
||||
knowhere::Config GenBuild(const milvus::engine::IndexType& type, const milvus::engine::TempMetaConf& conf) {
|
||||
auto adapter = milvus::engine::AdapterMgr::GetInstance().GetAdapter(type);
|
||||
return adapter->Match(conf);
|
||||
}
|
||||
|
||||
knowhere::Config Gen(const milvus::engine::IndexType& type) {
|
||||
switch (type) {
|
||||
case milvus::engine::IndexType::FAISS_IDMAP: {
|
||||
auto tempconf = std::make_shared<knowhere::Cfg>();
|
||||
@ -113,34 +127,37 @@ class ParamGenerator {
|
||||
tempconf->metric_type = knowhere::METRICTYPE::L2;
|
||||
return tempconf;
|
||||
}
|
||||
// case milvus::engine::IndexType::FAISS_IVFPQ_CPU:
|
||||
// case milvus::engine::IndexType::FAISS_IVFPQ_GPU: {
|
||||
// auto tempconf = std::make_shared<knowhere::IVFPQCfg>();
|
||||
// tempconf->nlist = 100;
|
||||
// tempconf->nprobe = 16;
|
||||
// tempconf->nbits = 8;
|
||||
// tempconf->m = 8;
|
||||
// tempconf->metric_type = knowhere::METRICTYPE::L2;
|
||||
// return tempconf;
|
||||
// }
|
||||
// case milvus::engine::IndexType::NSG_MIX: {
|
||||
// auto tempconf = std::make_shared<knowhere::NSGCfg>();
|
||||
// tempconf->nlist = 100;
|
||||
// tempconf->nprobe = 16;
|
||||
// tempconf->search_length = 8;
|
||||
// tempconf->knng = 200;
|
||||
// tempconf->search_length = 40; // TODO(linxj): be 20 when search
|
||||
// tempconf->out_degree = 60;
|
||||
// tempconf->candidate_pool_size = 200;
|
||||
// tempconf->metric_type = knowhere::METRICTYPE::L2;
|
||||
// return tempconf;
|
||||
// }
|
||||
case milvus::engine::IndexType::FAISS_IVFPQ_CPU:
|
||||
case milvus::engine::IndexType::FAISS_IVFPQ_GPU:
|
||||
case milvus::engine::IndexType::FAISS_IVFPQ_MIX: {
|
||||
auto tempconf = std::make_shared<knowhere::IVFPQCfg>();
|
||||
tempconf->nlist = 100;
|
||||
tempconf->nprobe = 16;
|
||||
tempconf->nbits = 8;
|
||||
tempconf->m = 8;
|
||||
tempconf->metric_type = knowhere::METRICTYPE::L2;
|
||||
return tempconf;
|
||||
}
|
||||
case milvus::engine::IndexType::NSG_MIX: {
|
||||
auto tempconf = std::make_shared<knowhere::NSGCfg>();
|
||||
tempconf->nlist = 100;
|
||||
tempconf->nprobe = 16;
|
||||
tempconf->search_length = 8;
|
||||
tempconf->knng = 200;
|
||||
tempconf->search_length = 40; // TODO(linxj): be 20 when search
|
||||
tempconf->out_degree = 60;
|
||||
tempconf->candidate_pool_size = 200;
|
||||
tempconf->metric_type = knowhere::METRICTYPE::L2;
|
||||
return tempconf;
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
// class SanityCheck : public DataGenBase {
|
||||
|
||||
//class SanityCheck : public DataGenBase {
|
||||
// public:
|
||||
// void GenData(const int &dim, const int &nb, const int &nq, float *xb, float *xq, long *ids,
|
||||
// const int &k, long *gt_ids, float *gt_dis) override;
|
||||
//};
|
||||
|
||||
|
@ -42,16 +42,22 @@ def connect(request):
|
||||
port = request.config.getoption("--port")
|
||||
milvus = Milvus()
|
||||
try:
|
||||
milvus.connect(host=ip, port=port)
|
||||
except:
|
||||
status = milvus.connect(host=ip, port=port)
|
||||
logging.getLogger().info(status)
|
||||
if not status.OK():
|
||||
# try again
|
||||
logging.getLogger().info("------------------------------------")
|
||||
logging.getLogger().info("Try to connect again")
|
||||
logging.getLogger().info("------------------------------------")
|
||||
res = milvus.connect(host=ip, port=port)
|
||||
except Exception as e:
|
||||
logging.getLogger().error(str(e))
|
||||
pytest.exit("Milvus server can not connected, exit pytest ...")
|
||||
|
||||
def fin():
|
||||
try:
|
||||
milvus.disconnect()
|
||||
except:
|
||||
pass
|
||||
|
||||
request.addfinalizer(fin)
|
||||
return milvus
|
||||
|
||||
@ -129,4 +135,4 @@ def ip_table(request, connect):
|
||||
|
||||
request.addfinalizer(teardown)
|
||||
|
||||
return table_name
|
||||
return table_name
|
||||
|
@ -249,8 +249,8 @@ class TestConnect:
|
||||
'''
|
||||
milvus = Milvus()
|
||||
uri_value = "tcp://%s:19540" % args["ip"]
|
||||
milvus.connect(host=args["ip"], port="", uri=uri_value)
|
||||
assert milvus.connected()
|
||||
with pytest.raises(Exception) as e:
|
||||
milvus.connect(host=args["ip"], port="", uri=uri_value)
|
||||
|
||||
def test_connect_param_priority_uri(self, args):
|
||||
'''
|
||||
|
Loading…
Reference in New Issue
Block a user