diff --git a/syncoid b/syncoid index 79ad45f0..94bdb03e 100755 --- a/syncoid +++ b/syncoid @@ -898,7 +898,7 @@ sub runsynccmd { my $disp_pvsize = $pvsize == 0 ? 'UNKNOWN' : readablebytes($pvsize); my $sendoptions; - if ($sendsource =~ / -t /) { + if ($sendsource =~ /^-t /) { $sendoptions = getoptionsline(\@sendoptions, ('P','V','e','v')); } elsif ($sendsource =~ /#/) { $sendoptions = getoptionsline(\@sendoptions, ('L','V','c','e','w')); diff --git a/tests/syncoid/012_receive_resume_token/run.sh b/tests/syncoid/012_receive_resume_token/run.sh new file mode 100755 index 00000000..d3b4a954 --- /dev/null +++ b/tests/syncoid/012_receive_resume_token/run.sh @@ -0,0 +1,48 @@ +#!/bin/bash + +# test verifying syncoid behavior with partial transfers + +set -x +set -e + +. ../../common/lib.sh + +if [ -z "$ALLOW_INVASIVE_TESTS" ]; then + exit 130 +fi + +POOL_IMAGE="/tmp/jimsalterjrs_sanoid_918.img" +POOL_SIZE="128M" +POOL_NAME="jimsalterjrs_sanoid_918" + +truncate -s "${POOL_SIZE}" "${POOL_IMAGE}" + +zpool create -m none -f "${POOL_NAME}" "${POOL_IMAGE}" + +function cleanUp { + zpool destroy "${POOL_NAME}" + rm -f "${POOL_IMAGE}" +} + +# Clean up the pool and image file on exit +trap cleanUp EXIT + +zfs create "${POOL_NAME}/source" +zfs snap "${POOL_NAME}/source@empty" +dd if=/dev/urandom of="/${POOL_NAME}/source/garbage.bin" bs=1M count=16 +zfs snap "${POOL_NAME}/source@something" + +# Simulate interrupted transfer +zfs send -pwR "${POOL_NAME}/source@something" | head --bytes=8M | zfs recv -s "${POOL_NAME}/destination" + +# Using syncoid to continue interrupted transfer +../../../syncoid --sendoptions="pw" "${POOL_NAME}/source" "${POOL_NAME}/destination" + +# Verify success based on exit status +if [ $? -ne 0 ]; then + echo "Regression detected: syncoid did not handle the resuming correctly." + exit 1 +else + echo "Test passed: syncoid resumed transfer successfully." + exit 0 +fi