1 #
   2 # CDDL HEADER START
   3 #
   4 # The contents of this file are subject to the terms of the
   5 # Common Development and Distribution License (the "License").
   6 # You may not use this file except in compliance with the License.
   7 #
   8 # You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
   9 # or http://www.opensolaris.org/os/licensing.
  10 # See the License for the specific language governing permissions
  11 # and limitations under the License.
  12 #
  13 # When distributing Covered Code, include this CDDL HEADER in each
  14 # file and include the License file at usr/src/OPENSOLARIS.LICENSE.
  15 # If applicable, add the following below this CDDL HEADER, with the
  16 # fields enclosed by brackets "[]" replaced with your own identifying
  17 # information: Portions Copyright [yyyy] [name of copyright owner]
  18 #
  19 # CDDL HEADER END
  20 #
  21 
  22 #
  23 # Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
  24 # Use is subject to license terms.
  25 #
  26 
  27 #
  28 # Copyright (c) 2013 by Delphix. All rights reserved.
  29 #
  30 
  31 . $STF_SUITE/tests/functional/mv_files/mv_files.cfg
  32 
  33 #
  34 # Determine whether this version of the ksh being
  35 # executed has a bug where the limit of background
  36 # processes of 25.
  37 #
  38 function check_bg_procs_limit_num
  39 {
  40 $ECHO "#!/usr/bin/ksh" > /var/tmp/exitsZero.ksh
  41 $ECHO  "exit 0" >> /var/tmp/exitsZero.ksh
  42 $CHMOD 777 /var/tmp/exitsZero.ksh
  43 
  44 $CAT <<EOF > /var/tmp/testbackgprocs.ksh
  45 #!/usr/bin/ksh
  46 #
  47 # exitsZero.ksh is a one line script
  48 # that exit with status of "0"
  49 #
  50 
  51 PIDS=""
  52 typeset -i i=1
  53 while [ \$i -le 50 ]
  54 do
  55         /var/tmp/exitsZero.ksh &
  56         PIDS="\$PIDS \$!"
  57         (( i = i + 1 ))
  58 done
  59 
  60 \$SLEEP 1
  61 
  62 for pid in \$PIDS
  63 do
  64         \$WAIT \$pid
  65         (( \$? == 127 )) && exit 1
  66 done
  67 exit 0
  68 EOF
  69 
  70 $KSH /var/tmp/testbackgprocs.ksh
  71 if [[ $? -eq 1 ]]; then
  72 #
  73 # Current ksh being executed has a limit
  74 # of 25 background processes.
  75 #
  76         return 1
  77 else
  78         return 0
  79 fi
  80 }
  81 
  82 function init_setup
  83 {
  84 
  85         typeset disklist=$1
  86 
  87         create_pool $TESTPOOL "$disklist"
  88 
  89         if ! is_global_zone ; then
  90                 reexport_pool
  91         fi
  92 
  93         $RM -rf $TESTDIR  || log_unresolved Could not remove $TESTDIR
  94         $MKDIR -p $TESTDIR || log_unresolved Could not create $TESTDIR
  95 
  96         $RM -rf $TESTDIR_TGT  || log_unresolved Could not remove $TESTDIR_TGT
  97         $MKDIR -p $TESTDIR_TGT || log_unresolved Could not create $TESTDIR_TGT
  98 
  99         log_must $ZFS create $TESTPOOL/$TESTFS
 100         log_must $ZFS set mountpoint=$TESTDIR $TESTPOOL/$TESTFS
 101 
 102         log_must $ZFS create $TESTPOOL/$TESTFS_TGT
 103         log_must $ZFS set mountpoint=$TESTDIR_TGT $TESTPOOL/$TESTFS_TGT
 104 
 105         $MKDIR -p $OLDDIR || log_unresolved Could not create $OLDDIR
 106         $MKDIR -p $NEWDIR_IN_FS || log_unresolved Could not create $NEWDIR_IN_FS
 107         $MKDIR -p $NEWDIR_ACROSS_FS || log_unresolved Could not create $NEWDIR_ACROSS_FS
 108 
 109 }
 110 
 111 function wait_pid
 112 {
 113         for pid in $1
 114         do
 115                 $PS -e | $GREP $pid >/dev/null 2>&1
 116                 (( $? == 0 )) && $WAIT $pid
 117         done
 118 }
 119 
 120 
 121 #
 122 # Generate given number files in a
 123 # directory of zfs file system
 124 # $1 - the directory holds the generated files
 125 # $2 - number of to-be-generated files
 126 #
 127 
 128 function generate_files
 129 {
 130         typeset -i count
 131         typeset -i proc_num=0
 132 
 133         if (( $2 == $MVNUMFILES )); then
 134                 count=1
 135         else
 136                 count=$MVNUMFILES+1
 137         fi
 138 
 139         while (( count <= $2 ))
 140         do
 141                 $CP /etc/passwd $1/file_$count \
 142                          > /dev/null 2>&1 &
 143 
 144                 PIDS="$PIDS $!"
 145 
 146                 proc_num=`$ECHO $PIDS | $WC -w`
 147                 if (( proc_num >= GANGPIDS )); then
 148                         wait_pid "$PIDS"
 149                         proc_num=0
 150                         PIDS=""
 151                 fi
 152 
 153                (( count = count + 1 ))
 154         done
 155 
 156 }
 157 
 158 #
 159 # Move given number files from one directory to
 160 # another directory in parallel
 161 # $1 - source directory
 162 # $2 - target directory
 163 #
 164 function mv_files
 165 {
 166 
 167         $FIND $1 -type f -print | xargs -i \
 168                 $MV {} $2 > /dev/null 2>&1
 169 }
 170 
 171 #
 172 # Count the files number after moving, and
 173 # compare it with the original number
 174 # $1 - directory that to be operated
 175 # $2 - original files number
 176 #
 177 function count_files
 178 {
 179         typeset -i file_num
 180         file_num=`$FIND $1  -type f -print | \
 181                 wc -l`
 182         (( file_num != $2 )) && \
 183                 log_fail "The file number of target directory"\
 184                         "$2 is not equal to that of the source "\
 185                         "directory $1"
 186 
 187 }
 188 
 189 #
 190 # Running the 'mv' test
 191 # $1 - old directory
 192 # $2 - new directory
 193 #
 194 function mv_test
 195 {
 196         typeset old=$1
 197         typeset new=$2
 198 
 199         typeset -i inc_num=$(( MVNUMFILES + MVNUMINCR ))
 200         typeset -i num=0
 201 
 202         for num in $MVNUMFILES $inc_num
 203         do
 204                 generate_files $old $num
 205 
 206                 mv_files $old $new
 207                 count_files $new $num
 208 
 209                 mv_files $new $old
 210                 count_files $old $num
 211         done
 212 
 213         typeset dir=$(get_device_dir $DISKS)
 214         verify_filesys "$TESTPOOL" "$TESTPOOL/$TESTFS" "$dir"
 215 
 216         return 0
 217 }