]> sipb.mit.edu Git - ikiwiki.git/commitdiff
Merge commit 'upstream/po' into prv/po
authorintrigeri <intrigeri@boum.org>
Wed, 12 Nov 2008 00:08:57 +0000 (01:08 +0100)
committerintrigeri <intrigeri@boum.org>
Wed, 12 Nov 2008 00:08:57 +0000 (01:08 +0100)
IkiWiki.pm
IkiWiki/Plugin/bzr.pm
IkiWiki/Wrapper.pm
debian/changelog
doc/bugs/bzr_RecentChanges_dates_start_from_1969.mdwn [new file with mode: 0644]
doc/plugins/contrib/po.mdwn
doc/plugins/po.mdwn
doc/todo/avoid_thrashing.mdwn [new file with mode: 0644]
doc/users/Edward_Betts.mdwn
po/ikiwiki.pot

index dc9b66344ae8529b24aec6b993e09f951f267b2b..d949566d834fb1cfcc053bd48ae91398f2571e80 100644 (file)
@@ -1280,8 +1280,7 @@ sub indexlink () { #{{{
 
 my $wikilock;
 
-sub lockwiki (;$) { #{{{
-       my $wait=@_ ? shift : 1;
+sub lockwiki () { #{{{
        # 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}) {
@@ -1289,20 +1288,8 @@ sub lockwiki (;$) { #{{{
        }
        open($wikilock, '>', "$config{wikistatedir}/lockfile") ||
                error ("cannot write to $config{wikistatedir}/lockfile: $!");
-       if (! flock($wikilock, 2 | 4)) { # LOCK_EX | LOCK_NB
-               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 {
-                       return 0;
-               }
+       if (! flock($wikilock, 2)) { # LOCK_EX
+               error("failed to get lock");
        }
        return 1;
 } #}}}
index 101e91b930836126f9ef4a00b6a722af42cf5c50..1054f5b3e3f0be1c39e3865fc0a8b90b80ae2b74 100644 (file)
@@ -246,7 +246,7 @@ sub rcs_recentchanges ($) { #{{{
                        rev        => $info->{"revno"},
                        user       => $user,
                        committype => "bzr",
-                       when       => time - str2time($info->{"timestamp"}),
+                       when       => str2time($info->{"timestamp"}),
                        message    => [@message],
                        pages      => [@pages],
                };
index 99237d3b5c5b46b6b5afb85436938b1cbbd329c4..7a2d4381a079aaf5af71a3a4447486a76f5e0c9b 100644 (file)
@@ -44,6 +44,7 @@ EOF
        }
 
        my $check_commit_hook="";
+       my $pre_exec="";
        if ($config{post_commit}) {
                # Optimise checking !commit_hook_enabled() , 
                # so that ikiwiki does not have to be started if the
@@ -58,7 +59,7 @@ EOF
                # the benefit of this optimisation.
                $check_commit_hook=<<"EOF";
        {
-               int fd=open("$config{wikistatedir}/commitlock", O_CREAT | O_RDWR);
+               int fd=open("$config{wikistatedir}/commitlock", O_CREAT | O_RDWR, 0666);
                if (fd != -1) {
                        if (flock(fd, LOCK_SH | LOCK_NB) != 0)
                                exit(0);
@@ -67,6 +68,19 @@ EOF
        }
 EOF
        }
+       elsif ($config{cgi}) {
+               # Avoid more than one ikiwiki cgi running at a time by
+               # taking a cgi lock. Since ikiwiki uses several MB of
+               # memory, a pile up of processes could cause thrashing
+               # otherwise.
+               $pre_exec=<<"EOF";
+       {
+               int fd=open("$config{wikistatedir}/cgilock", O_CREAT | O_RDWR, 0666);
+               if (fd != -1)
+                       flock(fd, LOCK_EX);
+       }
+EOF
+       }
 
        $Data::Dumper::Indent=0; # no newlines
        my $configstring=Data::Dumper->Dump([\%config], ['*config']);
@@ -122,6 +136,7 @@ $envsave
                exit(1);
        }
 
+$pre_exec
        execl("$this", "$this", NULL);
        perror("exec $this");
        exit(1);
index cc277beb359563bc000ae10db4a3552d95cf8330..2088b07ecf5425dce84203ea857ec9f90c39af32 100644 (file)
@@ -13,6 +13,15 @@ ikiwiki (2.69) UNRELEASED; urgency=low
     was earlier added to edit links.
   * tag: Normalize tagbase so leading/trailing slashes in it don't break
     things.
+  * bzr: Fix dates for recentchanges.
+  * Avoid multiple ikiwiki cgi processes piling up, eating all memory,
+    and thrashing, by making the cgi wrapper wait on a cgilock.
+    If you had to set apache's MaxClients low to avoid ikiwiki thrashing your
+    server, you can now turn it up to a high value.
+  * Stop busy-waiting in lockwiki, as this could delay ikiwiki from waking up
+    for up to one second. The bailout code is no longer needed after above
+    change.
+  * Remove support for unused optional wait parameter from lockwiki.
 
  -- Joey Hess <joeyh@debian.org>  Thu, 06 Nov 2008 16:01:00 -0500
 
diff --git a/doc/bugs/bzr_RecentChanges_dates_start_from_1969.mdwn b/doc/bugs/bzr_RecentChanges_dates_start_from_1969.mdwn
new file mode 100644 (file)
index 0000000..fa6e45b
--- /dev/null
@@ -0,0 +1,16 @@
+Using bzr, the dates for changes on the RecentChanges page all start
+slightly before the Unix epoch.
+
+Changing line 249 of bzr.pm from
+
+`                        when       => time - str2time($info->{"timestamp"}),`
+
+to
+
+`                        when       => str2time($info->{"timestamp"}),`
+
+fixed this for me.
+
+> Weird, I wonder why it was written to return an absolute time like that
+> in the first place? Can't have ever been right. Fixed, thanks. --[[Joey]]
+> [[done]]
index 4ad0fa063a88e6429510452b8932b5a15285a440..3077b485848118722d2514508703346364aaa966 100644 (file)
@@ -93,7 +93,7 @@ Any thoughts on this?
 >>> When a new language is added to `po_slave_languages`, a rebuild is
 >>> triggered, and all missing PO files are created and checked into
 >>> VCS. An unpriviledged wiki user can not add a new language to
->>> `po_slave_languages`, though. One could thing of adding the needed
+>>> `po_slave_languages`, though. One could think of adding the needed
 >>> interface to translate a page into a yet-unsupported slave
 >>> language, and this would automagically add this new language to
 >>> `po_slave_languages`. It would probably be useful in some
@@ -106,6 +106,39 @@ Any thoughts on this?
 >>>> I guess that if the template modification is made, it will list those
 >>>> languages on the page, and if a translation to a language is missing,
 >>>> the link will allow creating it?
+>>>>
+>>>>> Any translation page always exist for every supported slave
+>>>>> language, even if no string at all have been translated yet.
+>>>>> This implies the po plugin is especially friendly to people who
+>>>>> prefer reading in their native language if available, but don't
+>>>>> mind reading in English else.
+>>>>>
+>>>>> While I'm at it, there is a remaining issue that needs to be
+>>>>> sorted out: how painful it could be for non-English speakers
+>>>>> (assuming the master language is English) to be perfectly able
+>>>>> to navigate between translation pages supposed to be written in
+>>>>> their own language, when their translation level is most
+>>>>> often low.
+>>>>>
+>>>>> (It is currently easy to display this status on the translation
+>>>>> page itself, but then it's too late, and how frustrating to load
+>>>>> a page just to realize it's actually not translated enough for
+>>>>> you. The "other languages" loop also allows displaying this
+>>>>> information, but it is generally not the primary
+>>>>> navigation tool.)
+>>>>>
+>>>>> IMHO, this is actually a social problem (i.e. it's no use adding
+>>>>> a language to the supported slave ones if you don't have the
+>>>>> manpower to actually do the translations), that can't be fully
+>>>>> solved by technical solutions, but I can think of some hacks
+>>>>> that would limit the negative impact: a given translation's
+>>>>> status (currently = percent translated) could be displayed next
+>>>>> to the link that leads to it; a color code could as well be used
+>>>>> ("just" a matter of adding a CSS id or class to the links,
+>>>>> depending on this variable). As there is already work to be done
+>>>>> to have the links text generation more customizable through
+>>>>> plugins, I could do both at the same time if we consider this
+>>>>> matter to be important enough. --[[intrigeri]]
 
 >> FWIW, I'm tracking your po branch in ikiwiki master git in the po
 >> branch. One thing I'd like to try in there is setting up a translated
index 125a9b016ef1b5fef44c14c395d71c76b4bed897..eeeabe7306fde63139c3334f6b6f2e43a33bc415 100644 (file)
@@ -299,6 +299,8 @@ means the `Text` module only.
   variables; they seem safe to me, but someone more expert than me
   will need to check. Joey?
 
+  > Freaky code, but seems ok due to use of `quotementa`.
+
 ##### Text::WrapI18N
 
 `Text::WrapI18N` can cause DoS (see the
@@ -318,6 +320,34 @@ in this field. Joey? [[--intrigeri]]
 > familiar with. I can learn and do it, in case no Perl wizard
 > volunteers to provide the po4a patch. [[--intrigeri]]
 
+>> That doesn't really need to be in a BEGIN. This patch moves it to
+>> `import`, and makes this disable wrap18n:
+>> `use Locale::Po4a::Common q{nowrapi18n}` --[[Joey]]
+
+<pre>
+--- /usr/share/perl5/Locale/Po4a/Common.pm     2008-07-21 14:54:52.000000000 -0400
++++ Common.pm  2008-11-11 18:27:34.000000000 -0500
+@@ -30,8 +30,16 @@
+ use strict;
+ use warnings;
+-BEGIN {
+-    if (eval { require Text::WrapI18N }) {
++sub import {
++    my $class=shift;
++    my $wrapi18n=1;
++    if ($_[0] eq 'nowrapi18n') {
++      shift;
++      $wrapi18n=0;
++    }
++    $class->export_to_level(1, $class, @_);
++
++    if ($wrapi18n && eval { require Text::WrapI18N }) {
+     
+         # Don't bother determining the wrap column if we cannot wrap.
+         my $col=$ENV{COLUMNS};
+</pre>
+
 ##### Term::ReadKey
 
 `Term::ReadKey` is not a hard dependency in our case, *i.e.* po4a
@@ -404,6 +434,9 @@ and
 Perl seems to exit cleanly, and an incomplete PO file is written on
 disk. I not sure whether if this is a bug in Perl or in `Po.pm`.
 
+> It's fairly standard perl behavior when fed malformed utf-8. As long as it doesn't
+> crash ikiwiki, it's probably acceptable. Ikiwiki can do some similar things itself when fed malformed utf-8 (doesn't crash tho) --[[Joey]]
+
 #### po4a-translate
 
 `po4a-translate` uses more or less the same po4a features as our
diff --git a/doc/todo/avoid_thrashing.mdwn b/doc/todo/avoid_thrashing.mdwn
new file mode 100644 (file)
index 0000000..45b11d8
--- /dev/null
@@ -0,0 +1,22 @@
+Problem: Suppose a server has 256 mb ram. Each ikiwiki process needs about
+15 mb, before it's loaded the index. (And maybe 25 after, but only one such
+process runs at any time). That allows for about 16 ikiwiki processes to
+run concurrently on a server, before it starts to swap. Of course, anything
+else that runs on the server and eats memory will affect this.
+
+One could just set `MaxClients 16` in the apache config, but then it's also
+limited to 16 clients serving static pages, which is silly. Also, 16 is
+optimistic -- 8 might be a saner choice. And then, what if something on the
+server decides to eat a lot of memory? Ikiwiki can again overflow memory 
+and thrash.
+
+It occurred to me that the ikiwiki cgi wrapper could instead do locking of
+its own (say of `.ikiwiki/cgilock`). The wrapper only needs a few kb to
+run, and it starts *fast*. So hundreds could be running waiting for a lock
+with no ill effects. Crank `MaxClients` up to 256? No problem..
+
+And there's no real reason to allow more than one ikiwiki cgi to run at a
+time. Since almost all uses of the CGI lock the index, only one can really
+be doing anything at a time. --[[Joey]]
+
+[[done]]
index 0d4483fa87f05431d2d7ee38502eae9896d6b3c0..b32927a1c312b13f632506deaf3fbcd09baf5a7f 100644 (file)
@@ -3,5 +3,7 @@ My watchlist:
 [[!inline archive="yes" sort="mtime" atom="yes" pages="
 todo/allow_wiki_syntax_in_commit_messages*
 todo/shortcut_with_different_link_text*
-todo/structured_page_data* "]]
+todo/structured_page_data*
+tips/convert_mediawiki_to_ikiwiki*
+"]]
 
index 34fa5e65b1584bee9f11e63624dadf7712edaa64..8cf3853e0b199df2c41b4cad0033eaae6a94e0a7 100644 (file)
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2008-11-07 12:23-0500\n"
+"POT-Creation-Date: 2008-11-11 15:36-0500\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -910,19 +910,19 @@ msgstr ""
 
 #. translators: The first parameter is a filename, and the second is
 #. translators: a (probably not translated) error message.
-#: ../IkiWiki/Wrapper.pm:79
+#: ../IkiWiki/Wrapper.pm:93
 #, perl-format
 msgid "failed to write %s: %s"
 msgstr ""
 
 #. translators: The parameter is a C filename.
-#: ../IkiWiki/Wrapper.pm:135
+#: ../IkiWiki/Wrapper.pm:150
 #, perl-format
 msgid "failed to compile %s"
 msgstr ""
 
 #. translators: The parameter is a filename.
-#: ../IkiWiki/Wrapper.pm:155
+#: ../IkiWiki/Wrapper.pm:170
 #, perl-format
 msgid "successfully generated %s"
 msgstr ""
@@ -969,7 +969,7 @@ msgstr ""
 msgid "preprocessing loop detected on %s at depth %i"
 msgstr ""
 
-#: ../IkiWiki.pm:1685
+#: ../IkiWiki.pm:1672
 msgid "yes"
 msgstr ""