aboutsummaryrefslogtreecommitdiff
path: root/IkiWiki.pm
diff options
context:
space:
mode:
authorjoey <joey@0fa5a96a-9a0e-0410-b3b2-a0fd24251071>2007-05-21 02:52:51 +0000
committerjoey <joey@0fa5a96a-9a0e-0410-b3b2-a0fd24251071>2007-05-21 02:52:51 +0000
commit82ac63d798cc7f45a42e14bc2ad05a9388e25a04 (patch)
treea718173f89b4d58dff64adadfff4c2199f42a9e1 /IkiWiki.pm
parent07a1796d3bf52bca9a325cf517f742ff44b49921 (diff)
downloadikiwiki-82ac63d798cc7f45a42e14bc2ad05a9388e25a04.tar
ikiwiki-82ac63d798cc7f45a42e14bc2ad05a9388e25a04.tar.gz
* Change the aggregate plugin's locking strategy. Now it defers loading state
until the wiki is building and already locked, unless it's aggregating. When aggregating, it does not wait for the lock if it cannot get it, and instead exits, to prevent aggregating processes from piling up.
Diffstat (limited to 'IkiWiki.pm')
-rw-r--r--IkiWiki.pm24
1 files changed, 16 insertions, 8 deletions
diff --git a/IkiWiki.pm b/IkiWiki.pm
index a0b902794..31e175d2a 100644
--- a/IkiWiki.pm
+++ b/IkiWiki.pm
@@ -668,7 +668,8 @@ sub indexlink () { #{{{
return "<a href=\"$config{url}\">$config{wikiname}</a>";
} #}}}
-sub lockwiki () { #{{{
+sub lockwiki (;$) { #{{{
+ my $wait=@_ ? shift : 1;
# Take an exclusive lock on the wiki to prevent multiple concurrent
# run issues. The lock will be dropped on program exit.
if (! -d $config{wikistatedir}) {
@@ -677,15 +678,22 @@ sub lockwiki () { #{{{
open(WIKILOCK, ">$config{wikistatedir}/lockfile") ||
error ("cannot write to $config{wikistatedir}/lockfile: $!");
if (! flock(WIKILOCK, 2 | 4)) { # LOCK_EX | LOCK_NB
- debug("wiki seems to be locked, waiting for lock");
- my $wait=600; # arbitrary, but don't hang forever to
- # prevent process pileup
- for (1..$wait) {
- return if flock(WIKILOCK, 2 | 4);
- sleep 1;
+ if ($wait) {
+ debug("wiki seems to be locked, waiting for lock");
+ my $wait=600; # arbitrary, but don't hang forever to
+ # prevent process pileup
+ for (1..$wait) {
+ return if flock(WIKILOCK, 2 | 4);
+ sleep 1;
+ }
+ error("wiki is locked; waited $wait seconds without lock being freed (possible stuck process or stale lock?)");
+ }
+ else {
+ debug("wiki is locked");
+ return 0;
}
- error("wiki is locked; waited $wait seconds without lock being freed (possible stuck process or stale lock?)");
}
+ return 1;
} #}}}
sub unlockwiki () { #{{{