Whamcloud - gitweb
LU-4293 utils: handle lfs migrate failure in lfs_migrate
[fs/lustre-release.git] / lustre / scripts / lfs_migrate
index c285510..e9c8aae 100755 (executable)
@@ -17,6 +17,7 @@ set -e
 RSYNC=${RSYNC:-rsync}
 ECHO=echo
 LFS=${LFS:-lfs}
+LFS_SIZE_OPT="-s"
 
 usage() {
     cat -- <<USAGE 1>&2
@@ -96,7 +97,12 @@ strings $(which $RSYNC) 2>&1 | grep -q lustre && LFS=:
 # access the temporary file.
 umask 0077
 
+# This is needed for 1.8 Interoperability and can be removed in the future
+$LFS getstripe --help 2>&1 | grep -q stripe-size && LFS_SIZE_OPT="-S"
+
 lfs_migrate() {
+       local RSYNC_MODE=false
+
        while IFS='' read -d '' OLDNAME; do
                $ECHO -n "$OLDNAME: "
 
@@ -126,7 +132,6 @@ lfs_migrate() {
                        continue
                fi
 
-
                if [ "$OPT_RESTRIPE" ]; then
                        UNLINK=""
                else
@@ -138,17 +143,32 @@ lfs_migrate() {
                        [ "$OPT_STRIPE_COUNT" ] && COUNT=$OPT_STRIPE_COUNT ||
                                COUNT=$($LFS getstripe -c "$OLDNAME" \
                                        2> /dev/null)
-                       SIZE=$($LFS getstripe -S "$OLDNAME" 2> /dev/null)
+                       SIZE=$($LFS getstripe $LFS_SIZE_OPT "$OLDNAME" \
+                              2> /dev/null)
 
                        [ -z "$COUNT" -o -z "$SIZE" ] && UNLINK=""
+                       SIZE=${LFS_SIZE_OPT}${SIZE}
                fi
+
+               # first try to migrate inside lustre
+               # if failed go back to old rsync mode
+               if [[ $RSYNC_MODE == false ]]; then
+                       if $LFS migrate -c${COUNT} ${SIZE} "$OLDNAME"; then
+                               $ECHO "done"
+                               continue
+                       else
+                               echo "falling back to rsync-based migration"
+                               RSYNC_MODE=true
+                       fi
+               fi
+
                NEWNAME=$(mktemp $UNLINK "$OLDNAME.tmp.XXXXXX")
                if [ $? -ne 0 -o -z "$NEWNAME" ]; then
                        echo -e "\r$OLDNAME: can't make temp file, skipped" 1>&2
                        continue
                fi
 
-               [ "$UNLINK" ] && $LFS setstripe -c${COUNT} -S${SIZE} "$NEWNAME"
+               [ "$UNLINK" ] && $LFS setstripe -c${COUNT} ${SIZE} "$NEWNAME"
 
                # we use --inplace, since we created our own temp file already
                if ! $RSYNC -a --inplace $RSYNC_OPTS "$OLDNAME" "$NEWNAME";then