Hlavní navigace

Chyba v mod_czech

Petr Tesařík

Také na svém WWW serveru používáte Apache a mod_czech? A občas se Vám stane, že některý proces zůstane "viset" a přitom výrazně zatěžuje CPU? Přišli jsme na to, kde je chyba.

Na našem serveru provozujeme kombinaci Apache + mod_czech pro dynamické kódování češtiny na našich stránkách. Po chvíli provozu ovšem tu a tam některý Apache zůstal v nekonečné smyčce, přičemž vytvářel nezanedbatelnou zátěž procesoru. Zřejmě nejsme jediní, protože o podobných problémech mluvili i provozovatelé jiných serverů.

Jak se zdá, na vině je mod_czech. Po krátkém zkoumání jsem odhalil i chybu. Je ve funkci mysockwrite, která nepočítá s případem uzavření spojení. Jak jsem se díval na zdrojové texty mod_czech verze 3.0.0, tam už patrně chyba není (ale nezkoušel jsem to), nicméně 3.0.0 je stále ještě v alpha verzi, takže pro ty, kdo provozují verzi 2.x.x nabízím tento patch: (není to žádná ukázka čistého programování, ale svůj účel splňuje)

--- mod_czech.c.old Thu Apr 23 09:23:16 1998
+++ mod_czech.c Thu Apr 23 09:25:40 1998
@@ -555,12 +555,23 @@
while(tosend) {
     if(r->connection->aborted) return(-1);
     n = bwrite(r->connection->client, &buf[i], tosend);
+    if(n <= 0)
+        break;
+    reset_timeout(r); /* reset timeout after successful write */
     i += n;
     tosend -= n;
#ifdef DEBUGBUG
     if(tosend) LogMess("Bwrite - Writing %d getting %d",tosend, n);
#endif
}
+
+ /* Tohle je hack!!! Melo by se vracet i a volajici funkce by mely pocitat
+  * s tim, ze je mensi nez num (coz se IMHO nedeje).
+  *  (Petr Tesarik, 21.4.1998)
+  */
+ if(i<num)
+   return(-1);
+
return(num);
}
/* -------------- ChangeTag -------------- */

Myslím si, že je to o něco lepší, než průběžně „ubíjet“ Apache, jak jsem to viděl na jednom nejmenovaném serveru.

Petr Tesařík

Našli jste v článku chybu?