Bug 18436 - /sbin/limited выставляет лимиты в неправильном порядке
: /sbin/limited выставляет лимиты в неправильном порядке
Status: CLOSED FIXED
: Sisyphus
(All bugs in Sisyphus/service)
: unstable
: all Linux
: P2 normal
Assigned To:
:
:
: patch
:
:
  Show dependency tree
 
Reported: 2009-01-04 06:27 by
Modified: 2009-02-09 03:57 (History)


Attachments
Исправление порядка выставления лимитов в limited (236 bytes, patch)
2009-01-04 06:27, Alexey Rusakov
no flags Details | Diff
limited v1 (3.35 KB, text/plain)
2009-01-14 14:14, Alexey Gladkov
no flags Details


Note

You need to log in before you can comment on or make changes to this bug.


Description From 2009-01-04 06:27:22
Created an attachment (id=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 From 2009-01-09 04:09:24 -------
0.5.18-alt1-2-ge6f5138
------- Comment #2 From 2009-01-13 00:49:34 -------
Да, проспали.  Если просто поменять местами порядок установки лимитов, то они
не будут выставляться в других случаях.

Вот пример:

# (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 From 2009-01-13 00:58:37 -------
Тогда нужно несколько иначе выставлять лимит. set_ulimits() должна обрабатывать
сразу оба типа лимитов.
------- Comment #4 From 2009-01-13 01:01:57 -------
(In reply to comment #3)
> Тогда нужно несколько иначе выставлять лимит. set_ulimits() должна обрабатывать
> сразу оба типа лимитов.

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

На самом деле, сразу определить правильный порядок весьма хлопотное занятие.
Вот одно из возможных вариантов. Его плюс он маленький и простой.
------- Comment #7 From 2009-01-26 21:08:25 -------
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 From 2009-02-09 03:57:30 -------
Hopefully fixed in 0.5.19-alt1