Print this page
2605 want to resume interrupted zfs send
Reviewed by: George Wilson <george.wilson@delphix.com>
Reviewed by: Paul Dagnelie <pcd@delphix.com>
Reviewed by: Richard Elling <Richard.Elling@RichardElling.com>
Reviewed by: Xin Li <delphij@freebsd.org>
Reviewed by: Arne Jansen <sensille@gmx.net>
Approved by: Dan McDonald <danmcd@omniti.com>
4206 history_003_pos relies on exact size of history log and entries
4207 history_008_pos depends on obsolete internal history log message
4208 Typo in zfs_main.c: "posxiuser"
4209 Populate zfstest with the remainder of the STF tests
Reviewed by: Sonu Pillai <sonu.pillai@delphix.com>
Reviewed by: Will Guyette <will.guyette@delphix.com>
Reviewed by: Eric Diven <eric.diven@delphix.com>
Reviewed by: Christopher Siden <christopher.siden@delphix.com>
Approved by: Richard Lowe <richlowe@richlowe.net>


 495                 stream_num=$((stream_num+1))
 496 
 497                 token=$(zfs get -Hp -o value receive_resume_token $recvfs)
 498                 log_must eval "zfs send -v -t $token >/$streamfs/$stream_num"
 499                 [[ -f /$streamfs/$stream_num ]] || \
 500                     log_fail "NO FILE /$streamfs/$stream_num"
 501         done
 502         log_must zfs recv -suv $recvfs </$streamfs/$stream_num
 503 }
 504 
 505 #
 506 # Setup filesystems for the resumable send/receive tests
 507 #
 508 # $1 The "send" filesystem
 509 # $2 The "recv" filesystem
 510 #
 511 function test_fs_setup
 512 {
 513         typeset sendfs=$1
 514         typeset recvfs=$2
 515         typeset streamfs=$3
 516         typeset sendpool=${sendfs%%/*}
 517         typeset recvpool=${recvfs%%/*}
 518 
 519         datasetexists $sendfs && log_must zfs destroy -r $sendpool
 520         datasetexists $recvfs && log_must zfs destroy -r $recvpool
 521         datasetexists $streamfs && log_must zfs destroy -r $streamfs
 522 
 523         if $(datasetexists $sendfs || zfs create -o compress=lz4 $sendfs); then
 524                 mk_files 1000 256 0 $sendfs &
 525                 mk_files 1000 131072 0 $sendfs &
 526                 mk_files 100 1048576 0 $sendfs &
 527                 mk_files 10 10485760 0 $sendfs &
 528                 mk_files 1 104857600 0 $sendfs &
 529                 log_must wait
 530                 log_must zfs snapshot $sendfs@a
 531 
 532                 rm_files 200 256 0 $sendfs &
 533                 rm_files 200 131072 0 $sendfs &
 534                 rm_files 20 1048576 0 $sendfs &
 535                 rm_files 2 10485760 0 $sendfs &
 536                 log_must wait
 537 
 538                 mk_files 400 256 0 $sendfs &
 539                 mk_files 400 131072 0 $sendfs &
 540                 mk_files 40 1048576 0 $sendfs &
 541                 mk_files 4 10485760 0 $sendfs &
 542                 log_must wait
 543 
 544                 log_must zfs snapshot $sendfs@b
 545                 log_must eval "zfs send -v $sendfs@a >/$sendpool/initial.zsend"
 546                 log_must eval "zfs send -v -i @a $sendfs@b " \
 547                     ">/$sendpool/incremental.zsend"
 548         fi
 549 
 550         log_must zfs create -o compress=lz4 $streamfs



 551 }
 552 
 553 #
 554 # Check to see if the specified features are set in a send stream.
 555 # The values for these features are found in uts/common/fs/zfs/sys/zfs_ioctl.h
 556 #
 557 # $1 The stream file
 558 # $2-$n The flags expected in the stream
 559 #
 560 function stream_has_features
 561 {
 562         typeset file=$1
 563         shift
 564 
 565         [[ -f $file ]] || log_fail "Couldn't find file: $file"
 566         typeset flags=$(cat $file | zstreamdump | awk '/features =/ {print $3}')
 567         typeset -A feature
 568         feature[dedup]="1"
 569         feature[dedupprops]="2"
 570         feature[sa_spill]="4"


 643                         inc_size=$(get_prop refer $inc_src)
 644                 fi
 645         fi
 646 
 647         if stream_has_features $stream compressed; then
 648                 ds_size=$(get_prop refer $ds)
 649         else
 650                 ds_size=$(get_prop lrefer $ds)
 651         fi
 652         ds_size=$((ds_size - inc_size))
 653 
 654         within_percent $stream_size $ds_size $percent || log_fail \
 655             "$stream_size $ds_size differed by too much"
 656 }
 657 
 658 # Cleanup function for tests involving resumable send
 659 function resume_cleanup
 660 {
 661         typeset sendfs=$1
 662         typeset streamfs=$2
 663         typeset sendpool=${sendfs%%/*}
 664 
 665         datasetexists $sendfs && log_must zfs destroy -r $sendfs
 666         datasetexists $streamfs && log_must zfs destroy -r $streamfs
 667         cleanup_pool $POOL2
 668         rm -f /$sendpool/initial.zsend /$sendpool/incremental.zsend
 669 }


 495                 stream_num=$((stream_num+1))
 496 
 497                 token=$(zfs get -Hp -o value receive_resume_token $recvfs)
 498                 log_must eval "zfs send -v -t $token >/$streamfs/$stream_num"
 499                 [[ -f /$streamfs/$stream_num ]] || \
 500                     log_fail "NO FILE /$streamfs/$stream_num"
 501         done
 502         log_must zfs recv -suv $recvfs </$streamfs/$stream_num
 503 }
 504 
 505 #
 506 # Setup filesystems for the resumable send/receive tests
 507 #
 508 # $1 The "send" filesystem
 509 # $2 The "recv" filesystem
 510 #
 511 function test_fs_setup
 512 {
 513         typeset sendfs=$1
 514         typeset recvfs=$2

 515         typeset sendpool=${sendfs%%/*}
 516         typeset recvpool=${recvfs%%/*}
 517 
 518         datasetexists $sendfs && log_must zfs destroy -r $sendpool
 519         datasetexists $recvfs && log_must zfs destroy -r $recvpool

 520 
 521         if $(datasetexists $sendfs || zfs create -o compress=lz4 $sendfs); then
 522                 mk_files 1000 256 0 $sendfs &
 523                 mk_files 1000 131072 0 $sendfs &
 524                 mk_files 100 1048576 0 $sendfs &
 525                 mk_files 10 10485760 0 $sendfs &
 526                 mk_files 1 104857600 0 $sendfs &
 527                 log_must wait
 528                 log_must zfs snapshot $sendfs@a
 529 
 530                 rm_files 200 256 0 $sendfs &
 531                 rm_files 200 131072 0 $sendfs &
 532                 rm_files 20 1048576 0 $sendfs &
 533                 rm_files 2 10485760 0 $sendfs &
 534                 log_must wait
 535 
 536                 mk_files 400 256 0 $sendfs &
 537                 mk_files 400 131072 0 $sendfs &
 538                 mk_files 40 1048576 0 $sendfs &
 539                 mk_files 4 10485760 0 $sendfs &
 540                 log_must wait
 541 
 542                 log_must zfs snapshot $sendfs@b
 543                 log_must eval "zfs send -v $sendfs@a >/$sendpool/initial.zsend"
 544                 log_must eval "zfs send -v -i @a $sendfs@b " \
 545                     ">/$sendpool/incremental.zsend"
 546         fi
 547 
 548         if datasetexists $streamfs; then
 549                 log_must zfs destroy -r $streamfs
 550         fi
 551         log_must zfs create -o compress=lz4 $sendpool/stream
 552 }
 553 
 554 #
 555 # Check to see if the specified features are set in a send stream.
 556 # The values for these features are found in uts/common/fs/zfs/sys/zfs_ioctl.h
 557 #
 558 # $1 The stream file
 559 # $2-$n The flags expected in the stream
 560 #
 561 function stream_has_features
 562 {
 563         typeset file=$1
 564         shift
 565 
 566         [[ -f $file ]] || log_fail "Couldn't find file: $file"
 567         typeset flags=$(cat $file | zstreamdump | awk '/features =/ {print $3}')
 568         typeset -A feature
 569         feature[dedup]="1"
 570         feature[dedupprops]="2"
 571         feature[sa_spill]="4"


 644                         inc_size=$(get_prop refer $inc_src)
 645                 fi
 646         fi
 647 
 648         if stream_has_features $stream compressed; then
 649                 ds_size=$(get_prop refer $ds)
 650         else
 651                 ds_size=$(get_prop lrefer $ds)
 652         fi
 653         ds_size=$((ds_size - inc_size))
 654 
 655         within_percent $stream_size $ds_size $percent || log_fail \
 656             "$stream_size $ds_size differed by too much"
 657 }
 658 
 659 # Cleanup function for tests involving resumable send
 660 function resume_cleanup
 661 {
 662         typeset sendfs=$1
 663         typeset streamfs=$2

 664 
 665         datasetexists $sendfs && log_must zfs destroy -r $sendfs
 666         datasetexists $streamfs && log_must zfs destroy -r $streamfs
 667         cleanup_pool $POOL2
 668         rm -f /$POOL/initial.zsend /$POOL/incremental.zsend
 669 }