diff --git a/conanfile.py b/conanfile.py index c86cbf553..7d930b3af 100644 --- a/conanfile.py +++ b/conanfile.py @@ -9,7 +9,7 @@ class HomestoreConan(ConanFile): name = "homestore" - version = "6.6.17" + version = "6.6.18" homepage = "https://github.com/eBay/Homestore" description = "HomeStore Storage Engine" diff --git a/src/include/homestore/replication/repl_dev.h b/src/include/homestore/replication/repl_dev.h index d05be3fde..b5cff2f25 100644 --- a/src/include/homestore/replication/repl_dev.h +++ b/src/include/homestore/replication/repl_dev.h @@ -477,6 +477,9 @@ class ReplDev { /// @return true if ready, false otherwise virtual bool is_ready_for_traffic() const = 0; + /// @brief Purge all unnecessary stuff on this repl dev. + virtual void purge() = 0; + virtual void attach_listener(shared< ReplDevListener > listener) { m_listener = std::move(listener); } virtual void detach_listener() { diff --git a/src/lib/replication/log_store/home_raft_log_store.cpp b/src/lib/replication/log_store/home_raft_log_store.cpp index 55cd690e4..be7039059 100644 --- a/src/lib/replication/log_store/home_raft_log_store.cpp +++ b/src/lib/replication/log_store/home_raft_log_store.cpp @@ -380,6 +380,13 @@ ulong HomeRaftLogStore::last_durable_index() { return to_repl_lsn(m_last_durable_lsn); } +void HomeRaftLogStore::purge_all_logs() { + auto last_lsn = m_log_store->get_contiguous_issued_seq_num(m_last_durable_lsn); + REPL_STORE_LOG(INFO, "Store={} LogDev={}: Purging all logs in the log store, last_lsn={}", + m_logstore_id, m_logdev_id, last_lsn); + m_log_store->truncate(last_lsn, false /* in_memory_truncate_only */); +} + void HomeRaftLogStore::wait_for_log_store_ready() { m_log_store_future.wait(); } void HomeRaftLogStore::set_last_durable_lsn(repl_lsn_t lsn) { m_last_durable_lsn = to_store_lsn(lsn); } diff --git a/src/lib/replication/log_store/home_raft_log_store.h b/src/lib/replication/log_store/home_raft_log_store.h index d2c0fd57b..7fb96a5d4 100644 --- a/src/lib/replication/log_store/home_raft_log_store.h +++ b/src/lib/replication/log_store/home_raft_log_store.h @@ -215,6 +215,12 @@ class HomeRaftLogStore : public nuraft::log_store { void truncate(uint32_t num_reserved_cnt, repl_lsn_t compact_lsn); #endif + /** + * Purge all logs in the log store + * It is a dangerous operation and is only used in baseline resync now (purge all logs and restore by snapshot). + */ + void purge_all_logs(); + void wait_for_log_store_ready(); void set_last_durable_lsn(repl_lsn_t lsn); diff --git a/src/lib/replication/repl_dev/raft_repl_dev.h b/src/lib/replication/repl_dev/raft_repl_dev.h index 619da7843..4c838cb44 100644 --- a/src/lib/replication/repl_dev/raft_repl_dev.h +++ b/src/lib/replication/repl_dev/raft_repl_dev.h @@ -198,6 +198,10 @@ class RaftReplDev : public ReplDev, if (!ready) { RD_LOGD("Not yet ready for traffic, committed to {} but gate is {}", committed_lsn, gate); } return ready; } + void purge() override { + // purge existing logs in log store + m_data_journal->purge_all_logs(); + } //////////////// Accessor/shortcut methods /////////////////////// nuraft_mesg::repl_service_ctx* group_msg_service(); diff --git a/src/lib/replication/repl_dev/solo_repl_dev.h b/src/lib/replication/repl_dev/solo_repl_dev.h index e5f33fb63..f252dd209 100644 --- a/src/lib/replication/repl_dev/solo_repl_dev.h +++ b/src/lib/replication/repl_dev/solo_repl_dev.h @@ -54,6 +54,7 @@ class SoloReplDev : public ReplDev { return std::vector< peer_info >{peer_info{.id_ = m_group_id, .replication_idx_ = 0, .last_succ_resp_us_ = 0}}; } bool is_ready_for_traffic() const override { return true; } + void purge() override {} uuid_t group_id() const override { return m_group_id; }