Commit c8df964b authored by Vitaly Lipatov's avatar Vitaly Lipatov

gluster/grf: improve

parent 7f4f41f1
......@@ -53,10 +53,15 @@ opbrick()
$1 "$MOUNTDIR//$host/$path/$2"
}
fastssh()
{
ssh -o "ControlMaster auto" -o "ControlPath ~/tmp/ssh_mux_%h_%p_%r" -o "ControlPersist 4h" "$@"
}
sshopbrick()
{
echo "remote execute: ssh $host $1 $path/$2" >>$0.log
ssh $host $1 $path/$2
fastssh $host $1 "$path/$2"
}
# TODO: проблемы со snail2
......@@ -84,6 +89,16 @@ if [ "$1" = "--force" ] ; then
shift
fi
if [ "$1" = "--mount" ] ; then
mount="$1"
shift
fi
if [ "$1" = "--umount" ] ; then
mount="$1"
shift
fi
WORKDIR=~/grf
mkdir -p $WORKDIR
......@@ -128,11 +143,17 @@ LISTBRICKS="$(get_bricks)"
MOUNTDIR=~/grf-mount
# TODO: move before GVOLUME detect
if [ "$1" = "--umount" ] ; then
if [ "$mount" = "--umount" ] ; then
umount_g
exit
fi
# TODO: move before GVOLUME detect
if [ "$mount" = "--mount" ] ; then
mount_g
exit
fi
# check and fix path
if [ -n "$sfile" ] ; then
# select via param?
......@@ -146,7 +167,7 @@ if [ -n "$sfile" ] ; then
if echo "$sfile" | grep -q "\*" ; then
sdir="$(dirname "$sfile")"
if [ -d "$sdir" ] ; then
echo "Work with dir $sdir"
echo "Work with all files in dir $sdir"
else
sdir=
fi
......@@ -198,7 +219,7 @@ tr_gfid_to_rpath()
get_gfid()
{
local file="$1"
[ -n "$host" ] || return
#trusted.gfid=0x9dd12f564daa42ff94e103a4b0fb0899
# /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")
......@@ -208,6 +229,10 @@ get_gfid()
fi
}
is_nofile()
{
LANG=C stat "$1" 2>&1 | grep -q "No such file or directory"
}
test_file()
{
......@@ -224,14 +249,16 @@ if [ -z "$restore" ] ; then
md5sum "$sfile"
fi
FLAGNOFILE=
FLAGBROKENFILE=
if ! stat "$sfile" >/dev/null ; then
sleep 1
stat "$sfile" >/dev/null || FLAGBROKENFILE=1
stat "$sfile" >/dev/null 2>/dev/null || FLAGBROKENFILE=1
is_nofile "$sfile" && FLAGNOFILE=1
fi
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
FLAGBROKENFILE=1
fi
......@@ -281,14 +308,6 @@ for brick in $LISTBRICKS ; do
done
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=
SELFILE=
......@@ -297,29 +316,66 @@ SELPATH=
ISDIR=
[ -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
COUNT=1
FILNUM=0
rm -f $WORKDIR/*
[ -d "$sfile" ] && [ ! -L "$sfile" ] && ISDIR=1
for i in $LISTBRICKS ; do
set_host_path "$i"
# Надо отличать, есть файл или ошибка с ним. Если файла вообще нет, надо удалять всё на томах
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
# При 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"
#if [ -z "$OLDFILE" ] || [ "$OLDFILE" -nt "$WORKDIR/$host-$COUNT" ] || [ "$NUMFILES" != "0" ] ; 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"
SELFILE="$file"
SELHOST=$host
SELPATH=$path
echo "Select OLDFILE:$OLDFILE ($file)"
echo "Selected OLDFILE:$OLDFILE ($file)"
fi
fi
fi
......@@ -338,13 +394,22 @@ if [ "$restore" = "--restore" ] ; then
COUNT=$(($COUNT+1))
done
ls -l $WORKDIR
#ls -l $WORKDIR
echo "FILNUM: $FILNUM OLD: $OLDFILE"
# Если два оригинала, ничего не удаляем (если нет иных проблем)
[ "$FILNUM" -eq 2 ] && [ -z "$FLAGBROKENFILE" ] && [ -z "$force" ] && continue
# Если два оригинала, ничего не удаляем (если нет иных проблем и force)
[ "$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
# we need host and path vars for get_gfid
......@@ -352,20 +417,13 @@ if [ "$restore" = "--restore" ] ; then
path=$SELPATH
GENGFID=$(get_gfid "$SELFILE")
COUNT=1
for i in $LISTBRICKS ; do
set_host_path "$i"
if [ -n "$ISDIR" ] ; then
RMCMD="rmdir -v"
else
RMCMD="rm -fv"
fi
RMFCMD="rm -fv"
# Удаляем всё, кроме OLDFILE
if [ ! "$OLDFILE" = "$WORKDIR/$host-$COUNT" ] ; then
if [ ! "$OLDFILE" = "$WORKDIR/$host-$COUNT" ] || [ "$remove" = "--allremove" ] ; then
# FIXME: Нельзя удалять, если OLDFILE на неактивном томе
# TODO: обычно нет смысла удалять пару
# прежде удаляем из .glusterfs
......@@ -383,10 +441,11 @@ if [ "$restore" = "--restore" ] ; then
[ -n "$GENGFID" ] && opbrick "$RMFCMD" "$(get_pgf_name $GENGFID)"
fi
opbrick "$RMCMD" "$file"
opbrick "$RMFCMD" "$file"
dfile=$(echo "$file" | sed -e "s|/*$||g")
opbrick "$RMCMD" "$dfile"
opbrick "$RMFCMD" "$dfile"
echo "$path/$file ($host)" >>grf.removed.list
echo "$RMCMD / $RMFCMD $host:$path/$dfile" >>grf.removed.list
fi
# нулевые с правами 10000 уберём по-другому
......@@ -396,13 +455,15 @@ if [ "$restore" = "--restore" ] ; then
COUNT=$(($COUNT+1))
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
}
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
done
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