Add backwards compatibility with non-checksum metadata and journal formats

This commit is contained in:
Vitaliy Filippov
2023-07-13 01:49:45 +03:00
parent 7a530346a6
commit 1adf77f8fb
4 changed files with 80 additions and 21 deletions
+17 -1
View File
@@ -193,7 +193,23 @@ void blockstore_disk_t::calc_lengths(bool skip_meta_check)
meta_len = (1 + (block_count - 1 + meta_block_size / clean_entry_size) / (meta_block_size / clean_entry_size)) * meta_block_size;
if (!skip_meta_check && meta_area_size < meta_len)
{
throw std::runtime_error("Metadata area is too small, need at least "+std::to_string(meta_len)+" bytes");
if (!data_csum_type && !meta_version)
{
uint64_t clean_entry_v0_size = sizeof(clean_disk_entry) + 2*clean_entry_bitmap_size;
uint64_t meta_v0_len = (1 + (block_count - 1 + meta_block_size / clean_entry_v0_size)
/ (meta_block_size / clean_entry_v0_size)) * meta_block_size;
if (meta_area_size >= meta_v0_len)
{
// Old metadata fits.
clean_entry_size = clean_entry_v0_size;
meta_len = meta_v0_len;
meta_version = BLOCKSTORE_META_VERSION_V1;
}
}
if (meta_area_size < meta_len)
{
throw std::runtime_error("Metadata area is too small, need at least "+std::to_string(meta_len)+" bytes");
}
}
// requested journal size
if (!skip_meta_check && cfg_journal_size > journal_len)