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. |