Bug 29236 - Некорректная остановка squid
Summary: Некорректная остановка squid
Status: CLOSED FIXED
Alias: None
Product: Sisyphus
Classification: Development
Component: squid (show other bugs)
Version: unstable
Hardware: all Linux
: P3 normal
Assignee: Alexey Shabalin
QA Contact: qa-sisyphus
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2013-07-29 14:17 MSK by Alex Moskalenko
Modified: 2013-08-18 01:08 MSK (History)
2 users (show)

See Also:


Attachments
Патч на squid.init (1.66 KB, patch)
2013-08-14 15:36 MSK, Alex Moskalenko
no flags Details | Diff

Note You need to log in before you can comment on or make changes to this bug.
Description Alex Moskalenko 2013-07-29 14:17:12 MSK
В init-скрипте squid останавливается командой "stop_daemon --pidfile "$PIDFILE" --lockfile "$LOCKFILE" --expect-user squid -- $SQUID", из-за чего при повторном запуске он заново проверяет свой кэш. В процессе проверки squid не обслуживает запросы пользователей, а при достаточно большом объеме кэша проверка занимает значительное время (десятки минут).
Вместо этого squid рекомендуется останавливать командой squid -k shutdown (в .service-файле для systemd, кстати, именно так и сделано) - при этом состояние кэша записывается на диск корректно и squid начинает работать без его проверки при старте.
Comment 1 led 2013-07-30 08:16:05 MSK
В 3.2.13-alt2 вроде бы исправил.

Когда дойдёт до репозитория посмотрите, пожалуйста, устраивает ли такое поведение (stop и restart)
Comment 2 Repository Robot 2013-07-30 11:26:36 MSK
squid-3.2.13-alt2 -> sisyphus:

* Tue Jul 30 2013 Led <led@altlinux> 3.2.13-alt2
- squid.init: fixed stopping service (ALT#29236)
Comment 3 Alex Moskalenko 2013-07-31 13:54:03 MSK
Спасибо, поведение сильно лучше, чем раньше. :) Есть пара мыслей по этому поводу:

1. Есть смысл ввести обработку SQUID_SHUTDOWN_TIMEOUT из /etc/sysconfig/squid. В текущем варианте, если процесс squid помирать откажется (по разным причинам - сбой диска, например), мы получим бесконечное ожидание при его завершении. Предлагаю ждать определенное время, настраиваемое в /etc/sysconfig/squid.
2. Возможно, есть смысл обработать cache_effective_user из /etc/squid/squid.conf аналогично pid-файлу, и использовать полученное значение, вместо жесткого задания в squid.
Comment 4 Alex Moskalenko 2013-08-14 15:36:54 MSK
Created attachment 5906 [details]
Патч на squid.init

Вариант патча для squid.init, реализующий таймаут при остановке и обработку cache_effective_user
Comment 5 Alex Moskalenko 2013-08-14 15:38:22 MSK
Переоткрою багу, так как думаю, что обработка таймаута при остановке squid все-таки нужна.
Comment 6 led 2013-08-14 19:09:41 MSK
(В ответ на комментарий №4)
> Created an attachment (id=5906) [details]
> Патч на squid.init
> 
> Вариант патча для squid.init, реализующий таймаут при остановке и обработку
> cache_effective_user

С SQUIDUSER - согласен.
С SQUID_SHUTDOWN_TIMEOUT=60 - не очень.

Таймаут задаётся в конфиге параметром shutdown_lifetime - его и нужно использовать (или дефолтные 30 секунд, если не задан), а не абстрактные 60 секунд. Плюс 5 секунд накидываем сверху "на всякий случай" (по тестам получается, что нужно сверх 1-3 секунды).

См. http://git.altlinux.org/people/led/packages/?p=squid.git;a=commit;h=89d9197e7d5217a775c3264f63d0a338165f266b

Ну и следующий за ним http://git.altlinux.org/people/led/packages/?p=squid.git;a=commit;h=9b5cb51a1c09333a780686a3ace00bd375c12e6b в котором опять всё упрощаем и используем для остановки по таймауту стандартный stop_daemon(). При этом, если не дождались (почему-то), процесс прибивается с -9.

Если конструктивных возражений не будет, этот вариант и пойдёт на сборку.
Comment 7 Alex Moskalenko 2013-08-14 19:19:11 MSK
По-моему, в http://git.altlinux.org/people/led/packages/?p=squid.git;a=commit;h=9b5cb51a1c09333a780686a3ace00bd375c12e6b все упростили настолько, что потеряли собственно цель - гасить squid с помощью squid -k shutdown. :)

Предлагаю "упростить" только цикл остановки по таймауту, а функцию stop() начать с чего-то типа
if start-stop-daemon -q --pid "$PIDFILE" --user $SQUID_USER --stop --test >/dev/null; then
  msg_stopping $"squid"
  $SQUID -f "$SQUID_CONF" -k shutdown
  *** далее остановка по таймауту ***
fi
Comment 8 led 2013-08-14 19:25:50 MSK
(В ответ на комментарий №7)
> По-моему, в
> http://git.altlinux.org/people/led/packages/?p=squid.git;a=commit;h=9b5cb51a1c09333a780686a3ace00bd375c12e6b
> все упростили настолько, что потеряли собственно цель - гасить squid с помощью
> squid -k shutdown. :)

stop_daemon() делает ровно то же, что и "squid -k shutdown" - посылает процессу с указанным pid'ом сигнал TERM. Просто без --retry он, не дожидаясь, посылал сразу же KILL.
Поэтому разницы никакой, зато на порядок проще и "стандартнее".
Comment 9 Alex Moskalenko 2013-08-14 19:38:44 MSK
(В ответ на комментарий №8)
> stop_daemon() делает ровно то же, что и "squid -k shutdown" - посылает процессу
> с указанным pid'ом сигнал TERM. Просто без --retry он, не дожидаясь, посылал
> сразу же KILL.
> Поэтому разницы никакой, зато на порядок проще и "стандартнее".

Если так - тогда возражений нет.
Comment 10 Repository Robot 2013-08-14 21:38:43 MSK
squid-3.2.13-alt3 -> sisyphus:

* Wed Aug 14 2013 Led <led@altlinux> 3.2.13-alt3
- squid.init: use config values for shutdown timeout and effective squid user
  (ALT#29236)
Comment 11 Alex Moskalenko 2013-08-16 16:27:36 MSK
(В ответ на комментарий №6)
> (В ответ на комментарий №4)
> С SQUID_SHUTDOWN_TIMEOUT=60 - не очень.
> 
> Таймаут задаётся в конфиге параметром shutdown_lifetime - его и нужно
> использовать (или дефолтные 30 секунд, если не задан), а не абстрактные 60
> секунд. Плюс 5 секунд накидываем сверху "на всякий случай" (по тестам
> получается, что нужно сверх 1-3 секунды).
 
А как Вы считаете, не следует ли абстрактные 5 секунд, накинутые сверху, заменить переменной типа SQUID_EXTRA_SHUTDOWN_TIMEOUT (вместо SQUID_SHUTDOWN_TIMEOUT, которую вообще убрать из /etc/sysconfig/squid), и дать возможность настраивать эти "на всякий случай накидываемые" секунды, с умолчанием в те же 5 секунд например? Случаи разные могут быть, 5 секунд может и не хватить (пример - параллельная остановка нескольких контейнеров OpenVZ, squid в одном из них. 5 секунд может не хватить для корректной остановки).

PS Состояние баги не меняю, так как она таки RESOLVED. Если этот пакет скопировать в p7, то я его протестирую и базу закрою/переоткрою.
Comment 12 led 2013-08-16 17:53:05 MSK
(В ответ на комментарий №11)

http://git.altlinux.org/people/led/packages/?p=squid.git;a=commit;h=5b12e87c8a54916050aa3ce675ebe844c6c15fd2

* Fri Aug 16 2013 Led <led@altlinux.ru> 3.2.13-alt4
- squid.init: made SQUID_EXTRA_SHUTDOWN_TIMEOUT configurable
Comment 13 Alex Moskalenko 2013-08-18 01:08:52 MSK
Спасибо, работает замечательно.