From: Sage Weil Date: Fri, 1 Oct 2021 18:14:26 +0000 (-0500) Subject: os/bluestore/ZonedFreelistManager: simplify freelist merge update vs zone reset X-Git-Tag: v17.1.0~535^2~10 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=63b8f2f3ff0e46286cc1285e94c9f3c2d59660e8;p=ceph.git os/bluestore/ZonedFreelistManager: simplify freelist merge update vs zone reset Signed-off-by: Sage Weil --- diff --git a/src/os/bluestore/BlueStore.cc b/src/os/bluestore/BlueStore.cc index 3c57055b3210..320909d6133a 100644 --- a/src/os/bluestore/BlueStore.cc +++ b/src/os/bluestore/BlueStore.cc @@ -13159,8 +13159,7 @@ void BlueStore::_zoned_clean_zone(uint64_t zone) bdev->reset_zone(zone); // record that we can now write there - f->mark_zone_to_clean_free(zone, a->get_write_pointer(zone), - a->get_dead_bytes(zone), db); + f->mark_zone_to_clean_free(zone, db); bdev->flush(); // then allow ourselves to start allocating there diff --git a/src/os/bluestore/ZonedFreelistManager.cc b/src/os/bluestore/ZonedFreelistManager.cc index 8f7f05ab425e..a940005e7a99 100644 --- a/src/os/bluestore/ZonedFreelistManager.cc +++ b/src/os/bluestore/ZonedFreelistManager.cc @@ -30,7 +30,7 @@ using ceph::bufferptr; using ceph::decode; using ceph::encode; -void ZonedFreelistManager::write_zone_state_to_db( +void ZonedFreelistManager::write_zone_state_delta_to_db( uint64_t zone_num, const zone_state_t &zone_state, KeyValueDB::Transaction txn) @@ -42,6 +42,18 @@ void ZonedFreelistManager::write_zone_state_to_db( txn->merge(info_prefix, key, bl); } +void ZonedFreelistManager::write_zone_state_reset_to_db( + uint64_t zone_num, + const zone_state_t &zone_state, + KeyValueDB::Transaction txn) +{ + string key; + _key_encode_u64(zone_num, &key); + bufferlist bl; + zone_state.encode(bl); + txn->set(info_prefix, key, bl); +} + void ZonedFreelistManager::load_zone_state_from_db( uint64_t zone_num, zone_state_t &zone_state, @@ -62,7 +74,7 @@ void ZonedFreelistManager::init_zone_states(KeyValueDB::Transaction txn) dout(10) << __func__ << dendl; for (uint64_t zone_num = 0; zone_num < num_zones; ++zone_num) { zone_state_t zone_state; - write_zone_state_to_db(zone_num, zone_state, txn); + write_zone_state_reset_to_db(zone_num, zone_state, txn); } } @@ -243,7 +255,7 @@ void ZonedFreelistManager::allocate( << " zone 0x" << zone_num << std::dec << dendl; zone_state_t zone_state; zone_state.increment_write_pointer(this_len); - write_zone_state_to_db(zone_num, zone_state, txn); + write_zone_state_delta_to_db(zone_num, zone_state, txn); offset += this_len; length -= this_len; } @@ -267,7 +279,7 @@ void ZonedFreelistManager::release( << " zone 0x" << zone_num << std::dec << dendl; zone_state_t zone_state; zone_state.increment_num_dead_bytes(this_len); - write_zone_state_to_db(zone_num, zone_state, txn); + write_zone_state_delta_to_db(zone_num, zone_state, txn); length -= this_len; offset += this_len; } @@ -345,13 +357,9 @@ int ZonedFreelistManager::_read_cfg(cfg_reader_t cfg_reader) void ZonedFreelistManager::mark_zone_to_clean_free( uint64_t zone, - uint64_t write_pointer, - uint64_t dead, KeyValueDB *kvdb) { - dout(10) << __func__ << " zone 0x" << std::hex << zone - << " (dead 0x" << dead << " write pointer 0x" << write_pointer - << ")" << std::dec << dendl; + dout(10) << __func__ << " zone 0x" << std::hex << zone << std::dec << dendl; if (true) { string key; @@ -361,15 +369,11 @@ void ZonedFreelistManager::mark_zone_to_clean_free( zone_state_t zs; load_zone_state_from_db(zone, zs, it); dout(20) << __func__ << " before " << zs << dendl; - ceph_assert(zs.num_dead_bytes == dead); - ceph_assert(zs.write_pointer == write_pointer); } KeyValueDB::Transaction txn = kvdb->get_transaction(); - zone_state_t neg_zone_state; - neg_zone_state.num_dead_bytes = 0ll - (int64_t)dead; - neg_zone_state.write_pointer = 0ll - (int64_t)write_pointer; - write_zone_state_to_db(zone, neg_zone_state, txn); + zone_state_t empty_zone_state; + write_zone_state_reset_to_db(zone, empty_zone_state, txn); // block here until this commits so that we don't end up starting to allocate and // write to the new zone before this fully commits. diff --git a/src/os/bluestore/ZonedFreelistManager.h b/src/os/bluestore/ZonedFreelistManager.h index 4e0b040c80cd..378a20f0a796 100644 --- a/src/os/bluestore/ZonedFreelistManager.h +++ b/src/os/bluestore/ZonedFreelistManager.h @@ -36,9 +36,12 @@ class ZonedFreelistManager : public FreelistManager { KeyValueDB::Iterator enumerate_p; uint64_t enumerate_zone_num; - void write_zone_state_to_db(uint64_t zone_num, - const zone_state_t &zone_state, - KeyValueDB::Transaction txn); + void write_zone_state_delta_to_db(uint64_t zone_num, + const zone_state_t &zone_state, + KeyValueDB::Transaction txn); + void write_zone_state_reset_to_db(uint64_t zone_num, + const zone_state_t &zone_state, + KeyValueDB::Transaction txn); void load_zone_state_from_db(uint64_t zone_num, zone_state_t &zone_state, KeyValueDB::Iterator &it) const; @@ -104,7 +107,6 @@ public: std::vector get_zone_states(KeyValueDB *kvdb) const; void mark_zone_to_clean_free(uint64_t zone, - uint64_t write_pointer, uint64_t dead, KeyValueDB *kvdb); };