diff --git a/blockstore_flush.cpp b/blockstore_flush.cpp index 1c5bb5f2..95ea9bd4 100644 --- a/blockstore_flush.cpp +++ b/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()) { diff --git a/blockstore_init.cpp b/blockstore_init.cpp index afb6c8f4..2c493a3e 100644 --- a/blockstore_init.cpp +++ b/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, diff --git a/blockstore_open.cpp b/blockstore_open.cpp index 284d8021..1f3e7d47 100644 --- a/blockstore_open.cpp +++ b/blockstore_open.cpp @@ -37,7 +37,7 @@ void blockstore::calc_lengths(spp::sparse_hash_map & 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"); diff --git a/blockstore_write.cpp b/blockstore_write.cpp index 1467492b..b383e131 100644 --- a/blockstore_write.cpp +++ b/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;