Skip to content

Commit 04077a8

Browse files
committed
refactor locking a bit, and only rebuild if a lock file can be obtained
1 parent c160421 commit 04077a8

File tree

2 files changed

+19
-7
lines changed

2 files changed

+19
-7
lines changed

evalbot.pl

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -252,10 +252,15 @@ package Evalbot;
252252
} elsif ($command eq 'version'){
253253
return "This is evalbot revision $evalbot_version";
254254
}
255-
} elsif ($message =~ m/\Aevalbot\s*rebuild\s+(\w+)/) {
256-
system "./build.pl $1 &";
257-
return "OK (started asynchronously)";
258-
}
255+
} elsif ($message =~ m/\Aevalbot\s*rebuild\s+(\w+)/) {
256+
my $name = "$1";
257+
if (EvalbotExecuter::try_lock($name)) {
258+
system "./build.pl $name &";
259+
return "OK (started asynchronously)";
260+
} else {
261+
return "NOT OK (maybe a rebuild is already in progress?)";
262+
}
263+
}
259264
return;
260265
}
261266

lib/EvalbotExecuter.pm

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@ sub _fork_and_eval {
117117
} elsif ($fork_val == 0) {
118118
POSIX::setpgid($$,$$);
119119
_set_resource_limits();
120-
_auto_execute($executer, $program, $fh, $filename, "/home/p6eval/evalbot/build-scripts/lock.$ename");
120+
_auto_execute($executer, $program, $fh, $filename, $ename);
121121
close $fh;
122122
exit;
123123
} else {
@@ -149,15 +149,22 @@ sub _fork_and_eval {
149149
return $result;
150150
}
151151

152+
sub try_lock {
153+
my $name = shift;
154+
my $lockfile = "/home/p6eval/evalbot/build-scripts/lock.$name";
155+
open my $lock, '>', $lockfile or return;
156+
flock($lock, 6) && $lock;
157+
}
158+
152159
sub _auto_execute {
153160
my ($executer, $program, $fh, $out_filename, $lock_name) = @_;
154161
local $^F = 1000;
155-
open my $lock, ">", $lock_name;
156162
open STDOUT, ">&", $fh;
157163
open STDERR, ">&", $fh;
158164
# TODO: avoid hardcoded path
159165
open STDIN, "<", glob '~/evalbot/stdin';
160-
if (!$executer->{nolock} && !flock $lock, 6) {
166+
my $lock;
167+
if (!$executer->{nolock} && !($lock = try_lock($lock_name)) ) {
161168
print "Rebuild in progress\n";
162169
exit 1;
163170
}

0 commit comments

Comments
 (0)