Bug 47836 - memory leaks in python bindings for RPM
Summary: memory leaks in python bindings for RPM
Status: CLOSED FIXED
Alias: None
Product: Sisyphus
Classification: Development
Component: python3-module-rpm (show other bugs)
Version: unstable
Hardware: x86_64 Linux
: P5 normal
Assignee: placeholder@altlinux.org
QA Contact: qa-sisyphus
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2023-10-04 16:52 MSK by Ivan A. Melnikov
Modified: 2023-10-04 19:51 MSK (History)
6 users (show)

See Also:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Ivan A. Melnikov 2023-10-04 16:52:38 MSK
Сизиф, python3-module-rpm-4.13.0.1-alt39

Для поддержки sisyphus_riscv64 и sisyphus_loongarch64 у нас есть несколько аналитических инструментов, написаных на python; некоторые из них используют модуль rpm для чтения pkglist'ов.

Было замечено, что если перечитывать pkglist'ы несколько раз, вся память очень быстро куда-то девается.

Вот несложный способ воспроизвести проблему:

$ wget 'http://ftp.altlinux.org/pub/distributions/ALTLinux/Sisyphus/noarch/base/pkglist.classic.xz'
$ xz -d pkglist.classic.xz 
$ cat test.py
import sys
import rpm

for _ in range(int(sys.argv[1])):
    with open("pkglist.classic") as f:
        rpms = rpm.readHeaderListFromFD(f.fileno())
        print(len(rpms))
        del rpms
$ python3 test.py 1
19279

По данным time, maxresident растёт линейно с ростом argv[1], valgrind  --leak-check=yes больше всего ругается на:

96,513,220 (771,080 direct, 95,742,140 indirect) bytes in 19,277 blocks are definitely lost in loss record 453 of 453
   at 0x48461E8: calloc (vg_replace_malloc.c:1117)
   by 0x5480053: rcalloc (rpmmalloc.c:55)
   by 0x53F8346: UnknownInlinedFun (header.c:171)
   by 0x53F8346: headerImport (header.c:829)
   by 0x53F8B2F: headerRead (header.c:1029)
   by 0x53A94DD: hdr_new (header-py.c:403)
   by 0x2DCABA: UnknownInlinedFun (typeobject.c:1100)
   by 0x2DCABA: _PyObject_MakeTpCall (call.c:214)
   by 0x2E93A5: _PyEval_EvalFrameDefault (ceval.c:4774)
   by 0x3A5AF8: UnknownInlinedFun (pycore_ceval.h:73)
   by 0x3A5AF8: _PyEval_Vector (ceval.c:6439)
   by 0x3A52E2: PyEval_EvalCode (ceval.c:1154)
   by 0x3C3149: run_eval_code_obj (pythonrun.c:1714)
   by 0x3BF8B2: run_mod (pythonrun.c:1735)
   by 0x3D47A1: pyrun_file (pythonrun.c:1630)

Алексей Шепляков, которого эта проблема больше всего зацепила, предположил, что это https://bugzilla.redhat.com/show_bug.cgi?id=1358467 . И действительно cherry pick 40326b5724b0cd55a21b2d86eeef344e4826f863 поверх rpm 4.13.0.1-alt39 помогает: valgrind не находит больше ничего definitely lost, а maxresident по данным time почти не растёт с ростом argv[0].
Comment 1 Ivan A. Melnikov 2023-10-04 18:05:52 MSK
Задача с исправлением: https://git.altlinux.org/tasks/330954/

Please review && approve.
Comment 2 Repository Robot 2023-10-04 19:51:49 MSK
rpm-4.13.0.1-alt40 -> sisyphus:

 Wed Oct 04 2023 Alexey Sheplyakov <asheplyakov@altlinux> 4.13.0.1-alt40
 - Plug a memory leak in python bindings (closes: #47836).