GrpcClient.cpp 9.0 KB
Newer Older
K
kun yu 已提交
1 2 3 4 5 6 7 8 9 10 11
/*******************************************************************************
* Copyright 上海赜睿信息科技有限公司(Zilliz) - All Rights Reserved
* Unauthorized copying of this file, via any medium is strictly prohibited.
* Proprietary and confidential.
******************************************************************************/
#include <grpc/grpc.h>
#include <grpcpp/channel.h>
#include <grpcpp/client_context.h>
#include <grpcpp/create_channel.h>
#include <grpcpp/security/credentials.h>

K
kun yu 已提交
12
#include "GrpcClient.h"
K
kun yu 已提交
13 14 15 16 17 18 19 20 21

using grpc::Channel;
using grpc::ClientContext;
using grpc::ClientReader;
using grpc::ClientReaderWriter;
using grpc::ClientWriter;
using grpc::Status;

namespace milvus {
K
kun yu 已提交
22
GrpcClient::GrpcClient(std::shared_ptr<::grpc::Channel>& channel)
K
kun yu 已提交
23 24 25 26
        : stub_(::milvus::grpc::MilvusService::NewStub(channel)) {

}

K
kun yu 已提交
27
GrpcClient::~GrpcClient() = default;
K
kun yu 已提交
28

K
kun yu 已提交
29
Status
K
kun yu 已提交
30
GrpcClient::CreateTable(const ::milvus::grpc::TableSchema& table_schema) {
K
kun yu 已提交
31
    ClientContext context;
K
kun yu 已提交
32
    grpc::Status response;
K
kun yu 已提交
33
    ::grpc::Status grpc_status = stub_->CreateTable(&context, table_schema, &response);
K
kun yu 已提交
34

K
kun yu 已提交
35
    if (!grpc_status.ok()) {
K
kun yu 已提交
36
        std::cerr << "CreateTable gRPC failed!" << std::endl;
K
kun yu 已提交
37
        return Status(StatusCode::RPCFailed, grpc_status.error_message());
K
kun yu 已提交
38 39 40 41
    }

    if (response.error_code() != grpc::SUCCESS) {
        std::cerr << response.reason() << std::endl;
K
kun yu 已提交
42
        return Status(StatusCode::ServerFailed, response.reason());
K
kun yu 已提交
43
    }
K
kun yu 已提交
44
    return Status::OK();
K
kun yu 已提交
45 46 47
}

bool
K
kun yu 已提交
48 49
GrpcClient::HasTable(const ::milvus::grpc::TableName& table_name,
                     Status& status) {
K
kun yu 已提交
50 51
    ClientContext context;
    ::milvus::grpc::BoolReply response;
K
kun yu 已提交
52
    ::grpc::Status grpc_status = stub_->HasTable(&context, table_name, &response);
K
kun yu 已提交
53

K
kun yu 已提交
54
    if (!grpc_status.ok()) {
K
kun yu 已提交
55
        std::cerr << "HasTable gRPC failed!" << std::endl;
K
kun yu 已提交
56
        status = Status(StatusCode::RPCFailed, grpc_status.error_message());
K
kun yu 已提交
57 58 59
    }
    if (response.status().error_code() != grpc::SUCCESS) {
        std::cerr << response.status().reason() << std::endl;
K
kun yu 已提交
60
        status = Status(StatusCode::ServerFailed, response.status().reason());
K
kun yu 已提交
61
    }
K
kun yu 已提交
62
    status = Status::OK();
K
kun yu 已提交
63 64 65
    return response.bool_reply();
}

K
kun yu 已提交
66
Status
K
kun yu 已提交
67
GrpcClient::DropTable(const ::milvus::grpc::TableName& table_name) {
K
kun yu 已提交
68
    ClientContext context;
K
kun yu 已提交
69
    grpc::Status response;
K
kun yu 已提交
70
    ::grpc::Status grpc_status = stub_->DropTable(&context, table_name, &response);
K
kun yu 已提交
71

K
kun yu 已提交
72 73 74
    if (!grpc_status.ok()) {
        std::cerr << "DropTable gRPC failed!" << std::endl;
        return Status(StatusCode::RPCFailed, grpc_status.error_message());
K
kun yu 已提交
75 76 77
    }
    if (response.error_code() != grpc::SUCCESS) {
        std::cerr << response.reason() << std::endl;
K
kun yu 已提交
78
        return Status(StatusCode::ServerFailed, response.reason());
K
kun yu 已提交
79
    }
K
kun yu 已提交
80 81

    return Status::OK();
K
kun yu 已提交
82 83
}

K
kun yu 已提交
84
Status
Y
Yu Kun 已提交
85
GrpcClient::CreateIndex(const ::milvus::grpc::IndexParam& index_param) {
K
kun yu 已提交
86
    ClientContext context;
K
kun yu 已提交
87
    grpc::Status response;
Y
Yu Kun 已提交
88
    ::grpc::Status grpc_status = stub_->CreateIndex(&context, index_param, &response);
K
kun yu 已提交
89

K
kun yu 已提交
90 91 92
    if (!grpc_status.ok()) {
        std::cerr << "BuildIndex rpc failed!" << std::endl;
        return Status(StatusCode::RPCFailed, grpc_status.error_message());
K
kun yu 已提交
93 94 95
    }
    if (response.error_code() != grpc::SUCCESS) {
        std::cerr << response.reason() << std::endl;
K
kun yu 已提交
96
        return Status(StatusCode::ServerFailed, response.reason());
K
kun yu 已提交
97
    }
K
kun yu 已提交
98 99

    return Status::OK();
K
kun yu 已提交
100 101 102
}

void
Y
Yu Kun 已提交
103 104
GrpcClient::Insert(::milvus::grpc::VectorIds& vector_ids,
                         const ::milvus::grpc::InsertParam& insert_param,
K
kun yu 已提交
105
                         Status& status) {
K
kun yu 已提交
106
    ClientContext context;
Y
Yu Kun 已提交
107
    ::grpc::Status grpc_status = stub_->Insert(&context, insert_param, &vector_ids);
K
kun yu 已提交
108

K
kun yu 已提交
109 110 111 112
    if (!grpc_status.ok()) {
        std::cerr << "InsertVector rpc failed!" << std::endl;
        status = Status(StatusCode::RPCFailed, grpc_status.error_message());
        return;
K
kun yu 已提交
113 114 115
    }
    if (vector_ids.status().error_code() != grpc::SUCCESS) {
        std::cerr << vector_ids.status().reason() << std::endl;
K
kun yu 已提交
116 117
        status = Status(StatusCode::ServerFailed, vector_ids.status().reason());
        return;
K
kun yu 已提交
118
    }
K
kun yu 已提交
119 120

    status = Status::OK();
K
kun yu 已提交
121 122
}

K
kun yu 已提交
123
Status
Y
Yu Kun 已提交
124 125
GrpcClient::Search(std::vector<::milvus::grpc::TopKQueryResult>& result_array,
                         const ::milvus::grpc::SearchParam& search_param) {
K
kun yu 已提交
126 127 128
    ::milvus::grpc::TopKQueryResult query_result;
    ClientContext context;
    std::unique_ptr<ClientReader<::milvus::grpc::TopKQueryResult> > reader(
Y
Yu Kun 已提交
129
            stub_->Search(&context, search_param));
K
kun yu 已提交
130 131 132 133 134

    while (reader->Read(&query_result)) {
        result_array.emplace_back(query_result);
    }

K
kun yu 已提交
135
    ::grpc::Status grpc_status = reader->Finish();
K
kun yu 已提交
136

K
kun yu 已提交
137
    if (!grpc_status.ok()) {
K
kun yu 已提交
138
        std::cerr << "SearchVector rpc failed!" << std::endl;
K
kun yu 已提交
139 140
        std::cerr << grpc_status.error_message() << std::endl;
        return Status(StatusCode::RPCFailed, grpc_status.error_message());
K
kun yu 已提交
141 142 143
    }
    if (query_result.status().error_code() != grpc::SUCCESS) {
        std::cerr << query_result.status().reason() << std::endl;
K
kun yu 已提交
144 145
        return Status(StatusCode::ServerFailed,
            query_result.status().reason());
K
kun yu 已提交
146
    }
K
kun yu 已提交
147 148

    return Status::OK();
K
kun yu 已提交
149 150
}

K
kun yu 已提交
151 152 153
Status
GrpcClient::DescribeTable(::milvus::grpc::TableSchema& grpc_schema,
                          const std::string& table_name) {
K
kun yu 已提交
154 155 156
    ClientContext context;
    ::milvus::grpc::TableName grpc_tablename;
    grpc_tablename.set_table_name(table_name);
K
kun yu 已提交
157
    ::grpc::Status grpc_status = stub_->DescribeTable(&context, grpc_tablename, &grpc_schema);
K
kun yu 已提交
158

K
kun yu 已提交
159
    if (!grpc_status.ok()) {
K
kun yu 已提交
160
        std::cerr << "DescribeTable rpc failed!" << std::endl;
K
kun yu 已提交
161 162
        std::cerr << grpc_status.error_message() << std::endl;
        return Status(StatusCode::RPCFailed, grpc_status.error_message());
K
kun yu 已提交
163 164 165 166
    }

    if (grpc_schema.table_name().status().error_code() != grpc::SUCCESS) {
        std::cerr << grpc_schema.table_name().status().reason() << std::endl;
K
kun yu 已提交
167 168
        return Status(StatusCode::ServerFailed,
            grpc_schema.table_name().status().reason());
K
kun yu 已提交
169
    }
K
kun yu 已提交
170 171

    return Status::OK();
K
kun yu 已提交
172 173 174
}

int64_t
Y
Yu Kun 已提交
175
GrpcClient::CountTable(const std::string& table_name, Status& status) {
K
kun yu 已提交
176 177 178
    ClientContext context;
    ::milvus::grpc::TableRowCount response;
    ::milvus::grpc::TableName grpc_tablename;
K
kun yu 已提交
179
    grpc_tablename.set_table_name(table_name);
Y
Yu Kun 已提交
180
    ::grpc::Status grpc_status = stub_->CountTable(&context, grpc_tablename, &response);
K
kun yu 已提交
181

K
kun yu 已提交
182 183 184
    if (!grpc_status.ok()) {
        std::cerr << "DescribeTable rpc failed!" << std::endl;
        status = Status(StatusCode::RPCFailed,  grpc_status.error_message());
K
kun yu 已提交
185 186 187 188 189
        return -1;
    }

    if (response.status().error_code() != grpc::SUCCESS) {
        std::cerr << response.status().reason() << std::endl;
K
kun yu 已提交
190
        status = Status(StatusCode::ServerFailed, response.status().reason());
K
kun yu 已提交
191
        return -1;
K
kun yu 已提交
192
    }
K
kun yu 已提交
193 194

    status = Status::OK();
K
kun yu 已提交
195 196 197
    return response.table_row_count();
}

K
kun yu 已提交
198
Status
K
kun yu 已提交
199
GrpcClient::ShowTables(std::vector<std::string> &table_array) {
K
kun yu 已提交
200 201 202 203 204 205 206 207 208
    ClientContext context;
    ::milvus::grpc::Command command;
    std::unique_ptr<ClientReader<::milvus::grpc::TableName> > reader(
            stub_->ShowTables(&context, command));

    ::milvus::grpc::TableName table_name;
    while (reader->Read(&table_name)) {
        table_array.emplace_back(table_name.table_name());
    }
K
kun yu 已提交
209
    ::grpc::Status grpc_status = reader->Finish();
K
kun yu 已提交
210

K
kun yu 已提交
211
    if (!grpc_status.ok()) {
K
kun yu 已提交
212
        std::cerr << "ShowTables gRPC failed!" << std::endl;
K
kun yu 已提交
213 214
        std::cerr << grpc_status.error_message() << std::endl;
        return Status(StatusCode::RPCFailed, grpc_status.error_message());
K
kun yu 已提交
215 216 217 218
    }

    if (table_name.status().error_code() != grpc::SUCCESS) {
        std::cerr << table_name.status().reason() << std::endl;
K
kun yu 已提交
219 220
        return Status(StatusCode::ServerFailed,
            table_name.status().reason());
K
kun yu 已提交
221
    }
K
kun yu 已提交
222 223

    return Status::OK();
K
kun yu 已提交
224 225
}

K
kun yu 已提交
226
Status
Y
Yu Kun 已提交
227
GrpcClient::Cmd(std::string &result,
K
kun yu 已提交
228
                 const std::string& cmd) {
K
kun yu 已提交
229
    ClientContext context;
Y
Yu Kun 已提交
230
    ::milvus::grpc::StringReply response;
K
kun yu 已提交
231 232
    ::milvus::grpc::Command command;
    command.set_cmd(cmd);
Y
Yu Kun 已提交
233
    ::grpc::Status grpc_status = stub_->Cmd(&context, command, &response);
K
kun yu 已提交
234

Y
Yu Kun 已提交
235
    result = response.string_reply();
K
kun yu 已提交
236
    if (!grpc_status.ok()) {
Y
Yu Kun 已提交
237
        std::cerr << "Cmd gRPC failed!" << std::endl;
K
kun yu 已提交
238
        return Status(StatusCode::RPCFailed, grpc_status.error_message());
K
kun yu 已提交
239 240 241 242
    }

    if (response.status().error_code() != grpc::SUCCESS) {
        std::cerr << response.status().reason() << std::endl;
K
kun yu 已提交
243
        return Status(StatusCode::ServerFailed, response.status().reason());
K
kun yu 已提交
244
    }
K
kun yu 已提交
245 246

    return Status::OK();
K
kun yu 已提交
247 248
}

Y
Yu Kun 已提交
249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266
Status
GrpcClient::PreloadTable(milvus::grpc::TableName &table_name) {
    ClientContext context;
    ::milvus::grpc::Status response;
    ::grpc::Status grpc_status = stub_->PreloadTable(&context, table_name, &response);

    if (!grpc_status.ok()) {
        std::cerr << "PreloadTable gRPC failed!" << std::endl;
        return Status(StatusCode::RPCFailed, grpc_status.error_message());
    }

    if (response.error_code() != grpc::SUCCESS) {
        std::cerr << response.reason() << std::endl;
        return Status(StatusCode::ServerFailed, response.reason());
    }
    return Status::OK();
}

K
kun yu 已提交
267
Status
K
kun yu 已提交
268 269
GrpcClient::Disconnect() {
    stub_.release();
K
kun yu 已提交
270
    return Status::OK();
K
kun yu 已提交
271 272 273
}

}