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
/// 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
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;
}
/// 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));
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;
}
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);
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<double>(end-start).count();
dout(1) << "finished manual compaction in " << duration << " seconds" << dendl;
db->compact();
}
+ void compact_async() {
+ db->compact_async();
+ }
+
void compact_prefix(const string& prefix) {
db->compact_prefix(prefix);
}