[devel] Q: [python3-3.3.1] RLIMIT в hasher`е

Aleksey Avdeev solo на solin.spb.ru
Чт Апр 11 16:51:28 MSK 2013


10.04.2013 21:39, Dmitry V. Levin пишет:
> On Wed, Apr 10, 2013 at 09:06:04PM +0400, Aleksey Avdeev wrote:
>> 10.04.2013 19:47, Dmitry V. Levin пишет:
>>> On Wed, Apr 10, 2013 at 06:41:36PM +0400, Aleksey Avdeev wrote:
>>>> 10.04.2013 17:45, Dmitry V. Levin пишет:
>>>>> On Wed, Apr 10, 2013 at 05:36:15PM +0400, Aleksey Avdeev wrote:
>>>>>> 10.04.2013 16:53, Dmitry V. Levin пишет:
>>>>>>> On Wed, Apr 10, 2013 at 01:11:56PM +0400, Aleksey Avdeev wrote:
>>>>>>>> Приветствую.
>>>>>>>>
>>>>>>>>   Я правильно понимаю, что установка пользовательским процессом  RLIMIT
>>>>>>>> в 1000000, запрещена настройками hasher`а?
>>>>>>>
>>>>>>> $ hsh-run -- sh -c 'ulimit -Ha'
>>>>>>> core file size          (blocks, -c) unlimited
>>>>>>> data seg size           (kbytes, -d) unlimited
>>>>>>> scheduling priority             (-e) 0
>>>>>>> file size               (blocks, -f) unlimited
>>>>>>> pending signals                 (-i) 1032915
>>>>>>> max locked memory       (kbytes, -l) 64
>>>>>>> max memory size         (kbytes, -m) unlimited
>>>>>>> open files                      (-n) 4096
>>>>>>> pipe size            (512 bytes, -p) 8
>>>>>>> POSIX message queues     (bytes, -q) 819200
>>>>>>> real-time priority              (-r) 0
>>>>>>> stack size              (kbytes, -s) unlimited
>>>>>>> cpu time               (seconds, -t) 7260
>>>>>>> max user processes              (-u) 1024
>>>>>>> virtual memory          (kbytes, -v) unlimited
>>>>>>> file locks                      (-x) unlimited
>>>>>>>
>>>>>>> Привысить значения этих hard limits ядро не даст.
>>>>>>>
>>>>>>>> PS: В Python-3.3.1 такую операцию пытается сделать
>>>>>>>> test.test_resource.ResourceTest. Если у нас это запрещено -- отключу тест.
>>>>>>>
>>>>>>> Какой именно лимит?
>>>>>>
>>>>>>   В коде (см.
>>>>>> <http://git.altlinux.org/people/solo/packages/?p=python3.git;a=blob;f=python3/Lib/test/test_resource.py;h=f3416b7b43ef2db9094401f65abe78222af7746a;hb=001b4a54de71226a2f7e0d9f5a409774a686effd>):
>>>>>>
>>>>>>     # Issue 6083: Reference counting bug
>>>>>>     def test_setrusage_refcount(self):
>>>>>>         try:
>>>>>>             limits = resource.getrlimit(resource.RLIMIT_CPU)
>>>>>>         except AttributeError:
>>>>>>             pass
>>>>>>         else:
>>>>>>             class BadSequence:
>>>>>>                 def __len__(self):
>>>>>>                     return 2
>>>>>>                 def __getitem__(self, key):
>>>>>>                     if key in (0, 1):
>>>>>>                         return len(tuple(range(1000000)))
>>>>                                                   ^^^^^^^
>>>>>>                     raise IndexError
>>>>>>
>>>>>>             resource.setrlimit(resource.RLIMIT_CPU, BadSequence())
>>>>>
>>>>> И какие значения RLIMIT_CPU в результате пытается установить этот код?
>>>>
>>>>   1000000 (см. выделение).
>>>>
>>>>   Там в конечном итоге setrlimit(resource, &rl)(см. функцию
>>>> resource_setrlimit(PyObject *self, PyObject *args) в
>>>> <http://git.altlinux.org/people/solo/packages/?p=python3.git;a=blob;f=python3/Modules/resource.c;h=b294a8cfe169bbc209e7e183b2eedbe018ed14b0;hb=001b4a54de71226a2f7e0d9f5a409774a686effd>)
>>>> возвращает errno == EPERM.
>>>
>>> Сколько значений RLIMIT_CPU передается в одном вызове setrlimit?
>>> Какие значения RLIMIT_CPU в результате пытается установить этот код?
>>
>>   Вызов происходит так:
>>
>> setrlimit(resource, &rl)
>>
>>   где:
>>
>> resource = 0 (константа RLIMIT_CPU из /usr/include/bits/resource.h)
>>
>> rl -- структура, содержащая:
>>
>> rl.rlim_cur = 1000000
>>
>> rl.rlim_max = 1000000
> 
> Верно.
> 
>>> На какое поведение setrlimit рассчитывает этот тест?
>>
>>   Что setrlimit(resource, &rl) вернёт нечто отличное от -1.
> 
> Верно.
> 
>>> Что вообще тестирует тест по имени test_setrusage_refcount?
>>
>>   Похоже он проверяет работоспособность вызова setrlimit (судя по коду).
> 
> Неверно.

  Это не важно, т. к., судя по логу, проблема именно в возврате -1,
вызовом setrlimit. В логе:

======================================================================
ERROR: test_setrusage_refcount (test.test_resource.ResourceTest)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/usr/src/RPM/BUILD/python3-3.3.1/Lib/test/test_resource.py",
line 125, in test_setrusage_refcount
    resource.setrlimit(resource.RLIMIT_CPU, BadSequence())
ValueError: not allowed to raise maximum limit
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

  А строка "not allowed to raise maximum limit" присутствует только в:

    if (setrlimit(resource, &rl) == -1) {
        if (errno == EINVAL)
            PyErr_SetString(PyExc_ValueError,
                            "current limit exceeds maximum limit");
        else if (errno == EPERM)
            PyErr_SetString(PyExc_ValueError,
                            "not allowed to raise maximum limit");
                             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
        else
            PyErr_SetFromErrno(PyExc_OSError);
        goto error;
    }

  Т. е. до вызова setrlimit, с указанными выше параметрами, дело
доходит. И корень проблемы в том, что он возвращает -1.

  А смысл теста -- вещь, в данном контексте, десятая.

-- 

С уважением. Алексей.


----------- следующая часть -----------
Было удалено вложение не в текстовом формате...
Имя     : signature.asc
Тип     : application/pgp-signature
Размер  : 897 байтов
Описание: OpenPGP digital signature
Url     : <http://lists.altlinux.org/pipermail/devel/attachments/20130411/f2718adf/attachment.bin>


Подробная информация о списке рассылки Devel