*маленькое невинное хобби

Как починить mod_watch

Для apache есть весьма интересный «показометр» по нагрузке на отдельные виртуальные хосты. Пример картинки. Подробное и внятное руководство по уснтановке лежит здесь.

Однако, модуль почему-то обильно гадит в логи сообщениями вида

[error] shVerifyString(2b64251a2b78, 2b640fd4d710) failed!
[crit] (20014)Internal error: shGetLockedEntry(2b64251a2b78, "SERVER") failed in watchPostReadRequestHash()

Смотрим на строку 102 в файле SharedHash.c:

if ((char *)  tp->shared <= str && str < (char *) tp->eshared)

Действительно, tp->shared указывает только на блок памяти, а реально используемый адрес начала блока получается при помощи функции apr_shm_baseaddr_get (так, кстати, сделано для вычисления верхней границы блока в функции shCreate). В результате в моём случае tp->shared всегда больше чем tp->eshared и сравнение всегда ложно. Правим следующим образом:

if ((char *)  apr_shm_baseaddr_get(tp->shared) <= str && str < (char *) tp->eshared)

Теперь всё работает.