Fix vitastor-disk prepare and param validation
This commit is contained in:
@@ -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(target_block_free_space < dsk->meta_block_size);
|
||||||
assert(dsk->meta_block_size < 32768);
|
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));
|
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);
|
meta_alloc = new multilist_index_t(meta_block_count, 1 + dsk->meta_block_size/MIN_ALLOC, 0);
|
||||||
block_info.resize(meta_block_count);
|
block_info.resize(meta_block_count);
|
||||||
|
|||||||
@@ -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);
|
meta_superblock = (uint8_t*)memalign_or_die(MEM_ALIGNMENT, dsk.meta_block_size);
|
||||||
memset(meta_superblock, 0, dsk.meta_block_size);
|
memset(meta_superblock, 0, dsk.meta_block_size);
|
||||||
|
}
|
||||||
|
|
||||||
|
void blockstore_impl_t::init()
|
||||||
|
{
|
||||||
flusher = new journal_flusher_t(this);
|
flusher = new journal_flusher_t(this);
|
||||||
if (dsk.inmemory_journal)
|
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()
|
blockstore_impl_t::~blockstore_impl_t()
|
||||||
{
|
{
|
||||||
|
if (flusher)
|
||||||
|
delete flusher;
|
||||||
if (heap)
|
if (heap)
|
||||||
delete heap;
|
delete heap;
|
||||||
if (buffer_area)
|
if (buffer_area)
|
||||||
free(buffer_area);
|
free(buffer_area);
|
||||||
delete flusher;
|
|
||||||
if (meta_superblock)
|
if (meta_superblock)
|
||||||
free(meta_superblock);
|
free(meta_superblock);
|
||||||
if (zero_object)
|
if (zero_object)
|
||||||
|
|||||||
@@ -146,6 +146,7 @@ public:
|
|||||||
int metadata_buf_size;
|
int metadata_buf_size;
|
||||||
blockstore_init_meta* metadata_init_reader;
|
blockstore_init_meta* metadata_init_reader;
|
||||||
|
|
||||||
|
void init();
|
||||||
void check_wait(blockstore_op_t *op);
|
void check_wait(blockstore_op_t *op);
|
||||||
void init_op(blockstore_op_t *op);
|
void init_op(blockstore_op_t *op);
|
||||||
|
|
||||||
|
|||||||
@@ -147,7 +147,6 @@ resume_1:
|
|||||||
);
|
);
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
bs->heap->set_compacted_lsn(hdr->compacted_lsn);
|
|
||||||
if (bs->dsk.meta_format != hdr->version)
|
if (bs->dsk.meta_format != hdr->version)
|
||||||
{
|
{
|
||||||
bs->dsk.meta_format = hdr->version;
|
bs->dsk.meta_format = hdr->version;
|
||||||
@@ -155,6 +154,8 @@ resume_1:
|
|||||||
}
|
}
|
||||||
bs->dsk.check_lengths();
|
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)
|
if (bs->dsk.inmemory_journal)
|
||||||
{
|
{
|
||||||
// Read buffer area
|
// Read buffer area
|
||||||
|
|||||||
@@ -118,15 +118,18 @@ int disk_tool_t::prepare_one(std::map<std::string, std::string> options, int is_
|
|||||||
try
|
try
|
||||||
{
|
{
|
||||||
dsk.parse_config(options);
|
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.journal_offset = 4096;
|
||||||
dsk.meta_offset = 4096;
|
dsk.meta_offset = 4096 + (dsk.meta_device == dsk.journal_device ? dsk.cfg_journal_size : 0);
|
||||||
dsk.data_offset = 4096;
|
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.data_io = dsk.meta_io = dsk.journal_io = (options["io"] == "cached" ? "cached" : "direct");
|
||||||
dsk.open_data();
|
dsk.open_data();
|
||||||
dsk.open_meta();
|
dsk.open_meta();
|
||||||
dsk.open_journal();
|
dsk.open_journal();
|
||||||
dsk.calc_lengths();
|
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 {
|
sb = json11::Json::object {
|
||||||
{ "meta_format", options["meta_format"] },
|
{ "meta_format", options["meta_format"] },
|
||||||
{ "data_device", options["data_device"] },
|
{ "data_device", options["data_device"] },
|
||||||
@@ -141,7 +144,7 @@ int disk_tool_t::prepare_one(std::map<std::string, std::string> options, int is_
|
|||||||
{ "disable_device_lock", dsk.disable_flock },
|
{ "disable_device_lock", dsk.disable_flock },
|
||||||
{ "journal_offset", 4096 },
|
{ "journal_offset", 4096 },
|
||||||
{ "meta_offset", dsk.meta_offset },
|
{ "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_no_same_sector_overwrites", !is_hdd || is_hybrid },
|
||||||
{ "journal_sector_buffer_count", 1024 },
|
{ "journal_sector_buffer_count", 1024 },
|
||||||
{ "disable_data_fsync", json_is_true(options["disable_data_fsync"]) },
|
{ "disable_data_fsync", json_is_true(options["disable_data_fsync"]) },
|
||||||
|
|||||||
Reference in New Issue
Block a user