diff --git a/cpp/src/db/db_impl.cpp b/cpp/src/db/db_impl.cpp index 3d030d9e2a..3fdbdf01e0 100644 --- a/cpp/src/db/db_impl.cpp +++ b/cpp/src/db/db_impl.cpp @@ -6,7 +6,9 @@ namespace vecengine { DBImpl::DBImpl(const Options& options_, const std::string& name_) : _dbname(name_), _env(options_.env), - _options(options_) { + _options(options_), + _bg_work_finish_signal(_mutex), + _bg_compaction_scheduled(false) { } Status DBImpl::add_group(const GroupOptions& options_, @@ -17,6 +19,35 @@ Status DBImpl::add_group(const GroupOptions& options_, } +void DBImpl::try_schedule_compaction() { + if (_bg_compaction_scheduled) return; + if (!_bg_error.ok()) return; + + _bg_compaction_scheduled = true; + _env->schedule(&DBImpl::BGWork, this); +} + +void DBImpl::BGWork(void* db_) { + reinterpret_cast(db_)->background_call(); +} + +void DBImpl::background_call() { + std::lock_guard lock(_mutex); + assert(_bg_compaction_scheduled); + + if (!_bg_error.ok()) return; + + background_compaction(); +} + +void DBImpl::background_compaction() { + +} + +void DBImpl::compact_memory() { + +} + /* * DB */ diff --git a/cpp/src/db/db_impl.h b/cpp/src/db/db_impl.h index 0d7d2a3f10..de50cda91a 100644 --- a/cpp/src/db/db_impl.h +++ b/cpp/src/db/db_impl.h @@ -1,6 +1,8 @@ #ifndef VECENGINE_DB_IMPL_H_ #define VECENGINE_DB_IMPL_H_ +#include +#include #include "db.h" namespace vecengine { @@ -15,9 +17,15 @@ public: const std::string& group_id_, std::string& gid_) override; + void try_schedule_compaction(); + virtual ~DBImpl(); private: + static void BGWork(void* db); + void background_call(); + void background_compaction(); + Status meta_add_group(const std::string& group_id_); Status meta_add_group_file(const std::string& group_id_); @@ -25,6 +33,11 @@ private: Env* const _env; const Options _options; + std::mutex _mutex; + std::condition_variable _bg_work_finish_signal; + bool _bg_compaction_scheduled; + Status _bg_error; + }; // DBImpl } // namespace vecengine