Модуль для Drupal cacherouter и оценка его кода изнутри
Изучение модуля cacherouter версии 5.x-1.0-beta4 повергло меня в уныние.
Сама идея - того что разные таблицы кеша drupal стоит хранить каждую по своему - прекрасна. Учитывая специфику данных - что-то удобнее держать в файлах, что-то в памяти, что-то в кеше акселлераторов(APC, eaccelerator).
Однако реализация блокировок - а именно неприемлемая реализация именно для многопоточных систем - повергла меня в шок...
Пример кода из бекенда кеша APC для данного модуля:
/**
* lock()
* lock the cache from other writes.
*
* @param none
* @return string
* Returns TRUE on success, FALSE on failure
*/
function lock() {
// Lock once by trying to add lock file, if we can't get the lock, we will loop
// for 3 seconds attempting to get lock. If we still can't get it at that point,
// then we give up and return FALSE.
if (apc_add('lock_' . $this->name, TRUE) === FALSE) {
$time = time();
while (apc_add('lock_' . $this->name, TRUE) === FALSE) {
if (time() - $time >= 3) {
return FALSE;
}
}
}
return TRUE;
}
/**
* unlock()
* lock the cache from other writes.
*
* @param none
* @return bool
* Returns TRUE on success, FALSE on failure
*/
function unlock() {
return apc_delete('lock_' . $this->name);
}
То есть оно создает ключ и проверяет его существования. А если мы упремся на одновременное его создание? А если один процесс не увидит создания ключа пока создаст другой? Блокировка не сработает.
Короче такая штука приведет к непредсказуемым последствиям.
И в других бекендах кроме файлового в модуле можно увидеть такой же говнокод с блокировками.
Я все понимаю, иначе с кеширующими модулями тут никак не решить... но все таки. Мне кажется что идея то несколько неправильна. Даже при малой посещаемости можно получить неплохой геморрой с неверным отображением сайта в браузерах пользователей.
В общем, я продолжаю разработку своей расширенной системы кеша, части которой уже выкладывал на drupal.ru.
Увы, система работ "криво-косо" мне не подходит.















Комментарии
Код для 5ки абсолютно кривой, все изменения внесенные в 6ю версию там отсутствуют!
на бекендах flock задействован, семафоры, мютексы? ах нет? тада увы....
Отправить комментарий