From c1e473d4c7844570264da7cd06712fe4c6fe8bf8 Mon Sep 17 00:00:00 2001 From: myoungwon oh Date: Wed, 4 Mar 2026 00:42:51 +0900 Subject: [PATCH] crimson/os/seastore: reload head if modified This commit also fixes the test case to verify that the head is correctly allocated and updated during omap_set_keys operations involving multiple keys. Signed-off-by: Myoungwon Oh --- .../seastore/omap_manager/log/log_manager.cc | 20 ++++++++++++++----- src/test/crimson/seastore/test_seastore.cc | 2 +- 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/src/crimson/os/seastore/omap_manager/log/log_manager.cc b/src/crimson/os/seastore/omap_manager/log/log_manager.cc index 430fc250d18..59e182c0709 100644 --- a/src/crimson/os/seastore/omap_manager/log/log_manager.cc +++ b/src/crimson/os/seastore/omap_manager/log/log_manager.cc @@ -204,7 +204,13 @@ LogManager::omap_set_keys( // remove duplicate keys first co_await remove_kv(t, log_root.addr, p.first, nullptr); } + laddr_t last_addr = log_root.addr; co_await f(p.first, p.second, has_ow_key); + if (last_addr != log_root.addr) { + ext = co_await log_load_extent( + t, log_root.addr, BEGIN_KEY, END_KEY); + last_addr = log_root.addr; + } } if (!ow_kv.first.empty()) { @@ -216,13 +222,17 @@ LogManager::omap_set_keys( if (!dup_kvs.empty()) { - ext = co_await log_load_extent( - t, - co_await get_dup_addr_from_root(t, log_root.addr), - BEGIN_KEY, - END_KEY); + laddr_t last_addr = co_await get_dup_addr_from_root(t, log_root.addr); + ext = co_await log_load_extent(t, last_addr, BEGIN_KEY, END_KEY); for (auto &p: dup_kvs) { co_await f(p.first, p.second, false); + if (&p != &*dup_kvs.rbegin()) { + laddr_t current_addr = co_await get_dup_addr_from_root(t, log_root.addr); + if (last_addr != current_addr) { + ext = co_await log_load_extent(t, current_addr, BEGIN_KEY, END_KEY); + last_addr = current_addr; + } + } } } co_return; diff --git a/src/test/crimson/seastore/test_seastore.cc b/src/test/crimson/seastore/test_seastore.cc index d7fedc0b814..b251b603e79 100644 --- a/src/test/crimson/seastore/test_seastore.cc +++ b/src/test/crimson/seastore/test_seastore.cc @@ -1646,7 +1646,7 @@ TEST_P(seastore_test_t, pgmeta_io) encode(ss, l2); CTransaction t; - if (i % 2 == 0) { + if ((i / 2) % 2 == 0) { test_obj2.set_omap(t, key, l); test_obj2.set_omap(t, key2, l2); // x2 } else { -- 2.47.3