GrpcRequestTask.cpp 35.3 KB
Newer Older
K
kun yu 已提交
1
/*******************************************************************************
Y
Yu Kun 已提交
2 3 4 5
* Copyright 上海赜睿信息科技有限公司(Zilliz) - All Rights Reserved
* Unauthorized copying of this file, via any medium is strictly prohibited.
* Proprietary and confidential.
******************************************************************************/
Y
Yu Kun 已提交
6
#include "GrpcRequestTask.h"
K
kun yu 已提交
7
#include "../ServerConfig.h"
K
kun yu 已提交
8 9 10 11
#include "utils/CommonUtil.h"
#include "utils/Log.h"
#include "utils/TimeRecorder.h"
#include "utils/ValidationUtil.h"
K
kun yu 已提交
12
#include "../DBWrapper.h"
K
kun yu 已提交
13
#include "version.h"
Y
Yu Kun 已提交
14
#include "GrpcMilvusServer.h"
S
starlord 已提交
15
#include "db/Utils.h"
16
#include "scheduler/SchedInst.h"
K
kun yu 已提交
17

K
kun yu 已提交
18
#include "src/server/Server.h"
K
kun yu 已提交
19

S
starlord 已提交
20 21
#include <string.h>

K
kun yu 已提交
22 23 24
namespace zilliz {
namespace milvus {
namespace server {
Y
Yu Kun 已提交
25 26 27 28 29
namespace grpc {

static const char *DQL_TASK_GROUP = "dql";
static const char *DDL_DML_TASK_GROUP = "ddl_dml";
static const char *PING_TASK_GROUP = "ping";
K
kun yu 已提交
30 31 32 33 34 35 36 37 38 39 40 41 42

using DB_META = zilliz::milvus::engine::meta::Meta;
using DB_DATE = zilliz::milvus::engine::meta::DateT;

namespace {
    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},
                {3, engine::EngineType::FAISS_IVFSQ8},
        };

Y
Yu Kun 已提交
43
        if (map_type.find(type) == map_type.end()) {
K
kun yu 已提交
44 45 46 47 48 49 50 51
            return engine::EngineType::INVALID;
        }

        return map_type[type];
    }

    int IndexType(engine::EngineType type) {
        static std::map<engine::EngineType, int> map_type = {
Y
Yu Kun 已提交
52 53
                {engine::EngineType::INVALID,       0},
                {engine::EngineType::FAISS_IDMAP,   1},
K
kun yu 已提交
54
                {engine::EngineType::FAISS_IVFFLAT, 2},
Y
Yu Kun 已提交
55
                {engine::EngineType::FAISS_IVFSQ8,  3},
K
kun yu 已提交
56 57
        };

Y
Yu Kun 已提交
58
        if (map_type.find(type) == map_type.end()) {
K
kun yu 已提交
59 60 61 62 63 64
            return 0;
        }

        return map_type[type];
    }

K
kun yu 已提交
65
    constexpr long DAY_SECONDS = 24 * 60 * 60;
K
kun yu 已提交
66 67 68

    void
    ConvertTimeRangeToDBDates(const std::vector<::milvus::grpc::Range> &range_array,
Y
Yu Kun 已提交
69 70 71
                              std::vector<DB_DATE> &dates,
                              ServerError &error_code,
                              std::string &error_msg) {
K
kun yu 已提交
72
        dates.clear();
Y
Yu Kun 已提交
73
        for (auto &range : range_array) {
K
kun yu 已提交
74 75
            time_t tt_start, tt_end;
            tm tm_start, tm_end;
Y
Yu Kun 已提交
76
            if (!CommonUtil::TimeStrToTime(range.start_value(), tt_start, tm_start)) {
K
kun yu 已提交
77 78 79 80 81
                error_code = SERVER_INVALID_TIME_RANGE;
                error_msg = "Invalid time range: " + range.start_value();
                return;
            }

Y
Yu Kun 已提交
82
            if (!CommonUtil::TimeStrToTime(range.end_value(), tt_end, tm_end)) {
K
kun yu 已提交
83 84 85 86 87
                error_code = SERVER_INVALID_TIME_RANGE;
                error_msg = "Invalid time range: " + range.start_value();
                return;
            }

Y
Yu Kun 已提交
88 89 90
            long days = (tt_end > tt_start) ? (tt_end - tt_start) / DAY_SECONDS : (tt_start - tt_end) /
                                                                                  DAY_SECONDS;
            if (days == 0) {
K
kun yu 已提交
91 92
                error_code = SERVER_INVALID_TIME_RANGE;
                error_msg = "Invalid time range: " + range.start_value() + " to " + range.end_value();
Y
Yu Kun 已提交
93
                return;
K
kun yu 已提交
94 95
            }

96
            //range: [start_day, end_day)
Y
Yu Kun 已提交
97 98
            for (long i = 0; i < days; i++) {
                time_t tt_day = tt_start + DAY_SECONDS * i;
K
kun yu 已提交
99 100 101
                tm tm_day;
                CommonUtil::ConvertTime(tt_day, tm_day);

Y
Yu Kun 已提交
102 103
                long date = tm_day.tm_year * 10000 + tm_day.tm_mon * 100 +
                            tm_day.tm_mday;//according to db logic
K
kun yu 已提交
104 105 106 107 108 109 110
                dates.push_back(date);
            }
        }
    }
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
S
starlord 已提交
111
CreateTableTask::CreateTableTask(const ::milvus::grpc::TableSchema *schema)
Y
Yu Kun 已提交
112
        : GrpcBaseTask(DDL_DML_TASK_GROUP),
K
kun yu 已提交
113 114 115 116
          schema_(schema) {

}

Y
Yu Kun 已提交
117
BaseTaskPtr
S
starlord 已提交
118 119 120 121 122
CreateTableTask::Create(const ::milvus::grpc::TableSchema *schema) {
    if(schema == nullptr) {
        SERVER_LOG_ERROR << "grpc input is null!";
        return nullptr;
    }
Y
Yu Kun 已提交
123
    return std::shared_ptr<GrpcBaseTask>(new CreateTableTask(schema));
K
kun yu 已提交
124 125
}

Y
Yu Kun 已提交
126 127
ServerError
CreateTableTask::OnExecute() {
K
kun yu 已提交
128 129 130 131
    TimeRecorder rc("CreateTableTask");

    try {
        //step 1: check arguments
S
starlord 已提交
132
        ServerError res = ValidationUtil::ValidateTableName(schema_->table_name().table_name());
Y
Yu Kun 已提交
133
        if (res != SERVER_SUCCESS) {
S
starlord 已提交
134
            return SetError(res, "Invalid table name: " + schema_->table_name().table_name());
K
kun yu 已提交
135 136
        }

S
starlord 已提交
137
        res = ValidationUtil::ValidateTableDimension(schema_->dimension());
Y
Yu Kun 已提交
138
        if (res != SERVER_SUCCESS) {
S
starlord 已提交
139
            return SetError(res, "Invalid table dimension: " + std::to_string(schema_->dimension()));
K
kun yu 已提交
140 141
        }

S
starlord 已提交
142
        res = ValidationUtil::ValidateTableIndexFileSize(schema_->index_file_size());
143
        if(res != SERVER_SUCCESS) {
S
starlord 已提交
144
            return SetError(res, "Invalid index file size: " + std::to_string(schema_->index_file_size()));
145 146
        }

K
kun yu 已提交
147 148
        //step 2: construct table schema
        engine::meta::TableSchema table_info;
S
starlord 已提交
149 150 151
        table_info.table_id_ = schema_->table_name().table_name();
        table_info.dimension_ = (uint16_t) schema_->dimension();
        table_info.index_file_size_ = schema_->index_file_size();
K
kun yu 已提交
152 153 154

        //step 3: create table
        engine::Status stat = DBWrapper::DB()->CreateTable(table_info);
Y
Yu Kun 已提交
155
        if (!stat.ok()) {
K
kun yu 已提交
156
            //table could exist
157 158 159 160
            if(stat.IsAlreadyExist()) {
                return SetError(SERVER_INVALID_TABLE_NAME, stat.ToString());
            }
            return SetError(DB_META_TRANSACTION_FAILED, stat.ToString());
K
kun yu 已提交
161 162
        }

Y
Yu Kun 已提交
163
    } catch (std::exception &ex) {
K
kun yu 已提交
164 165 166
        return SetError(SERVER_UNEXPECTED_ERROR, ex.what());
    }

K
kun yu 已提交
167
    rc.ElapseFromBegin("totally cost");
K
kun yu 已提交
168 169 170 171 172

    return SERVER_SUCCESS;
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
S
starlord 已提交
173
DescribeTableTask::DescribeTableTask(const std::string &table_name, ::milvus::grpc::TableSchema *schema)
Y
Yu Kun 已提交
174
        : GrpcBaseTask(DDL_DML_TASK_GROUP),
K
kun yu 已提交
175 176 177 178
          table_name_(table_name),
          schema_(schema) {
}

Y
Yu Kun 已提交
179
BaseTaskPtr
S
starlord 已提交
180
DescribeTableTask::Create(const std::string &table_name, ::milvus::grpc::TableSchema *schema) {
Y
Yu Kun 已提交
181
    return std::shared_ptr<GrpcBaseTask>(new DescribeTableTask(table_name, schema));
K
kun yu 已提交
182 183
}

Y
Yu Kun 已提交
184 185
ServerError
DescribeTableTask::OnExecute() {
K
kun yu 已提交
186 187 188 189
    TimeRecorder rc("DescribeTableTask");

    try {
        //step 1: check arguments
K
kun yu 已提交
190
        ServerError res = ValidationUtil::ValidateTableName(table_name_);
Y
Yu Kun 已提交
191
        if (res != SERVER_SUCCESS) {
K
kun yu 已提交
192 193 194 195 196 197 198
            return SetError(res, "Invalid table name: " + table_name_);
        }

        //step 2: get table info
        engine::meta::TableSchema table_info;
        table_info.table_id_ = table_name_;
        engine::Status stat = DBWrapper::DB()->DescribeTable(table_info);
Y
Yu Kun 已提交
199
        if (!stat.ok()) {
200
            return SetError(DB_META_TRANSACTION_FAILED, stat.ToString());
K
kun yu 已提交
201 202
        }

S
starlord 已提交
203 204
        schema_->mutable_table_name()->set_table_name(table_info.table_id_);
        schema_->set_dimension(table_info.dimension_);
205
        schema_->set_index_file_size(table_info.index_file_size_);
K
kun yu 已提交
206

Y
Yu Kun 已提交
207
    } catch (std::exception &ex) {
K
kun yu 已提交
208 209 210
        return SetError(SERVER_UNEXPECTED_ERROR, ex.what());
    }

K
kun yu 已提交
211
    rc.ElapseFromBegin("totally cost");
K
kun yu 已提交
212 213 214 215 216

    return SERVER_SUCCESS;
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
S
starlord 已提交
217
CreateIndexTask::CreateIndexTask(const ::milvus::grpc::IndexParam *index_param)
Y
Yu Kun 已提交
218
        : GrpcBaseTask(DDL_DML_TASK_GROUP),
Y
Yu Kun 已提交
219
          index_param_(index_param) {
K
kun yu 已提交
220 221
}

Y
Yu Kun 已提交
222
BaseTaskPtr
S
starlord 已提交
223 224 225 226 227
CreateIndexTask::Create(const ::milvus::grpc::IndexParam *index_param) {
    if(index_param == nullptr) {
        SERVER_LOG_ERROR << "grpc input is null!";
        return nullptr;
    }
Y
Yu Kun 已提交
228
    return std::shared_ptr<GrpcBaseTask>(new CreateIndexTask(index_param));
K
kun yu 已提交
229 230
}

Y
Yu Kun 已提交
231
ServerError
Y
Yu Kun 已提交
232
CreateIndexTask::OnExecute() {
K
kun yu 已提交
233
    try {
Y
Yu Kun 已提交
234
        TimeRecorder rc("CreateIndexTask");
K
kun yu 已提交
235 236

        //step 1: check arguments
S
starlord 已提交
237
        std::string table_name_ = index_param_->table_name().table_name();
K
kun yu 已提交
238
        ServerError res = ValidationUtil::ValidateTableName(table_name_);
Y
Yu Kun 已提交
239
        if (res != SERVER_SUCCESS) {
K
kun yu 已提交
240 241 242 243 244
            return SetError(res, "Invalid table name: " + table_name_);
        }

        bool has_table = false;
        engine::Status stat = DBWrapper::DB()->HasTable(table_name_, has_table);
Y
Yu Kun 已提交
245
        if (!stat.ok()) {
246
            return SetError(DB_META_TRANSACTION_FAILED, stat.ToString());
K
kun yu 已提交
247 248
        }

Y
Yu Kun 已提交
249
        if (!has_table) {
K
kun yu 已提交
250 251 252
            return SetError(SERVER_TABLE_NOT_EXIST, "Table " + table_name_ + " not exists");
        }

S
starlord 已提交
253 254
        auto &grpc_index = index_param_->index();
        res = ValidationUtil::ValidateTableIndexType(grpc_index.index_type());
S
starlord 已提交
255
        if(res != SERVER_SUCCESS) {
S
starlord 已提交
256
            return SetError(res, "Invalid index type: " + std::to_string(grpc_index.index_type()));
S
starlord 已提交
257 258
        }

S
starlord 已提交
259
        res = ValidationUtil::ValidateTableIndexNlist(grpc_index.nlist());
S
starlord 已提交
260
        if(res != SERVER_SUCCESS) {
S
starlord 已提交
261
            return SetError(res, "Invalid index nlist: " + std::to_string(grpc_index.nlist()));
S
starlord 已提交
262 263
        }

S
starlord 已提交
264
        res = ValidationUtil::ValidateTableIndexMetricType(grpc_index.metric_type());
S
starlord 已提交
265
        if(res != SERVER_SUCCESS) {
S
starlord 已提交
266
            return SetError(res, "Invalid index metric type: " + std::to_string(grpc_index.metric_type()));
S
starlord 已提交
267 268
        }

K
kun yu 已提交
269
        //step 2: check table existence
270
        engine::TableIndex index;
S
starlord 已提交
271 272 273
        index.engine_type_ = grpc_index.index_type();
        index.nlist_ = grpc_index.nlist();
        index.metric_type_ = grpc_index.metric_type();
274
        stat = DBWrapper::DB()->CreateIndex(table_name_, index);
Y
Yu Kun 已提交
275
        if (!stat.ok()) {
276
            return SetError(SERVER_BUILD_INDEX_ERROR, stat.ToString());
K
kun yu 已提交
277 278
        }

K
kun yu 已提交
279
        rc.ElapseFromBegin("totally cost");
Y
Yu Kun 已提交
280
    } catch (std::exception &ex) {
K
kun yu 已提交
281 282 283 284 285 286 287
        return SetError(SERVER_UNEXPECTED_ERROR, ex.what());
    }

    return SERVER_SUCCESS;
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Y
Yu Kun 已提交
288
HasTableTask::HasTableTask(const std::string &table_name, bool &has_table)
Y
Yu Kun 已提交
289
        : GrpcBaseTask(DDL_DML_TASK_GROUP),
K
kun yu 已提交
290 291 292 293 294
          table_name_(table_name),
          has_table_(has_table) {

}

Y
Yu Kun 已提交
295
BaseTaskPtr
Y
Yu Kun 已提交
296
HasTableTask::Create(const std::string &table_name, bool &has_table) {
Y
Yu Kun 已提交
297
    return std::shared_ptr<GrpcBaseTask>(new HasTableTask(table_name, has_table));
K
kun yu 已提交
298 299
}

Y
Yu Kun 已提交
300 301
ServerError
HasTableTask::OnExecute() {
K
kun yu 已提交
302 303 304 305
    try {
        TimeRecorder rc("HasTableTask");

        //step 1: check arguments
K
kun yu 已提交
306
        ServerError res = ValidationUtil::ValidateTableName(table_name_);
Y
Yu Kun 已提交
307
        if (res != SERVER_SUCCESS) {
K
kun yu 已提交
308 309 310 311 312
            return SetError(res, "Invalid table name: " + table_name_);
        }

        //step 2: check table existence
        engine::Status stat = DBWrapper::DB()->HasTable(table_name_, has_table_);
Y
Yu Kun 已提交
313
        if (!stat.ok()) {
314
            return SetError(DB_META_TRANSACTION_FAILED, stat.ToString());
K
kun yu 已提交
315 316
        }

K
kun yu 已提交
317
        rc.ElapseFromBegin("totally cost");
Y
Yu Kun 已提交
318
    } catch (std::exception &ex) {
K
kun yu 已提交
319 320 321 322 323 324 325
        return SetError(SERVER_UNEXPECTED_ERROR, ex.what());
    }

    return SERVER_SUCCESS;
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Y
Yu Kun 已提交
326
DropTableTask::DropTableTask(const std::string &table_name)
Y
Yu Kun 已提交
327
        : GrpcBaseTask(DDL_DML_TASK_GROUP),
K
kun yu 已提交
328 329 330 331
          table_name_(table_name) {

}

Y
Yu Kun 已提交
332
BaseTaskPtr
Y
Yu Kun 已提交
333
DropTableTask::Create(const std::string &table_name) {
Y
Yu Kun 已提交
334
    return std::shared_ptr<GrpcBaseTask>(new DropTableTask(table_name));
K
kun yu 已提交
335 336
}

Y
Yu Kun 已提交
337 338
ServerError
DropTableTask::OnExecute() {
K
kun yu 已提交
339 340 341 342
    try {
        TimeRecorder rc("DropTableTask");

        //step 1: check arguments
K
kun yu 已提交
343
        ServerError res = ValidationUtil::ValidateTableName(table_name_);
Y
Yu Kun 已提交
344
        if (res != SERVER_SUCCESS) {
K
kun yu 已提交
345 346 347 348 349 350 351
            return SetError(res, "Invalid table name: " + table_name_);
        }

        //step 2: check table existence
        engine::meta::TableSchema table_info;
        table_info.table_id_ = table_name_;
        engine::Status stat = DBWrapper::DB()->DescribeTable(table_info);
Y
Yu Kun 已提交
352 353
        if (!stat.ok()) {
            if (stat.IsNotFound()) {
K
kun yu 已提交
354 355
                return SetError(SERVER_TABLE_NOT_EXIST, "Table " + table_name_ + " not exists");
            } else {
356
                return SetError(DB_META_TRANSACTION_FAILED, stat.ToString());
K
kun yu 已提交
357 358 359
            }
        }

K
kun yu 已提交
360
        rc.ElapseFromBegin("check validation");
K
kun yu 已提交
361 362 363 364

        //step 3: Drop table
        std::vector<DB_DATE> dates;
        stat = DBWrapper::DB()->DeleteTable(table_name_, dates);
Y
Yu Kun 已提交
365
        if (!stat.ok()) {
366
            return SetError(DB_META_TRANSACTION_FAILED, stat.ToString());
K
kun yu 已提交
367 368
        }

K
kun yu 已提交
369
        rc.ElapseFromBegin("total cost");
Y
Yu Kun 已提交
370
    } catch (std::exception &ex) {
K
kun yu 已提交
371 372 373 374 375 376 377
        return SetError(SERVER_UNEXPECTED_ERROR, ex.what());
    }

    return SERVER_SUCCESS;
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
S
starlord 已提交
378
ShowTablesTask::ShowTablesTask(::grpc::ServerWriter<::milvus::grpc::TableName> *writer)
Y
Yu Kun 已提交
379
        : GrpcBaseTask(DDL_DML_TASK_GROUP),
K
kun yu 已提交
380 381 382 383
          writer_(writer) {

}

Y
Yu Kun 已提交
384
BaseTaskPtr
S
starlord 已提交
385
ShowTablesTask::Create(::grpc::ServerWriter<::milvus::grpc::TableName> *writer) {
Y
Yu Kun 已提交
386
    return std::shared_ptr<GrpcBaseTask>(new ShowTablesTask(writer));
K
kun yu 已提交
387 388
}

Y
Yu Kun 已提交
389 390
ServerError
ShowTablesTask::OnExecute() {
K
kun yu 已提交
391 392
    std::vector<engine::meta::TableSchema> schema_array;
    engine::Status stat = DBWrapper::DB()->AllTables(schema_array);
Y
Yu Kun 已提交
393
    if (!stat.ok()) {
394
        return SetError(DB_META_TRANSACTION_FAILED, stat.ToString());
K
kun yu 已提交
395 396
    }

Y
Yu Kun 已提交
397
    for (auto &schema : schema_array) {
K
kun yu 已提交
398 399
        ::milvus::grpc::TableName tableName;
        tableName.set_table_name(schema.table_id_);
S
starlord 已提交
400
        if (!writer_->Write(tableName)) {
K
kun yu 已提交
401 402
            return SetError(SERVER_WRITE_ERROR, "Write table name failed!");
        }
K
kun yu 已提交
403 404 405 406 407
    }
    return SERVER_SUCCESS;
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
S
starlord 已提交
408 409 410 411 412 413
InsertTask::InsertTask(const ::milvus::grpc::InsertParam *insert_param,
                       ::milvus::grpc::VectorIds *record_ids)
    : GrpcBaseTask(DDL_DML_TASK_GROUP),
      insert_param_(insert_param),
      record_ids_(record_ids) {
    record_ids_->Clear();
K
kun yu 已提交
414 415
}

Y
Yu Kun 已提交
416
BaseTaskPtr
S
starlord 已提交
417 418 419 420 421 422
InsertTask::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;
    }
Y
Yu Kun 已提交
423
    return std::shared_ptr<GrpcBaseTask>(new InsertTask(insert_param, record_ids));
K
kun yu 已提交
424 425
}

Y
Yu Kun 已提交
426
ServerError
Y
Yu Kun 已提交
427
InsertTask::OnExecute() {
K
kun yu 已提交
428 429 430 431
    try {
        TimeRecorder rc("InsertVectorTask");

        //step 1: check arguments
S
starlord 已提交
432
        ServerError res = ValidationUtil::ValidateTableName(insert_param_->table_name());
Y
Yu Kun 已提交
433
        if (res != SERVER_SUCCESS) {
S
starlord 已提交
434
            return SetError(res, "Invalid table name: " + insert_param_->table_name());
K
kun yu 已提交
435
        }
S
starlord 已提交
436
        if (insert_param_->row_record_array().empty()) {
K
kun yu 已提交
437 438 439
            return SetError(SERVER_INVALID_ROWRECORD_ARRAY, "Row record array is empty");
        }

S
starlord 已提交
440 441
        if (!record_ids_->vector_id_array().empty()) {
            if (record_ids_->vector_id_array().size() != insert_param_->row_record_array_size()) {
Y
Yu Kun 已提交
442 443 444 445 446
                return SetError(SERVER_ILLEGAL_VECTOR_ID,
                        "Size of vector ids is not equal to row record array size");
            }
        }

K
kun yu 已提交
447 448
        //step 2: check table existence
        engine::meta::TableSchema table_info;
S
starlord 已提交
449
        table_info.table_id_ = insert_param_->table_name();
K
kun yu 已提交
450
        engine::Status stat = DBWrapper::DB()->DescribeTable(table_info);
Y
Yu Kun 已提交
451 452 453
        if (!stat.ok()) {
            if (stat.IsNotFound()) {
                return SetError(SERVER_TABLE_NOT_EXIST,
S
starlord 已提交
454
                                "Table " + insert_param_->table_name() + " not exists");
K
kun yu 已提交
455
            } else {
456
                return SetError(DB_META_TRANSACTION_FAILED, stat.ToString());
K
kun yu 已提交
457 458 459
            }
        }

S
starlord 已提交
460 461 462 463
        //all user provide id, or all internal id
        uint64_t row_count = 0;
        DBWrapper::DB()->GetTableRowCount(table_info.table_id_, row_count);
        bool empty_table = (row_count == 0);
S
starlord 已提交
464
        bool user_provide_ids = !insert_param_->row_id_array().empty();
S
starlord 已提交
465 466 467 468 469 470 471 472 473 474 475 476
        if(!empty_table) {
            //user already provided id before, all insert action require user id
            if(engine::utils::UserDefinedId(table_info.flag_) && !user_provide_ids) {
                return SetError(SERVER_INVALID_ARGUMENT, "Table vector ids are user defined, please provide id for this batch");
            }

            //user didn't provided id before, no need to provide user id
            if(!engine::utils::UserDefinedId(table_info.flag_) && user_provide_ids) {
                return SetError(SERVER_INVALID_ARGUMENT, "Table vector ids are auto generated, no need to provide id for this batch");
            }
        }

K
kun yu 已提交
477 478 479 480 481 482 483
        rc.RecordSection("check validation");

#ifdef MILVUS_ENABLE_PROFILING
        std::string fname = "/tmp/insert_" + std::to_string(this->record_array_.size()) +
                            "_" + GetCurrTimeStr() + ".profiling";
        ProfilerStart(fname.c_str());
#endif
K
kun yu 已提交
484 485

        //step 3: prepare float data
S
starlord 已提交
486
        std::vector<float> vec_f(insert_param_->row_record_array_size() * table_info.dimension_, 0);
K
kun yu 已提交
487

K
kun yu 已提交
488
        // TODO: change to one dimension array in protobuf or use multiple-thread to copy the data
S
starlord 已提交
489 490
        for (size_t i = 0; i < insert_param_->row_record_array_size(); i++) {
            if (insert_param_->row_record_array(i).vector_data().empty()) {
Y
Yu Kun 已提交
491 492
                return SetError(SERVER_INVALID_ROWRECORD_ARRAY, "Row record float array is empty");
            }
S
starlord 已提交
493
            uint64_t vec_dim = insert_param_->row_record_array(i).vector_data().size();
Y
Yu Kun 已提交
494 495 496 497 498 499
            if (vec_dim != table_info.dimension_) {
                ServerError error_code = SERVER_INVALID_VECTOR_DIMENSION;
                std::string error_msg = "Invalid rowrecord dimension: " + std::to_string(vec_dim)
                                        + " vs. table dimension:" +
                                        std::to_string(table_info.dimension_);
                return SetError(error_code, error_msg);
K
kun yu 已提交
500
            }
Y
yudong.cai 已提交
501
            memcpy(&vec_f[i * table_info.dimension_],
S
starlord 已提交
502
                   insert_param_->row_record_array(i).vector_data().data(),
Y
Yu Kun 已提交
503
                   table_info.dimension_ * sizeof(float));
K
kun yu 已提交
504 505
        }

K
kun yu 已提交
506
        rc.ElapseFromBegin("prepare vectors data");
K
kun yu 已提交
507 508

        //step 4: insert vectors
S
starlord 已提交
509 510 511 512
        auto vec_count = (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();
S
starlord 已提交
513
            int64_t* target_data = vec_ids.data();
S
starlord 已提交
514
            memcpy(target_data, src_data, (size_t)(sizeof(int64_t)*insert_param_->row_id_array_size()));
Y
Yu Kun 已提交
515
        }
K
kun yu 已提交
516

S
starlord 已提交
517
        stat = DBWrapper::DB()->InsertVectors(insert_param_->table_name(), vec_count, vec_f.data(), vec_ids);
K
kun yu 已提交
518
        rc.ElapseFromBegin("add vectors to engine");
Y
Yu Kun 已提交
519
        if (!stat.ok()) {
K
kun yu 已提交
520 521
            return SetError(SERVER_CACHE_ERROR, "Cache error: " + stat.ToString());
        }
K
kun yu 已提交
522
        for (int64_t id : vec_ids) {
S
starlord 已提交
523
            record_ids_->add_vector_id_array(id);
K
kun yu 已提交
524 525
        }

S
starlord 已提交
526
        auto ids_size = record_ids_->vector_id_array_size();
Y
Yu Kun 已提交
527
        if (ids_size != vec_count) {
K
kun yu 已提交
528
            std::string msg = "Add " + std::to_string(vec_count) + " vectors but only return "
K
kun yu 已提交
529
                              + std::to_string(ids_size) + " id";
K
kun yu 已提交
530 531 532
            return SetError(SERVER_ILLEGAL_VECTOR_ID, msg);
        }

S
starlord 已提交
533 534
        //step 5: update table flag
        if(empty_table && user_provide_ids) {
S
starlord 已提交
535
            stat = DBWrapper::DB()->UpdateTableFlag(insert_param_->table_name(),
S
starlord 已提交
536 537 538
                                                    table_info.flag_ | engine::meta::FLAG_MASK_USERID);
        }

K
kun yu 已提交
539 540 541 542 543 544
#ifdef MILVUS_ENABLE_PROFILING
        ProfilerStop();
#endif

        rc.RecordSection("add vectors to engine");
        rc.ElapseFromBegin("total cost");
K
kun yu 已提交
545

Y
Yu Kun 已提交
546
    } catch (std::exception &ex) {
K
kun yu 已提交
547 548 549 550 551 552 553
        return SetError(SERVER_UNEXPECTED_ERROR, ex.what());
    }

    return SERVER_SUCCESS;
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
S
starlord 已提交
554
SearchTask::SearchTask(const ::milvus::grpc::SearchParam *search_vector_infos,
Y
Yu Kun 已提交
555
                                   const std::vector<std::string> &file_id_array,
S
starlord 已提交
556
                                   ::grpc::ServerWriter<::milvus::grpc::TopKQueryResult> *writer)
Y
Yu Kun 已提交
557
        : GrpcBaseTask(DQL_TASK_GROUP),
Y
Yu Kun 已提交
558
          search_param_(search_vector_infos),
K
kun yu 已提交
559 560 561 562 563
          file_id_array_(file_id_array),
          writer_(writer) {

}

Y
Yu Kun 已提交
564
BaseTaskPtr
S
starlord 已提交
565 566 567 568 569 570 571
SearchTask::Create(const ::milvus::grpc::SearchParam *search_vector_infos,
                   const std::vector<std::string> &file_id_array,
                   ::grpc::ServerWriter<::milvus::grpc::TopKQueryResult> *writer) {
    if(search_vector_infos == nullptr) {
        SERVER_LOG_ERROR << "grpc input is null!";
        return nullptr;
    }
Y
Yu Kun 已提交
572
    return std::shared_ptr<GrpcBaseTask>(new SearchTask(search_vector_infos, file_id_array,
Y
Yu Kun 已提交
573
                                                              writer));
K
kun yu 已提交
574 575
}

Y
Yu Kun 已提交
576
ServerError
Y
Yu Kun 已提交
577
SearchTask::OnExecute() {
K
kun yu 已提交
578
    try {
Y
Yu Kun 已提交
579
        TimeRecorder rc("SearchTask");
K
kun yu 已提交
580

581
        //step 1: check table name
S
starlord 已提交
582
        std::string table_name_ = search_param_->table_name();
K
kun yu 已提交
583
        ServerError res = ValidationUtil::ValidateTableName(table_name_);
Y
Yu Kun 已提交
584
        if (res != SERVER_SUCCESS) {
K
kun yu 已提交
585 586 587 588 589 590 591
            return SetError(res, "Invalid table name: " + table_name_);
        }

        //step 2: check table existence
        engine::meta::TableSchema table_info;
        table_info.table_id_ = table_name_;
        engine::Status stat = DBWrapper::DB()->DescribeTable(table_info);
Y
Yu Kun 已提交
592 593
        if (!stat.ok()) {
            if (stat.IsNotFound()) {
K
kun yu 已提交
594 595
                return SetError(SERVER_TABLE_NOT_EXIST, "Table " + table_name_ + " not exists");
            } else {
596
                return SetError(DB_META_TRANSACTION_FAILED, stat.ToString());
K
kun yu 已提交
597 598 599
            }
        }

600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617
        //step 3: check search parameter
        int64_t top_k = search_param_->topk();
        res = ValidationUtil::ValidateSearchTopk(top_k, table_info);
        if (res != SERVER_SUCCESS) {
            return SetError(res, "Invalid topk: " + std::to_string(top_k));
        }

        int64_t nprobe = search_param_->nprobe();
        res = ValidationUtil::ValidateSearchNprobe(nprobe, table_info);
        if (res != SERVER_SUCCESS) {
            return SetError(res, "Invalid nprobe: " + std::to_string(nprobe));
        }

        if (search_param_->query_record_array().empty()) {
            return SetError(SERVER_INVALID_ROWRECORD_ARRAY, "Row record array is empty");
        }

        //step 4: check date range, and convert to db dates
K
kun yu 已提交
618 619 620 621 622
        std::vector<DB_DATE> dates;
        ServerError error_code = SERVER_SUCCESS;
        std::string error_msg;

        std::vector<::milvus::grpc::Range> range_array;
S
starlord 已提交
623 624
        for (size_t i = 0; i < search_param_->query_range_array_size(); i++) {
            range_array.emplace_back(search_param_->query_range_array(i));
K
kun yu 已提交
625 626
        }
        ConvertTimeRangeToDBDates(range_array, dates, error_code, error_msg);
Y
Yu Kun 已提交
627
        if (error_code != SERVER_SUCCESS) {
K
kun yu 已提交
628 629 630
            return SetError(error_code, error_msg);
        }

K
kun yu 已提交
631 632 633 634 635 636 637 638
        double span_check = rc.RecordSection("check validation");

#ifdef MILVUS_ENABLE_PROFILING
        std::string fname = "/tmp/search_nq_" + std::to_string(this->record_array_.size()) +
                            "_top_" + std::to_string(this->top_k_) + "_" +
                            GetCurrTimeStr() + ".profiling";
        ProfilerStart(fname.c_str());
#endif
K
kun yu 已提交
639

640
        //step 5: prepare float data
S
starlord 已提交
641
        auto record_array_size = search_param_->query_record_array_size();
K
kun yu 已提交
642 643
        std::vector<float> vec_f(record_array_size * table_info.dimension_, 0);
        for (size_t i = 0; i < record_array_size; i++) {
S
starlord 已提交
644
            if (search_param_->query_record_array(i).vector_data().empty()) {
645
                return SetError(SERVER_INVALID_ROWRECORD_ARRAY, "Query record float array is empty");
K
kun yu 已提交
646
            }
S
starlord 已提交
647
            uint64_t query_vec_dim = search_param_->query_record_array(i).vector_data().size();
648 649 650 651 652 653 654 655
            if (query_vec_dim != table_info.dimension_) {
                ServerError error_code = SERVER_INVALID_VECTOR_DIMENSION;
                std::string error_msg = "Invalid rowrecord dimension: " + std::to_string(query_vec_dim)
                                        + " vs. table dimension:" + std::to_string(table_info.dimension_);
                return SetError(error_code, error_msg);
            }

            memcpy(&vec_f[i * table_info.dimension_],
S
starlord 已提交
656
                   search_param_->query_record_array(i).vector_data().data(),
657
                   table_info.dimension_ * sizeof(float));
K
kun yu 已提交
658
        }
K
kun yu 已提交
659
        rc.ElapseFromBegin("prepare vector data");
K
kun yu 已提交
660

661
        //step 6: search vectors
K
kun yu 已提交
662
        engine::QueryResults results;
S
starlord 已提交
663
        auto record_count = (uint64_t) search_param_->query_record_array().size();
K
kun yu 已提交
664

Y
Yu Kun 已提交
665
        if (file_id_array_.empty()) {
666
            stat = DBWrapper::DB()->Query(table_name_, (size_t) top_k, record_count, nprobe, vec_f.data(),
Y
Yu Kun 已提交
667
                                          dates, results);
K
kun yu 已提交
668
        } else {
669
            stat = DBWrapper::DB()->Query(table_name_, file_id_array_, (size_t) top_k,
Y
Yu Kun 已提交
670
                                          record_count, nprobe, vec_f.data(), dates, results);
K
kun yu 已提交
671 672
        }

K
kun yu 已提交
673
        rc.ElapseFromBegin("search vectors from engine");
Y
Yu Kun 已提交
674
        if (!stat.ok()) {
675
            return SetError(DB_META_TRANSACTION_FAILED, stat.ToString());
K
kun yu 已提交
676 677
        }

Y
Yu Kun 已提交
678
        if (results.empty()) {
K
kun yu 已提交
679 680 681
            return SERVER_SUCCESS; //empty table
        }

Y
Yu Kun 已提交
682
        if (results.size() != record_count) {
K
kun yu 已提交
683 684 685 686 687
            std::string msg = "Search " + std::to_string(record_count) + " vectors but only return "
                              + std::to_string(results.size()) + " results";
            return SetError(SERVER_ILLEGAL_SEARCH_RESULT, msg);
        }

K
kun yu 已提交
688
        rc.ElapseFromBegin("do search");
K
kun yu 已提交
689

690
        //step 7: construct result array
Y
Yu Kun 已提交
691 692
        for (uint64_t i = 0; i < record_count; i++) {
            auto &result = results[i];
S
starlord 已提交
693
            const auto &record = search_param_->query_record_array(i);
K
kun yu 已提交
694
            ::milvus::grpc::TopKQueryResult grpc_topk_result;
Y
Yu Kun 已提交
695
            for (auto &pair : result) {
K
kun yu 已提交
696 697 698 699
                ::milvus::grpc::QueryResult *grpc_result = grpc_topk_result.add_query_result_arrays();
                grpc_result->set_id(pair.first);
                grpc_result->set_distance(pair.second);
            }
S
starlord 已提交
700
            if (!writer_->Write(grpc_topk_result)) {
K
kun yu 已提交
701 702
                return SetError(SERVER_WRITE_ERROR, "Write topk result failed!");
            }
K
kun yu 已提交
703
        }
K
kun yu 已提交
704 705 706 707 708

#ifdef MILVUS_ENABLE_PROFILING
        ProfilerStop();
#endif

709
        //step 8: print time cost percent
K
kun yu 已提交
710 711 712
        double span_result = rc.RecordSection("construct result");
        rc.ElapseFromBegin("totally cost");

K
kun yu 已提交
713

Y
Yu Kun 已提交
714
    } catch (std::exception &ex) {
K
kun yu 已提交
715 716 717 718 719 720 721
        return SetError(SERVER_UNEXPECTED_ERROR, ex.what());
    }

    return SERVER_SUCCESS;
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Y
Yu Kun 已提交
722
CountTableTask::CountTableTask(const std::string &table_name, int64_t &row_count)
Y
Yu Kun 已提交
723
        : GrpcBaseTask(DDL_DML_TASK_GROUP),
K
kun yu 已提交
724 725 726 727 728
          table_name_(table_name),
          row_count_(row_count) {

}

Y
Yu Kun 已提交
729
BaseTaskPtr
Y
Yu Kun 已提交
730 731
CountTableTask::Create(const std::string &table_name, int64_t &row_count) {
    return std::shared_ptr<GrpcBaseTask>(new CountTableTask(table_name, row_count));
K
kun yu 已提交
732 733
}

Y
Yu Kun 已提交
734
ServerError
Y
Yu Kun 已提交
735
CountTableTask::OnExecute() {
K
kun yu 已提交
736 737 738 739 740
    try {
        TimeRecorder rc("GetTableRowCountTask");

        //step 1: check arguments
        ServerError res = SERVER_SUCCESS;
K
kun yu 已提交
741
        res = ValidationUtil::ValidateTableName(table_name_);
Y
Yu Kun 已提交
742
        if (res != SERVER_SUCCESS) {
K
kun yu 已提交
743 744 745 746 747 748 749
            return SetError(res, "Invalid table name: " + table_name_);
        }

        //step 2: get row count
        uint64_t row_count = 0;
        engine::Status stat = DBWrapper::DB()->GetTableRowCount(table_name_, row_count);
        if (!stat.ok()) {
750
            return SetError(DB_META_TRANSACTION_FAILED, stat.ToString());
K
kun yu 已提交
751 752 753 754
        }

        row_count_ = (int64_t) row_count;

K
kun yu 已提交
755
        rc.ElapseFromBegin("total cost");
K
kun yu 已提交
756

Y
Yu Kun 已提交
757
    } catch (std::exception &ex) {
K
kun yu 已提交
758 759 760 761 762 763 764
        return SetError(SERVER_UNEXPECTED_ERROR, ex.what());
    }

    return SERVER_SUCCESS;
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Y
Yu Kun 已提交
765
CmdTask::CmdTask(const std::string &cmd, std::string &result)
Y
Yu Kun 已提交
766
        : GrpcBaseTask(PING_TASK_GROUP),
K
kun yu 已提交
767 768 769 770 771
          cmd_(cmd),
          result_(result) {

}

Y
Yu Kun 已提交
772
BaseTaskPtr
Y
Yu Kun 已提交
773 774
CmdTask::Create(const std::string &cmd, std::string &result) {
    return std::shared_ptr<GrpcBaseTask>(new CmdTask(cmd, result));
K
kun yu 已提交
775 776
}

Y
Yu Kun 已提交
777
ServerError
Y
Yu Kun 已提交
778
CmdTask::OnExecute() {
Y
Yu Kun 已提交
779
    if (cmd_ == "version") {
K
kun yu 已提交
780
        result_ = MILVUS_VERSION;
781 782 783 784
    } else if (cmd_ == "tasktable") {
        result_ = engine::ResMgrInst::GetInstance()->DumpTaskTables();
    }
    else {
K
kun yu 已提交
785
        result_ = "OK";
K
kun yu 已提交
786 787 788 789 790
    }

    return SERVER_SUCCESS;
}

791
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
S
starlord 已提交
792
DeleteByRangeTask::DeleteByRangeTask(const ::milvus::grpc::DeleteByRangeParam *delete_by_range_param)
793 794 795 796 797
        : GrpcBaseTask(DDL_DML_TASK_GROUP),
          delete_by_range_param_(delete_by_range_param){
}

BaseTaskPtr
S
starlord 已提交
798 799 800 801 802
DeleteByRangeTask::Create(const ::milvus::grpc::DeleteByRangeParam *delete_by_range_param) {
    if(delete_by_range_param == nullptr) {
        SERVER_LOG_ERROR << "grpc input is null!";
        return nullptr;
    }
803 804 805 806 807 808 809 810 811
    return std::shared_ptr<GrpcBaseTask>(new DeleteByRangeTask(delete_by_range_param));
}

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

        //step 1: check arguments
S
starlord 已提交
812
        std::string table_name = delete_by_range_param_->table_name();
813 814 815 816 817 818 819 820 821 822 823 824 825
        ServerError res = ValidationUtil::ValidateTableName(table_name);
        if (res != SERVER_SUCCESS) {
            return SetError(res, "Invalid table name: " + table_name);
        }

        //step 2: check table existence
        engine::meta::TableSchema table_info;
        table_info.table_id_ = table_name;
        engine::Status stat = DBWrapper::DB()->DescribeTable(table_info);
        if (!stat.ok()) {
            if (stat.IsNotFound()) {
                return SetError(SERVER_TABLE_NOT_EXIST, "Table " + table_name + " not exists");
            } else {
826
                return SetError(DB_META_TRANSACTION_FAILED, stat.ToString());
827 828 829 830 831 832 833 834 835 836 837
            }
        }

        rc.ElapseFromBegin("check validation");

        //step 3: check date range, and convert to db dates
        std::vector<DB_DATE> dates;
        ServerError error_code = SERVER_SUCCESS;
        std::string error_msg;

        std::vector<::milvus::grpc::Range> range_array;
S
starlord 已提交
838
        range_array.emplace_back(delete_by_range_param_->range());
839 840 841 842 843 844 845 846 847 848 849 850 851
        ConvertTimeRangeToDBDates(range_array, dates, error_code, error_msg);
        if (error_code != SERVER_SUCCESS) {
            return SetError(error_code, error_msg);
        }

#ifdef MILVUS_ENABLE_PROFILING
        std::string fname = "/tmp/search_nq_" + std::to_string(this->record_array_.size()) +
                            "_top_" + std::to_string(this->top_k_) + "_" +
                            GetCurrTimeStr() + ".profiling";
        ProfilerStart(fname.c_str());
#endif
        engine::Status status = DBWrapper::DB()->DeleteTable(table_name, dates);
        if (!status.ok()) {
852
            return SetError(DB_META_TRANSACTION_FAILED, stat.ToString());
853 854 855 856 857 858 859 860 861
        }

    } catch (std::exception &ex) {
        return SetError(SERVER_UNEXPECTED_ERROR, ex.what());
    }
    
    return SERVER_SUCCESS;
}

Y
Yu Kun 已提交
862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
PreloadTableTask::PreloadTableTask(const std::string &table_name)
        : GrpcBaseTask(DDL_DML_TASK_GROUP),
          table_name_(table_name) {

}

BaseTaskPtr
PreloadTableTask::Create(const std::string &table_name){
    return std::shared_ptr<GrpcBaseTask>(new PreloadTableTask(table_name));
}

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

        //step 1: check arguments
        ServerError res = ValidationUtil::ValidateTableName(table_name_);
        if (res != SERVER_SUCCESS) {
            return SetError(res, "Invalid table name: " + table_name_);
        }

        //step 2: check table existence
        engine::Status stat = DBWrapper::DB()->PreloadTable(table_name_);
        if (!stat.ok()) {
888
            return SetError(DB_META_TRANSACTION_FAILED, stat.ToString());
Y
Yu Kun 已提交
889 890 891 892 893 894 895 896 897 898
        }

        rc.ElapseFromBegin("totally cost");
    } catch (std::exception &ex) {
        return SetError(SERVER_UNEXPECTED_ERROR, ex.what());
    }

    return SERVER_SUCCESS;
}

899 900
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
DescribeIndexTask::DescribeIndexTask(const std::string &table_name,
S
starlord 已提交
901
                                     ::milvus::grpc::IndexParam *index_param)
902 903 904 905 906 907 908 909
    : GrpcBaseTask(DDL_DML_TASK_GROUP),
      table_name_(table_name),
      index_param_(index_param) {

}

BaseTaskPtr
DescribeIndexTask::Create(const std::string &table_name,
S
starlord 已提交
910
                          ::milvus::grpc::IndexParam *index_param){
911 912 913 914 915 916 917
    return std::shared_ptr<GrpcBaseTask>(new DescribeIndexTask(table_name, index_param));
}

ServerError
DescribeIndexTask::OnExecute() {
    try {
        TimeRecorder rc("DescribeIndexTask");
Y
Yu Kun 已提交
918

919 920 921 922 923 924 925 926 927 928
        //step 1: check arguments
        ServerError res = ValidationUtil::ValidateTableName(table_name_);
        if (res != SERVER_SUCCESS) {
            return SetError(res, "Invalid table name: " + table_name_);
        }

        //step 2: check table existence
        engine::TableIndex index;
        engine::Status stat = DBWrapper::DB()->DescribeIndex(table_name_, index);
        if (!stat.ok()) {
929
            return SetError(DB_META_TRANSACTION_FAILED, stat.ToString());
930 931
        }

S
starlord 已提交
932 933 934 935
        index_param_->mutable_table_name()->set_table_name(table_name_);
        index_param_->mutable_index()->set_index_type(index.engine_type_);
        index_param_->mutable_index()->set_nlist(index.nlist_);
        index_param_->mutable_index()->set_metric_type(index.metric_type_);
936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970

        rc.ElapseFromBegin("totally cost");
    } catch (std::exception &ex) {
        return SetError(SERVER_UNEXPECTED_ERROR, ex.what());
    }

    return SERVER_SUCCESS;
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
DropIndexTask::DropIndexTask(const std::string &table_name)
    : GrpcBaseTask(DDL_DML_TASK_GROUP),
      table_name_(table_name) {

}

BaseTaskPtr
DropIndexTask::Create(const std::string &table_name){
    return std::shared_ptr<GrpcBaseTask>(new DropIndexTask(table_name));
}

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

        //step 1: check arguments
        ServerError res = ValidationUtil::ValidateTableName(table_name_);
        if (res != SERVER_SUCCESS) {
            return SetError(res, "Invalid table name: " + table_name_);
        }

        //step 2: check table existence
        engine::Status stat = DBWrapper::DB()->DropIndex(table_name_);
        if (!stat.ok()) {
971
            return SetError(DB_META_TRANSACTION_FAILED, stat.ToString());
972 973 974 975 976 977 978 979 980
        }

        rc.ElapseFromBegin("totally cost");
    } catch (std::exception &ex) {
        return SetError(SERVER_UNEXPECTED_ERROR, ex.what());
    }

    return SERVER_SUCCESS;
}
Y
Yu Kun 已提交
981

Y
Yu Kun 已提交
982
}
K
kun yu 已提交
983 984 985
}
}
}