diff --git a/.gitea/workflows/test.yml b/.gitea/workflows/test.yml index 5bd0a96e..d15cc0fb 100644 --- a/.gitea/workflows/test.yml +++ b/.gitea/workflows/test.yml @@ -1530,6 +1530,24 @@ jobs: echo "" done + test_resize_last: + runs-on: ubuntu-latest + needs: build + container: ${{env.TEST_IMAGE}}:${{github.sha}} + steps: + - name: Run test + id: test + timeout-minutes: 3 + run: /root/vitastor/tests/test_resize_last.sh + - name: Print logs + if: always() && steps.test.outcome == 'failure' + run: | + for i in /root/vitastor/testdata/*.log /root/vitastor/testdata/*.txt; do + echo "-------- $i --------" + cat $i + echo "" + done + test_resize_auto: runs-on: ubuntu-latest needs: build @@ -1566,6 +1584,24 @@ jobs: echo "" done + test_old_resize_last: + runs-on: ubuntu-latest + needs: build + container: ${{env.TEST_IMAGE}}:${{github.sha}} + steps: + - name: Run test + id: test + timeout-minutes: 3 + run: OLD=1 /root/vitastor/tests/test_resize_last.sh + - name: Print logs + if: always() && steps.test.outcome == 'failure' + run: | + for i in /root/vitastor/testdata/*.log /root/vitastor/testdata/*.txt; do + echo "-------- $i --------" + cat $i + echo "" + done + test_old_resize_auto: runs-on: ubuntu-latest needs: build diff --git a/src/disk_tool/disk_tool_resize.cpp b/src/disk_tool/disk_tool_resize.cpp index df59214b..e553538f 100644 --- a/src/disk_tool/disk_tool_resize.cpp +++ b/src/disk_tool/disk_tool_resize.cpp @@ -213,7 +213,8 @@ void disk_tool_t::resize_init(blockstore_meta_header_v3_t *hdr) data_idx_diff = ((int64_t)(dsk.data_offset-new_data_offset))/((int64_t)dsk.data_block_size); free_first = new_data_offset > dsk.data_offset ? (new_data_offset-dsk.data_offset) / dsk.data_block_size : 0; free_last = (new_data_offset+new_data_len < dsk.data_offset+dsk.data_len) - ? (dsk.data_offset+dsk.data_len-new_data_offset-new_data_len) / dsk.data_block_size + ? ((dsk.data_offset-new_data_offset)/dsk.data_block_size + + dsk.data_len/dsk.data_block_size - new_data_len/dsk.data_block_size) : 0; uint32_t new_clean_entry_header_size = sizeof(clean_disk_entry) + 4 /*entry_csum*/; new_clean_entry_bitmap_size = dsk.data_block_size / (hdr ? hdr->bitmap_granularity : 4096) / 8; diff --git a/tests/run_tests.sh b/tests/run_tests.sh index 1130c742..c9234c96 100755 --- a/tests/run_tests.sh +++ b/tests/run_tests.sh @@ -118,9 +118,11 @@ TEST_NAME=csum_4k_dj OSD_ARGS="--data_csum_type crc32c --inmemory_journal fals TEST_NAME=csum_4k OSD_ARGS="--data_csum_type crc32c" OFFSET_ARGS=$OSD_ARGS ./test_heal.sh ./test_resize.sh +./test_resize_last.sh ./test_resize_auto.sh OLD=1 ./test_resize.sh +OLD=1 ./test_resize_last.sh OLD=1 ./test_resize_auto.sh ./test_osd_tags.sh diff --git a/tests/test_resize.sh b/tests/test_resize.sh index fde7b379..e0af7c8d 100755 --- a/tests/test_resize.sh +++ b/tests/test_resize.sh @@ -29,12 +29,11 @@ for i in $(seq 1 $OSD_COUNT); do data_offset=$(echo $offsets | jq -r .data_offset) 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 + new_data_offset=$((128*1024*1024 + data_offset%131072)) build/src/disk_tool/vitastor-disk raw-resize --io cached \ $opts \ --new_meta_offset 0 \ diff --git a/tests/test_resize_last.sh b/tests/test_resize_last.sh new file mode 100755 index 00000000..5d24cd13 --- /dev/null +++ b/tests/test_resize_last.sh @@ -0,0 +1,50 @@ +#!/bin/bash -ex + +PG_COUNT=1 +PG_SIZE=1 +PG_MINSIZE=1 +SCHEME=replicated +OSD_COUNT=1 +. `dirname $0`/run_3osds.sh + +kill -9 $OSD1_PID +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) +data_len=$((1024*1024*1024 - data_offset)) +last_block=$((data_len/128/1024 - 1)) + +if [[ "$meta_format" = "3" ]]; then + cat >>./testdata/meta.json <./testdata/meta1.json + if ! jq -s -e '(.[0].entries | length) == 1 and .[0].entries[0].writes[0].location < '$((last_block*128*1024)) <./testdata/meta1.json; then + format_error "Last block not moved" + fi +else + cat >>./testdata/meta.json <./testdata/meta1.json + if ! jq -s -e '(.[0].entries | length) == 1 and .[0].entries[0].block < '$last_block <./testdata/meta1.json; then + format_error "Last block not moved" + fi +fi + +format_green OK