Previously, all extents ended up initialized to the same crc value
upon read -- the one for an empty buffer. This bug wasn't detected
because an extent was always evicted and reread following the first
write and subsequently kept in cache once initially written.
Also, add crc to operator<< for extents.
Signed-off-by: Samuel Just <sjust@redhat.com>
ref->set_paddr(offset);
ref->state = CachedExtent::extent_state_t::CLEAN;
- /* TODO: crc should be checked against LBA manager */
- ref->last_committed_crc = ref->get_crc32c();
-
return segment_manager.read(
offset,
length,
ref->get_bptr()).safe_then(
[this, ref=std::move(ref)]() mutable {
+ /* TODO: crc should be checked against LBA manager */
+ ref->last_committed_crc = ref->get_crc32c();
+
ref->on_clean_read();
ref->complete_io();
add_extent(ref);
<< ", version=" << version
<< ", paddr=" << get_paddr()
<< ", state=" << state
+ << ", last_committed_crc=" << last_committed_crc
<< ", refcount=" << use_count();
print_detail(out);
return out << ")";