From 5dbe26fc60e0b07593c914508cc42ed9e7a75170 Mon Sep 17 00:00:00 2001 From: "Dustin C. Hatch" Date: Sat, 16 Aug 2025 09:22:51 -0500 Subject: [PATCH] r/repohost: Optimize createrepo queue loop Instead of waking every 30 seconds, the queue loop in `repohost-createrepo.sh` now only wakes when it receives an inotify event indicating the queue file has been modified. To avoid missing events that occured while a `createrepo` process was running, there's now an inner loop that runs until the queue is completely empty, before returning to blocking on `inotifywait`. --- roles/repohost/files/repohost-createrepo.sh | 30 ++++++++++++++------- 1 file changed, 21 insertions(+), 9 deletions(-) diff --git a/roles/repohost/files/repohost-createrepo.sh b/roles/repohost/files/repohost-createrepo.sh index 9883404..b476e57 100755 --- a/roles/repohost/files/repohost-createrepo.sh +++ b/roles/repohost/files/repohost-createrepo.sh @@ -1,18 +1,30 @@ #!/bin/sh +# vim: set sw=4 ts=4 sts=4 et : QFILE="${HOME}"/createrepo.queue REPOS_ROOT="${HOME}"/repos +wait_queue() { + inotifywait \ + --event close_write \ + --include "${QFILE##*/}" \ + "${QFILE%/*}" +} + createrepo_loop() { - while sleep 30; do - [ -f "${QFILE}" ] || continue - mv "${QFILE}" "${QFILE}.work" - sort -u "${QFILE}.work" > "${QFILE}.sorted" - while read dir; do - printf 'Generating repository metadata for %s\n' "${dir}" - createrepo_c "${dir}" - done < "${QFILE}.sorted" - rm -f "${QFILE}.work" "${QFILE}.sorted" + while wait_queue; do + while [ -f "${QFILE}" ]; do + sleep 10 + flock "${QFILE}" mv "${QFILE}" "${QFILE}.work" + sort -u "${QFILE}.work" > "${QFILE}.sorted" + while read dir; do + if [ -d "${dir}" ]; then + printf 'Generating repository metadata for %s\n' "${dir}" + createrepo_c "${dir}" + fi + done < "${QFILE}.sorted" + rm -f "${QFILE}.work" "${QFILE}.sorted" + done done }