Bug 57543 - MDB_TXN_FULL: Transaction has too many dirty pages при работе с большими группами в домене
Summary: MDB_TXN_FULL: Transaction has too many dirty pages при работе с большими груп...
Status: NEW
Alias: None
Product: Sisyphus
Classification: Development
Component: liblmdb (show other bugs)
Version: unstable
Hardware: x86_64 Linux
: P5 normal
Assignee: Evgeny Sinelnikov
QA Contact: qa-sisyphus
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2026-01-19 11:54 MSK by Дмитрий
Modified: 2026-01-30 23:55 MSK (History)
4 users (show)

See Also:


Attachments
скриншоты ошибок (310.21 KB, application/gzip)
2026-01-19 11:54 MSK, Дмитрий
no flags Details

Note You need to log in before you can comment on or make changes to this bug.
Description Дмитрий 2026-01-19 11:54:47 MSK
Created attachment 20515 [details]
скриншоты ошибок

Проверено на стендах с Р10 и Р11.
Конфигурация:
Альт Сервер (Р10 или Р11, обновлённый до актуального на 17.01.26 состояния)
Samba-DC 4.19.9-alt7-x86_64 и Samba-DC 4.21.9-alt1-x86_64

В случае, когда в домене имеются группы пользователей в большим количеством членств (на практике более 128571 пользователя) при вводе нового контроллера в домен посредством samba-tool join с --backend-store=mdb в процессе репликации основной БД процесс останавливается с ошибкой:
ERROR(runtime): uncaught exception - (8, 'WERR_NOT_ENOUGH_MEMORY')
При этом расход физических ресурсов контроллера далёк даже от 1/4 имеющихся. Размер получившегося на момент сбоя файла БД тоже далёк до пределов MAP_SIZE БД.
Повышение уровня дебага показывает, что в момент, когда в очередной транзакции пытается реплицироваться одна из таких больших групп происходит событие:
DSDB Transaction [rollback]. И следом сообщение об ошибке, что указано выше.

Если ввести контроллер в домен с параметром --domain-critical-only, то контроллер в домен вводится, но в дальнейшем DRS репликация корневого NC домена останавливается с тем же сообщением - 'WERR_NOT_ENOUGH_MEMORY'.

Если на имеющемся контроллере попытаться удалить такую группу целиком, получаем ошибку вида:
../../source4/dsdb/samdb/ldb_modules/repl_meta_data.c:4909: Failed to rename object from 'CN=megagroup-14,CN=Users,DC=corp,DC=alt' to 'CN=megagroup-14\0ADEL:1a1f3db6-d666-47bc-80d6-78cb1d36c73f,CN=Deleted Objects,DC=corp,DC=alt' - Linked attribute member->memberOf between CN=megagroup-14,CN=Users,DC=corp,DC=alt and CN=____bkovalev1960574760,CN=Users,DC=corp,DC=alt - update failed - (-30788) - MDB_TXN_FULL: Transaction has too many dirty pages - transaction too big at ../../ldb_mdb/ldb_mdb.c:203
ERROR(ldb): Failed to remove group "megagroup-14" - Linked attribute member->memberOf between CN=megagroup-14,CN=Users,DC=corp,DC=alt and CN=____bkovalev1960574760,CN=Users,DC=corp,DC=alt - update failed - (-30788) - MDB_TXN_FULL: Transaction has too many dirty pages - transaction too big at ../../ldb_mdb/ldb_mdb.c:203

Добавление/удаление пользователей по одному при этом работает.
Если же уменьшить количество членств в группе до 128571 (определено методом проб), то группа успешно удаляется, репликация такой группы тоже проходит.

Была найдена информация, что библиотека liblmdb имеет ограничение на количество "грязных страниц" в одной транзакции в 131072 (2^17). Исходя из количества членств (а каждое из них - это линк атрибутов member (группы) -> memberOf (пользователя)), есть предположение, что с учётом прочих изменяемых атрибутов при репликации/удалении группы проблема именно в этом ограничении liblmdb.

Проблема может возникнуть при использовании продукта Альт Домен в инфраструктурах, где имеется большой штат сотрудников и группы доступа/безопасности с большим количеством членов.

Несколько скриншотов  с ошибкой ввода и попытками удаления группы при разном количестве членств во вложении.
Comment 1 Evgeny Shesteperov 2026-01-29 20:56:15 MSK
Версия

- samba-dc-4.21.9-alt1

Шаги Воспроизведения (показан простой способ воспроизведения)

Достаточно одного DC: неважно с storage-backend mdb или по умолчанию.
Тестировалось с RAM 10Gb.

1.  Создать 130000 пользователей и добавить их в одну группу:

        # samba-tool group list | grep '^group'
        groupccaabdb
        # samba-tool group listmembers $(samba-tool group list | grep '^group' | head -n 1 | xargs) | wc -l
        130000

2.  Удалить данную группу:

        # samba-tool group delete $(samba-tool group list | grep '^group' | head -n 1 | xargs)

Ожидаемый результат: Успешное удаление группы.

Фактический результат: Ошибка
MDB_TXN_FULL: Transaction has too many dirty pages. Примерный вывод:

    replmd_delete_internals: Failure to handle 'delete' of object CN=groupccaabdb\0ADEL:90164629-ef33-440d-a280-925f91b91264,CN=Deleted Objects,DC=samba,DC=testdomain after successful rename to CN=groupccaabdb,CN=Users,DC=samba,DC=testdomain.  Error during tombstone modification was: Failed to remove backlink from CN=groupccaabdb\0ADEL:90164629-ef33-440d-a280-925f91b91264,CN=Deleted Objects,DC=samba,DC=testdomain to CN=userfdcbdcdawr,CN=Users,DC=samba,DC=testdomain - (-30788) - MDB_TXN_FULL: Transaction has too many dirty pages - transaction too big at ../../lib/ldb/ldb_mdb/ldb_mdb.c:203
    ERROR(ldb): Failed to remove group "groupccaabdb" - replmd_delete: Failed to modify object CN=groupccaabdb,CN=Users,DC=samba,DC=testdomain in 'delete' - Failed to remove backlink from CN=groupccaabdb\0ADEL:90164629-ef33-440d-a280-925f91b91264,CN=Deleted Objects,DC=samba,DC=testdomain to CN=userfdcbdcdawr,CN=Users,DC=samba,DC=testdomain - (-30788) - MDB_TXN_FULL: Transaction has too many dirty pages - transaction too big at ../../lib/ldb/ldb_mdb/ldb_mdb.c:203
      File "/usr/lib64/samba-dc/python3.12/samba/netcmd/group.py", line 394, in run
        samdb.delete(group_dn)