Fix zero-length writes

This commit is contained in:
Vitaliy Filippov
2025-11-23 19:08:24 +03:00
parent d0690091c1
commit ecd26ebac3
3 changed files with 10 additions and 9 deletions
+1
View File
@@ -161,6 +161,7 @@ bool journal_flusher_co::loop()
else if (wait_state == 24) goto resume_24; else if (wait_state == 24) goto resume_24;
resume_0: resume_0:
wait_state = 0; wait_state = 0;
wait_count = 0;
cur_oid = {}; cur_oid = {};
res = bs->heap->get_next_compact(cur_oid); res = bs->heap->get_next_compact(cur_oid);
if (res == ENOENT && flusher->force_start > 0 && co_id == 0 && if (res == ENOENT && flusher->force_start > 0 && co_id == 0 &&
+7 -8
View File
@@ -571,13 +571,12 @@ bool blockstore_heap_t::calc_checksums(heap_write_t *wr, uint8_t *data, bool set
{ {
if (!dsk->csum_block_size) if (!dsk->csum_block_size)
{ {
if (wr->type() != BS_HEAP_SMALL_WRITE && // Single checksum
wr->type() != BS_HEAP_INTENT_WRITE) uint32_t *wr_csum = wr->get_checksum(this);
if (!wr_csum)
{ {
return true; return true;
} }
// Single checksum
uint32_t *wr_csum = wr->get_checksum(this);
uint32_t real_csum = crc32c(0, data, wr->len); uint32_t real_csum = crc32c(0, data, wr->len);
if (set) if (set)
{ {
@@ -1309,7 +1308,7 @@ bool blockstore_heap_t::mvcc_save_copy(heap_object_t *obj)
add_ref = 1; add_ref = 1;
} }
} }
else if (wr->type() == BS_HEAP_SMALL_WRITE) else if (wr->type() == BS_HEAP_SMALL_WRITE && wr->len > 0)
{ {
mvcc_buffer_refs[wr->location] += add_ref; mvcc_buffer_refs[wr->location] += add_ref;
} }
@@ -1331,7 +1330,7 @@ void blockstore_heap_t::mark_overwritten(uint64_t over_lsn, uint64_t inode, heap
overwrite_ref_queue.push_back((heap_refqi_t){ .lsn = over_lsn, .inode = inode, .location = wr->location, .len = 0, .is_data = true }); overwrite_ref_queue.push_back((heap_refqi_t){ .lsn = over_lsn, .inode = inode, .location = wr->location, .len = 0, .is_data = true });
mvcc_data_refs[wr->location] += !tracking_active; mvcc_data_refs[wr->location] += !tracking_active;
} }
else if (wr->type() == BS_HEAP_SMALL_WRITE && wr->size > 0) else if (wr->type() == BS_HEAP_SMALL_WRITE && wr->len > 0)
{ {
overwrite_ref_queue.push_back((heap_refqi_t){ .lsn = over_lsn, .inode = inode, .location = wr->location, .len = wr->len, .is_data = false }); overwrite_ref_queue.push_back((heap_refqi_t){ .lsn = over_lsn, .inode = inode, .location = wr->location, .len = wr->len, .is_data = false });
mvcc_buffer_refs[wr->location] += !tracking_active; mvcc_buffer_refs[wr->location] += !tracking_active;
@@ -1393,7 +1392,7 @@ int blockstore_heap_t::update_object(uint32_t block_num, heap_object_t *obj, hea
{ {
mvcc_data_refs[wr->location]++; mvcc_data_refs[wr->location]++;
} }
else if (wr->type() == BS_HEAP_SMALL_WRITE) else if (wr->type() == BS_HEAP_SMALL_WRITE && wr->len > 0)
{ {
mvcc_buffer_refs[wr->location]++; mvcc_buffer_refs[wr->location]++;
} }
@@ -1760,7 +1759,7 @@ void blockstore_heap_t::free_object_space(inode_t inode, heap_write_t *from, hea
break; break;
} }
} }
else if (wr->type() == BS_HEAP_SMALL_WRITE) else if (wr->type() == BS_HEAP_SMALL_WRITE && wr->len > 0)
{ {
deref_buffer(inode, wr->location, wr->len, mode != BS_HEAP_FREE_MAIN); deref_buffer(inode, wr->location, wr->len, mode != BS_HEAP_FREE_MAIN);
} }
+2 -1
View File
@@ -228,7 +228,8 @@ process_intent:
} }
assert(res == 0); assert(res == 0);
PRIV(op)->lsn = wr->lsn; PRIV(op)->lsn = wr->lsn;
heap->use_buffer_area(op->oid.inode, loc, op->len); if (op->len)
heap->use_buffer_area(op->oid.inode, loc, op->len);
prepare_meta_block_write(op, modified_block); prepare_meta_block_write(op, modified_block);
if (op->len > 0) if (op->len > 0)
{ {