// This means the first entry of the new LogNode is not _fastinfo
if (!is_ow_key(key) && can_ow) {
// remove _fastinfo in old LogNode
- auto e = co_await tail->get_value(key);
+ auto e = co_await tail->get_value(key, LogNode::copy_t::SHALLOW);
if (e != std::nullopt) {
auto mut = tm.get_mutable_extent(t, tail)->template cast<LogNode>();
mut->remove_entry(get_ow_key());
LOG_PREFIX(LogManager::omap_get_value);
DEBUGT("key={}", t, key);
assert(log_root.get_type() == omap_type_t::LOG);
- std::optional<bufferlist> ret;
if (!is_dup_log_key(key)) {
- ret = co_await find_kv(t, log_root.addr, key);
- } else {
- ret = co_await find_kv(t,
- co_await get_dup_addr_from_root(t, log_root.addr), key);
+ co_return co_await find_kv(t, log_root.addr, key);
}
- co_return ret;
+ co_return co_await find_kv(t,
+ co_await get_dup_addr_from_root(t, log_root.addr), key);
}
LogManager::omap_list_ret
co_return;
}
- auto e = co_await extent->get_value(key);
+ auto e = co_await extent->get_value(key, LogNode::copy_t::SHALLOW);
if (e == std::nullopt) {
if(extent->get_prev_addr() == L_ADDR_NULL) {
co_return;
});
}
-LogNode::get_value_ret LogNode::get_value(const std::string &key)
+LogNode::get_value_ret LogNode::get_value(const std::string &key, copy_t c)
{
bufferlist bl;
bool found = false;
for_each_live_entry([&](const auto& ent, uint32_t index) -> bool {
const auto k = ent.get_key();
if (k == key) {
- bl = ent.get_val();
+ if (c == copy_t::SHALLOW) {
+ bl = ent.get_val_shallow();
+ } else {
+ bl = ent.get_val();
+ }
found = true;
/* If key is time-series log,
* duplicate does not exist. In this case, return latest one */
}
ceph::bufferlist get_val() const {
+ auto node_key = get_node_key();
+ ceph::bufferlist bl;
+ bl.append(get_node_val_ptr() + node_key.key_len,
+ node_key.val_len);
+ return bl;
+ }
+
+ ceph::bufferlist get_val_shallow() const {
auto node_key = get_node_key();
ceph::bufferlist bl;
ceph::bufferptr bptr(
get_node_val_ptr() + node_key.key_len,
- get_node_key().val_len);
+ node_key.val_len);
bl.append(bptr);
return bl;
}
void set_init_vars();
+ enum class copy_t : uint8_t {
+ SHALLOW,
+ DEEP,
+ };
using get_value_ret = OMapManager::omap_get_value_ret;
- get_value_ret get_value(const std::string &key);
+ get_value_ret get_value(const std::string &key, copy_t c = copy_t::DEEP);
void set_dup_tail_addr(laddr_t laddr);