Remove block_order and replace << >> by / * data_block_size

This commit is contained in:
Vitaliy Filippov
2025-11-22 18:10:32 +03:00
parent d75b1cb2d2
commit be1858848e
7 changed files with 29 additions and 30 deletions
+1 -1
View File
@@ -95,7 +95,7 @@ void blockstore_disk_t::parse_config(std::map<std::string, std::string> & config
{ {
data_block_size = (1 << DEFAULT_DATA_BLOCK_ORDER); data_block_size = (1 << DEFAULT_DATA_BLOCK_ORDER);
} }
if ((block_order = is_power_of_two(data_block_size)) >= 64 || data_block_size < MIN_DATA_BLOCK_SIZE || data_block_size >= MAX_DATA_BLOCK_SIZE) if (is_power_of_two(data_block_size) >= 64 || data_block_size < MIN_DATA_BLOCK_SIZE || data_block_size >= MAX_DATA_BLOCK_SIZE)
{ {
throw std::runtime_error("Bad block size"); throw std::runtime_error("Bad block size");
} }
-1
View File
@@ -46,7 +46,6 @@ struct blockstore_disk_t
uint64_t data_offset, data_device_sect, data_device_size, data_len; uint64_t data_offset, data_device_sect, data_device_size, data_len;
uint64_t journal_offset, journal_device_sect, journal_device_size, journal_len; uint64_t journal_offset, journal_device_sect, journal_device_size, journal_len;
uint32_t block_order = 0;
uint64_t block_count = 0; uint64_t block_count = 0;
uint32_t clean_entry_bitmap_size = 0, clean_entry_size = 0, clean_dyn_size = 0; uint32_t clean_entry_bitmap_size = 0, clean_entry_size = 0, clean_dyn_size = 0;
+12 -12
View File
@@ -542,7 +542,7 @@ resume_2:
if (old_entry->oid.inode != 0 && old_entry->oid != cur.oid) if (old_entry->oid.inode != 0 && old_entry->oid != cur.oid)
{ {
printf("Fatal error (metadata corruption or bug): tried to wipe metadata entry %ju (%jx:%jx v%ju) as old location of %jx:%jx\n", printf("Fatal error (metadata corruption or bug): tried to wipe metadata entry %ju (%jx:%jx v%ju) as old location of %jx:%jx\n",
old_clean_loc >> bs->dsk.block_order, old_entry->oid.inode, old_entry->oid.stripe, old_clean_loc / bs->dsk.data_block_size, old_entry->oid.inode, old_entry->oid.stripe,
old_entry->version, cur.oid.inode, cur.oid.stripe); old_entry->version, cur.oid.inode, cur.oid.stripe);
exit(1); exit(1);
} }
@@ -645,7 +645,7 @@ void journal_flusher_co::update_metadata_entry()
has_delete has_delete
? "Fatal error (metadata corruption or bug): tried to delete metadata entry %ju (%jx:%jx v%ju) while deleting %jx:%jx v%ju\n" ? "Fatal error (metadata corruption or bug): tried to delete metadata entry %ju (%jx:%jx v%ju) while deleting %jx:%jx v%ju\n"
: "Fatal error (metadata corruption or bug): tried to overwrite non-zero metadata entry %ju (%jx:%jx v%ju) with %jx:%jx v%ju\n", : "Fatal error (metadata corruption or bug): tried to overwrite non-zero metadata entry %ju (%jx:%jx v%ju) with %jx:%jx v%ju\n",
clean_loc >> bs->dsk.block_order, new_entry->oid.inode, new_entry->oid.stripe, clean_loc / bs->dsk.data_block_size, new_entry->oid.inode, new_entry->oid.stripe,
new_entry->version, cur.oid.inode, cur.oid.stripe, cur.version new_entry->version, cur.oid.inode, cur.oid.stripe, cur.version
); );
exit(1); exit(1);
@@ -695,7 +695,7 @@ void journal_flusher_co::update_metadata_entry()
new_entry->version = cur.version; new_entry->version = cur.version;
if (!bs->inmemory_meta) if (!bs->inmemory_meta)
{ {
auto inmem_bmp = (uint8_t*)bs->clean_bitmaps + (clean_loc >> bs->dsk.block_order)*2*bs->dsk.clean_entry_bitmap_size; auto inmem_bmp = (uint8_t*)bs->clean_bitmaps + (clean_loc / bs->dsk.data_block_size)*2*bs->dsk.clean_entry_bitmap_size;
memcpy(inmem_bmp, new_clean_bitmap, 2*bs->dsk.clean_entry_bitmap_size); memcpy(inmem_bmp, new_clean_bitmap, 2*bs->dsk.clean_entry_bitmap_size);
} }
if (bs->dsk.meta_format >= BLOCKSTORE_META_FORMAT_V2) if (bs->dsk.meta_format >= BLOCKSTORE_META_FORMAT_V2)
@@ -848,7 +848,7 @@ bool journal_flusher_co::clear_incomplete_csum_block_bits(int wait_base)
{ {
printf( printf(
"Fatal error (metadata corruption or bug): tried to make holes in %ju (%jx:%jx v%ju) with %jx:%jx v%ju\n", "Fatal error (metadata corruption or bug): tried to make holes in %ju (%jx:%jx v%ju) with %jx:%jx v%ju\n",
clean_loc >> bs->dsk.block_order, new_entry->oid.inode, new_entry->oid.stripe, clean_loc / bs->dsk.data_block_size, new_entry->oid.inode, new_entry->oid.stripe,
new_entry->version, cur.oid.inode, cur.oid.stripe, cur.version new_entry->version, cur.oid.inode, cur.oid.stripe, cur.version
); );
} }
@@ -864,7 +864,7 @@ bool journal_flusher_co::clear_incomplete_csum_block_bits(int wait_base)
calc_block_checksums(new_data_csums, true); calc_block_checksums(new_data_csums, true);
if (!bs->inmemory_meta) if (!bs->inmemory_meta)
{ {
auto inmem_bmp = (uint8_t*)bs->clean_bitmaps + (clean_loc >> bs->dsk.block_order)*2*bs->dsk.clean_entry_bitmap_size; auto inmem_bmp = (uint8_t*)bs->clean_bitmaps + (clean_loc / bs->dsk.data_block_size)*2*bs->dsk.clean_entry_bitmap_size;
memcpy(inmem_bmp, new_clean_bitmap, 2*bs->dsk.clean_entry_bitmap_size); memcpy(inmem_bmp, new_clean_bitmap, 2*bs->dsk.clean_entry_bitmap_size);
} }
if (bs->dsk.meta_format >= BLOCKSTORE_META_FORMAT_V2) if (bs->dsk.meta_format >= BLOCKSTORE_META_FORMAT_V2)
@@ -1231,8 +1231,8 @@ bool journal_flusher_co::modify_meta_read(uint64_t meta_loc, flusher_meta_write_
// And yet another option is to use LSM trees for metadata, but it sophisticates everything a lot, // And yet another option is to use LSM trees for metadata, but it sophisticates everything a lot,
// so I'll avoid it as long as I can. // so I'll avoid it as long as I can.
wr.submitted = false; wr.submitted = false;
wr.sector = ((meta_loc >> bs->dsk.block_order) / (bs->dsk.meta_block_size / bs->dsk.clean_entry_size)) * bs->dsk.meta_block_size; wr.sector = ((meta_loc / bs->dsk.data_block_size) / (bs->dsk.meta_block_size / bs->dsk.clean_entry_size)) * bs->dsk.meta_block_size;
wr.pos = ((meta_loc >> bs->dsk.block_order) % (bs->dsk.meta_block_size / bs->dsk.clean_entry_size)); wr.pos = ((meta_loc / bs->dsk.data_block_size) % (bs->dsk.meta_block_size / bs->dsk.clean_entry_size));
if (bs->inmemory_meta) if (bs->inmemory_meta)
{ {
wr.buf = (uint8_t*)bs->metadata_buffer + wr.sector; wr.buf = (uint8_t*)bs->metadata_buffer + wr.sector;
@@ -1292,14 +1292,14 @@ void journal_flusher_co::free_data_blocks()
#ifdef BLOCKSTORE_DEBUG #ifdef BLOCKSTORE_DEBUG
printf("%s block %ju from %jx:%jx v%ju (new location is %ju)\n", printf("%s block %ju from %jx:%jx v%ju (new location is %ju)\n",
used ? "Postpone free" : "Free", used ? "Postpone free" : "Free",
old_clean_loc >> bs->dsk.block_order, old_clean_loc / bs->dsk.data_block_size,
cur.oid.inode, cur.oid.stripe, cur.version, cur.oid.inode, cur.oid.stripe, cur.version,
clean_loc >> bs->dsk.block_order); clean_loc / bs->dsk.data_block_size);
#endif #endif
if (used) if (used)
uo_it->second.was_freed = true; uo_it->second.was_freed = true;
else else
bs->data_alloc->set(old_clean_loc >> bs->dsk.block_order, false); bs->data_alloc->set(old_clean_loc / bs->dsk.data_block_size, false);
} }
if (has_delete) if (has_delete)
{ {
@@ -1309,13 +1309,13 @@ void journal_flusher_co::free_data_blocks()
#ifdef BLOCKSTORE_DEBUG #ifdef BLOCKSTORE_DEBUG
printf("%s block %ju from %jx:%jx v%ju (delete)\n", printf("%s block %ju from %jx:%jx v%ju (delete)\n",
used ? "Postpone free" : "Free", used ? "Postpone free" : "Free",
old_clean_loc >> bs->dsk.block_order, old_clean_loc / bs->dsk.data_block_size,
cur.oid.inode, cur.oid.stripe, cur.version); cur.oid.inode, cur.oid.stripe, cur.version);
#endif #endif
if (used) if (used)
uo_it->second.was_freed = true; uo_it->second.was_freed = true;
else else
bs->data_alloc->set(old_clean_loc >> bs->dsk.block_order, false); bs->data_alloc->set(old_clean_loc / bs->dsk.data_block_size, false);
} }
} }
+7 -7
View File
@@ -372,7 +372,7 @@ bool blockstore_init_meta::handle_meta_block(uint8_t *buf, uint64_t entries_per_
// free the previous block // free the previous block
// here we have to zero out the previous entry because otherwise we'll hit // here we have to zero out the previous entry because otherwise we'll hit
// "tried to overwrite non-zero metadata entry" later // "tried to overwrite non-zero metadata entry" later
uint64_t old_clean_loc = clean_it->second.location >> bs->dsk.block_order; uint64_t old_clean_loc = clean_it->second.location / bs->dsk.data_block_size;
if (bs->inmemory_meta) if (bs->inmemory_meta)
{ {
uint64_t sector = (old_clean_loc / entries_per_block) * bs->dsk.meta_block_size; uint64_t sector = (old_clean_loc / entries_per_block) * bs->dsk.meta_block_size;
@@ -390,7 +390,7 @@ bool blockstore_init_meta::handle_meta_block(uint8_t *buf, uint64_t entries_per_
} }
else else
{ {
entries_to_zero.push_back(clean_it->second.location >> bs->dsk.block_order); entries_to_zero.push_back(clean_it->second.location / bs->dsk.data_block_size);
} }
#ifdef BLOCKSTORE_DEBUG #ifdef BLOCKSTORE_DEBUG
printf("Free block %ju from %jx:%jx v%ju (new location is %ju)\n", printf("Free block %ju from %jx:%jx v%ju (new location is %ju)\n",
@@ -412,7 +412,7 @@ bool blockstore_init_meta::handle_meta_block(uint8_t *buf, uint64_t entries_per_
bs->data_alloc->set(done_cnt+i, true); bs->data_alloc->set(done_cnt+i, true);
clean_db[entry->oid] = (struct clean_entry){ clean_db[entry->oid] = (struct clean_entry){
.version = entry->version, .version = entry->version,
.location = (done_cnt+i) << bs->dsk.block_order, .location = (done_cnt+i) * bs->dsk.data_block_size,
}; };
} }
else else
@@ -1001,7 +1001,7 @@ int blockstore_init_journal::handle_journal_part(void *buf, uint64_t done_pos, u
printf( printf(
"je_big_write%s oid=%jx:%jx ver=%ju loc=%ju\n", "je_big_write%s oid=%jx:%jx ver=%ju loc=%ju\n",
je->type == JE_BIG_WRITE_INSTANT ? "_instant" : "", je->type == JE_BIG_WRITE_INSTANT ? "_instant" : "",
je->big_write.oid.inode, je->big_write.oid.stripe, je->big_write.version, je->big_write.location >> bs->dsk.block_order je->big_write.oid.inode, je->big_write.oid.stripe, je->big_write.version, je->big_write.location / bs->dsk.data_block_size
); );
#endif #endif
auto dirty_it = bs->dirty_db.upper_bound((obj_ver_id){ auto dirty_it = bs->dirty_db.upper_bound((obj_ver_id){
@@ -1064,7 +1064,7 @@ int blockstore_init_journal::handle_journal_part(void *buf, uint64_t done_pos, u
.journal_sector = proc_pos, .journal_sector = proc_pos,
.dyn_data = dyn, .dyn_data = dyn,
}).first; }).first;
if (bs->data_alloc->get(je->big_write.location >> bs->dsk.block_order)) if (bs->data_alloc->get(je->big_write.location / bs->dsk.data_block_size))
{ {
// This is probably a big_write that's already flushed and freed, but it may // This is probably a big_write that's already flushed and freed, but it may
// also indicate a bug. So we remember such entries and recheck them afterwards. // also indicate a bug. So we remember such entries and recheck them afterwards.
@@ -1077,11 +1077,11 @@ int blockstore_init_journal::handle_journal_part(void *buf, uint64_t done_pos, u
#ifdef BLOCKSTORE_DEBUG #ifdef BLOCKSTORE_DEBUG
printf( printf(
"Allocate block (journal) %ju: %jx:%jx v%ju\n", "Allocate block (journal) %ju: %jx:%jx v%ju\n",
je->big_write.location >> bs->dsk.block_order, je->big_write.location / bs->dsk.data_block_size,
ov.oid.inode, ov.oid.stripe, ov.version ov.oid.inode, ov.oid.stripe, ov.version
); );
#endif #endif
bs->data_alloc->set(je->big_write.location >> bs->dsk.block_order, true); bs->data_alloc->set(je->big_write.location / bs->dsk.data_block_size, true);
} }
bs->journal.used_sectors[proc_pos]++; bs->journal.used_sectors[proc_pos]++;
#ifdef BLOCKSTORE_DEBUG #ifdef BLOCKSTORE_DEBUG
+5 -5
View File
@@ -151,7 +151,7 @@ int blockstore_impl_t::fulfill_read(blockstore_op_t *read_op,
uint8_t* blockstore_impl_t::get_clean_entry_bitmap(uint64_t block_loc, int offset) uint8_t* blockstore_impl_t::get_clean_entry_bitmap(uint64_t block_loc, int offset)
{ {
uint8_t *clean_entry_bitmap; uint8_t *clean_entry_bitmap;
uint64_t meta_loc = block_loc >> dsk.block_order; uint64_t meta_loc = block_loc / dsk.data_block_size;
if (inmemory_meta) if (inmemory_meta)
{ {
uint64_t sector = (meta_loc / (dsk.meta_block_size / dsk.clean_entry_size)) * dsk.meta_block_size; uint64_t sector = (meta_loc / (dsk.meta_block_size / dsk.clean_entry_size)) * dsk.meta_block_size;
@@ -691,8 +691,8 @@ bool blockstore_impl_t::fulfill_clean_read(blockstore_op_t *read_op, uint64_t &
uint8_t* blockstore_impl_t::read_clean_meta_block(blockstore_op_t *op, uint64_t clean_loc, int rv_pos) uint8_t* blockstore_impl_t::read_clean_meta_block(blockstore_op_t *op, uint64_t clean_loc, int rv_pos)
{ {
auto & rv = PRIV(op)->read_vec; auto & rv = PRIV(op)->read_vec;
auto sector = ((clean_loc >> dsk.block_order) / (dsk.meta_block_size / dsk.clean_entry_size)) * dsk.meta_block_size; auto sector = ((clean_loc / dsk.data_block_size) / (dsk.meta_block_size / dsk.clean_entry_size)) * dsk.meta_block_size;
auto pos = ((clean_loc >> dsk.block_order) % (dsk.meta_block_size / dsk.clean_entry_size)) * dsk.clean_entry_size; auto pos = ((clean_loc / dsk.data_block_size) % (dsk.meta_block_size / dsk.clean_entry_size)) * dsk.clean_entry_size;
uint8_t *buf = (uint8_t*)memalign_or_die(MEM_ALIGNMENT, dsk.meta_block_size); uint8_t *buf = (uint8_t*)memalign_or_die(MEM_ALIGNMENT, dsk.meta_block_size);
rv.insert(rv.begin()+rv_pos, (copy_buffer_t){ rv.insert(rv.begin()+rv_pos, (copy_buffer_t){
.copy_flags = COPY_BUF_META_BLOCK|COPY_BUF_CSUM_FILL, .copy_flags = COPY_BUF_META_BLOCK|COPY_BUF_CSUM_FILL,
@@ -806,7 +806,7 @@ bool blockstore_impl_t::verify_clean_padded_checksums(blockstore_op_t *op, uint6
uint32_t offset = clean_loc % dsk.data_block_size; uint32_t offset = clean_loc % dsk.data_block_size;
if (from_journal) if (from_journal)
return verify_padded_checksums(dyn_data, dyn_data + dsk.clean_entry_bitmap_size, offset, iov, n_iov, bad_block_cb); return verify_padded_checksums(dyn_data, dyn_data + dsk.clean_entry_bitmap_size, offset, iov, n_iov, bad_block_cb);
clean_loc = (clean_loc >> dsk.block_order) << dsk.block_order; clean_loc = (clean_loc / dsk.data_block_size) * dsk.data_block_size;
if (!dyn_data) if (!dyn_data)
{ {
assert(inmemory_meta); assert(inmemory_meta);
@@ -866,7 +866,7 @@ void blockstore_impl_t::handle_read_event(ring_data_t *data, blockstore_op_t *op
{ {
// BIG_WRITE from journal or clean data // BIG_WRITE from journal or clean data
// Do not verify checksums if the data location is/was mutated by flushers // Do not verify checksums if the data location is/was mutated by flushers
auto & uo = used_clean_objects.at((rv[i].disk_offset >> dsk.block_order) << dsk.block_order); auto & uo = used_clean_objects.at((rv[i].disk_offset / dsk.data_block_size) * dsk.data_block_size);
if (!uo.was_changed) if (!uo.was_changed)
{ {
verify_clean_padded_checksums( verify_clean_padded_checksums(
+2 -2
View File
@@ -210,10 +210,10 @@ void blockstore_impl_t::erase_dirty(blockstore_dirty_db_t::iterator dirty_start,
dirty_it->second.location != UINT64_MAX) dirty_it->second.location != UINT64_MAX)
{ {
#ifdef BLOCKSTORE_DEBUG #ifdef BLOCKSTORE_DEBUG
printf("Free block %ju from %jx:%jx v%ju\n", dirty_it->second.location >> dsk.block_order, printf("Free block %ju from %jx:%jx v%ju\n", dirty_it->second.location / dsk.data_block_size,
dirty_it->first.oid.inode, dirty_it->first.oid.stripe, dirty_it->first.version); dirty_it->first.oid.inode, dirty_it->first.oid.stripe, dirty_it->first.version);
#endif #endif
data_alloc->set(dirty_it->second.location >> dsk.block_order, false); data_alloc->set(dirty_it->second.location / dsk.data_block_size, false);
} }
auto used = --journal.used_sectors.at(dirty_it->second.journal_sector); auto used = --journal.used_sectors.at(dirty_it->second.journal_sector);
#ifdef BLOCKSTORE_DEBUG #ifdef BLOCKSTORE_DEBUG
+2 -2
View File
@@ -340,7 +340,7 @@ int blockstore_impl_t::dequeue_write(blockstore_op_t *op)
} }
BS_SUBMIT_GET_SQE(sqe, data); BS_SUBMIT_GET_SQE(sqe, data);
write_iodepth++; write_iodepth++;
dirty_it->second.location = loc << dsk.block_order; dirty_it->second.location = loc * dsk.data_block_size;
dirty_it->second.state = (dirty_it->second.state & ~BS_ST_WORKFLOW_MASK) | BS_ST_SUBMITTED; dirty_it->second.state = (dirty_it->second.state & ~BS_ST_WORKFLOW_MASK) | BS_ST_SUBMITTED;
#ifdef BLOCKSTORE_DEBUG #ifdef BLOCKSTORE_DEBUG
printf( printf(
@@ -366,7 +366,7 @@ int blockstore_impl_t::dequeue_write(blockstore_op_t *op)
data->iov.iov_len = op->len + stripe_offset + stripe_end; // to check it in the callback data->iov.iov_len = op->len + stripe_offset + stripe_end; // to check it in the callback
data->callback = [this, op](ring_data_t *data) { handle_write_event(data, op); }; data->callback = [this, op](ring_data_t *data) { handle_write_event(data, op); };
io_uring_prep_writev( io_uring_prep_writev(
sqe, dsk.data_fd, PRIV(op)->iov_zerofill, vcnt, dsk.data_offset + (loc << dsk.block_order) + op->offset - stripe_offset sqe, dsk.data_fd, PRIV(op)->iov_zerofill, vcnt, dsk.data_offset + (loc * dsk.data_block_size) + op->offset - stripe_offset
); );
PRIV(op)->pending_ops = 1; PRIV(op)->pending_ops = 1;
if (!(dirty_it->second.state & BS_ST_INSTANT)) if (!(dirty_it->second.state & BS_ST_INSTANT))