From 8b35c09e12bcb62958d4c4af4f818c5a412807ce Mon Sep 17 00:00:00 2001 From: Vitaliy Filippov Date: Fri, 8 Aug 2025 21:13:33 +0300 Subject: [PATCH] Fix vitastor-disk prepare and param validation --- src/blockstore/blockstore_heap.cpp | 2 ++ src/blockstore/blockstore_impl.cpp | 7 ++++++- src/blockstore/blockstore_impl.h | 1 + src/blockstore/blockstore_init.cpp | 3 ++- src/disk_tool/disk_tool_prepare.cpp | 11 +++++++---- 5 files changed, 18 insertions(+), 6 deletions(-) diff --git a/src/blockstore/blockstore_heap.cpp b/src/blockstore/blockstore_heap.cpp index 7ea56a01..336f4502 100644 --- a/src/blockstore/blockstore_heap.cpp +++ b/src/blockstore/blockstore_heap.cpp @@ -162,6 +162,8 @@ blockstore_heap_t::blockstore_heap_t(blockstore_disk_t *dsk, uint8_t *buffer_are { assert(target_block_free_space < dsk->meta_block_size); assert(dsk->meta_block_size < 32768); + assert(dsk->meta_area_size > 0); + assert(dsk->journal_len > 0); assert(sizeof(heap_object_t) < sizeof(heap_write_t)); meta_alloc = new multilist_index_t(meta_block_count, 1 + dsk->meta_block_size/MIN_ALLOC, 0); block_info.resize(meta_block_count); diff --git a/src/blockstore/blockstore_impl.cpp b/src/blockstore/blockstore_impl.cpp index 7914d8e0..a1713a7d 100644 --- a/src/blockstore/blockstore_impl.cpp +++ b/src/blockstore/blockstore_impl.cpp @@ -30,6 +30,10 @@ blockstore_impl_t::blockstore_impl_t(blockstore_config_t & config, ring_loop_i * } meta_superblock = (uint8_t*)memalign_or_die(MEM_ALIGNMENT, dsk.meta_block_size); memset(meta_superblock, 0, dsk.meta_block_size); +} + +void blockstore_impl_t::init() +{ flusher = new journal_flusher_t(this); if (dsk.inmemory_journal) { @@ -40,11 +44,12 @@ blockstore_impl_t::blockstore_impl_t(blockstore_config_t & config, ring_loop_i * blockstore_impl_t::~blockstore_impl_t() { + if (flusher) + delete flusher; if (heap) delete heap; if (buffer_area) free(buffer_area); - delete flusher; if (meta_superblock) free(meta_superblock); if (zero_object) diff --git a/src/blockstore/blockstore_impl.h b/src/blockstore/blockstore_impl.h index db7bd698..67a19d0f 100644 --- a/src/blockstore/blockstore_impl.h +++ b/src/blockstore/blockstore_impl.h @@ -146,6 +146,7 @@ public: int metadata_buf_size; blockstore_init_meta* metadata_init_reader; + void init(); void check_wait(blockstore_op_t *op); void init_op(blockstore_op_t *op); diff --git a/src/blockstore/blockstore_init.cpp b/src/blockstore/blockstore_init.cpp index 4a7f45b3..4202ce92 100644 --- a/src/blockstore/blockstore_init.cpp +++ b/src/blockstore/blockstore_init.cpp @@ -147,7 +147,6 @@ resume_1: ); exit(1); } - bs->heap->set_compacted_lsn(hdr->compacted_lsn); if (bs->dsk.meta_format != hdr->version) { bs->dsk.meta_format = hdr->version; @@ -155,6 +154,8 @@ resume_1: } bs->dsk.check_lengths(); } + bs->init(); + bs->heap->set_compacted_lsn(((blockstore_meta_header_v3_t *)bs->meta_superblock)->compacted_lsn); if (bs->dsk.inmemory_journal) { // Read buffer area diff --git a/src/disk_tool/disk_tool_prepare.cpp b/src/disk_tool/disk_tool_prepare.cpp index 842c28b2..f27e65a6 100644 --- a/src/disk_tool/disk_tool_prepare.cpp +++ b/src/disk_tool/disk_tool_prepare.cpp @@ -118,15 +118,18 @@ int disk_tool_t::prepare_one(std::map options, int is_ try { dsk.parse_config(options); - // Set all offsets to 4096 to calculate metadata size with excess + // Calculate metadata sizes (with excess) dsk.journal_offset = 4096; - dsk.meta_offset = 4096; - dsk.data_offset = 4096; + dsk.meta_offset = 4096 + (dsk.meta_device == dsk.journal_device ? dsk.cfg_journal_size : 0); + dsk.data_offset = 4096 + (dsk.data_device == dsk.meta_device && new_meta_len ? new_meta_len : 0) + + (dsk.data_device == dsk.journal_device ? dsk.cfg_journal_size : 0); dsk.data_io = dsk.meta_io = dsk.journal_io = (options["io"] == "cached" ? "cached" : "direct"); dsk.open_data(); dsk.open_meta(); dsk.open_journal(); dsk.calc_lengths(); + dsk.data_offset += (new_meta_len ? 0 : (dsk.meta_format == BLOCKSTORE_META_FORMAT_HEAP ? dsk.min_meta_len*2 : dsk.min_meta_len)); + dsk.meta_area_size = (dsk.data_device == dsk.meta_device ? dsk.data_offset : dsk.meta_device_size) - dsk.meta_offset; sb = json11::Json::object { { "meta_format", options["meta_format"] }, { "data_device", options["data_device"] }, @@ -141,7 +144,7 @@ int disk_tool_t::prepare_one(std::map options, int is_ { "disable_device_lock", dsk.disable_flock }, { "journal_offset", 4096 }, { "meta_offset", dsk.meta_offset }, - { "data_offset", dsk.data_offset + (new_meta_len ? 0 : (dsk.meta_format == BLOCKSTORE_META_FORMAT_HEAP ? dsk.min_meta_len*2 : dsk.min_meta_len)) }, + { "data_offset", dsk.data_offset }, { "journal_no_same_sector_overwrites", !is_hdd || is_hybrid }, { "journal_sector_buffer_count", 1024 }, { "disable_data_fsync", json_is_true(options["disable_data_fsync"]) },