GrpcClient.cpp 15.8 KB
Newer Older
1
// Copyright (C) 2019-2020 Zilliz. All rights reserved.
J
jinhai 已提交
2
//
3 4
// Licensed 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
J
jinhai 已提交
5
//
6 7 8 9 10
// 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.
J
jinhai 已提交
11

Y
yukun 已提交
12
#include "grpc/GrpcClient.h"
S
starlord 已提交
13

K
kun yu 已提交
14 15 16 17 18 19
#include <grpc/grpc.h>
#include <grpcpp/channel.h>
#include <grpcpp/client_context.h>
#include <grpcpp/create_channel.h>
#include <grpcpp/security/credentials.h>

S
starlord 已提交
20
#include <memory>
S
starlord 已提交
21 22
#include <string>
#include <vector>
K
kun yu 已提交
23 24 25 26 27 28 29 30 31

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

namespace milvus {
S
starlord 已提交
32
GrpcClient::GrpcClient(std::shared_ptr<::grpc::Channel>& channel)
S
starlord 已提交
33
    : stub_(::milvus::grpc::MilvusService::NewStub(channel)) {
K
kun yu 已提交
34 35
}

K
kun yu 已提交
36
GrpcClient::~GrpcClient() = default;
K
kun yu 已提交
37

K
kun yu 已提交
38
Status
G
groot 已提交
39
GrpcClient::CreateCollection(const ::milvus::grpc::CollectionSchema& collection_schema) {
K
kun yu 已提交
40
    ClientContext context;
K
kun yu 已提交
41
    grpc::Status response;
G
groot 已提交
42
    ::grpc::Status grpc_status = stub_->CreateCollection(&context, collection_schema, &response);
K
kun yu 已提交
43

K
kun yu 已提交
44
    if (!grpc_status.ok()) {
G
groot 已提交
45
        std::cerr << "CreateCollection gRPC failed!" << std::endl;
K
kun yu 已提交
46
        return Status(StatusCode::RPCFailed, grpc_status.error_message());
K
kun yu 已提交
47 48 49 50
    }

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

bool
G
groot 已提交
57
GrpcClient::HasCollection(const ::milvus::grpc::CollectionName& collection_name, Status& status) {
K
kun yu 已提交
58 59
    ClientContext context;
    ::milvus::grpc::BoolReply response;
G
groot 已提交
60
    ::grpc::Status grpc_status = stub_->HasCollection(&context, collection_name, &response);
K
kun yu 已提交
61

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

K
kun yu 已提交
74
Status
G
groot 已提交
75
GrpcClient::DropCollection(const ::milvus::grpc::CollectionName& collection_name) {
K
kun yu 已提交
76
    ClientContext context;
K
kun yu 已提交
77
    grpc::Status response;
G
groot 已提交
78
    ::grpc::Status grpc_status = stub_->DropCollection(&context, collection_name, &response);
K
kun yu 已提交
79

K
kun yu 已提交
80
    if (!grpc_status.ok()) {
G
groot 已提交
81
        std::cerr << "DropCollection gRPC failed!" << std::endl;
K
kun yu 已提交
82
        return Status(StatusCode::RPCFailed, grpc_status.error_message());
K
kun yu 已提交
83 84 85
    }
    if (response.error_code() != grpc::SUCCESS) {
        std::cerr << response.reason() << std::endl;
K
kun yu 已提交
86
        return Status(StatusCode::ServerFailed, response.reason());
K
kun yu 已提交
87
    }
K
kun yu 已提交
88 89

    return Status::OK();
K
kun yu 已提交
90 91
}

K
kun yu 已提交
92
Status
S
starlord 已提交
93
GrpcClient::CreateIndex(const ::milvus::grpc::IndexParam& index_param) {
K
kun yu 已提交
94
    ClientContext context;
K
kun yu 已提交
95
    grpc::Status response;
Y
Yu Kun 已提交
96
    ::grpc::Status grpc_status = stub_->CreateIndex(&context, index_param, &response);
K
kun yu 已提交
97

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

    return Status::OK();
K
kun yu 已提交
108 109
}

110 111
Status
GrpcClient::Insert(const ::milvus::grpc::InsertParam& insert_param, ::milvus::grpc::VectorIds& vector_ids) {
K
kun yu 已提交
112
    ClientContext context;
Y
Yu Kun 已提交
113
    ::grpc::Status grpc_status = stub_->Insert(&context, insert_param, &vector_ids);
K
kun yu 已提交
114

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

124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158
    return Status::OK();
}

Status
GrpcClient::GetVectorByID(const grpc::VectorIdentity& vector_identity, ::milvus::grpc::VectorData& vector_data) {
    ClientContext context;
    ::grpc::Status grpc_status = stub_->GetVectorByID(&context, vector_identity, &vector_data);

    if (!grpc_status.ok()) {
        std::cerr << "GetVectorByID rpc failed!" << std::endl;
        return Status(StatusCode::RPCFailed, grpc_status.error_message());
    }
    if (vector_data.status().error_code() != grpc::SUCCESS) {
        std::cerr << vector_data.status().reason() << std::endl;
        return Status(StatusCode::ServerFailed, vector_data.status().reason());
    }

    return Status::OK();
}

Status
GrpcClient::GetIDsInSegment(const grpc::GetVectorIDsParam& param, grpc::VectorIds& vector_ids) {
    ClientContext context;
    ::grpc::Status grpc_status = stub_->GetVectorIDs(&context, param, &vector_ids);

    if (!grpc_status.ok()) {
        std::cerr << "GetIDsInSegment rpc failed!" << std::endl;
        return Status(StatusCode::RPCFailed, grpc_status.error_message());
    }
    if (vector_ids.status().error_code() != grpc::SUCCESS) {
        std::cerr << vector_ids.status().reason() << std::endl;
        return Status(StatusCode::ServerFailed, vector_ids.status().reason());
    }

    return Status::OK();
K
kun yu 已提交
159 160
}

K
kun yu 已提交
161
Status
162 163
GrpcClient::Search(
    const ::milvus::grpc::SearchParam& search_param, ::milvus::grpc::TopKQueryResult& topk_query_result) {
K
kun yu 已提交
164 165
    ::milvus::grpc::TopKQueryResult query_result;
    ClientContext context;
166
    ::grpc::Status grpc_status = stub_->Search(&context, search_param, &topk_query_result);
K
kun yu 已提交
167

K
kun yu 已提交
168
    if (!grpc_status.ok()) {
169
        std::cerr << "Search rpc failed!" << std::endl;
K
kun yu 已提交
170 171
        std::cerr << grpc_status.error_message() << std::endl;
        return Status(StatusCode::RPCFailed, grpc_status.error_message());
K
kun yu 已提交
172
    }
173 174 175
    if (topk_query_result.status().error_code() != grpc::SUCCESS) {
        std::cerr << topk_query_result.status().reason() << std::endl;
        return Status(StatusCode::ServerFailed, topk_query_result.status().reason());
K
kun yu 已提交
176
    }
K
kun yu 已提交
177 178

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

181
Status
G
groot 已提交
182
GrpcClient::DescribeCollection(const std::string& collection_name, ::milvus::grpc::CollectionSchema& grpc_schema) {
K
kun yu 已提交
183
    ClientContext context;
G
groot 已提交
184 185 186
    ::milvus::grpc::CollectionName grpc_collectionname;
    grpc_collectionname.set_collection_name(collection_name);
    ::grpc::Status grpc_status = stub_->DescribeCollection(&context, grpc_collectionname, &grpc_schema);
K
kun yu 已提交
187

K
kun yu 已提交
188
    if (!grpc_status.ok()) {
G
groot 已提交
189
        std::cerr << "DescribeCollection rpc failed!" << std::endl;
K
kun yu 已提交
190 191
        std::cerr << grpc_status.error_message() << std::endl;
        return Status(StatusCode::RPCFailed, grpc_status.error_message());
K
kun yu 已提交
192 193
    }

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

    return Status::OK();
K
kun yu 已提交
200 201 202
}

int64_t
G
groot 已提交
203
GrpcClient::CountCollection(grpc::CollectionName& collection_name, Status& status) {
K
kun yu 已提交
204
    ClientContext context;
G
groot 已提交
205 206
    ::milvus::grpc::CollectionRowCount response;
    ::grpc::Status grpc_status = stub_->CountCollection(&context, collection_name, &response);
K
kun yu 已提交
207

K
kun yu 已提交
208
    if (!grpc_status.ok()) {
G
groot 已提交
209
        std::cerr << "CountCollection rpc failed!" << std::endl;
S
starlord 已提交
210
        status = Status(StatusCode::RPCFailed, grpc_status.error_message());
K
kun yu 已提交
211 212 213 214 215
        return -1;
    }

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

    status = Status::OK();
G
groot 已提交
221
    return response.collection_row_count();
K
kun yu 已提交
222 223
}

K
kun yu 已提交
224
Status
G
groot 已提交
225
GrpcClient::ShowCollections(milvus::grpc::CollectionNameList& collection_name_list) {
K
kun yu 已提交
226 227
    ClientContext context;
    ::milvus::grpc::Command command;
G
groot 已提交
228
    ::grpc::Status grpc_status = stub_->ShowCollections(&context, command, &collection_name_list);
K
kun yu 已提交
229

K
kun yu 已提交
230
    if (!grpc_status.ok()) {
G
groot 已提交
231
        std::cerr << "ShowCollections gRPC failed!" << std::endl;
K
kun yu 已提交
232 233
        std::cerr << grpc_status.error_message() << std::endl;
        return Status(StatusCode::RPCFailed, grpc_status.error_message());
K
kun yu 已提交
234 235
    }

G
groot 已提交
236 237 238
    if (collection_name_list.status().error_code() != grpc::SUCCESS) {
        std::cerr << collection_name_list.status().reason() << std::endl;
        return Status(StatusCode::ServerFailed, collection_name_list.status().reason());
K
kun yu 已提交
239
    }
K
kun yu 已提交
240 241

    return Status::OK();
K
kun yu 已提交
242 243
}

K
kun yu 已提交
244
Status
G
groot 已提交
245
GrpcClient::ShowCollectionInfo(grpc::CollectionName& collection_name, grpc::CollectionInfo& collection_info) {
246 247
    ClientContext context;
    ::milvus::grpc::Command command;
G
groot 已提交
248
    ::grpc::Status grpc_status = stub_->ShowCollectionInfo(&context, collection_name, &collection_info);
249 250

    if (!grpc_status.ok()) {
G
groot 已提交
251
        std::cerr << "ShowCollectionInfo gRPC failed!" << std::endl;
252 253 254 255
        std::cerr << grpc_status.error_message() << std::endl;
        return Status(StatusCode::RPCFailed, grpc_status.error_message());
    }

256 257 258
    if (collection_info.status().error_code() != grpc::SUCCESS) {
        std::cerr << collection_info.status().reason() << std::endl;
        return Status(StatusCode::ServerFailed, collection_info.status().reason());
259 260 261 262 263 264 265
    }

    return Status::OK();
}

Status
GrpcClient::Cmd(const std::string& cmd, std::string& result) {
K
kun yu 已提交
266
    ClientContext context;
Y
Yu Kun 已提交
267
    ::milvus::grpc::StringReply response;
K
kun yu 已提交
268 269
    ::milvus::grpc::Command command;
    command.set_cmd(cmd);
Y
Yu Kun 已提交
270
    ::grpc::Status grpc_status = stub_->Cmd(&context, command, &response);
K
kun yu 已提交
271

Y
Yu Kun 已提交
272
    result = response.string_reply();
K
kun yu 已提交
273
    if (!grpc_status.ok()) {
Y
Yu Kun 已提交
274
        std::cerr << "Cmd gRPC failed!" << std::endl;
K
kun yu 已提交
275
        return Status(StatusCode::RPCFailed, grpc_status.error_message());
K
kun yu 已提交
276 277 278 279
    }

    if (response.status().error_code() != grpc::SUCCESS) {
        std::cerr << response.status().reason() << std::endl;
K
kun yu 已提交
280
        return Status(StatusCode::ServerFailed, response.status().reason());
K
kun yu 已提交
281
    }
K
kun yu 已提交
282 283

    return Status::OK();
K
kun yu 已提交
284 285
}

Y
Yu Kun 已提交
286
Status
G
groot 已提交
287
GrpcClient::PreloadCollection(milvus::grpc::CollectionName& collection_name) {
Y
Yu Kun 已提交
288 289
    ClientContext context;
    ::milvus::grpc::Status response;
G
groot 已提交
290
    ::grpc::Status grpc_status = stub_->PreloadCollection(&context, collection_name, &response);
Y
Yu Kun 已提交
291 292

    if (!grpc_status.ok()) {
G
groot 已提交
293
        std::cerr << "PreloadCollection gRPC failed!" << std::endl;
Y
Yu Kun 已提交
294 295 296 297 298 299 300 301 302 303
        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();
}

304
Status
305
GrpcClient::DeleteByID(grpc::DeleteByIDParam& delete_by_id_param) {
306 307
    ClientContext context;
    ::milvus::grpc::Status response;
308
    ::grpc::Status grpc_status = stub_->DeleteByID(&context, delete_by_id_param, &response);
309 310

    if (!grpc_status.ok()) {
311
        std::cerr << "DeleteByID gRPC failed!" << std::endl;
312 313 314 315 316 317 318 319 320 321
        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();
}

322
Status
G
groot 已提交
323
GrpcClient::DescribeIndex(grpc::CollectionName& collection_name, grpc::IndexParam& index_param) {
324
    ClientContext context;
J
Jin Hai 已提交
325
    ::grpc::Status grpc_status = stub_->DescribeIndex(&context, collection_name, &index_param);
326 327 328 329 330

    if (!grpc_status.ok()) {
        std::cerr << "DescribeIndex rpc failed!" << std::endl;
        return Status(StatusCode::RPCFailed, grpc_status.error_message());
    }
331 332 333
    if (index_param.status().error_code() != grpc::SUCCESS) {
        std::cerr << index_param.status().reason() << std::endl;
        return Status(StatusCode::ServerFailed, index_param.status().reason());
334 335 336 337 338 339
    }

    return Status::OK();
}

Status
G
groot 已提交
340
GrpcClient::DropIndex(grpc::CollectionName& collection_name) {
341 342
    ClientContext context;
    ::milvus::grpc::Status response;
J
Jin Hai 已提交
343
    ::grpc::Status grpc_status = stub_->DropIndex(&context, collection_name, &response);
344 345 346 347 348 349 350 351 352 353 354 355 356

    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();
}

G
groot 已提交
357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375
Status
GrpcClient::CreatePartition(const grpc::PartitionParam& partition_param) {
    ClientContext context;
    ::milvus::grpc::Status response;
    ::grpc::Status grpc_status = stub_->CreatePartition(&context, partition_param, &response);

    if (!grpc_status.ok()) {
        std::cerr << "CreatePartition 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();
}

Status
G
groot 已提交
376
GrpcClient::ShowPartitions(const grpc::CollectionName& collection_name, grpc::PartitionList& partition_array) const {
G
groot 已提交
377
    ClientContext context;
J
Jin Hai 已提交
378
    ::grpc::Status grpc_status = stub_->ShowPartitions(&context, collection_name, &partition_array);
G
groot 已提交
379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409

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

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

Status
GrpcClient::DropPartition(const ::milvus::grpc::PartitionParam& partition_param) {
    ClientContext context;
    ::milvus::grpc::Status response;
    ::grpc::Status grpc_status = stub_->DropPartition(&context, partition_param, &response);

    if (!grpc_status.ok()) {
        std::cerr << "DropPartition 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();
}

410
Status
J
Jin Hai 已提交
411
GrpcClient::Flush(const std::string& collection_name) {
412 413 414
    ClientContext context;

    ::milvus::grpc::FlushParam param;
J
Jin Hai 已提交
415
    if (!collection_name.empty()) {
G
groot 已提交
416
        param.add_collection_name_array(collection_name);
417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434
    }

    ::milvus::grpc::Status response;
    ::grpc::Status grpc_status = stub_->Flush(&context, param, &response);

    if (!grpc_status.ok()) {
        std::cerr << "Flush 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();
}

Status
G
groot 已提交
435
GrpcClient::Compact(milvus::grpc::CollectionName& collection_name) {
436 437
    ClientContext context;
    ::milvus::grpc::Status response;
J
Jin Hai 已提交
438
    ::grpc::Status grpc_status = stub_->Compact(&context, collection_name, &response);
439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457

    if (!grpc_status.ok()) {
        std::cerr << "Compact 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();
}

Status
GrpcClient::Disconnect() {
    stub_.release();
    return Status::OK();
}

S
starlord 已提交
458
}  // namespace milvus