From 857f1993a9f6044636a680c048a7b4ccf8c2f3a2 Mon Sep 17 00:00:00 2001 From: ninsmiracle Date: Tue, 31 Oct 2023 11:38:12 +0800 Subject: [PATCH 1/5] fix manual comapct progress --- src/server/meta_store.cpp | 35 +++++++++++++++++++ src/server/meta_store.h | 9 +++++ src/server/pegasus_manual_compact_service.cpp | 7 +++- src/server/pegasus_manual_compact_service.h | 2 ++ src/server/pegasus_server_impl.cpp | 27 +++++++++++--- src/server/pegasus_server_impl.h | 4 ++- 6 files changed, 77 insertions(+), 7 deletions(-) diff --git a/src/server/meta_store.cpp b/src/server/meta_store.cpp index 3ba5187a07..78015c245b 100644 --- a/src/server/meta_store.cpp +++ b/src/server/meta_store.cpp @@ -34,6 +34,9 @@ const std::string meta_store::DATA_VERSION = "pegasus_data_version"; const std::string meta_store::LAST_FLUSHED_DECREE = "pegasus_last_flushed_decree"; const std::string meta_store::LAST_MANUAL_COMPACT_FINISH_TIME = "pegasus_last_manual_compact_finish_time"; +const std::string meta_store::LAST_MANUAL_COMPACT_USED_TIME = + "pegasus_last_manual_compact_used_time"; + meta_store::meta_store(pegasus_server_impl *server, rocksdb::DB *db, @@ -44,6 +47,38 @@ meta_store::meta_store(pegasus_server_impl *server, _wt_opts.disableWAL = true; } +dsn::error_code meta_store::get_last_manual_compact_used_time(uint64_t *ts) const +{ + LOG_AND_RETURN_NOT_OK(ERROR_PREFIX, + get_value_from_meta_cf(false, LAST_MANUAL_COMPACT_USED_TIME, ts), + "get_value_from_meta_cf failed"); + return dsn::ERR_OK; +} + +bool meta_store::check_key_exist_in_meta_store(const std::string meta_cf_key) const +{ + uint64_t value = 0; + auto ec = get_value_from_meta_cf( + false, meta_cf_key, &value); + + if(::dsn::ERR_OBJECT_NOT_FOUND == ec){ + LOG_INFO_PREFIX("check {} exist in meta store NOT_FOUND",meta_cf_key); + } + + if(::dsn::ERR_LOCAL_APP_FAILURE == ec){ + LOG_INFO_PREFIX("check {} exist in meta store APP_FAILURE",meta_cf_key); + } + + return ::dsn::ERR_OK == ec ; +} + +void meta_store::set_last_manual_compact_used_time(uint64_t last_manual_compact_used_time) const +{ + CHECK_EQ_PREFIX( + ::dsn::ERR_OK, + set_value_to_meta_cf(LAST_MANUAL_COMPACT_USED_TIME, last_manual_compact_used_time)); +} + dsn::error_code meta_store::get_last_flushed_decree(uint64_t *decree) const { LOG_AND_RETURN_NOT_OK(ERROR_PREFIX, diff --git a/src/server/meta_store.h b/src/server/meta_store.h index 247702657e..4645d10392 100644 --- a/src/server/meta_store.h +++ b/src/server/meta_store.h @@ -50,6 +50,7 @@ class meta_store : public dsn::replication::replica_base rocksdb::ColumnFamilyHandle *meta_cf) const; dsn::error_code get_data_version(uint32_t *version) const; dsn::error_code get_last_manual_compact_finish_time(uint64_t *ts) const; + dsn::error_code get_last_manual_compact_used_time(uint64_t *ts) const; std::string get_usage_scenario() const; void set_last_flushed_decree(uint64_t decree) const; @@ -57,6 +58,13 @@ class meta_store : public dsn::replication::replica_base void set_last_manual_compact_finish_time(uint64_t last_manual_compact_finish_time) const; void set_usage_scenario(const std::string &usage_scenario) const; + void set_last_manual_compact_used_time(uint64_t last_manual_compact_used_time) const; + bool check_key_exist_in_meta_store(std::string meta_cf_key) const; + bool check_last_used_time_exist_in_meta_store() const{ + return check_key_exist_in_meta_store(LAST_MANUAL_COMPACT_USED_TIME); + }; + + private: ::dsn::error_code get_value_from_meta_cf(bool read_flushed_data, const std::string &key, uint64_t *value) const; @@ -85,6 +93,7 @@ class meta_store : public dsn::replication::replica_base static const std::string DATA_VERSION; static const std::string LAST_FLUSHED_DECREE; static const std::string LAST_MANUAL_COMPACT_FINISH_TIME; + static const std::string LAST_MANUAL_COMPACT_USED_TIME; rocksdb::DB *_db; rocksdb::ColumnFamilyHandle *_meta_cf; diff --git a/src/server/pegasus_manual_compact_service.cpp b/src/server/pegasus_manual_compact_service.cpp index 643e3e9978..40b8144151 100644 --- a/src/server/pegasus_manual_compact_service.cpp +++ b/src/server/pegasus_manual_compact_service.cpp @@ -76,6 +76,11 @@ void pegasus_manual_compact_service::init_last_finish_time_ms(uint64_t last_fini _manual_compact_last_finish_time_ms.store(last_finish_time_ms); } +void pegasus_manual_compact_service::init_last_used_time_ms(uint64_t last_used_time_ms) +{ + _manual_compact_last_time_used_ms.store(last_used_time_ms); +} + void pegasus_manual_compact_service::start_manual_compact_if_needed( const std::map &envs) { @@ -305,7 +310,7 @@ void pegasus_manual_compact_service::manual_compact(const rocksdb::CompactRangeO } uint64_t start = begin_manual_compact(); - uint64_t finish = _app->do_manual_compact(options); + uint64_t finish = _app->do_manual_compact(options,start); end_manual_compact(start, finish); _pfc_manual_compact_running_count->decrement(); diff --git a/src/server/pegasus_manual_compact_service.h b/src/server/pegasus_manual_compact_service.h index c47bbb5ec5..b9ce9f2443 100644 --- a/src/server/pegasus_manual_compact_service.h +++ b/src/server/pegasus_manual_compact_service.h @@ -44,6 +44,8 @@ class pegasus_manual_compact_service : public dsn::replication::replica_base void init_last_finish_time_ms(uint64_t last_finish_time_ms); + void init_last_used_time_ms(uint64_t last_used_time_ms); + void start_manual_compact_if_needed(const std::map &envs); // Called by pegasus_manual_compaction.sh diff --git a/src/server/pegasus_server_impl.cpp b/src/server/pegasus_server_impl.cpp index 32d6b0e3ce..4cc82bfed5 100644 --- a/src/server/pegasus_server_impl.cpp +++ b/src/server/pegasus_server_impl.cpp @@ -1727,14 +1727,22 @@ dsn::error_code pegasus_server_impl::start(int argc, char **argv) dsn::ERR_LOCAL_APP_FAILURE, "open app failed, unsupported data version {}", _pegasus_data_version); - // update last manual compact finish timestamp + uint64_t last_manual_compact_used_time = 0; + LOG_AND_RETURN_NOT_OK( + ERROR_PREFIX, + _meta_store->get_last_manual_compact_used_time(&last_manual_compact_used_time), + "last_manual_compact_used_time failed"); + + // update last manual compact finish & used timestamp _manual_compact_svc.init_last_finish_time_ms(last_manual_compact_finish_time); + _manual_compact_svc.init_last_used_time_ms(last_manual_compact_used_time); cleanup.cancel(); } else { // Write initial meta data to meta CF and flush when create new DB. _meta_store->set_data_version(PEGASUS_DATA_VERSION_MAX); _meta_store->set_last_flushed_decree(0); _meta_store->set_last_manual_compact_finish_time(0); + _meta_store->set_last_manual_compact_used_time(0); flush_all_family_columns(true); } @@ -3320,7 +3328,7 @@ ::dsn::error_code pegasus_server_impl::check_column_families(const std::string & return ::dsn::ERR_OK; } -uint64_t pegasus_server_impl::do_manual_compact(const rocksdb::CompactRangeOptions &options) +uint64_t pegasus_server_impl::do_manual_compact(const rocksdb::CompactRangeOptions &options,uint64_t start) { // wait flush before compact to make all data compacted. uint64_t start_time = dsn_now_ms(); @@ -3341,6 +3349,11 @@ uint64_t pegasus_server_impl::do_manual_compact(const rocksdb::CompactRangeOptio status.ToString(), end_time - start_time); _meta_store->set_last_manual_compact_finish_time(end_time); + uint64_t last_manual_compact_finish_time = 0; + CHECK_OK_PREFIX( + _meta_store->get_last_manual_compact_finish_time(&last_manual_compact_finish_time)); + after_manual_compact(start_time,last_manual_compact_finish_time); + // generate new checkpoint and remove old checkpoints, in order to release storage asap if (!release_storage_after_manual_compact()) { // it is possible that the new checkpoint is not generated, if there was no data @@ -3361,12 +3374,16 @@ uint64_t pegasus_server_impl::do_manual_compact(const rocksdb::CompactRangeOptio // update rocksdb statistics immediately update_replica_rocksdb_statistics(); - uint64_t last_manual_compact_finish_time = 0; - CHECK_OK_PREFIX( - _meta_store->get_last_manual_compact_finish_time(&last_manual_compact_finish_time)); return last_manual_compact_finish_time; } +void pegasus_server_impl::after_manual_compact(std::uint64_t starttime,uint64_t endtime){ + //store last manual compact used time to meta store for learn situation + uint64_t used_time = endtime - starttime; + _meta_store->set_last_manual_compact_used_time(used_time); + flush_all_family_columns(true); +} + bool pegasus_server_impl::release_storage_after_manual_compact() { int64_t old_last_durable = last_durable_decree(); diff --git a/src/server/pegasus_server_impl.h b/src/server/pegasus_server_impl.h index 02c6421c7a..d9290de94f 100644 --- a/src/server/pegasus_server_impl.h +++ b/src/server/pegasus_server_impl.h @@ -349,7 +349,9 @@ class pegasus_server_impl : public pegasus_read_service std::string compression_type_to_str(rocksdb::CompressionType type); // return finish time recorded in rocksdb - uint64_t do_manual_compact(const rocksdb::CompactRangeOptions &options); + uint64_t do_manual_compact(const rocksdb::CompactRangeOptions &options,uint64_t start); + + void after_manual_compact(uint64_t starttime,uint64_t endtime); // generate new checkpoint and remove old checkpoints, in order to release storage asap // return true if release succeed (new checkpointed generated). From d481587ac26c739bc1be05a27ae962c854c3e096 Mon Sep 17 00:00:00 2001 From: guoningshen Date: Tue, 31 Oct 2023 11:42:54 +0800 Subject: [PATCH 2/5] format code --- src/server/meta_store.cpp | 14 ++++++-------- src/server/meta_store.h | 4 ++-- src/server/pegasus_manual_compact_service.cpp | 2 +- src/server/pegasus_server_impl.cpp | 10 ++++++---- src/server/pegasus_server_impl.h | 4 ++-- 5 files changed, 17 insertions(+), 17 deletions(-) diff --git a/src/server/meta_store.cpp b/src/server/meta_store.cpp index 78015c245b..7776f59101 100644 --- a/src/server/meta_store.cpp +++ b/src/server/meta_store.cpp @@ -37,7 +37,6 @@ const std::string meta_store::LAST_MANUAL_COMPACT_FINISH_TIME = const std::string meta_store::LAST_MANUAL_COMPACT_USED_TIME = "pegasus_last_manual_compact_used_time"; - meta_store::meta_store(pegasus_server_impl *server, rocksdb::DB *db, rocksdb::ColumnFamilyHandle *meta_cf) @@ -58,18 +57,17 @@ dsn::error_code meta_store::get_last_manual_compact_used_time(uint64_t *ts) cons bool meta_store::check_key_exist_in_meta_store(const std::string meta_cf_key) const { uint64_t value = 0; - auto ec = get_value_from_meta_cf( - false, meta_cf_key, &value); + auto ec = get_value_from_meta_cf(false, meta_cf_key, &value); - if(::dsn::ERR_OBJECT_NOT_FOUND == ec){ - LOG_INFO_PREFIX("check {} exist in meta store NOT_FOUND",meta_cf_key); + if (::dsn::ERR_OBJECT_NOT_FOUND == ec) { + LOG_INFO_PREFIX("check {} exist in meta store NOT_FOUND", meta_cf_key); } - if(::dsn::ERR_LOCAL_APP_FAILURE == ec){ - LOG_INFO_PREFIX("check {} exist in meta store APP_FAILURE",meta_cf_key); + if (::dsn::ERR_LOCAL_APP_FAILURE == ec) { + LOG_INFO_PREFIX("check {} exist in meta store APP_FAILURE", meta_cf_key); } - return ::dsn::ERR_OK == ec ; + return ::dsn::ERR_OK == ec; } void meta_store::set_last_manual_compact_used_time(uint64_t last_manual_compact_used_time) const diff --git a/src/server/meta_store.h b/src/server/meta_store.h index 4645d10392..c3c8563a07 100644 --- a/src/server/meta_store.h +++ b/src/server/meta_store.h @@ -60,11 +60,11 @@ class meta_store : public dsn::replication::replica_base void set_last_manual_compact_used_time(uint64_t last_manual_compact_used_time) const; bool check_key_exist_in_meta_store(std::string meta_cf_key) const; - bool check_last_used_time_exist_in_meta_store() const{ + bool check_last_used_time_exist_in_meta_store() const + { return check_key_exist_in_meta_store(LAST_MANUAL_COMPACT_USED_TIME); }; - private: ::dsn::error_code get_value_from_meta_cf(bool read_flushed_data, const std::string &key, uint64_t *value) const; diff --git a/src/server/pegasus_manual_compact_service.cpp b/src/server/pegasus_manual_compact_service.cpp index 40b8144151..fccf29fa53 100644 --- a/src/server/pegasus_manual_compact_service.cpp +++ b/src/server/pegasus_manual_compact_service.cpp @@ -310,7 +310,7 @@ void pegasus_manual_compact_service::manual_compact(const rocksdb::CompactRangeO } uint64_t start = begin_manual_compact(); - uint64_t finish = _app->do_manual_compact(options,start); + uint64_t finish = _app->do_manual_compact(options, start); end_manual_compact(start, finish); _pfc_manual_compact_running_count->decrement(); diff --git a/src/server/pegasus_server_impl.cpp b/src/server/pegasus_server_impl.cpp index 4cc82bfed5..34095ff957 100644 --- a/src/server/pegasus_server_impl.cpp +++ b/src/server/pegasus_server_impl.cpp @@ -3328,7 +3328,8 @@ ::dsn::error_code pegasus_server_impl::check_column_families(const std::string & return ::dsn::ERR_OK; } -uint64_t pegasus_server_impl::do_manual_compact(const rocksdb::CompactRangeOptions &options,uint64_t start) +uint64_t pegasus_server_impl::do_manual_compact(const rocksdb::CompactRangeOptions &options, + uint64_t start) { // wait flush before compact to make all data compacted. uint64_t start_time = dsn_now_ms(); @@ -3352,7 +3353,7 @@ uint64_t pegasus_server_impl::do_manual_compact(const rocksdb::CompactRangeOptio uint64_t last_manual_compact_finish_time = 0; CHECK_OK_PREFIX( _meta_store->get_last_manual_compact_finish_time(&last_manual_compact_finish_time)); - after_manual_compact(start_time,last_manual_compact_finish_time); + after_manual_compact(start_time, last_manual_compact_finish_time); // generate new checkpoint and remove old checkpoints, in order to release storage asap if (!release_storage_after_manual_compact()) { @@ -3377,8 +3378,9 @@ uint64_t pegasus_server_impl::do_manual_compact(const rocksdb::CompactRangeOptio return last_manual_compact_finish_time; } -void pegasus_server_impl::after_manual_compact(std::uint64_t starttime,uint64_t endtime){ - //store last manual compact used time to meta store for learn situation +void pegasus_server_impl::after_manual_compact(std::uint64_t starttime, uint64_t endtime) +{ + // store last manual compact used time to meta store for learn situation uint64_t used_time = endtime - starttime; _meta_store->set_last_manual_compact_used_time(used_time); flush_all_family_columns(true); diff --git a/src/server/pegasus_server_impl.h b/src/server/pegasus_server_impl.h index d9290de94f..0db9538d4f 100644 --- a/src/server/pegasus_server_impl.h +++ b/src/server/pegasus_server_impl.h @@ -349,9 +349,9 @@ class pegasus_server_impl : public pegasus_read_service std::string compression_type_to_str(rocksdb::CompressionType type); // return finish time recorded in rocksdb - uint64_t do_manual_compact(const rocksdb::CompactRangeOptions &options,uint64_t start); + uint64_t do_manual_compact(const rocksdb::CompactRangeOptions &options, uint64_t start); - void after_manual_compact(uint64_t starttime,uint64_t endtime); + void after_manual_compact(uint64_t starttime, uint64_t endtime); // generate new checkpoint and remove old checkpoints, in order to release storage asap // return true if release succeed (new checkpointed generated). From b1ddc6180ae41814946a02476b97fdae88401025 Mon Sep 17 00:00:00 2001 From: ninsmiracle Date: Tue, 31 Oct 2023 15:25:41 +0800 Subject: [PATCH 3/5] remove check_meta_cf --- src/server/meta_store.cpp | 16 ---------------- src/server/meta_store.h | 5 ----- 2 files changed, 21 deletions(-) diff --git a/src/server/meta_store.cpp b/src/server/meta_store.cpp index 7776f59101..c5c589f722 100644 --- a/src/server/meta_store.cpp +++ b/src/server/meta_store.cpp @@ -54,22 +54,6 @@ dsn::error_code meta_store::get_last_manual_compact_used_time(uint64_t *ts) cons return dsn::ERR_OK; } -bool meta_store::check_key_exist_in_meta_store(const std::string meta_cf_key) const -{ - uint64_t value = 0; - auto ec = get_value_from_meta_cf(false, meta_cf_key, &value); - - if (::dsn::ERR_OBJECT_NOT_FOUND == ec) { - LOG_INFO_PREFIX("check {} exist in meta store NOT_FOUND", meta_cf_key); - } - - if (::dsn::ERR_LOCAL_APP_FAILURE == ec) { - LOG_INFO_PREFIX("check {} exist in meta store APP_FAILURE", meta_cf_key); - } - - return ::dsn::ERR_OK == ec; -} - void meta_store::set_last_manual_compact_used_time(uint64_t last_manual_compact_used_time) const { CHECK_EQ_PREFIX( diff --git a/src/server/meta_store.h b/src/server/meta_store.h index c3c8563a07..3e4ccc1545 100644 --- a/src/server/meta_store.h +++ b/src/server/meta_store.h @@ -59,11 +59,6 @@ class meta_store : public dsn::replication::replica_base void set_usage_scenario(const std::string &usage_scenario) const; void set_last_manual_compact_used_time(uint64_t last_manual_compact_used_time) const; - bool check_key_exist_in_meta_store(std::string meta_cf_key) const; - bool check_last_used_time_exist_in_meta_store() const - { - return check_key_exist_in_meta_store(LAST_MANUAL_COMPACT_USED_TIME); - }; private: ::dsn::error_code From 322514b9ede575f4a9a182af8683b4e7dee15042 Mon Sep 17 00:00:00 2001 From: ninsmiracle Date: Thu, 21 Mar 2024 20:07:56 +0800 Subject: [PATCH 4/5] format --- src/base/meta_store.cpp | 1 - src/base/meta_store.h | 1 - 2 files changed, 2 deletions(-) diff --git a/src/base/meta_store.cpp b/src/base/meta_store.cpp index abfccfc77f..2b5e4721ca 100644 --- a/src/base/meta_store.cpp +++ b/src/base/meta_store.cpp @@ -41,7 +41,6 @@ const std::string meta_store::ROCKSDB_ENV_USAGE_SCENARIO_NORMAL = "normal"; const std::string meta_store::ROCKSDB_ENV_USAGE_SCENARIO_PREFER_WRITE = "prefer_write"; const std::string meta_store::ROCKSDB_ENV_USAGE_SCENARIO_BULK_LOAD = "bulk_load"; - meta_store::meta_store(const char *log_prefix, rocksdb::DB *db, rocksdb::ColumnFamilyHandle *meta_cf) diff --git a/src/base/meta_store.h b/src/base/meta_store.h index aace22e527..c92256cb4a 100644 --- a/src/base/meta_store.h +++ b/src/base/meta_store.h @@ -101,7 +101,6 @@ class meta_store static const std::string ROCKSDB_ENV_USAGE_SCENARIO_PREFER_WRITE; static const std::string ROCKSDB_ENV_USAGE_SCENARIO_BULK_LOAD; - const std::string _log_prefix; rocksdb::DB *_db; rocksdb::ColumnFamilyHandle *_meta_cf; From 1e3f78de4747485a7ede70137caf1de3a58de4c2 Mon Sep 17 00:00:00 2001 From: ninsmiracle <110282526+ninsmiracle@users.noreply.github.com> Date: Tue, 2 Apr 2024 15:39:40 +0800 Subject: [PATCH 5/5] Update src/server/pegasus_server_impl.cpp Co-authored-by: Yingchun Lai --- src/server/pegasus_server_impl.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/server/pegasus_server_impl.cpp b/src/server/pegasus_server_impl.cpp index 42a8ba9bcf..97e2e9aee9 100644 --- a/src/server/pegasus_server_impl.cpp +++ b/src/server/pegasus_server_impl.cpp @@ -1762,7 +1762,7 @@ dsn::error_code pegasus_server_impl::start(int argc, char **argv) LOG_AND_RETURN_NOT_OK( ERROR_PREFIX, _meta_store->get_last_manual_compact_used_time(&last_manual_compact_used_time), - "last_manual_compact_used_time failed"); + "get_last_manual_compact_used_time failed"); // update last manual compact finish & used timestamp _manual_compact_svc.init_last_finish_time_ms(last_manual_compact_finish_time);