Compare commits
3 Commits
c2e7c28672
...
27ebe5082d
Author | SHA1 | Date |
---|---|---|
Vitaliy Filippov | 27ebe5082d | |
Vitaliy Filippov | ef8c21ad6f | |
Vitaliy Filippov | 2bb8e8999e |
|
@ -828,6 +828,42 @@ jobs:
|
||||||
echo ""
|
echo ""
|
||||||
done
|
done
|
||||||
|
|
||||||
|
test_resize:
|
||||||
|
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.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
|
||||||
|
container: ${{env.TEST_IMAGE}}:${{github.sha}}
|
||||||
|
steps:
|
||||||
|
- name: Run test
|
||||||
|
id: test
|
||||||
|
timeout-minutes: 3
|
||||||
|
run: /root/vitastor/tests/test_resize_auto.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_snapshot_pool2:
|
test_snapshot_pool2:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
needs: build
|
needs: build
|
||||||
|
|
|
@ -431,7 +431,7 @@ struct cli_dd_t
|
||||||
if (read_op->retval < 0)
|
if (read_op->retval < 0)
|
||||||
{
|
{
|
||||||
fprintf(
|
fprintf(
|
||||||
stderr, "Failed to read bitmap for %lu bytes from image %s at offset %lu: %s (code %d)\n",
|
stderr, "Failed to read bitmap for %ju bytes from image %s at offset %ju: %s (code %d)\n",
|
||||||
read_op->len, iinfo.iimg.c_str(), read_op->offset,
|
read_op->len, iinfo.iimg.c_str(), read_op->offset,
|
||||||
strerror(read_op->retval < 0 ? -read_op->retval : EIO), read_op->retval
|
strerror(read_op->retval < 0 ? -read_op->retval : EIO), read_op->retval
|
||||||
);
|
);
|
||||||
|
@ -476,7 +476,7 @@ struct cli_dd_t
|
||||||
if (read_op->retval != read_op->len)
|
if (read_op->retval != read_op->len)
|
||||||
{
|
{
|
||||||
fprintf(
|
fprintf(
|
||||||
stderr, "Failed to read %lu bytes from image %s at offset %lu: %s (code %d)\n",
|
stderr, "Failed to read %ju bytes from image %s at offset %ju: %s (code %d)\n",
|
||||||
read_op->len, iinfo.iimg.c_str(), read_op->offset,
|
read_op->len, iinfo.iimg.c_str(), read_op->offset,
|
||||||
strerror(read_op->retval < 0 ? -read_op->retval : EIO), read_op->retval
|
strerror(read_op->retval < 0 ? -read_op->retval : EIO), read_op->retval
|
||||||
);
|
);
|
||||||
|
@ -547,7 +547,7 @@ struct cli_dd_t
|
||||||
if (data->res < 0)
|
if (data->res < 0)
|
||||||
{
|
{
|
||||||
fprintf(
|
fprintf(
|
||||||
stderr, "Failed to read %lu bytes from %s at offset %lu: %s (code %d)\n",
|
stderr, "Failed to read %ju bytes from %s at offset %ju: %s (code %d)\n",
|
||||||
data->iov.iov_len, iinfo.ifile == "" ? "stdin" : iinfo.ifile.c_str(), cur_read->offset,
|
data->iov.iov_len, iinfo.ifile == "" ? "stdin" : iinfo.ifile.c_str(), cur_read->offset,
|
||||||
strerror(-data->res), data->res
|
strerror(-data->res), data->res
|
||||||
);
|
);
|
||||||
|
@ -644,7 +644,7 @@ struct cli_dd_t
|
||||||
if (write_op->retval != write_op->len)
|
if (write_op->retval != write_op->len)
|
||||||
{
|
{
|
||||||
fprintf(
|
fprintf(
|
||||||
stderr, "Failed to write %lu bytes to image %s at offset %lu: %s (code %d)\n",
|
stderr, "Failed to write %ju bytes to image %s at offset %ju: %s (code %d)\n",
|
||||||
write_op->len, oinfo.oimg.c_str(), write_op->offset,
|
write_op->len, oinfo.oimg.c_str(), write_op->offset,
|
||||||
strerror(write_op->retval < 0 ? -write_op->retval : EIO), write_op->retval
|
strerror(write_op->retval < 0 ? -write_op->retval : EIO), write_op->retval
|
||||||
);
|
);
|
||||||
|
@ -680,7 +680,7 @@ struct cli_dd_t
|
||||||
if (data->res < 0)
|
if (data->res < 0)
|
||||||
{
|
{
|
||||||
fprintf(
|
fprintf(
|
||||||
stderr, "Failed to write %lu bytes to %s at offset %lu: %s (code %d)\n",
|
stderr, "Failed to write %ju bytes to %s at offset %ju: %s (code %d)\n",
|
||||||
data->iov.iov_len, oinfo.ofile == "" ? "stdout" : oinfo.ofile.c_str(),
|
data->iov.iov_len, oinfo.ofile == "" ? "stdout" : oinfo.ofile.c_str(),
|
||||||
oinfo.out_seekable ? cur_read->offset+cur_read->len+oseek : 0,
|
oinfo.out_seekable ? cur_read->offset+cur_read->len+oseek : 0,
|
||||||
strerror(-data->res), data->res
|
strerror(-data->res), data->res
|
||||||
|
@ -727,7 +727,7 @@ struct cli_dd_t
|
||||||
{
|
{
|
||||||
char buf[256];
|
char buf[256];
|
||||||
snprintf(
|
snprintf(
|
||||||
buf, sizeof(buf), "%lu bytes (%s) copied, %.1f s, %sB/s",
|
buf, sizeof(buf), "%ju bytes (%s) copied, %.1f s, %sB/s",
|
||||||
written_size, format_size(written_size).c_str(), sec_total,
|
written_size, format_size(written_size).c_str(), sec_total,
|
||||||
format_size((uint64_t)(written_size/sec_total), true).c_str()
|
format_size((uint64_t)(written_size/sec_total), true).c_str()
|
||||||
);
|
);
|
||||||
|
@ -749,7 +749,7 @@ struct cli_dd_t
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
fprintf(
|
fprintf(
|
||||||
stderr, "\r%lu bytes (%s) copied, %.1f s, %sB/s, avg %sB/s\033[K",
|
stderr, "\r%ju bytes (%s) copied, %.1f s, %sB/s, avg %sB/s\033[K",
|
||||||
written_size, format_size(written_size).c_str(), sec_total,
|
written_size, format_size(written_size).c_str(), sec_total,
|
||||||
format_size((uint64_t)(delta/sec_delta), true).c_str(),
|
format_size((uint64_t)(delta/sec_delta), true).c_str(),
|
||||||
format_size((uint64_t)(written_size/sec_total), true).c_str()
|
format_size((uint64_t)(written_size/sec_total), true).c_str()
|
||||||
|
|
|
@ -170,10 +170,10 @@ void disk_tool_t::resize_init(blockstore_meta_header_v2_t *hdr)
|
||||||
dsk.data_csum_type = hdr->data_csum_type;
|
dsk.data_csum_type = hdr->data_csum_type;
|
||||||
dsk.csum_block_size = hdr->csum_block_size;
|
dsk.csum_block_size = hdr->csum_block_size;
|
||||||
}
|
}
|
||||||
if (((new_data_len-dsk.data_len) % dsk.data_block_size) ||
|
if (((new_data_offset-dsk.data_offset) % dsk.data_block_size))
|
||||||
((new_data_offset-dsk.data_offset) % dsk.data_block_size))
|
|
||||||
{
|
{
|
||||||
fprintf(stderr, "Data alignment mismatch\n");
|
fprintf(stderr, "Data alignment mismatch: old data offset is 0x%jx, new is 0x%jx, but alignment on %x should be equal\n",
|
||||||
|
dsk.data_offset, new_data_offset, dsk.data_block_size);
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
data_idx_diff = ((int64_t)(dsk.data_offset-new_data_offset)) / dsk.data_block_size;
|
data_idx_diff = ((int64_t)(dsk.data_offset-new_data_offset)) / dsk.data_block_size;
|
||||||
|
@ -493,7 +493,7 @@ int disk_tool_t::resize_rewrite_meta()
|
||||||
block_num = remap_it->second;
|
block_num = remap_it->second;
|
||||||
if (block_num < free_first || block_num >= total_blocks-free_last)
|
if (block_num < free_first || block_num >= total_blocks-free_last)
|
||||||
{
|
{
|
||||||
fprintf(stderr, "BUG: remapped block %lu not in range %lu..%lu\n", block_num, free_first, total_blocks-free_last);
|
fprintf(stderr, "BUG: remapped block %ju not in range %ju..%ju\n", block_num, free_first, total_blocks-free_last);
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
block_num += data_idx_diff;
|
block_num += data_idx_diff;
|
||||||
|
|
|
@ -68,6 +68,9 @@ TEST_NAME=csum_4k_dmj OSD_ARGS="--data_csum_type crc32c --inmemory_metadata fal
|
||||||
TEST_NAME=csum_4k_dj OSD_ARGS="--data_csum_type crc32c --inmemory_journal false" OFFSET_ARGS=$OSD_ARGS ./test_heal.sh
|
TEST_NAME=csum_4k_dj OSD_ARGS="--data_csum_type crc32c --inmemory_journal false" OFFSET_ARGS=$OSD_ARGS ./test_heal.sh
|
||||||
TEST_NAME=csum_4k OSD_ARGS="--data_csum_type crc32c" OFFSET_ARGS=$OSD_ARGS ./test_heal.sh
|
TEST_NAME=csum_4k OSD_ARGS="--data_csum_type crc32c" OFFSET_ARGS=$OSD_ARGS ./test_heal.sh
|
||||||
|
|
||||||
|
./test_resize.sh
|
||||||
|
./test_resize_auto.sh
|
||||||
|
|
||||||
./test_snapshot_pool2.sh
|
./test_snapshot_pool2.sh
|
||||||
|
|
||||||
./test_osd_tags.sh
|
./test_osd_tags.sh
|
||||||
|
|
|
@ -28,12 +28,12 @@ for i in $(seq 1 $OSD_COUNT); do
|
||||||
data_offset=$(echo $offsets | jq -r .data_offset)
|
data_offset=$(echo $offsets | jq -r .data_offset)
|
||||||
build/src/disk_tool/vitastor-disk dump-journal --json ./testdata/bin/test_osd$i.bin 4096 0 $meta_offset >./testdata/journal_before_resize.json
|
build/src/disk_tool/vitastor-disk dump-journal --json ./testdata/bin/test_osd$i.bin 4096 0 $meta_offset >./testdata/journal_before_resize.json
|
||||||
build/src/disk_tool/vitastor-disk dump-meta ./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 ./testdata/bin/test_osd$i.bin 4096 $meta_offset $((data_offset-meta_offset)) >./testdata/meta_before_resize.json
|
||||||
build/src/disk_tool/vitastor-disk resize \
|
build/src/disk_tool/vitastor-disk raw-resize \
|
||||||
$(build/src/disk_tool/vitastor-disk simple-offsets --format options ./testdata/bin/test_osd$i.bin 2>/dev/null) \
|
$(build/src/disk_tool/vitastor-disk simple-offsets --format options ./testdata/bin/test_osd$i.bin 2>/dev/null) \
|
||||||
--new_meta_offset 0 \
|
--new_meta_offset 0 \
|
||||||
--new_meta_len $((1024*1024)) \
|
--new_meta_len $((1024*1024)) \
|
||||||
--new_journal_offset $((1024*1024)) \
|
--new_journal_offset $((1024*1024)) \
|
||||||
--new_data_offset $((128*1024*1024))
|
--new_data_offset $((128*1024*1024+32768))
|
||||||
build/src/disk_tool/vitastor-disk dump-journal --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-journal --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 ./testdata/bin/test_osd$i.bin 4096 0 $((1024*1024)) >./testdata/meta_after_resize.json
|
build/src/disk_tool/vitastor-disk dump-meta ./testdata/bin/test_osd$i.bin 4096 0 $((1024*1024)) >./testdata/meta_after_resize.json
|
||||||
if ! (cat ./testdata/meta_before_resize.json ./testdata/meta_after_resize.json | \
|
if ! (cat ./testdata/meta_before_resize.json ./testdata/meta_after_resize.json | \
|
||||||
|
@ -41,7 +41,7 @@ for i in $(seq 1 $OSD_COUNT); do
|
||||||
format_error "OSD $i metadata corrupted after resizing"
|
format_error "OSD $i metadata corrupted after resizing"
|
||||||
fi
|
fi
|
||||||
if ! (cat ./testdata/journal_before_resize.json ./testdata/journal_after_resize.json | \
|
if ! (cat ./testdata/journal_before_resize.json ./testdata/journal_after_resize.json | \
|
||||||
jq -e -s 'map([ .[].entries[] | del(.crc32, .crc32_prev, .valid, .loc, .start) ]) | .[0] == .[1] and (.[0] | length) > 1'); then
|
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"
|
format_error "OSD $i journal corrupted after resizing"
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
|
@ -53,7 +53,7 @@ for i in $(seq 1 $OSD_COUNT); do
|
||||||
--data_device ./testdata/bin/test_osd$i.bin \
|
--data_device ./testdata/bin/test_osd$i.bin \
|
||||||
--meta_offset 0 \
|
--meta_offset 0 \
|
||||||
--journal_offset $((1024*1024)) \
|
--journal_offset $((1024*1024)) \
|
||||||
--data_offset $((128*1024*1024)) >>./testdata/osd$i.log 2>&1 &
|
--data_offset $((128*1024*1024+32768)) >>./testdata/osd$i.log 2>&1 &
|
||||||
eval OSD${i}_PID=$!
|
eval OSD${i}_PID=$!
|
||||||
done
|
done
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,92 @@
|
||||||
|
#!/bin/bash -ex
|
||||||
|
|
||||||
|
ANTIETCD=1
|
||||||
|
. `dirname $0`/common.sh
|
||||||
|
|
||||||
|
[[ -e build/src/disk_tool/vitastor-disk-test ]] || ln -s vitastor-disk build/src/disk_tool/vitastor-disk-test
|
||||||
|
|
||||||
|
dd if=/dev/zero of=./testdata/bin/test_osd1.bin bs=1 count=1 seek=$((100*1024*1024*1024-1))
|
||||||
|
LOOP1=$(sudo losetup --show -f ./testdata/bin/test_osd1.bin)
|
||||||
|
trap "kill -9 $(jobs -p) || true; sudo losetup -d $LOOP1"' || true' EXIT
|
||||||
|
dd if=/dev/zero of=./testdata/bin/test_meta.bin bs=1 count=1 seek=$((1024*1024*1024-1))
|
||||||
|
LOOP2=$(sudo losetup --show -f ./testdata/bin/test_meta.bin)
|
||||||
|
trap "kill -9 $(jobs -p) || true; sudo losetup -d $LOOP1 $LOOP2"' || true' EXIT
|
||||||
|
|
||||||
|
# also test prepare --hybrid :)
|
||||||
|
# non-vitastor random type UUID to prevent udev activation
|
||||||
|
sudo build/src/disk_tool/vitastor-disk-test prepare --no_init 1 --meta_reserve 1x,1M \
|
||||||
|
--block_size 131072 --osd_num 987654 --part_type_uuid 0df42ae0-3695-4395-a957-7d5ff3645c56 \
|
||||||
|
--hybrid --fast-devices $LOOP2 $LOOP1
|
||||||
|
|
||||||
|
# write almost empty journal
|
||||||
|
node <<EOF > ./testdata/journal.json
|
||||||
|
console.log(JSON.stringify([
|
||||||
|
{"type":"start","start":"0x1000"},
|
||||||
|
{"type":"big_write_instant","inode":"0x1000000000001","stripe":"0xc60000","ver":"10","offset":0,"len":131072,"loc":"0x18ffdc0000","bitmap":"ffffffff"}
|
||||||
|
]));
|
||||||
|
EOF
|
||||||
|
sudo build/src/disk_tool/vitastor-disk write-journal ${LOOP1}p1 < ./testdata/journal.json
|
||||||
|
sudo build/src/disk_tool/vitastor-disk dump-journal --json --format data ${LOOP1}p1 | jq -S '[ .[] | del(.crc32, .crc32_prev) ]' > ./testdata/j2.json
|
||||||
|
jq -S '[ .[] + {"valid":true} ]' < ./testdata/journal.json > ./testdata/j1.json
|
||||||
|
diff ./testdata/j1.json ./testdata/j2.json
|
||||||
|
|
||||||
|
# write fake metadata items in the end
|
||||||
|
DATA_DEV_SIZE=$(sudo blockdev --getsize64 ${LOOP1}p1)
|
||||||
|
node <<EOF > ./testdata/meta.json
|
||||||
|
console.log(JSON.stringify({
|
||||||
|
version: "0.9",
|
||||||
|
meta_block_size: 4096,
|
||||||
|
data_block_size: 131072,
|
||||||
|
bitmap_granularity: 4096,
|
||||||
|
data_csum_type: "none",
|
||||||
|
csum_block_size: 0,
|
||||||
|
entries: [ ...new Array(100).keys() ].map(i => ({
|
||||||
|
block: (819183-100)+i, // 819183 = (rounded partition size-4k) / 128k
|
||||||
|
pool: 1,
|
||||||
|
inode: "0x1",
|
||||||
|
stripe: "0x"+Number(i*0x20000).toString(16),
|
||||||
|
version: 10,
|
||||||
|
bitmap: "ffffffff",
|
||||||
|
ext_bitmap: "ffffffff",
|
||||||
|
})),
|
||||||
|
}));
|
||||||
|
EOF
|
||||||
|
|
||||||
|
# also test write & dump
|
||||||
|
sudo build/src/disk_tool/vitastor-disk write-meta ${LOOP1}p1 < ./testdata/meta.json
|
||||||
|
sudo build/src/disk_tool/vitastor-disk dump-meta ${LOOP1}p1 > ./testdata/compare.json
|
||||||
|
jq -S < ./testdata/meta.json > ./testdata/1.json
|
||||||
|
jq -S < ./testdata/compare.json > ./testdata/2.json
|
||||||
|
diff ./testdata/1.json ./testdata/2.json
|
||||||
|
|
||||||
|
# move journal & meta back, data will become smaller; end indexes should be shifted by -1251
|
||||||
|
sudo build/src/disk_tool/vitastor-disk-test resize --move-journal '' --move-meta '' ${LOOP1}p1
|
||||||
|
sudo build/src/disk_tool/vitastor-disk dump-meta ${LOOP1}p1 | jq -S > ./testdata/2.json
|
||||||
|
jq -S '. + {"entries": [ .entries[] | (. + { "block": (.block-1251) }) ]}' < ./testdata/meta.json > ./testdata/1.json
|
||||||
|
diff ./testdata/1.json ./testdata/2.json
|
||||||
|
sudo build/src/disk_tool/vitastor-disk dump-journal --json --format data ${LOOP1}p1 | jq -S '[ .[] | del(.crc32, .crc32_prev) ]' > ./testdata/j2.json
|
||||||
|
jq -S '[ (.[] + {"valid":true}) | (if .type == "big_write_instant" then . + {"loc":"0x18f6160000"} else . end) ]' < ./testdata/journal.json > ./testdata/j1.json
|
||||||
|
diff ./testdata/j1.json ./testdata/j2.json
|
||||||
|
|
||||||
|
# move journal & meta out, data will become larger; end indexes should be shifted back by +1251
|
||||||
|
sudo build/src/disk_tool/vitastor-disk-test resize --move-journal ${LOOP2}p1 --move-meta ${LOOP2}p2 ${LOOP1}p1
|
||||||
|
sudo build/src/disk_tool/vitastor-disk dump-meta ${LOOP1}p1 | jq -S > ./testdata/2.json
|
||||||
|
jq -S < ./testdata/meta.json > ./testdata/1.json
|
||||||
|
diff ./testdata/1.json ./testdata/2.json
|
||||||
|
jq -S '[ .[] + {"valid":true} ]' < ./testdata/journal.json > ./testdata/j1.json
|
||||||
|
sudo build/src/disk_tool/vitastor-disk dump-journal --json --format data ${LOOP1}p1 | jq -S '[ .[] | del(.crc32, .crc32_prev) ]' > ./testdata/j2.json
|
||||||
|
|
||||||
|
# reduce data device size by exactly 128k * 99 (occupied blocks); exactly 1 should be left in place :)
|
||||||
|
sudo build/src/disk_tool/vitastor-disk-test resize --data-size $((DATA_DEV_SIZE-128*1024*99)) ${LOOP1}p1
|
||||||
|
sudo build/src/disk_tool/vitastor-disk dump-meta ${LOOP1}p1 | jq -S > ./testdata/2.json
|
||||||
|
jq -S '. + {"entries": ([ .entries[] | (. + { "block": (.block | if . > 819183-100 then .-(819183-100+1) else 819183-100 end) }) ] | .[1:] + [ .[0] ])}' < ./testdata/meta.json > ./testdata/1.json
|
||||||
|
diff ./testdata/1.json ./testdata/2.json
|
||||||
|
jq -S '[ .[] + {"valid":true} ]' < ./testdata/journal.json > ./testdata/j1.json
|
||||||
|
sudo build/src/disk_tool/vitastor-disk dump-journal --json --format data ${LOOP1}p1 | jq -S '[ .[] | del(.crc32, .crc32_prev) ]' > ./testdata/j2.json
|
||||||
|
|
||||||
|
# extend data device size to maximum
|
||||||
|
sudo build/src/disk_tool/vitastor-disk-test resize --data-size max ${LOOP1}p1
|
||||||
|
sudo build/src/disk_tool/vitastor-disk dump-meta ${LOOP1}p1 | jq -S > ./testdata/2.json
|
||||||
|
diff ./testdata/1.json ./testdata/2.json
|
||||||
|
|
||||||
|
format_green OK
|
Loading…
Reference in New Issue