From 861d19199872cc1bf29d54078775e24cc2302d15 Mon Sep 17 00:00:00 2001 From: Sam Liddicott Date: Fri, 19 Apr 2024 16:13:54 +0100 Subject: [PATCH] Use flock to guard against concurrent cache access Lock the `local` dir with `flock -Fs` for shared read locks and `flock -Fx` when updating This prevents certain failure at concurrency >=5 and succedes past concurrency of 70 Change-Id: I5beda9168b13b0525dc108c2ca85f9d21e126780 --- src/Main.hx | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/Main.hx b/src/Main.hx index ce190c5..6ad1aec 100644 --- a/src/Main.hx +++ b/src/Main.hx @@ -49,13 +49,13 @@ class Main { static function clone(remote, local, callback) { - ChildProcess.exec('git clone --quiet --mirror "$remote" "$local"', callback); + ChildProcess.exec('mkdir -p "$local" && flock -Fx "$local" git clone --quiet --mirror "$remote" "$local"', callback); } static function fetch(remote, local, callback) { - ChildProcess.exec('git -C "$local" remote set-url origin "$remote"', function(err, stdout, stderr) { - ChildProcess.exec('git -C "$local" fetch --quiet --prune --prune-tags', callback); + ChildProcess.exec('mkdir -p "$local" && flock -Fx "$local" git -C "$local" remote set-url origin "$remote"', function(err, stdout, stderr) { + ChildProcess.exec('mkdir -p "$local" && flock -Fx "$local" git -C "$local" fetch --quiet --prune --prune-tags', callback); }); } @@ -163,7 +163,7 @@ class Main { res.setHeader("Content-Type", 'application/x-${params.service}-advertisement'); res.setHeader("Cache-Control", "no-cache"); res.write("001e# service=git-upload-pack\n0000"); - var up = ChildProcess.spawn(params.service, ["--stateless-rpc", "--advertise-refs", local]); + var up = ChildProcess.spawn("flock", ["-Fs", local, params.service, "--stateless-rpc", "--advertise-refs", local]); up.stdout.pipe(res); up.stderr.on("data", function (data) println('${params.service} stderr: $data')); up.on("exit", function (code) { @@ -176,7 +176,7 @@ class Main { res.statusCode = 200; res.setHeader("Content-Type", 'application/x-${params.service}-result'); res.setHeader("Cache-Control", "no-cache"); - var up = ChildProcess.spawn(params.service, ["--stateless-rpc", local]); + var up = ChildProcess.spawn("flock", ["-Fs", local, params.service, "--stateless-rpc", local]); // If we receive gzip content, we must unzip if (req.headers['content-encoding'] == 'gzip') req.pipe(Zlib.createUnzip()).pipe(up.stdin);