From 3c2ed49de98cd2fa4c1c8921e3db8f86aa8748f0 Mon Sep 17 00:00:00 2001 From: penglaiyxy Date: Thu, 17 May 2018 18:39:51 +0800 Subject: [PATCH] mon:Change monitor compact command to run asynchronously In monitor message dispatch code, while one command is executing , it must have the dispatch lock. So indeed all command are executing synchronously. If one command is executing for long time, others command must wait.So change the monitor compact command to execute asynchronously. Fixed: http://tracker.ceph.com/issues/24159 Signed-off-by: brandy penglaiyxy@gmail.com --- src/kv/KeyValueDB.h | 3 +++ src/kv/LevelDBStore.cc | 6 +++++- src/kv/LevelDBStore.h | 4 ++++ src/kv/RocksDBStore.cc | 6 +++++- src/kv/RocksDBStore.h | 4 ++++ src/mon/Monitor.cc | 2 +- src/mon/MonitorDBStore.h | 4 ++++ 7 files changed, 26 insertions(+), 3 deletions(-) diff --git a/src/kv/KeyValueDB.h b/src/kv/KeyValueDB.h index 50714d24713..f6dace8202d 100644 --- a/src/kv/KeyValueDB.h +++ b/src/kv/KeyValueDB.h @@ -364,6 +364,9 @@ public: /// compact the underlying store virtual void compact() {} + /// compact the underlying store in async mode + virtual void compact_async() {} + /// compact db for all keys with a given prefix virtual void compact_prefix(const std::string& prefix) {} /// compact db for all keys with a given prefix, async diff --git a/src/kv/LevelDBStore.cc b/src/kv/LevelDBStore.cc index 7c8b44dc20d..9f5158a7c75 100644 --- a/src/kv/LevelDBStore.cc +++ b/src/kv/LevelDBStore.cc @@ -394,7 +394,11 @@ void LevelDBStore::compact_thread_entry() logger->set(l_leveldb_compact_queue_len, compact_queue.size()); compact_queue_lock.Unlock(); logger->inc(l_leveldb_compact_range); - compact_range(range.first, range.second); + if (range.first.empty() && range.second.empty()) { + compact(); + } else { + compact_range(range.first, range.second); + } compact_queue_lock.Lock(); continue; } diff --git a/src/kv/LevelDBStore.h b/src/kv/LevelDBStore.h index decd07977a6..703f1eb519e 100644 --- a/src/kv/LevelDBStore.h +++ b/src/kv/LevelDBStore.h @@ -98,6 +98,10 @@ public: /// compact the underlying leveldb store void compact() override; + void compact_async() override { + compact_range_async(string(), string()); + } + /// compact db for all keys with a given prefix void compact_prefix(const string& prefix) override { compact_range(prefix, past_prefix(prefix)); diff --git a/src/kv/RocksDBStore.cc b/src/kv/RocksDBStore.cc index 236b02346ac..94df017dfd6 100644 --- a/src/kv/RocksDBStore.cc +++ b/src/kv/RocksDBStore.cc @@ -1172,7 +1172,11 @@ void RocksDBStore::compact_thread_entry() logger->set(l_rocksdb_compact_queue_len, compact_queue.size()); compact_queue_lock.Unlock(); logger->inc(l_rocksdb_compact_range); - compact_range(range.first, range.second); + if (range.first.empty() && range.second.empty()) { + compact(); + } else { + compact_range(range.first, range.second); + } compact_queue_lock.Lock(); continue; } diff --git a/src/kv/RocksDBStore.h b/src/kv/RocksDBStore.h index 99d0941e7a4..ce96199d058 100644 --- a/src/kv/RocksDBStore.h +++ b/src/kv/RocksDBStore.h @@ -120,6 +120,10 @@ public: bool enable_rmrange; void compact() override; + void compact_async() override { + compact_range_async(string(), string()); + } + int tryInterpret(const string& key, const string& val, rocksdb::Options &opt); int ParseOptionsFromString(const string& opt_str, rocksdb::Options &opt); static int _test_init(const string& dir); diff --git a/src/mon/Monitor.cc b/src/mon/Monitor.cc index 9c60431cb18..2f99ef7ed6b 100644 --- a/src/mon/Monitor.cc +++ b/src/mon/Monitor.cc @@ -3168,7 +3168,7 @@ void Monitor::handle_command(MonOpRequestRef op) if (prefix == "compact" || prefix == "mon compact") { dout(1) << "triggering manual compaction" << dendl; auto start = ceph::coarse_mono_clock::now(); - store->compact(); + store->compact_async(); auto end = ceph::coarse_mono_clock::now(); double duration = std::chrono::duration(end-start).count(); dout(1) << "finished manual compaction in " << duration << " seconds" << dendl; diff --git a/src/mon/MonitorDBStore.h b/src/mon/MonitorDBStore.h index f1e0efd7da8..43dac528636 100644 --- a/src/mon/MonitorDBStore.h +++ b/src/mon/MonitorDBStore.h @@ -688,6 +688,10 @@ class MonitorDBStore db->compact(); } + void compact_async() { + db->compact_async(); + } + void compact_prefix(const string& prefix) { db->compact_prefix(prefix); } -- 2.39.5