RequestTask.cpp 20.8 KB
Newer Older
G
groot 已提交
1 2 3 4 5
/*******************************************************************************
 * Copyright 上海赜睿信息科技有限公司(Zilliz) - All Rights Reserved
 * Unauthorized copying of this file, via any medium is strictly prohibited.
 * Proprietary and confidential.
 ******************************************************************************/
G
groot 已提交
6
#include "RequestTask.h"
G
groot 已提交
7 8 9 10
#include "ServerConfig.h"
#include "utils/CommonUtil.h"
#include "utils/Log.h"
#include "utils/TimeRecorder.h"
G
groot 已提交
11
#include "DBWrapper.h"
G
groot 已提交
12
#include "version.h"
G
groot 已提交
13 14

namespace zilliz {
J
jinhai 已提交
15
namespace milvus {
G
groot 已提交
16 17
namespace server {

G
groot 已提交
18 19
using namespace ::milvus;

G
groot 已提交
20 21
static const std::string DQL_TASK_GROUP = "dql";
static const std::string DDL_DML_TASK_GROUP = "ddl_dml";
G
groot 已提交
22
static const std::string PING_TASK_GROUP = "ping";
G
groot 已提交
23

J
jinhai 已提交
24 25
using DB_META = zilliz::milvus::engine::meta::Meta;
using DB_DATE = zilliz::milvus::engine::meta::DateT;
G
groot 已提交
26 27

namespace {
G
groot 已提交
28 29 30 31 32 33 34 35 36 37 38 39
    engine::EngineType EngineType(int type) {
        static std::map<int, engine::EngineType> map_type = {
                {0, engine::EngineType::INVALID},
                {1, engine::EngineType::FAISS_IDMAP},
                {2, engine::EngineType::FAISS_IVFFLAT},
        };

        if(map_type.find(type) == map_type.end()) {
            return engine::EngineType::INVALID;
        }

        return map_type[type];
G
groot 已提交
40
    }
G
groot 已提交
41

G
groot 已提交
42 43 44 45 46 47 48 49 50 51 52 53 54 55
    int IndexType(engine::EngineType type) {
        static std::map<engine::EngineType, int> map_type = {
                {engine::EngineType::INVALID, 0},
                {engine::EngineType::FAISS_IDMAP, 1},
                {engine::EngineType::FAISS_IVFFLAT, 2},
        };

        if(map_type.find(type) == map_type.end()) {
            return 0;
        }

        return map_type[type];
    }

G
groot 已提交
56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90
    ServerError
    ConvertRowRecordToFloatArray(const std::vector<thrift::RowRecord>& record_array,
                                 uint64_t dimension,
                                 std::vector<float>& float_array) {
        ServerError error_code;
        uint64_t vec_count = record_array.size();
        float_array.resize(vec_count*dimension);//allocate enough memory
        for(uint64_t i = 0; i < vec_count; i++) {
            const auto& record = record_array[i];
            if(record.vector_data.empty()) {
                error_code = SERVER_INVALID_ARGUMENT;
                SERVER_LOG_ERROR << "No vector provided in record";
                return error_code;
            }
            uint64_t vec_dim = record.vector_data.size()/sizeof(double);//how many double value?
            if(vec_dim != dimension) {
                SERVER_LOG_ERROR << "Invalid vector dimension: " << vec_dim
                                 << " vs. group dimension:" << dimension;
                error_code = SERVER_INVALID_VECTOR_DIMENSION;
                return error_code;
            }

            //convert double array to float array(thrift has no float type)
            const double* d_p = reinterpret_cast<const double*>(record.vector_data.data());
            for(uint64_t d = 0; d < vec_dim; d++) {
                float_array[i*vec_dim + d] = (float)(d_p[d]);
            }
        }

        return SERVER_SUCCESS;
    }

    static constexpr long DAY_SECONDS = 86400;

    ServerError
G
groot 已提交
91
    ConvertTimeRangeToDBDates(const std::vector<thrift::Range> &range_array,
G
groot 已提交
92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122
                              std::vector<DB_DATE>& dates) {
        dates.clear();
        ServerError error_code;
        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)){
                error_code = SERVER_INVALID_TIME_RANGE;
                SERVER_LOG_ERROR << "Invalid time range: " << range.start_value;
                return error_code;
            }

            if(!CommonUtil::TimeStrToTime(range.end_value, tt_end, tm_end)){
                error_code = SERVER_INVALID_TIME_RANGE;
                SERVER_LOG_ERROR << "Invalid time range: " << range.end_value;
                return error_code;
            }

            long days = (tt_end > tt_start) ? (tt_end - tt_start)/DAY_SECONDS : (tt_start - tt_end)/DAY_SECONDS;
            for(long i = 0; i <= days; i++) {
                time_t tt_day = tt_start + DAY_SECONDS*i;
                tm tm_day;
                CommonUtil::ConvertTime(tt_day, tm_day);

                long date = tm_day.tm_year*10000 + tm_day.tm_mon*100 + tm_day.tm_mday;//according to db logic
                dates.push_back(date);
            }
        }

        return SERVER_SUCCESS;
    }
G
groot 已提交
123 124 125 126 127 128 129 130 131 132 133 134 135 136 137
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
CreateTableTask::CreateTableTask(const thrift::TableSchema& schema)
: BaseTask(DDL_DML_TASK_GROUP),
  schema_(schema) {

}

BaseTaskPtr CreateTableTask::Create(const thrift::TableSchema& schema) {
    return std::shared_ptr<BaseTask>(new CreateTableTask(schema));
}

ServerError CreateTableTask::OnExecute() {
    TimeRecorder rc("CreateTableTask");
G
groot 已提交
138
    
G
groot 已提交
139
    try {
G
groot 已提交
140 141 142 143 144 145
        //step 1: check arguments
        if(schema_.table_name.empty() || schema_.dimension <= 0) {
            error_code_ = SERVER_INVALID_ARGUMENT;
            error_msg_ = "Invalid table name or dimension";
            SERVER_LOG_ERROR << error_msg_;
            return error_code_;
G
groot 已提交
146 147
        }

G
groot 已提交
148 149 150 151 152 153 154 155 156
        engine::EngineType engine_type = EngineType(schema_.index_type);
        if(engine_type == engine::EngineType::INVALID) {
            error_code_ = SERVER_INVALID_ARGUMENT;
            error_msg_ = "Invalid index type";
            SERVER_LOG_ERROR << error_msg_;
            return error_code_;
        }

        //step 2: construct table schema
G
groot 已提交
157
        engine::meta::TableSchema table_info;
G
groot 已提交
158 159 160 161 162
        table_info.dimension_ = (uint16_t)schema_.dimension;
        table_info.table_id_ = schema_.table_name;
        table_info.engine_type_ = (int)EngineType(schema_.index_type);
        table_info.store_raw_data_ = schema_.store_raw_vector;

G
groot 已提交
163
        //step 3: create table
G
groot 已提交
164
        engine::Status stat = DBWrapper::DB()->CreateTable(table_info);
G
groot 已提交
165
        if(!stat.ok()) {//table could exist
G
groot 已提交
166
            error_code_ = SERVER_UNEXPECTED_ERROR;
G
groot 已提交
167 168
            error_msg_ = "Engine failed: " + stat.ToString();
            SERVER_LOG_ERROR << error_msg_;
G
groot 已提交
169
            return error_code_;
G
groot 已提交
170 171 172 173 174 175
        }

    } catch (std::exception& ex) {
        error_code_ = SERVER_UNEXPECTED_ERROR;
        error_msg_ = ex.what();
        SERVER_LOG_ERROR << error_msg_;
G
groot 已提交
176
        return error_code_;
G
groot 已提交
177 178 179 180 181 182 183 184 185
    }

    rc.Record("done");

    return SERVER_SUCCESS;
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
DescribeTableTask::DescribeTableTask(const std::string &table_name, thrift::TableSchema &schema)
G
groot 已提交
186
    : BaseTask(DDL_DML_TASK_GROUP),
G
groot 已提交
187 188 189 190 191 192 193 194 195 196 197 198 199
      table_name_(table_name),
      schema_(schema) {
    schema_.table_name = table_name_;
}

BaseTaskPtr DescribeTableTask::Create(const std::string& table_name, thrift::TableSchema& schema) {
    return std::shared_ptr<BaseTask>(new DescribeTableTask(table_name, schema));
}

ServerError DescribeTableTask::OnExecute() {
    TimeRecorder rc("DescribeTableTask");

    try {
G
groot 已提交
200 201 202 203 204 205 206 207 208
        //step 1: check arguments
        if(table_name_.empty()) {
            error_code_ = SERVER_INVALID_ARGUMENT;
            error_msg_ = "Table name cannot be empty";
            SERVER_LOG_ERROR << error_msg_;
            return error_code_;
        }

        //step 2: get table info
G
groot 已提交
209
        engine::meta::TableSchema table_info;
G
groot 已提交
210
        table_info.table_id_ = table_name_;
G
groot 已提交
211
        engine::Status stat = DBWrapper::DB()->DescribeTable(table_info);
G
groot 已提交
212
        if(!stat.ok()) {
G
groot 已提交
213
            error_code_ = SERVER_TABLE_NOT_EXIST;
G
groot 已提交
214 215 216 217 218
            error_msg_ = "Engine failed: " + stat.ToString();
            SERVER_LOG_ERROR << error_msg_;
            return error_code_;
        }

G
groot 已提交
219 220 221 222 223
        schema_.table_name = table_info.table_id_;
        schema_.index_type = IndexType((engine::EngineType)table_info.engine_type_);
        schema_.dimension = table_info.dimension_;
        schema_.store_raw_vector = table_info.store_raw_data_;

G
groot 已提交
224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242
    } catch (std::exception& ex) {
        error_code_ = SERVER_UNEXPECTED_ERROR;
        error_msg_ = ex.what();
        SERVER_LOG_ERROR << error_msg_;
        return SERVER_UNEXPECTED_ERROR;
    }

    rc.Record("done");

    return SERVER_SUCCESS;
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
DeleteTableTask::DeleteTableTask(const std::string& table_name)
    : BaseTask(DDL_DML_TASK_GROUP),
      table_name_(table_name) {

}

G
groot 已提交
243 244
BaseTaskPtr DeleteTableTask::Create(const std::string& group_id) {
    return std::shared_ptr<BaseTask>(new DeleteTableTask(group_id));
G
groot 已提交
245 246 247
}

ServerError DeleteTableTask::OnExecute() {
G
groot 已提交
248 249 250
    try {
        TimeRecorder rc("DeleteTableTask");

G
groot 已提交
251
        //step 1: check arguments
G
groot 已提交
252 253 254 255 256 257 258 259 260 261
        if (table_name_.empty()) {
            error_code_ = SERVER_INVALID_ARGUMENT;
            error_msg_ = "Table name cannot be empty";
            SERVER_LOG_ERROR << error_msg_;
            return error_code_;
        }

        //step 2: check table existence
        engine::meta::TableSchema table_info;
        table_info.table_id_ = table_name_;
G
groot 已提交
262
        engine::Status stat = DBWrapper::DB()->DescribeTable(table_info);
G
groot 已提交
263 264 265 266 267 268 269 270
        if(!stat.ok()) {
            error_code_ = SERVER_TABLE_NOT_EXIST;
            error_msg_ = "Engine failed: " + stat.ToString();
            SERVER_LOG_ERROR << error_msg_;
            return error_code_;
        }

        rc.Record("check validation");
G
groot 已提交
271

G
groot 已提交
272 273
        //step 3: delete table
        std::vector<DB_DATE> dates;
G
groot 已提交
274
        stat = DBWrapper::DB()->DeleteTable(table_name_, dates);
G
groot 已提交
275 276 277 278 279 280 281 282 283 284 285 286 287 288 289
        if(!stat.ok()) {
            SERVER_LOG_ERROR << "Engine failed: " << stat.ToString();
            return SERVER_UNEXPECTED_ERROR;
        }

        rc.Record("deleta table");
        rc.Elapse("totally cost");
    } catch (std::exception& ex) {
        error_code_ = SERVER_UNEXPECTED_ERROR;
        error_msg_ = ex.what();
        SERVER_LOG_ERROR << error_msg_;
        return error_code_;
    }

    return SERVER_SUCCESS;
G
groot 已提交
290 291
}

G
groot 已提交
292 293
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
ShowTablesTask::ShowTablesTask(std::vector<std::string>& tables)
G
groot 已提交
294
    : BaseTask(DDL_DML_TASK_GROUP),
G
groot 已提交
295 296 297 298 299 300 301 302 303
      tables_(tables) {

}

BaseTaskPtr ShowTablesTask::Create(std::vector<std::string>& tables) {
    return std::shared_ptr<BaseTask>(new ShowTablesTask(tables));
}

ServerError ShowTablesTask::OnExecute() {
G
groot 已提交
304
    std::vector<engine::meta::TableSchema> schema_array;
G
groot 已提交
305
    engine::Status stat = DBWrapper::DB()->AllTables(schema_array);
G
groot 已提交
306 307 308 309 310 311 312 313 314 315 316
    if(!stat.ok()) {
        error_code_ = SERVER_UNEXPECTED_ERROR;
        error_msg_ = "Engine failed: " + stat.ToString();
        SERVER_LOG_ERROR << error_msg_;
        return error_code_;
    }

    tables_.clear();
    for(auto& schema : schema_array) {
        tables_.push_back(schema.table_id_);
    }
G
groot 已提交
317 318 319

    return SERVER_SUCCESS;
}
G
groot 已提交
320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
AddVectorTask::AddVectorTask(const std::string& table_name,
                                       const std::vector<thrift::RowRecord>& record_array,
                                       std::vector<int64_t>& record_ids)
    : BaseTask(DDL_DML_TASK_GROUP),
      table_name_(table_name),
      record_array_(record_array),
      record_ids_(record_ids) {
    record_ids_.clear();
}

BaseTaskPtr AddVectorTask::Create(const std::string& table_name,
                                       const std::vector<thrift::RowRecord>& record_array,
                                       std::vector<int64_t>& record_ids) {
    return std::shared_ptr<BaseTask>(new AddVectorTask(table_name, record_array, record_ids));
}

ServerError AddVectorTask::OnExecute() {
    try {
        TimeRecorder rc("AddVectorTask");

G
groot 已提交
342 343 344 345 346 347 348 349
        //step 1: check arguments
        if (table_name_.empty()) {
            error_code_ = SERVER_INVALID_ARGUMENT;
            error_msg_ = "Table name cannot be empty";
            SERVER_LOG_ERROR << error_msg_;
            return error_code_;
        }

G
groot 已提交
350
        if(record_array_.empty()) {
G
groot 已提交
351 352 353 354
            error_code_ = SERVER_INVALID_ARGUMENT;
            error_msg_ = "Row record array is empty";
            SERVER_LOG_ERROR << error_msg_;
            return error_code_;
G
groot 已提交
355 356
        }

G
groot 已提交
357
        //step 2: check table existence
G
groot 已提交
358
        engine::meta::TableSchema table_info;
G
groot 已提交
359
        table_info.table_id_ = table_name_;
G
groot 已提交
360
        engine::Status stat = DBWrapper::DB()->DescribeTable(table_info);
G
groot 已提交
361
        if(!stat.ok()) {
G
groot 已提交
362
            error_code_ = SERVER_TABLE_NOT_EXIST;
G
groot 已提交
363 364 365 366 367
            error_msg_ = "Engine failed: " + stat.ToString();
            SERVER_LOG_ERROR << error_msg_;
            return error_code_;
        }

G
groot 已提交
368
        rc.Record("check validation");
G
groot 已提交
369

G
groot 已提交
370
        //step 3: prepare float data
G
groot 已提交
371
        std::vector<float> vec_f;
G
groot 已提交
372 373 374 375
        error_code_ = ConvertRowRecordToFloatArray(record_array_, table_info.dimension_, vec_f);
        if(error_code_ != SERVER_SUCCESS) {
            error_msg_ = "Invalid row record data";
            return error_code_;
G
groot 已提交
376 377 378 379
        }

        rc.Record("prepare vectors data");

G
groot 已提交
380
        //step 4: insert vectors
G
groot 已提交
381
        uint64_t vec_count = (uint64_t)record_array_.size();
G
groot 已提交
382
        stat = DBWrapper::DB()->InsertVectors(table_name_, vec_count, vec_f.data(), record_ids_);
G
groot 已提交
383 384 385 386 387 388 389 390
        rc.Record("add vectors to engine");
        if(!stat.ok()) {
            error_code_ = SERVER_UNEXPECTED_ERROR;
            error_msg_ = "Engine failed: " + stat.ToString();
            SERVER_LOG_ERROR << error_msg_;
            return error_code_;
        }

G
groot 已提交
391
        if(record_ids_.size() != vec_count) {
G
groot 已提交
392 393 394 395
            SERVER_LOG_ERROR << "Vector ID not returned";
            return SERVER_UNEXPECTED_ERROR;
        }

G
groot 已提交
396 397
        rc.Record("do insert");
        rc.Elapse("totally cost");
G
groot 已提交
398 399 400 401 402 403 404 405 406 407 408 409

    } catch (std::exception& ex) {
        error_code_ = SERVER_UNEXPECTED_ERROR;
        error_msg_ = ex.what();
        SERVER_LOG_ERROR << error_msg_;
        return error_code_;
    }

    return SERVER_SUCCESS;
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
410 411 412 413
SearchVectorTask::SearchVectorTask(const std::string &table_name,
                                   const std::vector<std::string>& file_id_array,
                                   const std::vector<thrift::RowRecord> &query_record_array,
                                   const std::vector<thrift::Range> &query_range_array,
G
groot 已提交
414
                                   const int64_t top_k,
415
                                   std::vector<thrift::TopKQueryResult> &result_array)
G
groot 已提交
416 417 418 419 420 421 422
    : BaseTask(DQL_TASK_GROUP),
      table_name_(table_name),
      file_id_array_(file_id_array),
      record_array_(query_record_array),
      range_array_(query_range_array),
      top_k_(top_k),
      result_array_(result_array) {
G
groot 已提交
423 424 425 426

}

BaseTaskPtr SearchVectorTask::Create(const std::string& table_name,
427
                                     const std::vector<std::string>& file_id_array,
G
groot 已提交
428
                                     const std::vector<thrift::RowRecord> & query_record_array,
G
groot 已提交
429
                                     const std::vector<thrift::Range> & query_range_array,
G
groot 已提交
430 431
                                     const int64_t top_k,
                                     std::vector<thrift::TopKQueryResult>& result_array) {
432
    return std::shared_ptr<BaseTask>(new SearchVectorTask(table_name, file_id_array,
G
groot 已提交
433
            query_record_array, query_range_array, top_k, result_array));
G
groot 已提交
434 435 436 437 438 439
}

ServerError SearchVectorTask::OnExecute() {
    try {
        TimeRecorder rc("SearchVectorTask");

G
groot 已提交
440 441 442 443 444 445 446 447
        //step 1: check arguments
        if (table_name_.empty()) {
            error_code_ = SERVER_INVALID_ARGUMENT;
            error_msg_ = "Table name cannot be empty";
            SERVER_LOG_ERROR << error_msg_;
            return error_code_;
        }

G
groot 已提交
448 449 450 451 452 453 454
        if(top_k_ <= 0 || record_array_.empty()) {
            error_code_ = SERVER_INVALID_ARGUMENT;
            error_msg_ = "Invalid topk value, or query record array is empty";
            SERVER_LOG_ERROR << error_msg_;
            return error_code_;
        }

G
groot 已提交
455
        //step 2: check table existence
G
groot 已提交
456
        engine::meta::TableSchema table_info;
G
groot 已提交
457
        table_info.table_id_ = table_name_;
G
groot 已提交
458
        engine::Status stat = DBWrapper::DB()->DescribeTable(table_info);
G
groot 已提交
459
        if(!stat.ok()) {
G
groot 已提交
460
            error_code_ = SERVER_TABLE_NOT_EXIST;
G
groot 已提交
461 462 463 464 465
            error_msg_ = "Engine failed: " + stat.ToString();
            SERVER_LOG_ERROR << error_msg_;
            return error_code_;
        }

G
groot 已提交
466 467 468 469 470 471 472 473
        //step 3: check date range, and convert to db dates
        std::vector<DB_DATE> dates;
        error_code_ = ConvertTimeRangeToDBDates(range_array_, dates);
        if(error_code_ != SERVER_SUCCESS) {
            error_msg_ = "Invalid query range";
            return error_code_;
        }

G
groot 已提交
474 475 476
        rc.Record("check validation");

        //step 3: prepare float data
G
groot 已提交
477
        std::vector<float> vec_f;
G
groot 已提交
478 479 480 481
        error_code_ = ConvertRowRecordToFloatArray(record_array_, table_info.dimension_, vec_f);
        if(error_code_ != SERVER_SUCCESS) {
            error_msg_ = "Invalid row record data";
            return error_code_;
G
groot 已提交
482 483 484 485
        }

        rc.Record("prepare vector data");

G
groot 已提交
486
        //step 4: search vectors
G
groot 已提交
487
        engine::QueryResults results;
G
groot 已提交
488
        uint64_t record_count = (uint64_t)record_array_.size();
489 490

        if(file_id_array_.empty()) {
G
groot 已提交
491
            stat = DBWrapper::DB()->Query(table_name_, (size_t) top_k_, record_count, vec_f.data(), dates, results);
492
        } else {
G
groot 已提交
493
            stat = DBWrapper::DB()->Query(table_name_, file_id_array_, (size_t) top_k_, record_count, vec_f.data(), dates, results);
494 495
        }

G
groot 已提交
496
        rc.Record("search vectors from engine");
G
groot 已提交
497 498 499
        if(!stat.ok()) {
            SERVER_LOG_ERROR << "Engine failed: " << stat.ToString();
            return SERVER_UNEXPECTED_ERROR;
G
groot 已提交
500 501 502 503 504 505 506
        }

        if(results.size() != record_count) {
            SERVER_LOG_ERROR << "Search result not returned";
            return SERVER_UNEXPECTED_ERROR;
        }

G
groot 已提交
507 508 509
        rc.Record("do search");

        //step 5: construct result array
G
groot 已提交
510 511 512 513 514
        for(uint64_t i = 0; i < record_count; i++) {
            auto& result = results[i];
            const auto& record = record_array_[i];

            thrift::TopKQueryResult thrift_topk_result;
G
groot 已提交
515
            for(auto& pair : result) {
G
groot 已提交
516
                thrift::QueryResult thrift_result;
G
groot 已提交
517 518
                thrift_result.__set_id(pair.first);
                thrift_result.__set_score(pair.second);
G
groot 已提交
519 520

                thrift_topk_result.query_result_arrays.emplace_back(thrift_result);
G
groot 已提交
521 522
            }

G
groot 已提交
523 524 525
            result_array_.emplace_back(thrift_topk_result);
        }
        rc.Record("construct result");
G
groot 已提交
526
        rc.Elapse("totally cost");
527

G
groot 已提交
528 529 530 531 532 533 534 535 536 537
    } catch (std::exception& ex) {
        error_code_ = SERVER_UNEXPECTED_ERROR;
        error_msg_ = ex.what();
        SERVER_LOG_ERROR << error_msg_;
        return error_code_;
    }

    return SERVER_SUCCESS;
}

G
groot 已提交
538 539
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
GetTableRowCountTask::GetTableRowCountTask(const std::string& table_name, int64_t& row_count)
G
groot 已提交
540
: BaseTask(DDL_DML_TASK_GROUP),
G
groot 已提交
541 542 543 544 545 546 547 548 549 550
  table_name_(table_name),
  row_count_(row_count) {

}

BaseTaskPtr GetTableRowCountTask::Create(const std::string& table_name, int64_t& row_count) {
    return std::shared_ptr<BaseTask>(new GetTableRowCountTask(table_name, row_count));
}

ServerError GetTableRowCountTask::OnExecute() {
G
groot 已提交
551 552 553
    try {
        TimeRecorder rc("GetTableRowCountTask");

G
groot 已提交
554
        //step 1: check arguments
G
groot 已提交
555 556 557 558 559 560 561 562 563
        if (table_name_.empty()) {
            error_code_ = SERVER_INVALID_ARGUMENT;
            error_msg_ = "Table name cannot be empty";
            SERVER_LOG_ERROR << error_msg_;
            return error_code_;
        }

        //step 2: get row count
        uint64_t row_count = 0;
G
groot 已提交
564
        engine::Status stat = DBWrapper::DB()->GetTableRowCount(table_name_, row_count);
G
groot 已提交
565 566 567 568 569 570 571 572 573 574 575 576
        if (!stat.ok()) {
            error_code_ = SERVER_UNEXPECTED_ERROR;
            error_msg_ = "Engine failed: " + stat.ToString();
            SERVER_LOG_ERROR << error_msg_;
            return error_code_;
        }

        row_count_ = (int64_t) row_count;

        rc.Elapse("totally cost");

    } catch (std::exception& ex) {
G
groot 已提交
577
        error_code_ = SERVER_UNEXPECTED_ERROR;
G
groot 已提交
578
        error_msg_ = ex.what();
G
groot 已提交
579 580 581 582
        SERVER_LOG_ERROR << error_msg_;
        return error_code_;
    }

G
groot 已提交
583
    return SERVER_SUCCESS;
G
groot 已提交
584 585
}

G
groot 已提交
586 587 588 589 590 591 592 593 594 595 596 597 598 599
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
PingTask::PingTask(const std::string& cmd, std::string& result)
    : BaseTask(PING_TASK_GROUP),
      cmd_(cmd),
      result_(result) {

}

BaseTaskPtr PingTask::Create(const std::string& cmd, std::string& result) {
    return std::shared_ptr<BaseTask>(new PingTask(cmd, result));
}

ServerError PingTask::OnExecute() {
    if(cmd_ == "version") {
G
groot 已提交
600
        result_ = MILVUS_VERSION;
G
groot 已提交
601 602 603 604 605
    }

    return SERVER_SUCCESS;
}

G
groot 已提交
606 607 608
}
}
}