Browse Source

Fix metadata partition length, fix journal allocation at the end

blocking-uring-test
Vitaliy Filippov 3 years ago
parent
commit
2630e2e3b9
  1. 16
      blockstore_flush.cpp
  2. 7
      blockstore_init.cpp
  3. 2
      blockstore_open.cpp
  4. 2
      blockstore_write.cpp

16
blockstore_flush.cpp

@ -249,7 +249,12 @@ resume_0:
if (old_clean_loc == UINT64_MAX)
{
// Object not present at all. This is a bug.
throw std::runtime_error("BUG: Object we are trying to flush is not allocated on the data device");
char err[1024];
snprintf(
err, 1024, "BUG: Object %lu:%lu v%lu that we are trying to flush is not allocated on the data device",
cur.oid.inode, cur.oid.stripe, cur.version
);
throw std::runtime_error(err);
}
else
clean_loc = old_clean_loc;
@ -279,7 +284,7 @@ resume_0:
if (data->res != data->iov.iov_len)
{
throw std::runtime_error(
"write operation failed ("+std::to_string(data->res)+" != "+std::to_string(data->iov.iov_len)+
"metadata read operation failed ("+std::to_string(data->res)+" != "+std::to_string(data->iov.iov_len)+
"). in-memory state is corrupted. AAAAAAAaaaaaaaaa!!!111"
);
}
@ -440,9 +445,12 @@ resume_0:
flusher->journal_trim_counter = 0;
journal_used_it = bs->journal.used_sectors.lower_bound(bs->journal.used_start);
#ifdef BLOCKSTORE_DEBUG
printf("Trimming journal (used_start=%lu, next_free=%lu, first_used=%lu, usage_count=%lu)\n", bs->journal.used_start, bs->journal.next_free,
printf(
"Trimming journal (used_start=%lu, next_free=%lu, first_used=%lu, usage_count=%lu)\n",
bs->journal.used_start, bs->journal.next_free,
journal_used_it == bs->journal.used_sectors.end() ? 0 : journal_used_it->first,
journal_used_it == bs->journal.used_sectors.end() ? 0 : journal_used_it->second);
journal_used_it == bs->journal.used_sectors.end() ? 0 : journal_used_it->second
);
#endif
if (journal_used_it == bs->journal.used_sectors.end())
{

7
blockstore_init.cpp

@ -85,6 +85,9 @@ void blockstore_init_meta::handle_entries(struct clean_disk_entry* entries, int
if (entries[i].oid.inode > 0)
{
auto clean_it = bs->clean_db.find(entries[i].oid);
#ifdef BLOCKSTORE_DEBUG
printf("Clean entry %lu: %lu:%lu v%lu\n", done_cnt+i, entries[i].oid.inode, entries[i].oid.stripe, entries[i].version);
#endif
if (clean_it == bs->clean_db.end() || clean_it->second.version < entries[i].version)
{
if (clean_it != bs->clean_db.end())
@ -338,7 +341,9 @@ int blockstore_init_journal::handle_journal_part(void *buf, uint64_t len)
}
if (location != je->small_write.data_offset)
{
throw std::runtime_error("BUG: calculated journal data offset != stored journal data offset");
char err[1024];
snprintf(err, 1024, "BUG: calculated journal data offset (%lu) != stored journal data offset (%lu)", location, je->small_write.data_offset);
throw std::runtime_error(err);
}
obj_ver_id ov = {
.oid = je->small_write.oid,

2
blockstore_open.cpp

@ -37,7 +37,7 @@ void blockstore::calc_lengths(spp::sparse_hash_map<std::string, std::string> & c
}
// required metadata size
block_count = data_len / block_size;
meta_len = block_count * sizeof(clean_disk_entry);
meta_len = (block_count / (512 / sizeof(clean_disk_entry))) * 512;
if (meta_area < meta_len)
{
throw std::runtime_error("Metadata area is too small");

2
blockstore_write.cpp

@ -126,7 +126,7 @@ int blockstore::dequeue_write(blockstore_operation *op)
printf("journal offset %lu is used by %lu:%lu v%lu\n", dirty_it->second.journal_sector, dirty_it->first.oid.inode, dirty_it->first.oid.stripe, dirty_it->first.version);
#endif
// Figure out where data will be
journal.next_free = (journal.next_free + op->len) < journal.len ? journal.next_free : 512;
journal.next_free = (journal.next_free + op->len) <= journal.len ? journal.next_free : 512;
je->oid = op->oid;
je->version = op->version;
je->offset = op->offset;

Loading…
Cancel
Save