diff --git a/fielddb/field_db.cpp b/fielddb/field_db.cpp index 93c433c..38e390a 100644 --- a/fielddb/field_db.cpp +++ b/fielddb/field_db.cpp @@ -229,6 +229,10 @@ Status FieldDB::CreateIndexOnField(const std::string& field_name) { std::string Field = field_name; iCreateReq req(&Field,&mutex_); HandleRequest(req); + //如果已经存在索引,那么可以直接返回 + if(req.Existed) { + return req.s; + } WriteBatch KVBatch,IndexBatch,MetaBatch; req.ConstructBatch(KVBatch, IndexBatch, MetaBatch, this); indexDB_->Write(WriteOptions(), &IndexBatch); @@ -257,6 +261,10 @@ Status FieldDB::DeleteIndex(const std::string &field_name) { std::string Field = field_name; iDeleteReq req(&Field,&mutex_); HandleRequest(req); + //如果已经被删除或者不存在,那么可以直接返回 + if(req.Deleted) { + return req.s; + } WriteBatch KVBatch,IndexBatch,MetaBatch; req.ConstructBatch(KVBatch, IndexBatch, MetaBatch, this); indexDB_->Write(WriteOptions(), &IndexBatch); diff --git a/fielddb/request.cpp b/fielddb/request.cpp index 36d82cf..f601a28 100644 --- a/fielddb/request.cpp +++ b/fielddb/request.cpp @@ -104,6 +104,7 @@ void iCreateReq::Prepare(FieldDB *DB) { if(istatus == FieldDB::Exist) { //如果已经完成建立索引,则返回成功 done = true; + Existed = true; s = Status::OK(); } else { //如果正在创建或删除,那么进行等待 @@ -131,4 +132,25 @@ void iCreateReq::Finalize(FieldDB *DB) { } +/*******iDeleteReq*******/ +void iDeleteReq::Prepare(FieldDB *DB) { + DB->index_mu.AssertHeld(); + if(DB->index_.count(*Field) == 0) { + done = true; + Deleted = true; + s = Status::OK(); + return ; + } +} + +void iDeleteReq::ConstructBatch(WriteBatch &KVBatch,WriteBatch &IndexBatch, + WriteBatch &MetaBatch,fielddb::FieldDB *DB) +{ + +} + +void iDeleteReq::Finalize(FieldDB *DB) { + +} + } \ No newline at end of file diff --git a/fielddb/request.h b/fielddb/request.h index 731158d..3346c1f 100644 --- a/fielddb/request.h +++ b/fielddb/request.h @@ -87,13 +87,14 @@ public: class iCreateReq : public Request { public: iCreateReq(std::string *Field,port::Mutex *mu): - Field(Field),Request(iCreateReq_t, mu) { }; + Field(Field),Request(iCreateReq_t, mu),Existed(false) { }; void ConstructBatch(WriteBatch &KVBatch,WriteBatch &IndexBatch, WriteBatch &MetaBatch,fielddb::FieldDB *DB) override; void Prepare(FieldDB *DB) override; void Finalize(FieldDB *DB) override; + bool Existed; std::string *Field; std::deque pending_list; }; @@ -102,13 +103,14 @@ public: class iDeleteReq : public Request { public: iDeleteReq(std::string *Field,port::Mutex *mu): - Field(Field),Request(iDeleteReq_t, mu) { }; + Field(Field),Request(iDeleteReq_t, mu),Deleted(false) { }; void ConstructBatch(WriteBatch &KVBatch,WriteBatch &IndexBatch, WriteBatch &MetaBatch,fielddb::FieldDB *DB) override; void Prepare(FieldDB *DB) override; void Finalize(FieldDB *DB) override; - + + bool Deleted; std::string *Field; std::deque pending_list; };