This is not really a bug, but elogd was getting really slow with our
logbook. It took about 4 1/2 seconds just to get the default page in
threaded mode with 15 entries. The logbook has in total about 2000
entries, though.
After playing around with the compiler option '-gp' and gprof the
problem was found: loc() is called about 18000 times per logbook
access! (Attached you can find the gprof output. There might be
other places where to save time: e.g. getcfg().) The function loc()
calls stat every time to check if the language file was updated and
this takes a long time especially over NFS.
The quick solution for me was to just replace loc() with 'char
*loc(char *orig) {return orig;}'. Therefore, I cannot use the
localization that I used anymore, which is not a big problem at the
moment. After that the time to download the default page was only
0.16 s; almost a factor of 30 faster!
I would suggest to only read the language file (AND also the config
file!) once upon startup. After changing things one has to restart
elogd, which is not so nice, but the long delay is not acceptable.
Another option not to restart elogd is to make elogd respond to a
signal (e.g. kill -HUP) to reread the config and language files. |
Around line 2240 (in loc()) in elogd.c the following is written,
which results in an infinite loop, since loc() recursively with
the same argument "Change %s".
/* special case: "Change %s" */
if (strstr(orig, "Change ")) {
sprintf(result, loc("Change %s"), orig + 7);
return result;
}
For now I just commented these lines. |
> > Have a look at the gcc info pages:
> >
> > $ info gcc "invoking gcc" "warning options"
>
> Sure, I'm not stupid!
Sorry, didn't mean to offend you.
> I looked for ~10 minutes how to turn off the remaining
> warnings, but I could not find it. The code is now correct, like I do want the
> "%y" format specifier in the strftime() function, but the warning is wrong.
One way to remove the warnings would be to use "%Y" in a separate strftime() call
and then taking only the last two digits (characters) of that string.
Something like:
old:
strftime(str, sizeof(str), "%A, %d-%b-%y %H:%M:%S GMT", gmt);
new:
strftime(str, sizeof(str), "%A, %d-%b-XX %H:%M:%S GMT", gmt);
strftime(year, sizeof(year), "%Y", gmt);
i=strstr(str,"XX"); /* find position of XX */
if ( i+1 < sizeof(str) ) {
str[i] =year[3];
str[i+1]=year[4];
} else ...
Somewhat cumbersome, but should work. Maybe consider using the four
digit year directly, where possible.
Gruss, Heiko |