diff --git a/src/disk_tool/disk_tool.cpp b/src/disk_tool/disk_tool.cpp index c5c854ae..95c23a11 100644 --- a/src/disk_tool/disk_tool.cpp +++ b/src/disk_tool/disk_tool.cpp @@ -370,7 +370,7 @@ int main(int argc, char *argv[]) self.dsk.meta_device = cmd[1]; self.dsk.meta_block_size = strtoul(cmd[2], NULL, 10); self.dsk.meta_offset = strtoull(cmd[3], NULL, 10); - self.dsk.meta_area_size = strtoull(cmd[4], NULL, 10); + self.dsk.min_meta_len = self.dsk.meta_area_size = strtoull(cmd[4], NULL, 10); } else if (cmd.size() == 2) { diff --git a/src/disk_tool/disk_tool_meta.cpp b/src/disk_tool/disk_tool_meta.cpp index 998c8240..4bf16f71 100644 --- a/src/disk_tool/disk_tool_meta.cpp +++ b/src/disk_tool/disk_tool_meta.cpp @@ -121,9 +121,6 @@ close_error: } else if (hdr->zero == 0 && hdr->magic == BLOCKSTORE_META_MAGIC_V1) { - dsk.meta_format = hdr->version; - dsk.calc_lengths(); - dsk.check_lengths(); if (hdr->version == BLOCKSTORE_META_FORMAT_V1) { // Vitastor 0.6-0.8 - static array of clean_disk_entry with bitmaps @@ -207,9 +204,9 @@ csum_unknown: uint64_t meta_pos = 0; uint64_t block_num = 0; hdr_fn(NULL); - while (meta_pos < dsk.meta_area_size) + while (meta_pos < dsk.min_meta_len) { - uint64_t read_len = buf_size < dsk.meta_area_size-meta_pos ? buf_size : dsk.meta_area_size-meta_pos; + uint64_t read_len = buf_size < dsk.min_meta_len-meta_pos ? buf_size : dsk.min_meta_len-meta_pos; read_blocking(dsk.meta_fd, data, read_len); meta_pos += read_len; for (uint64_t blk = 0; blk < read_len; blk += dsk.meta_block_size) diff --git a/tests/test_resize.sh b/tests/test_resize.sh index d3b2c99e..fd6c1b62 100755 --- a/tests/test_resize.sh +++ b/tests/test_resize.sh @@ -24,35 +24,49 @@ for i in $(seq 1 $OSD_COUNT); do done for i in $(seq 1 $OSD_COUNT); do - offsets=$(build/src/disk_tool/vitastor-disk simple-offsets --format json ./testdata/bin/test_osd$i.bin) - opts=$(build/src/disk_tool/vitastor-disk simple-offsets --format options ./testdata/bin/test_osd$i.bin) + offsets=$(build/src/disk_tool/vitastor-disk simple-offsets --format json ./testdata/bin/test_osd$i.bin $OFFSET_ARGS) + opts=$(build/src/disk_tool/vitastor-disk simple-offsets --format options ./testdata/bin/test_osd$i.bin $OFFSET_ARGS) meta_format=$(echo $offsets | jq -r .meta_format) meta_offset=$(echo $offsets | jq -r .meta_offset) data_offset=$(echo $offsets | jq -r .data_offset) - #build/src/disk_tool/vitastor-disk dump-journal --io cached --json ./testdata/bin/test_osd$i.bin 4096 0 $meta_offset >./testdata/journal_before_resize.json - #build/src/disk_tool/vitastor-disk dump-meta --io cached ./testdata/bin/test_osd$i.bin 4096 $meta_offset $((data_offset-meta_offset)) >./testdata/meta_before_resize.json - build/src/disk_tool/vitastor-disk dump-meta --io cached $opts >./testdata/meta_before_resize.json - new_data_offset=$((128*1024*1024+data_offset%131072)) + if [[ "$meta_format" = "3" ]]; then + build/src/disk_tool/vitastor-disk dump-meta --io cached $opts >./testdata/meta_before_resize.json + new_data_offset=$((128*1024*1024+data_offset%131072)) + else + build/src/disk_tool/vitastor-disk dump-journal --io cached --json ./testdata/bin/test_osd$i.bin 4096 0 $meta_offset >./testdata/journal_before_resize.json + build/src/disk_tool/vitastor-disk dump-meta --io cached ./testdata/bin/test_osd$i.bin 4096 $meta_offset $((data_offset-meta_offset)) >./testdata/meta_before_resize.json + new_data_offset=$((128*1024*1024+32768)) + fi build/src/disk_tool/vitastor-disk raw-resize --io cached \ $opts \ --new_meta_offset 0 \ --new_meta_len $((1024*1024)) \ --new_journal_offset $((1024*1024)) \ --new_data_offset $new_data_offset - #build/src/disk_tool/vitastor-disk dump-journal --io cached --json ./testdata/bin/test_osd$i.bin 4096 $((1024*1024)) $((127*1024*1024)) >./testdata/journal_after_resize.json - build/src/disk_tool/vitastor-disk dump-meta --io cached $opts \ - --meta_offset 0 \ - --meta_len $((1024*1024)) \ - --journal_offset $((1024*1024)) \ - --data_offset $new_data_offset >./testdata/meta_after_resize.json + if [[ "$meta_format" = "3" ]]; then + build/src/disk_tool/vitastor-disk dump-meta --io cached $opts \ + --meta_offset 0 \ + --meta_len $((1024*1024)) \ + --journal_offset $((1024*1024)) \ + --data_offset $new_data_offset >./testdata/meta_after_resize.json + else + build/src/disk_tool/vitastor-disk dump-journal --io cached --json ./testdata/bin/test_osd$i.bin 4096 $((1024*1024)) $((127*1024*1024)) >./testdata/journal_after_resize.json + build/src/disk_tool/vitastor-disk dump-meta --io cached ./testdata/bin/test_osd$i.bin 4096 0 $((1024*1024)) >./testdata/meta_after_resize.json + fi + RMBLOCK=".block" + if [[ "$meta_format" = "3" ]]; then + RMBLOCK=".writes[].location" + fi if ! (cat ./testdata/meta_before_resize.json ./testdata/meta_after_resize.json | \ - jq -e -s 'map([ .entries[] | del(.block, .writes[].location) ] | sort_by(.pool, .inode, .stripe)) | .[0] == .[1] and (.[0] | length) > 1000'); then + jq -e -s 'map([ .entries[] | del('"$RMBLOCK"') ] | sort_by(.pool, .inode, .stripe)) | .[0] == .[1] and (.[0] | length) > 1000'); then format_error "OSD $i metadata corrupted after resizing" fi - #if ! (cat ./testdata/journal_before_resize.json ./testdata/journal_after_resize.json | \ - # jq -e -s 'map([ .[] | del(.crc32, .crc32_prev, .valid, .loc, .start) ]) | .[0] == .[1] and (.[0] | length) > 1'); then - # format_error "OSD $i journal corrupted after resizing" - #fi + if [[ "$meta_format" != "3" ]]; then + if ! (cat ./testdata/journal_before_resize.json ./testdata/journal_after_resize.json | \ + jq -e -s 'map([ .[] | del(.crc32, .crc32_prev, .valid, .loc, .start) ]) | .[0] == .[1] and (.[0] | length) > 1'); then + format_error "OSD $i journal corrupted after resizing" + fi + fi done $ETCDCTL del --prefix /vitastor/osd/state/