From 1b08ec576fc105be8542a61aceb1b3683557e4b3 Mon Sep 17 00:00:00 2001 From: Erich Eckner Date: Sun, 23 Apr 2017 12:02:07 +0200 Subject: bin/get-assignment: add max_parallel_build_per_client and some verbosity --- bin/get-assignment | 48 +++++++++++++++++++++++++++++++++++++++++++++++- conf/default.conf | 2 ++ 2 files changed, 49 insertions(+), 1 deletion(-) diff --git a/bin/get-assignment b/bin/get-assignment index f74399d..fed7056 100755 --- a/bin/get-assignment +++ b/bin/get-assignment @@ -3,6 +3,16 @@ # receive one package to be built from the build-list whose dependencies # are already satisfied or which breaks a dependency cycle +# exit code shows state of success: +# 0: ok, I gave you an assignment +# 1: come back (shortly) later - I was running already +# 2: come back later - there are still packages to be built, +# but currently none has all its dependencies ready +# 3: come back after the next run of get-package-updates - currently +# there are no pending packages +# 4: come back, when you've done your work - you hit the limit on +# maximum allowed parallel jobs per ip + # TODO: # respect build-manually-list @@ -27,7 +37,41 @@ hand_out_assignment() { # Create a lock file. exec 9> "${lock_file}" -flock -n 9 || exit +if ! flock -n 9; then + >&2 echo 'come back (shortly) later - I was running already' + exit 1 +fi + +# Check if there are any pending packages at all and if the requester +# has already hit its max_parallel_build_per_client limit. + +num_jobs=0 +pending_packages=false + +while read -r package git_revision repository; do + + if [ -f "${work_dir}/package-states/${package}.${git_revision}.${repository}.locked" ]; + then + if [ "${SSH_CLIENT%% *}" = "$(cat "${work_dir}/package-states/${package}.${git_revision}.${repository}.locked")" ]; then + num_jobs=$[${num_jobs}+1]; + fi + else + pending_packages=true + fi + +done < "${work_dir}/build-list" + +if ! ${pending_packages}; then + >&2 echo 'come back after the next run of get-package-updates - currently there are no pending packages' + rm -f "${lock_file}" + exit 3 +fi + +if [ ${num_jobs} -ge ${max_parallel_build_per_client} ]; then + >&2 echo "come back, when you've done your work - you hit the limit on maximum allowed parallel jobs per ip" + rm -f "${lock_file}" + exit 4 +fi while read -r package git_revision repository; do @@ -62,4 +106,6 @@ fi # Remove the lock file +>&2 echo 'come back later - there are still packages to be built, but currently none has all its dependencies ready' rm -f "${lock_file}" +exit 2 diff --git a/conf/default.conf b/conf/default.conf index 1517272..0343ba4 100755 --- a/conf/default.conf +++ b/conf/default.conf @@ -15,6 +15,8 @@ repo_paths["archlinux32"]="${work_dir}/repos/packages32" lock_file="/tmp/${0##*/}.lock" +max_parallel_build_per_client=2 + # possibly pull in custom modifications [ -r "${base_dir}/conf/local.conf" ] && . "${base_dir}/conf/local.conf" -- cgit v1.2.3-54-g00ecf