Skip to content

Commit 70580ac

Browse files
authored
Merge pull request ceph#57107 from ifed01/wip-ifed-async-compact
os/bluestore: enable async manual compactions Reviewed-by: Adam Kupczyk <[email protected]> Reviewed-by: Pere Diaz Bou <[email protected]>
2 parents 7b18751 + 2e06b3d commit 70580ac

File tree

8 files changed

+58
-19
lines changed

8 files changed

+58
-19
lines changed

src/common/options/global.yaml.in

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5070,6 +5070,13 @@ options:
50705070
This setting is used only when OSD is doing ``--mkfs``.
50715071
Next runs of OSD retrieve sharding from disk.
50725072
default: m(3) p(3,0-12) O(3,0-13)=block_cache={type=binned_lru} L=min_write_buffer_number_to_merge=32 P=min_write_buffer_number_to_merge=32
5073+
- name: bluestore_async_db_compaction
5074+
type: bool
5075+
level: dev
5076+
desc: Perform DB compaction requests asynchronously
5077+
long_desc: 'How to perform DB compactions triggered either through async socket or
5078+
by OSD initialization procedure on start.'
5079+
default: true
50735080
- name: bluestore_qfsck_on_mount
50745081
type: bool
50755082
level: dev

src/kv/RocksDBStore.cc

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1243,7 +1243,9 @@ int RocksDBStore::do_open(ostream &out,
12431243
plb.add_time_avg(l_rocksdb_submit_latency, "submit_latency", "Submit Latency");
12441244
plb.add_time_avg(l_rocksdb_submit_sync_latency, "submit_sync_latency", "Submit Sync Latency");
12451245
plb.add_u64_counter(l_rocksdb_compact, "compact", "Compactions");
1246-
plb.add_u64_counter(l_rocksdb_compact_range, "compact_range", "Compactions by range");
1246+
plb.add_u64_counter(l_rocksdb_compact_running, "compact_running", "Running compactions");
1247+
plb.add_u64_counter(l_rocksdb_compact_completed, "compact_completed", "Completed compactions");
1248+
plb.add_time(l_rocksdb_compact_lasted, "compact_lasted", "Last completed compaction duration");
12471249
plb.add_u64_counter(l_rocksdb_compact_queue_merge, "compact_queue_merge", "Mergings of ranges in compaction queue");
12481250
plb.add_u64(l_rocksdb_compact_queue_len, "compact_queue_len", "Length of compaction queue");
12491251
plb.add_time_avg(l_rocksdb_write_wal_time, "rocksdb_write_wal_time", "Rocksdb write wal time");
@@ -1988,6 +1990,7 @@ int RocksDBStore::split_key(rocksdb::Slice in, string *prefix, string *key)
19881990

19891991
void RocksDBStore::compact()
19901992
{
1993+
dout(2) << __func__ << " starting" << dendl;
19911994
logger->inc(l_rocksdb_compact);
19921995
rocksdb::CompactRangeOptions options;
19931996
db->CompactRange(options, default_cf, nullptr, nullptr);
@@ -1999,6 +2002,7 @@ void RocksDBStore::compact()
19992002
nullptr, nullptr);
20002003
}
20012004
}
2005+
dout(2) << __func__ << " completed" << dendl;
20022006
}
20032007

20042008
void RocksDBStore::compact_thread_entry()
@@ -2011,12 +2015,17 @@ void RocksDBStore::compact_thread_entry()
20112015
compact_queue.pop_front();
20122016
logger->set(l_rocksdb_compact_queue_len, compact_queue.size());
20132017
l.unlock();
2014-
logger->inc(l_rocksdb_compact_range);
2018+
logger->inc(l_rocksdb_compact_running);
2019+
auto start = ceph_clock_now();
20152020
if (range.first.empty() && range.second.empty()) {
20162021
compact();
20172022
} else {
20182023
compact_range(range.first, range.second);
20192024
}
2025+
auto lat = ceph_clock_now() - start;
2026+
logger->dec(l_rocksdb_compact_running);
2027+
logger->inc(l_rocksdb_compact_completed);
2028+
logger->tset(l_rocksdb_compact_lasted, lat);
20202029
l.lock();
20212030
continue;
20222031
}

src/kv/RocksDBStore.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,9 @@ enum {
3535
l_rocksdb_submit_latency,
3636
l_rocksdb_submit_sync_latency,
3737
l_rocksdb_compact,
38-
l_rocksdb_compact_range,
38+
l_rocksdb_compact_running,
39+
l_rocksdb_compact_completed,
40+
l_rocksdb_compact_lasted,
3941
l_rocksdb_compact_queue_merge,
4042
l_rocksdb_compact_queue_len,
4143
l_rocksdb_write_wal_time,

src/os/ObjectStore.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -791,7 +791,7 @@ class ObjectStore {
791791
virtual void inject_data_error(const ghobject_t &oid) {}
792792
virtual void inject_mdata_error(const ghobject_t &oid) {}
793793

794-
virtual void compact() {}
794+
virtual int compact() { return -ENOTSUP; }
795795
virtual bool has_builtin_csum() const {
796796
return false;
797797
}

src/os/bluestore/BlueStore.cc

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11305,6 +11305,22 @@ void BlueStore::inject_bluefs_file(std::string_view dir, std::string_view name,
1130511305
bluefs->close_writer(p_handle);
1130611306
}
1130711307

11308+
int BlueStore::compact()
11309+
{
11310+
int r = 0;
11311+
ceph_assert(db);
11312+
if (cct->_conf.get_val<bool>("bluestore_async_db_compaction")) {
11313+
dout(1) << __func__ << " starting async.." << dendl;
11314+
db->compact_async();
11315+
r = -EINPROGRESS;
11316+
} else {
11317+
dout(1) << __func__ << " starting sync.." << dendl;
11318+
db->compact();
11319+
dout(1) << __func__ << " finished." << dendl;
11320+
}
11321+
return r;
11322+
}
11323+
1130811324
void BlueStore::collect_metadata(map<string,string> *pm)
1130911325
{
1131011326
dout(10) << __func__ << dendl;

src/os/bluestore/BlueStore.h

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3403,10 +3403,7 @@ class BlueStore : public ObjectStore,
34033403
std::string_view name,
34043404
size_t new_size);
34053405

3406-
void compact() override {
3407-
ceph_assert(db);
3408-
db->compact();
3409-
}
3406+
int compact() override;
34103407
bool has_builtin_csum() const override {
34113408
return true;
34123409
}

src/os/kstore/KStore.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -580,9 +580,10 @@ class KStore : public ObjectStore {
580580
TrackedOpRef op = TrackedOpRef(),
581581
ThreadPool::TPHandle *handle = NULL) override;
582582

583-
void compact () override {
583+
int compact () override {
584584
ceph_assert(db);
585585
db->compact();
586+
return 0;
586587
}
587588

588589
private:

src/osd/OSD.cc

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3000,15 +3000,22 @@ will start to track new ops received afterwards.";
30003000
} else if (prefix == "compact") {
30013001
dout(1) << "triggering manual compaction" << dendl;
30023002
auto start = ceph::coarse_mono_clock::now();
3003-
store->compact();
3004-
auto end = ceph::coarse_mono_clock::now();
3005-
double duration = std::chrono::duration<double>(end-start).count();
3006-
dout(1) << "finished manual compaction in "
3007-
<< duration
3008-
<< " seconds" << dendl;
3009-
f->open_object_section("compact_result");
3010-
f->dump_float("elapsed_time", duration);
3011-
f->close_section();
3003+
int r = store->compact();
3004+
if (r == 0) {
3005+
auto end = ceph::coarse_mono_clock::now();
3006+
double duration = std::chrono::duration<double>(end-start).count();
3007+
3008+
dout(1) << "finished manual compaction in "
3009+
<< duration
3010+
<< " seconds" << dendl;
3011+
f->open_object_section("compact_result");
3012+
f->dump_float("elapsed_time", duration);
3013+
f->close_section();
3014+
} else if ( r == -EINPROGRESS) {
3015+
dout(1) << "manual compaction is being executed asynchronously" << dendl;
3016+
} else {
3017+
derr << "error starting manual compaction:" << cpp_strerror(r) << dendl;
3018+
}
30123019
} else if (prefix == "get_mapped_pools") {
30133020
f->open_array_section("mapped_pools");
30143021
set<int64_t> poollist = get_mapped_pools();
@@ -3924,7 +3931,7 @@ int OSD::init()
39243931
dout(2) << "superblock: I am osd." << superblock.whoami << dendl;
39253932

39263933
if (cct->_conf.get_val<bool>("osd_compact_on_start")) {
3927-
dout(2) << "compacting object store's omap" << dendl;
3934+
dout(2) << "compacting object store's DB" << dendl;
39283935
store->compact();
39293936
}
39303937

0 commit comments

Comments
 (0)