diff --git a/fielddb/field_db.cpp b/fielddb/field_db.cpp index f836556..a5cda44 100644 --- a/fielddb/field_db.cpp +++ b/fielddb/field_db.cpp @@ -382,6 +382,17 @@ void FieldDB::ReleaseSnapshot(const Snapshot *snapshot) { kvDB_->ReleaseSnapshot(snapshot); } +const XSnapshot * FieldDB::GetXSnapshot() { + SnapshotReq req(&mutex_); + HandleRequest(req, WriteOptions()); + return req.xSnapshot; +} + +void FieldDB::ReleaseXSnapshot(const XSnapshot *xsnapshot) { + kvDB_->ReleaseSnapshot(xsnapshot->kv_snapshot); + indexDB_->ReleaseSnapshot(xsnapshot->index_snapshot); +} + bool FieldDB::GetProperty(const Slice &property, std::string *value) { return kvDB_->GetProperty(property, value) | indexDB_->GetProperty(property, value); } diff --git a/fielddb/field_db.h b/fielddb/field_db.h index 2b7f0d9..e74abfc 100644 --- a/fielddb/field_db.h +++ b/fielddb/field_db.h @@ -35,6 +35,7 @@ public: friend class iDeleteReq; friend class DeleteReq; friend class BatchReq; + friend class SnapshotReq; //用的时候必须FieldDB *db = new FieldDB()再open,不能像之前一样DB *db FieldDB() : indexDB_(nullptr), kvDB_(nullptr), metaDB_(nullptr) {}; @@ -60,6 +61,9 @@ public: //返回当前数据库中索引状态,用来测试,不过也可以作为一个功能? IndexStatus GetIndexStatus(const std::string &fieldName); + const XSnapshot* GetXSnapshot(); + void ReleaseXSnapshot(const XSnapshot* xsnapshot); + static Status OpenFieldDB(Options& options,const std::string& name,FieldDB** dbptr); private: diff --git a/fielddb/request.cpp b/fielddb/request.cpp index ea4987e..35fa89e 100644 --- a/fielddb/request.cpp +++ b/fielddb/request.cpp @@ -432,5 +432,18 @@ void BatchReq::ConstructBatch(WriteBatch &KVBatch,WriteBatch &IndexBatch, //DB->construct_BatchReq_elapsed += DB->env_->NowMicros() - start_; } +void SnapshotReq::Prepare(FieldDB *DB) { + DB->index_mu.AssertHeld(); + for(auto [_,pair] : DB->index_) { + auto [status,req] = pair; + if(status == Creating || status == Deleting) { + req->PendReq(this); + return; + } + } + xSnapshot = new XSnapshot(DB->kvDB_->GetSnapshot(),DB->indexDB_->GetSnapshot()); + done = true; +} + } // namespace fielddb \ No newline at end of file diff --git a/fielddb/request.h b/fielddb/request.h index 8bfc23a..d3b062e 100644 --- a/fielddb/request.h +++ b/fielddb/request.h @@ -1,5 +1,6 @@ #include <deque> #include <string> +#include "leveldb/db.h" #include "leveldb/slice.h" #include "leveldb/status.h" #include "leveldb/write_batch.h" @@ -164,6 +165,25 @@ public: // std::deque<FieldArray> fa_buf; }; +class SnapshotReq; + +class XSnapshot { +friend class SnapshotReq; +public: + XSnapshot(const Snapshot *kv,const Snapshot *index) + : kv_snapshot(kv), index_snapshot(index) {} + + const leveldb::Snapshot *kv_snapshot; + const leveldb::Snapshot *index_snapshot; +}; + +class SnapshotReq : public Request { +public: + SnapshotReq(port::Mutex *mu):Request(iCreateReq_t, mu) { }; + void Prepare(FieldDB *DB); + XSnapshot *xSnapshot; +}; + } #endif \ No newline at end of file