GrpcClient.cpp 10.8 KB
Newer Older
J
jinhai 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
// 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.

K
kun yu 已提交
18 19 20 21 22 23
#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 已提交
24
#include "GrpcClient.h"
K
kun yu 已提交
25 26 27 28 29 30 31 32 33

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

namespace milvus {
K
kun yu 已提交
34
GrpcClient::GrpcClient(std::shared_ptr<::grpc::Channel>& channel)
K
kun yu 已提交
35 36 37 38
        : stub_(::milvus::grpc::MilvusService::NewStub(channel)) {

}

K
kun yu 已提交
39
GrpcClient::~GrpcClient() = default;
K
kun yu 已提交
40

K
kun yu 已提交
41
Status
K
kun yu 已提交
42
GrpcClient::CreateTable(const ::milvus::grpc::TableSchema& table_schema) {
K
kun yu 已提交
43
    ClientContext context;
K
kun yu 已提交
44
    grpc::Status response;
K
kun yu 已提交
45
    ::grpc::Status grpc_status = stub_->CreateTable(&context, table_schema, &response);
K
kun yu 已提交
46

K
kun yu 已提交
47
    if (!grpc_status.ok()) {
K
kun yu 已提交
48
        std::cerr << "CreateTable gRPC failed!" << std::endl;
K
kun yu 已提交
49
        return Status(StatusCode::RPCFailed, grpc_status.error_message());
K
kun yu 已提交
50 51 52 53
    }

    if (response.error_code() != grpc::SUCCESS) {
        std::cerr << response.reason() << std::endl;
K
kun yu 已提交
54
        return Status(StatusCode::ServerFailed, response.reason());
K
kun yu 已提交
55
    }
K
kun yu 已提交
56
    return Status::OK();
K
kun yu 已提交
57 58 59
}

bool
K
kun yu 已提交
60 61
GrpcClient::HasTable(const ::milvus::grpc::TableName& table_name,
                     Status& status) {
K
kun yu 已提交
62 63
    ClientContext context;
    ::milvus::grpc::BoolReply response;
K
kun yu 已提交
64
    ::grpc::Status grpc_status = stub_->HasTable(&context, table_name, &response);
K
kun yu 已提交
65

K
kun yu 已提交
66
    if (!grpc_status.ok()) {
K
kun yu 已提交
67
        std::cerr << "HasTable gRPC failed!" << std::endl;
K
kun yu 已提交
68
        status = Status(StatusCode::RPCFailed, grpc_status.error_message());
K
kun yu 已提交
69 70 71
    }
    if (response.status().error_code() != grpc::SUCCESS) {
        std::cerr << response.status().reason() << std::endl;
K
kun yu 已提交
72
        status = Status(StatusCode::ServerFailed, response.status().reason());
K
kun yu 已提交
73
    }
K
kun yu 已提交
74
    status = Status::OK();
K
kun yu 已提交
75 76 77
    return response.bool_reply();
}

K
kun yu 已提交
78
Status
K
kun yu 已提交
79
GrpcClient::DropTable(const ::milvus::grpc::TableName& table_name) {
K
kun yu 已提交
80
    ClientContext context;
K
kun yu 已提交
81
    grpc::Status response;
K
kun yu 已提交
82
    ::grpc::Status grpc_status = stub_->DropTable(&context, table_name, &response);
K
kun yu 已提交
83

K
kun yu 已提交
84 85 86
    if (!grpc_status.ok()) {
        std::cerr << "DropTable gRPC failed!" << std::endl;
        return Status(StatusCode::RPCFailed, grpc_status.error_message());
K
kun yu 已提交
87 88 89
    }
    if (response.error_code() != grpc::SUCCESS) {
        std::cerr << response.reason() << std::endl;
K
kun yu 已提交
90
        return Status(StatusCode::ServerFailed, response.reason());
K
kun yu 已提交
91
    }
K
kun yu 已提交
92 93

    return Status::OK();
K
kun yu 已提交
94 95
}

K
kun yu 已提交
96
Status
Y
Yu Kun 已提交
97
GrpcClient::CreateIndex(const ::milvus::grpc::IndexParam& index_param) {
K
kun yu 已提交
98
    ClientContext context;
K
kun yu 已提交
99
    grpc::Status response;
Y
Yu Kun 已提交
100
    ::grpc::Status grpc_status = stub_->CreateIndex(&context, index_param, &response);
K
kun yu 已提交
101

K
kun yu 已提交
102 103 104
    if (!grpc_status.ok()) {
        std::cerr << "BuildIndex rpc failed!" << std::endl;
        return Status(StatusCode::RPCFailed, grpc_status.error_message());
K
kun yu 已提交
105 106 107
    }
    if (response.error_code() != grpc::SUCCESS) {
        std::cerr << response.reason() << std::endl;
K
kun yu 已提交
108
        return Status(StatusCode::ServerFailed, response.reason());
K
kun yu 已提交
109
    }
K
kun yu 已提交
110 111

    return Status::OK();
K
kun yu 已提交
112 113 114
}

void
Y
Yu Kun 已提交
115 116
GrpcClient::Insert(::milvus::grpc::VectorIds& vector_ids,
                         const ::milvus::grpc::InsertParam& insert_param,
K
kun yu 已提交
117
                         Status& status) {
K
kun yu 已提交
118
    ClientContext context;
Y
Yu Kun 已提交
119
    ::grpc::Status grpc_status = stub_->Insert(&context, insert_param, &vector_ids);
K
kun yu 已提交
120

K
kun yu 已提交
121 122 123 124
    if (!grpc_status.ok()) {
        std::cerr << "InsertVector rpc failed!" << std::endl;
        status = Status(StatusCode::RPCFailed, grpc_status.error_message());
        return;
K
kun yu 已提交
125 126 127
    }
    if (vector_ids.status().error_code() != grpc::SUCCESS) {
        std::cerr << vector_ids.status().reason() << std::endl;
K
kun yu 已提交
128 129
        status = Status(StatusCode::ServerFailed, vector_ids.status().reason());
        return;
K
kun yu 已提交
130
    }
K
kun yu 已提交
131 132

    status = Status::OK();
K
kun yu 已提交
133 134
}

K
kun yu 已提交
135
Status
136 137
GrpcClient::Search(::milvus::grpc::TopKQueryResultList& topk_query_result_list,
                   const ::milvus::grpc::SearchParam &search_param) {
K
kun yu 已提交
138 139
    ::milvus::grpc::TopKQueryResult query_result;
    ClientContext context;
140
    ::grpc::Status grpc_status = stub_->Search(&context, search_param, &topk_query_result_list);
K
kun yu 已提交
141

K
kun yu 已提交
142
    if (!grpc_status.ok()) {
K
kun yu 已提交
143
        std::cerr << "SearchVector rpc failed!" << std::endl;
K
kun yu 已提交
144 145
        std::cerr << grpc_status.error_message() << std::endl;
        return Status(StatusCode::RPCFailed, grpc_status.error_message());
K
kun yu 已提交
146
    }
147 148
    if (topk_query_result_list.status().error_code() != grpc::SUCCESS) {
        std::cerr << topk_query_result_list.status().reason() << std::endl;
K
kun yu 已提交
149
        return Status(StatusCode::ServerFailed,
150
                      topk_query_result_list.status().reason());
K
kun yu 已提交
151
    }
K
kun yu 已提交
152 153

    return Status::OK();
K
kun yu 已提交
154 155
}

K
kun yu 已提交
156 157 158
Status
GrpcClient::DescribeTable(::milvus::grpc::TableSchema& grpc_schema,
                          const std::string& table_name) {
K
kun yu 已提交
159 160 161
    ClientContext context;
    ::milvus::grpc::TableName grpc_tablename;
    grpc_tablename.set_table_name(table_name);
K
kun yu 已提交
162
    ::grpc::Status grpc_status = stub_->DescribeTable(&context, grpc_tablename, &grpc_schema);
K
kun yu 已提交
163

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

170 171
    if (grpc_schema.status().error_code() != grpc::SUCCESS) {
        std::cerr << grpc_schema.status().reason() << std::endl;
K
kun yu 已提交
172
        return Status(StatusCode::ServerFailed,
173
            grpc_schema.status().reason());
K
kun yu 已提交
174
    }
K
kun yu 已提交
175 176

    return Status::OK();
K
kun yu 已提交
177 178 179
}

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

K
kun yu 已提交
187 188 189
    if (!grpc_status.ok()) {
        std::cerr << "DescribeTable rpc failed!" << std::endl;
        status = Status(StatusCode::RPCFailed,  grpc_status.error_message());
K
kun yu 已提交
190 191 192 193 194
        return -1;
    }

    if (response.status().error_code() != grpc::SUCCESS) {
        std::cerr << response.status().reason() << std::endl;
K
kun yu 已提交
195
        status = Status(StatusCode::ServerFailed, response.status().reason());
K
kun yu 已提交
196
        return -1;
K
kun yu 已提交
197
    }
K
kun yu 已提交
198 199

    status = Status::OK();
K
kun yu 已提交
200 201 202
    return response.table_row_count();
}

K
kun yu 已提交
203
Status
204
GrpcClient::ShowTables(milvus::grpc::TableNameList &table_name_list) {
K
kun yu 已提交
205 206
    ClientContext context;
    ::milvus::grpc::Command command;
207
    ::grpc::Status grpc_status = stub_->ShowTables(&context, command, &table_name_list);
K
kun yu 已提交
208

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

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

    return Status::OK();
K
kun yu 已提交
222 223
}

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

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

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

    return Status::OK();
K
kun yu 已提交
245 246
}

Y
Yu Kun 已提交
247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264
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();
}

265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282
Status
GrpcClient::DeleteByRange(grpc::DeleteByRangeParam &delete_by_range_param) {
    ClientContext context;
    ::milvus::grpc::Status response;
    ::grpc::Status grpc_status = stub_->DeleteByRange(&context, delete_by_range_param, &response);

    if (!grpc_status.ok()) {
        std::cerr << "DeleteByRange 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 已提交
283
Status
K
kun yu 已提交
284 285
GrpcClient::Disconnect() {
    stub_.release();
K
kun yu 已提交
286
    return Status::OK();
K
kun yu 已提交
287 288
}

289 290 291 292 293 294 295 296 297
Status
GrpcClient::DescribeIndex(grpc::TableName &table_name, grpc::IndexParam &index_param) {
    ClientContext context;
    ::grpc::Status grpc_status = stub_->DescribeIndex(&context, table_name, &index_param);

    if (!grpc_status.ok()) {
        std::cerr << "DescribeIndex rpc failed!" << std::endl;
        return Status(StatusCode::RPCFailed, grpc_status.error_message());
    }
298 299 300
    if (index_param.status().error_code() != grpc::SUCCESS) {
        std::cerr << index_param.status().reason() << std::endl;
        return Status(StatusCode::ServerFailed, index_param.status().reason());
301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323
    }

    return Status::OK();
}

Status
GrpcClient::DropIndex(grpc::TableName &table_name) {
    ClientContext context;
    ::milvus::grpc::Status response;
    ::grpc::Status grpc_status = stub_->DropIndex(&context, table_name, &response);

    if (!grpc_status.ok()) {
        std::cerr << "DropIndex 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 已提交
324
}