mirror of
https://github.com/ceph/ceph
synced 2026-08-01 22:45:39 +00:00
crimson/os/seastore/omap_manager: count key length in the overwrite gap
ow_gap_from_last_entry() returns how much the node grows when the tail entry is overwritten. However, it compared *value* lengths only. overwriting pg-log key (31B) is longer than a _fastinfo key (9B) - So the growth was under-counted by 22 bytes. Also assert in _append()/_overwrite() that the write stays within capacity() to avoid similar issues. Signed-off-by: Matan Breizman <mbreizma@redhat.com>
This commit is contained in:
parent
0836e417ba
commit
cedad57aee
@ -346,8 +346,10 @@ int LogNode::ow_gap_from_last_entry(const size_t key, const size_t val) {
|
||||
if (p) {
|
||||
auto ret = p->get_latest_write_delta();
|
||||
if (ret && (*ret).key == get_ow_key()) {
|
||||
if ((*ret).val.length() < val) {
|
||||
gap = val - (*ret).val.length();
|
||||
auto old_size = get_entry_size((*ret).key.size(), (*ret).val.length());
|
||||
auto new_size = get_entry_size(key, val);
|
||||
if (new_size > old_size) {
|
||||
gap = new_size - old_size;
|
||||
}
|
||||
} else {
|
||||
gap = _ow_gap_from_last_entry(key, val);
|
||||
|
||||
@ -664,8 +664,10 @@ public:
|
||||
void _append(const std::string &key, const ceph::bufferlist &val) {
|
||||
iterator prev_iter(this, get_last_pos());
|
||||
auto last = prev_iter->get_node_key();
|
||||
iterator next_iter(this, get_size() == 0 ? get_last_pos() :
|
||||
get_last_pos() + get_entry_size(last.key_len, last.val_len));
|
||||
uint32_t pos = get_size() == 0 ? get_last_pos() :
|
||||
get_last_pos() + get_entry_size(last.key_len, last.val_len);
|
||||
assert(pos + get_entry_size(key.size(), val.length()) <= capacity());
|
||||
iterator next_iter(this, pos);
|
||||
next_iter.set_node_key(log_key_t(key.size(), val.length()));
|
||||
next_iter.set_node_val(key, val);
|
||||
if (get_size() >= 1) {
|
||||
@ -687,6 +689,8 @@ public:
|
||||
}
|
||||
|
||||
void _overwrite(const std::string &key, const ceph::bufferlist &val) {
|
||||
assert(get_last_pos() + get_entry_size(key.size(), val.length())
|
||||
<= capacity());
|
||||
iterator iter(this, get_last_pos());
|
||||
iter.set_node_key(log_key_t(key.size(), val.length()));
|
||||
iter.set_node_val(key, val);
|
||||
|
||||
Loading…
Reference in New Issue
Block a user