Bug 18436

Summary: /sbin/limited выставляет лимиты в неправильном порядке
Product: Sisyphus Reporter: Alexey Rusakov <ktirf>
Component: serviceAssignee: placeholder <placeholder>
Status: CLOSED FIXED QA Contact: qa-sisyphus
Severity: normal    
Priority: P2 CC: glebfm, ldv, legion, mike, placeholder
Version: unstableKeywords: patch
Hardware: all   
OS: Linux   
Attachments:
Description Flags
Исправление порядка выставления лимитов в limited
none
limited v1 none

Description Alexey Rusakov 2009-01-04 06:27:22 MSK
Created attachment 3185 [details]
Исправление порядка выставления лимитов в limited

Если попытаться задать для некоторой программы (в моём случае это был pulseaudio, но это не имеет значения) через /etc/sysconfig/limits.d/ и мягкий, и жёсткий лимиты, то легко создать ситуацию, при которой /sbin/limited ломается на первом же вызове ulimit. Последовательность действий у меня была следующая:
1. Прописываем в /etc/sysconfig/limits.d/pulseaudio два лимита: допустим, RLIMIT_SOFT_RTPRIO=7 и RLIMIT_HARD_RTPRIO=9.
2. service pulseaudio start
  Вместо запущенного pulseaudio получаем ругань на Invalid argument при выставлении real-time priority.
3. Выполняем ulimit -H -r 9
4. service pulseaudio start проходит без проблем.
А всё потому, что /sbin/limited сначала выставляет все мягкие лимиты, а потом все жёсткие. А если сделать ulimit -S -r 7 при жёстком лимите 0 (по умолчанию), то будет тот же самый invalid argument.
Очевидный патч на limited прилагается.
Comment 1 Dmitry V. Levin 2009-01-09 04:09:24 MSK
0.5.18-alt1-2-ge6f5138
Comment 2 Dmitry V. Levin 2009-01-13 00:49:34 MSK
Да, проспали.  Если просто поменять местами порядок установки лимитов, то они не будут выставляться в других случаях.

Вот пример:

# (ulimit -Hn; ulimit -Sn)
1024
1024
# (ulimit -Hn 1023; ulimit -Sn 1022)
-bash: ulimit: open files: cannot modify limit: Invalid argument
# (ulimit -Sn 1025; ulimit -Hn 1026)
-bash: ulimit: open files: cannot modify limit: Invalid argument

Т.е. повышение лимита нужно начинать с hard, а понижать -- начиная с soft.
Comment 3 Alexey Gladkov 2009-01-13 00:58:37 MSK
Тогда нужно несколько иначе выставлять лимит. set_ulimits() должна обрабатывать сразу оба типа лимитов.
Comment 4 Dmitry V. Levin 2009-01-13 01:01:57 MSK
(In reply to comment #3)
> Тогда нужно несколько иначе выставлять лимит. set_ulimits() должна обрабатывать
> сразу оба типа лимитов.

Она должна обрабатывать сразу оба типа лимитов, но самое главное -- она должна читать текущие значения лимитов для того, чтобы определить порядок их установки.
Comment 5 Alexey Gladkov 2009-01-13 01:11:54 MSK
Я сейчас попробую.
Comment 6 Alexey Gladkov 2009-01-14 14:14:02 MSK
Created attachment 3213 [details]
limited v1

На самом деле, сразу определить правильный порядок весьма хлопотное занятие. Вот одно из возможных вариантов. Его плюс он маленький и простой.
Comment 7 Alexey Gladkov 2009-01-26 21:08:25 MSK
Dmitry, please pull the latest git tree from:

git.alt:/people/legion/packages/service.git

I think we can close this bug. Suggest: Resolve => Fixed.
Comment 8 Dmitry V. Levin 2009-02-09 03:57:30 MSK
Hopefully fixed in 0.5.19-alt1