[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