From 01bab6e26d8c2da615cad18003d1ae31a4fb1672 Mon Sep 17 00:00:00 2001 From: Natanael Copa Date: Fri, 20 Jan 2012 09:19:39 +0100 Subject: abuild: implement locking of downloaded files We need locking Since the build servers use a shared download dir and multiple vservers might want download same file at same time. fixes #873 --- abuild.in | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) (limited to 'abuild.in') diff --git a/abuild.in b/abuild.in index 4437877..65778d1 100755 --- a/abuild.in +++ b/abuild.in @@ -86,6 +86,9 @@ cleanup() { msg "Uninstalling dependencies..." $SUDO $APK del --quiet $apk_opt_wait $uninstall_after fi + if [ -n "$CLEANUP_FILES" ]; then + rm -f $CLEANUP_FILES + fi } die() { @@ -258,7 +261,8 @@ uri_fetch() { local d="${uri##*/}" # $(basename $uri) local opts [ -n "$quiet" ] && opts="-s" - [ -f "$SRCDEST/$d" ] && return 0 + + local lockfile="$SRCDEST/$d".lock # fix saveas-*://* URIs case "$uri" in @@ -272,6 +276,14 @@ uri_fetch() { esac mkdir -p "$SRCDEST" + + CLEANUP_FILES="$CLEANUP_FILES $lockfile" + ( + flock -n -x 200 || msg "Waiting for ${lockfile##*/}..." + flock -w 600 -x 200 + + [ -f "$SRCDEST/$d" ] && exit 0 # use exit since its a subshell + if [ -f "$SRCDEST/$d.part" ]; then msg "Partial download found. Trying to resume" opts="$opts -C -" @@ -289,6 +301,12 @@ uri_fetch() { $fetcher $opts -o "$SRCDEST/$d.part" "$uri" \ && mv "$SRCDEST/$d.part" "$SRCDEST/$d" + + ) 200>$lockfile + + local rc=$? + rm -f "$lockfile" + return $rc } is_remote() { -- cgit v1.2.3-60-g2f50