Hasher/parallel

Материал из ALT Linux Wiki

Для применения нескольких экземпляров hasher одновременно следует создать дополнительные пары псевдопользователей при помощи hasher-useradd с --number=1 и далее, а также дополнительные префиксы (например, $TMP/hasherN; обратите внимание, что при отсутствии явного указания hsh и компания пытаются определить N по правам на содержимое префиксного каталога).

При желании автоматизировать параллельную сборку можно воспользоваться parallel; например, mike@ делал так:

~/bin/rebuild-hsh-quiet:

#!/bin/sh -e

[ $# -ge 1 ] || exit 1

num=
case "$1" in
-[1-9]) num="${1#-}"; shift;;
esac

mkdir -p ~/logs-parallel/{DONE,FAILED}

for i in "$@"; do
        f="`basename "$i"`"
        l=~/logs-parallel/"$f"
        o=~/hasher/repo/SRPMS.hasher/"$f"
        # FIXME: looks like ENOFILE provoking bug somewhere
        while :; do
                LANG=C hsh ${num:+--number=$num} \
                        "$TMP/hasher$num" "$i" \
                        >"$l" 2>&1 \
                        && d=DONE || d=FAILED
                if tail "$l" | grep -qs "^E: I wasn't able to locate file"; then
                        echo -n "rebuilding $i ... "
                        chmod +x "$l"
                else
                        echo "built $i"
                        chmod -x "$l"
                        break
                fi
        done
        mv "$l" ~/logs-parallel/"$d"/
done

~/bin/nightly-rehash-parallel:

#!/bin/sh

rm -rf ~/logs-parallel/{DONE,FAILED}

cd ~/repo/SRPMS.hasher &&
ls -rt *.src.rpm |
time parallel --jobs 4 --load 3 --delay 5 --eta 'rebuild-hsh-quiet -{%} {}'