Hasher/parallel

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

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

При желании автоматизировать параллельную сборку можно воспользоваться parallel; например, mike@ делал так (важно применять --without-stuff для избежания воздействия сборок друг на друга -- как изменением сборочного окружения, так и гонками):

~/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} --without-stuff \
                        "$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 -{%} {}'
  1. если наткнётесь на hsh: Failed to deduce hasher config number from directory ownership. -- это давний раздражающий баг hasher, который всем лень исправлять; не должен бы проявляться при прямом задании --number, однако же проявляется. Лечение -- сносом префикса перед запуском hsh (hsh-rmchroot и затем rm -rf)