Commit c8df964b authored by Vitaly Lipatov's avatar Vitaly Lipatov

gluster/grf: improve

parent 7f4f41f1
...@@ -53,10 +53,15 @@ opbrick() ...@@ -53,10 +53,15 @@ opbrick()
$1 "$MOUNTDIR//$host/$path/$2" $1 "$MOUNTDIR//$host/$path/$2"
} }
fastssh()
{
ssh -o "ControlMaster auto" -o "ControlPath ~/tmp/ssh_mux_%h_%p_%r" -o "ControlPersist 4h" "$@"
}
sshopbrick() sshopbrick()
{ {
echo "remote execute: ssh $host $1 $path/$2" >>$0.log echo "remote execute: ssh $host $1 $path/$2" >>$0.log
ssh $host $1 $path/$2 fastssh $host $1 "$path/$2"
} }
# TODO: проблемы со snail2 # TODO: проблемы со snail2
...@@ -84,6 +89,16 @@ if [ "$1" = "--force" ] ; then ...@@ -84,6 +89,16 @@ if [ "$1" = "--force" ] ; then
shift shift
fi fi
if [ "$1" = "--mount" ] ; then
mount="$1"
shift
fi
if [ "$1" = "--umount" ] ; then
mount="$1"
shift
fi
WORKDIR=~/grf WORKDIR=~/grf
mkdir -p $WORKDIR mkdir -p $WORKDIR
...@@ -128,11 +143,17 @@ LISTBRICKS="$(get_bricks)" ...@@ -128,11 +143,17 @@ LISTBRICKS="$(get_bricks)"
MOUNTDIR=~/grf-mount MOUNTDIR=~/grf-mount
# TODO: move before GVOLUME detect # TODO: move before GVOLUME detect
if [ "$1" = "--umount" ] ; then if [ "$mount" = "--umount" ] ; then
umount_g umount_g
exit exit
fi fi
# TODO: move before GVOLUME detect
if [ "$mount" = "--mount" ] ; then
mount_g
exit
fi
# check and fix path # check and fix path
if [ -n "$sfile" ] ; then if [ -n "$sfile" ] ; then
# select via param? # select via param?
...@@ -146,7 +167,7 @@ if [ -n "$sfile" ] ; then ...@@ -146,7 +167,7 @@ if [ -n "$sfile" ] ; then
if echo "$sfile" | grep -q "\*" ; then if echo "$sfile" | grep -q "\*" ; then
sdir="$(dirname "$sfile")" sdir="$(dirname "$sfile")"
if [ -d "$sdir" ] ; then if [ -d "$sdir" ] ; then
echo "Work with dir $sdir" echo "Work with all files in dir $sdir"
else else
sdir= sdir=
fi fi
...@@ -198,7 +219,7 @@ tr_gfid_to_rpath() ...@@ -198,7 +219,7 @@ tr_gfid_to_rpath()
get_gfid() get_gfid()
{ {
local file="$1" local file="$1"
[ -n "$host" ] || return
#trusted.gfid=0x9dd12f564daa42ff94e103a4b0fb0899 #trusted.gfid=0x9dd12f564daa42ff94e103a4b0fb0899
# /var/local/eterglust/pub/.glusterfs/9d/d1/9dd12f56-4daa-42ff-94e1-03a4b0fb0899 # /var/local/eterglust/pub/.glusterfs/9d/d1/9dd12f56-4daa-42ff-94e1-03a4b0fb0899
gfid=$(sshopbrick "getfattr -h -d -m . -e hex" "$file" | grep ^trusted.gfid | sed -e "s|trusted.gfid=0x||g") gfid=$(sshopbrick "getfattr -h -d -m . -e hex" "$file" | grep ^trusted.gfid | sed -e "s|trusted.gfid=0x||g")
...@@ -208,6 +229,10 @@ get_gfid() ...@@ -208,6 +229,10 @@ get_gfid()
fi fi
} }
is_nofile()
{
LANG=C stat "$1" 2>&1 | grep -q "No such file or directory"
}
test_file() test_file()
{ {
...@@ -224,14 +249,16 @@ if [ -z "$restore" ] ; then ...@@ -224,14 +249,16 @@ if [ -z "$restore" ] ; then
md5sum "$sfile" md5sum "$sfile"
fi fi
FLAGNOFILE=
FLAGBROKENFILE= FLAGBROKENFILE=
if ! stat "$sfile" >/dev/null ; then if ! stat "$sfile" >/dev/null ; then
sleep 1 sleep 1
stat "$sfile" >/dev/null || FLAGBROKENFILE=1 stat "$sfile" >/dev/null 2>/dev/null || FLAGBROKENFILE=1
is_nofile "$sfile" && FLAGNOFILE=1
fi fi
if [ -n "$restore" ] && [ -z "$FLAGBROKENFILE" ] && [ -z "$force" ] ; then if [ -n "$restore" ] && [ -z "$FLAGBROKENFILE" ] && [ -z "$force" ] ; then
PERM=$(stat -c "%a" "$sfile") PERM=$(stat -c "%a" "$sfile" 2>/dev/null)
if [ "$PERM" = "1000" ] ; then if [ "$PERM" = "1000" ] ; then
FLAGBROKENFILE=1 FLAGBROKENFILE=1
fi fi
...@@ -281,14 +308,6 @@ for brick in $LISTBRICKS ; do ...@@ -281,14 +308,6 @@ for brick in $LISTBRICKS ; do
done done
fi fi
if [ "$remove" = "--allremove" ] ; then
for brick in $LISTBRICKS ; do
set_host_path "$brick"
opbrick "rm -v" "$file"
gfid=$(get_gfid "$file")
[ -n "$gfid" ] && opbrick "rm -fv" "$(get_pgf_name $gfid)"
done
fi
OLDFILE= OLDFILE=
SELFILE= SELFILE=
...@@ -297,29 +316,66 @@ SELPATH= ...@@ -297,29 +316,66 @@ SELPATH=
ISDIR= ISDIR=
[ -n "$FORCEDIR" ] && ISDIR=1 [ -n "$FORCEDIR" ] && ISDIR=1
[ -d "$sfile" ] && [ ! -L "$sfile" ] && ISDIR=1
echo "$sfile" | grep -q "/$" && ISDIR=1
if [ -n "$ISDIR" ] ; then
echo "Handle $sfile as a directory"
#[ "$remove" != "--allremove" ] && echo "Skipping" && continue
fi
if [ -n "$ISDIR" ] ; then
RMCMD="rmdir -v"
if [ -n "$force" ] ; then
RMCMD="rm -rfv"
RMFCMD="rm -rfv"
fi
else
RMCMD="rm -fv"
fi
RMFCMD="rm -fv"
if [ "$remove" = "--allremove" ] ; then
for brick in $LISTBRICKS ; do
set_host_path "$brick"
opbrick "$RMCMD" "$file"
gfid=$(get_gfid "$file")
[ -n "$gfid" ] && opbrick "$RMCMD" "$(get_pgf_name $gfid)"
done
fi
if [ "$restore" = "--restore" ] ; then if [ "$restore" = "--restore" ] ; then
COUNT=1 COUNT=1
FILNUM=0 FILNUM=0
rm -f $WORKDIR/* rm -f $WORKDIR/*
[ -d "$sfile" ] && [ ! -L "$sfile" ] && ISDIR=1
for i in $LISTBRICKS ; do for i in $LISTBRICKS ; do
set_host_path "$i" set_host_path "$i"
# Надо отличать, есть файл или ошибка с ним. Если файла вообще нет, надо удалять всё на томах # Надо отличать, есть файл или ошибка с ним. Если файла вообще нет, надо удалять всё на томах
FD=$(opbrick 'stat -c %z' "$file" 2>/dev/null) FD=$(opbrick 'stat -c %z' "$file" 2>/dev/null)
echo "FD: $FD" SPFILE=
[ "$(opbrick 'stat -c %s%a' "$file" 2>/dev/null)" = "01000" ] && SPFILE="01000"
echo "$COUNT. FD: $i $FD $SPFILE"
if [ -n "$FD" ] ; then if [ -n "$FD" ] ; then
FILNUM=$(($FILNUM+1)) # При force добавляем все файлы, либо только нормальные (пропускаем 01000)
if [ -n "$force" ] || [ -z "$SPFILE" ] ; then
FILNUM=$(($FILNUM+1))
fi
NUMFILES=0
[ -n "$ISDIR" ] && NUMFILES=$(opbrick "ls -1" "$file" | wc -l)
# TODO: Если в каталоге что-то есть, хорошо бы из него удалить все 01000 и удалить его, если он станет пустым
# Это решит секрет неудаляемых каталогов.
touch -d "$FD" "$WORKDIR/$host-$COUNT" touch -d "$FD" "$WORKDIR/$host-$COUNT"
#if [ -z "$OLDFILE" ] || [ "$OLDFILE" -nt "$WORKDIR/$host-$COUNT" ] || [ "$NUMFILES" != "0" ] ; then
if [ -z "$OLDFILE" ] || [ "$OLDFILE" -nt "$WORKDIR/$host-$COUNT" ] ; then if [ -z "$OLDFILE" ] || [ "$OLDFILE" -nt "$WORKDIR/$host-$COUNT" ] ; then
if opbrick "test -L" "$file" || opbrick "test -r" "$file" ; then if opbrick "test -r" "$file" && [ -z "$SPFILE" ] || opbrick "test -L" "$file" ; then
# Если ссылка или файл # Если ссылка или файл
OLDFILE="$WORKDIR/$host-$COUNT" OLDFILE="$WORKDIR/$host-$COUNT"
SELFILE="$file" SELFILE="$file"
SELHOST=$host SELHOST=$host
SELPATH=$path SELPATH=$path
echo "Select OLDFILE:$OLDFILE ($file)" echo "Selected OLDFILE:$OLDFILE ($file)"
fi fi
fi fi
fi fi
...@@ -338,13 +394,22 @@ if [ "$restore" = "--restore" ] ; then ...@@ -338,13 +394,22 @@ if [ "$restore" = "--restore" ] ; then
COUNT=$(($COUNT+1)) COUNT=$(($COUNT+1))
done done
ls -l $WORKDIR #ls -l $WORKDIR
echo "FILNUM: $FILNUM OLD: $OLDFILE" echo "FILNUM: $FILNUM OLD: $OLDFILE"
# Если два оригинала, ничего не удаляем (если нет иных проблем) # Если два оригинала, ничего не удаляем (если нет иных проблем и force)
[ "$FILNUM" -eq 2 ] && [ -z "$FLAGBROKENFILE" ] && [ -z "$force" ] && continue [ "$FILNUM" -eq 2 ] && [ -z "$FLAGBROKENFILE" ] && [ -z "$force" ] && echo "skipping" && continue
if [ -n "$OLDFILE" ] ; then # Если файла нет, но мы нашли потерянный экземпляр (1 шт)
if [ -n "$FLAGNOFILE" ] && [ -n "$OLDFILE" ] && [ "$FILNUM" -eq 1 ] && [ -z "$ISDIR" ] ; then
echo "*** Trying to restore file $SELFILE from $SELHOST ..."
TDIR="$(dirname "$sfile")"
host=$SELHOST path=$SELPATH opbrick "cp -p --target-directory=$TDIR" "$SELFILE"
echo "$sfile" >>grf.redo.list
continue
fi
if [ -n "$OLDFILE" ] || [ "$FILNUM" -eq 0 ] || [ "$remove" = "--allremove" ] ; then
# get best gfid # get best gfid
# we need host and path vars for get_gfid # we need host and path vars for get_gfid
...@@ -352,20 +417,13 @@ if [ "$restore" = "--restore" ] ; then ...@@ -352,20 +417,13 @@ if [ "$restore" = "--restore" ] ; then
path=$SELPATH path=$SELPATH
GENGFID=$(get_gfid "$SELFILE") GENGFID=$(get_gfid "$SELFILE")
COUNT=1 COUNT=1
for i in $LISTBRICKS ; do for i in $LISTBRICKS ; do
set_host_path "$i" set_host_path "$i"
if [ -n "$ISDIR" ] ; then
RMCMD="rmdir -v"
else
RMCMD="rm -fv"
fi
RMFCMD="rm -fv"
# Удаляем всё, кроме OLDFILE # Удаляем всё, кроме OLDFILE
if [ ! "$OLDFILE" = "$WORKDIR/$host-$COUNT" ] ; then if [ ! "$OLDFILE" = "$WORKDIR/$host-$COUNT" ] || [ "$remove" = "--allremove" ] ; then
# FIXME: Нельзя удалять, если OLDFILE на неактивном томе # FIXME: Нельзя удалять, если OLDFILE на неактивном томе
# TODO: обычно нет смысла удалять пару # TODO: обычно нет смысла удалять пару
# прежде удаляем из .glusterfs # прежде удаляем из .glusterfs
...@@ -383,10 +441,11 @@ if [ "$restore" = "--restore" ] ; then ...@@ -383,10 +441,11 @@ if [ "$restore" = "--restore" ] ; then
[ -n "$GENGFID" ] && opbrick "$RMFCMD" "$(get_pgf_name $GENGFID)" [ -n "$GENGFID" ] && opbrick "$RMFCMD" "$(get_pgf_name $GENGFID)"
fi fi
opbrick "$RMCMD" "$file" dfile=$(echo "$file" | sed -e "s|/*$||g")
opbrick "$RMFCMD" "$file" opbrick "$RMCMD" "$dfile"
opbrick "$RMFCMD" "$dfile"
echo "$path/$file ($host)" >>grf.removed.list echo "$RMCMD / $RMFCMD $host:$path/$dfile" >>grf.removed.list
fi fi
# нулевые с правами 10000 уберём по-другому # нулевые с правами 10000 уберём по-другому
...@@ -396,13 +455,15 @@ if [ "$restore" = "--restore" ] ; then ...@@ -396,13 +455,15 @@ if [ "$restore" = "--restore" ] ; then
COUNT=$(($COUNT+1)) COUNT=$(($COUNT+1))
done done
stat "$sfile" if ! stat "$sfile" && [ "$FILNUM" -ne "0" ] ; then
LANG=C stat "$sfile" 2>&1 | grep -q "No such file or directory" || echo "$sfile" >>grf.redo.list
fi
fi fi
fi fi
} }
if [ -n "$uselist" ] ; then if [ -n "$uselist" ] ; then
cat "$uselist" | sort -u | grep "^/" | while read sf ; do cat "$uselist" | grep "^/" | while read sf ; do
test_file "$sf" </dev/null test_file "$sf" </dev/null
done done
else else
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment