[projects/pld-builder.new] Retry, cleaning, errors catching
arekm
arekm at pld-linux.org
Wed Apr 22 17:05:27 CEST 2026
commit 41c28379cff5be683fd7c88982e8ffceacdff5d5
Author: Arkadiusz Miśkiewicz <arekm at maven.pl>
Date: Wed Apr 22 17:05:08 2026 +0200
Retry, cleaning, errors catching
client/make-request.sh | 107 ++++++++++++++++++++++++++++++++++---------------
1 file changed, 75 insertions(+), 32 deletions(-)
---
diff --git a/client/make-request.sh b/client/make-request.sh
index a0c13c2..7e21e14 100755
--- a/client/make-request.sh
+++ b/client/make-request.sh
@@ -103,19 +103,35 @@ send_request() {
*)
msg "Sending using HTTP mode to $url"
cat - | $python -c '
-import sys, socket
+import sys, time
from urllib import request
-
-try:
- data = sys.stdin.read().encode("utf-8")
- url = sys.argv[1]
- socket.setdefaulttimeout(30)
- req = request.Request(url, data=data)
- f = request.urlopen(req)
- f.close()
-except Exception as e:
- print("Problem while sending request via HTTP: %s: %s" % (url, e), file=sys.stderr)
- sys.exit(1)
+from urllib.error import HTTPError
+
+data = sys.stdin.read().encode("utf-8")
+url = sys.argv[1]
+attempts = 3
+timeout = 20
+backoffs = [3, 10]
+
+for i in range(1, attempts + 1):
+ try:
+ req = request.Request(url, data=data)
+ f = request.urlopen(req, timeout=timeout)
+ f.close()
+ break
+ except HTTPError as e:
+ if 400 <= e.code < 500:
+ print("Non-retryable HTTP %d for %s: %s" % (e.code, url, e), file=sys.stderr)
+ sys.exit(1)
+ err = e
+ except Exception as e:
+ err = e
+ print("Attempt %d/%d failed for %s: %s" % (i, attempts, url, err), file=sys.stderr)
+ if i == attempts:
+ sys.exit(1)
+ wait = backoffs[min(i - 1, len(backoffs) - 1)]
+ print("Retrying in %ds..." % wait, file=sys.stderr)
+ time.sleep(wait)
print("Request queued via HTTP.", file=sys.stdout)
' "$url"
;;
@@ -626,22 +642,42 @@ import gzip
import re
import os
import string
+import time
from urllib import request
+from urllib.error import HTTPError
from io import BytesIO
from xml.dom import minidom
skip = os.environ.get("skip").split(",");
control_url = os.environ.get("control_url")
+queue_url = control_url + "/queue.gz"
print("* Check queue_id-s against %s" % control_url, file=sys.stderr)
-try:
- headers = { "Cache-Control": "no-cache", "Pragma": "no-cache" }
- req = request.Request(url=control_url + "/queue.gz", headers=headers)
- f = request.urlopen(req)
-except Exception as e:
- print("Fetch error %s: %s" % (control_url + "/queue.gz", e), file=sys.stderr)
- sys.exit(1)
+attempts = 3
+timeout = 20
+backoffs = [3, 10]
+headers = { "Cache-Control": "no-cache", "Pragma": "no-cache" }
+
+f = None
+for i in range(1, attempts + 1):
+ try:
+ req = request.Request(url=queue_url, headers=headers)
+ f = request.urlopen(req, timeout=timeout)
+ break
+ except HTTPError as e:
+ if 400 <= e.code < 500:
+ print("Non-retryable HTTP %d for %s: %s" % (e.code, queue_url, e), file=sys.stderr)
+ sys.exit(1)
+ err = e
+ except Exception as e:
+ err = e
+ print("Attempt %d/%d failed for %s: %s" % (i, attempts, queue_url, err), file=sys.stderr)
+ if i == attempts:
+ sys.exit(1)
+ wait = backoffs[min(i - 1, len(backoffs) - 1)]
+ print("Retrying in %ds..." % wait, file=sys.stderr)
+ time.sleep(wait)
sio = BytesIO()
sio.write(f.read())
@@ -725,9 +761,10 @@ if [ "$upgrade_scripts" = "yes" ]; then
build_mode=test
fi
-if [[ "$requester" != *@* ]] ; then
- requester="$requester at pld-linux.org"
-fi
+case "$requester" in
+ *@*) ;;
+ *) requester="$requester at pld-linux.org" ;;
+esac
if [ -z "$builders" ] ; then
builders="$default_builders"
@@ -877,15 +914,19 @@ gen_req() {
echo "</group>"
}
+tmpd=$(mktemp -d) || die "mktemp failed"
+trap 'rm -rf "$tmpd"' EXIT
+trap 'exit 129' HUP
+trap 'exit 130' INT
+trap 'exit 143' TERM
+
gen_email () {
# make request first, so the STDERR/STDOUT streams won't be mixed
- local tmpd tmp req
- tmpd=$(mktemp -d)
- tmp=$tmpd/req
- gen_req > $tmp
+ local tmp=$tmpd/req
+ gen_req > "$tmp"
if [ "$verbose" = "yes" ]; then
- cat $tmp >&2
+ cat "$tmp" >&2
fi
cat <<-EOF
@@ -898,14 +939,16 @@ gen_email () {
EOF
- gpg --clearsign --default-key $default_key $gpg_opts --output=$tmpd/sign $tmp
+ if ! gpg --clearsign --default-key $default_key $gpg_opts --output="$tmpd/sign" "$tmp"; then
+ die "gpg signing failed"
+ fi
if [ "$verbose" = "yes" ]; then
- cat >&2 $tmpd/sign
+ cat >&2 "$tmpd/sign"
fi
- cat $tmpd/sign
- rm -rf $tmpd
+ cat "$tmpd/sign"
}
-gen_email | send_request
+gen_email > "$tmpd/out" || exit 1
+send_request < "$tmpd/out"
================================================================
---- gitweb:
http://git.pld-linux.org/gitweb.cgi/projects/pld-builder.new.git/commitdiff/41c28379cff5be683fd7c88982e8ffceacdff5d5
More information about the pld-cvs-commit
mailing list