Во всех пакетах, связанных с glusterfs (от glusterfs9 до glusterfs11), присутствует патч "0001-afr_selfheal_do-return-EIO-if-inode-type-is-not-IA_I.patch". В его описании содержится ссылка на GitHub Issue: https://github.com/gluster/glusterfs/issues/1129 При этом данный Issue относится к GlusterFS 7.4. По какой-то причине этот патч был добавлен не в ветку GlusterFS 7.x (или 8.x), к которой относится указанный Issue, а в GlusterFS 9.x и продолжает присутствовать вплоть до текущей мажорной версии. Проблема затрагивает все версии ALT Linux от P9 до P11, а также Sisyphus. Основная проблема заключается в том, что данный патч ломает восстановление (self-heal) директорий при добавлении нового brick в уже существующий Volume. Шаги для воспроизведения: ---------------------------------------------------------------------- # Создать и запустить Volume gluster volume create shared-vol node01:/data/gluster/brick1 force gluster volume start shared-vol # Примонтировать Volume и создать папки/файлы внутри mkdir -p /mnt/shared echo 'localhost:/shared-vol /mnt/shared glusterfs defaults,_netdev,x-systemd.automount,x-systemd.mount-timeout=30 0 0' >> /etc/fstab mount /mnt/shared ROOTDIR=/mnt/shared for i in {1..8}; do mkdir -pv $ROOTDIR/dir$i; for j in {1..8}; do mkdir -pv $ROOTDIR/dir$i/dir$j; for k in {1..8}; do dd if=/dev/urandom of=$ROOTDIR/dir$i/dir$j/file$i.bin bs=1M count=1 status=progress; done done done # Добавить вторую ноду и подключить к ней Volume как реплику gluster peer probe node02 gluster volume add-brick shared-vol replica 2 node02:/data/gluster/brick1 force ---------------------------------------------------------------------- Что происходит: * Файлы изначально не синхронизируются. Им нужен дополнительный "пинок" командой "find /mnt/shared -type f". * Корневая директория "/" сразу после выполнения команды "gluster volume add-brick" остается в состоянии heal. * При попытке выполнить: ---------------------------------------------------------------------- gluster volume heal shared-vol granular-entry-heal enable ---------------------------------------------------------------------- получаю ошибку: ---------------------------------------------------------------------- One or more entries need heal. Please execute the command again after there are no entries to be healed Volume heal failed. ---------------------------------------------------------------------- * При выполнении: ---------------------------------------------------------------------- find /mnt/shared -type d | head -30 ---------------------------------------------------------------------- (либо даже обычного "ls" в примонтированном Volume) возникает рассинхронизация директорий (но не файлов), что подтверждается выводом: ---------------------------------------------------------------------- gluster volume heal shared-vol info ---------------------------------------------------------------------- * В журнале "/var/log/glusterfs/glustershd.log" появляется сообщение, которое было добавлено именно рассматриваемым патчем: ---------------------------------------------------------------------- E [MSGID: 108056] [afr-self-heal-common.c:2559:afr_selfheal_do] 0-shared-vol-replicate-0: TYPE mismatch 2 vs 1 (IA_IFREG) for gfid:00000000-0000-0000-0000-000000000001 ---------------------------------------------------------------------- Запись воспроизведения проблемы: https://asciinema.org/a/fpqkM1ZTl1Mybhmi Левая половина экрана - node01, правая - node02. В нижней части обеих половин выполняется: ---------------------------------------------------------------------- watch -n1 gluster volume heal shared-vol info ---------------------------------------------------------------------- Предлагаемое решение: Удалить либо исправить патч "0001-afr_selfheal_do-return-EIO-if-inode-type-is-not-IA_I.patch", поскольку именно после его применения возникает описанное поведение. Ожидаемое поведение: После удаления данного патча из сборки проблема должна исчезнуть. В частности: * Команда ---------------------------------------------------------------------- gluster volume heal shared-vol granular-entry-heal enable ---------------------------------------------------------------------- должна выполняться без ошибок. * После выполнения ---------------------------------------------------------------------- gluster volume add-brick shared-vol ... ---------------------------------------------------------------------- heal должен начинаться сразу, без зависания корневой директории. * Команда ---------------------------------------------------------------------- find /mnt/shared -type d | head -30 ---------------------------------------------------------------------- не должна приводить к рассинхронизации директорий. * В журнале "/var/log/glusterfs/glustershd.log" больше не должно появляться сообщение: ---------------------------------------------------------------------- TYPE mismatch 2 vs 1 (IA_IFREG) ---------------------------------------------------------------------- Для сравнения запись работы glusterfs после удаления данного патча: https://asciinema.org/a/aD3ngyGeremqg69L
Забыл добавить, что проблема затрагивает не только GlusterFS 9.X (на P10), но и GlusterFS 11.X (Sisyphus), т.к. этот патч присутствует во всех этих версиях GlusterFS.
Спасибо за подробный разбор и записи воспроизведения! Исправление готово: https://git.altlinux.org/tasks/435696/ - glusterfs11 обновлён до 11.2-alt1; - патч 0001-afr_selfheal_do-return-EIO-if-inode-type-is-not-IA_I.patch удалён; glusterfs11 больше не собирается на i586 (в 11.2 нужны 64-битные атомарные операции liburcu), поэтому в то же задание добавлены fio, samba и scsitarget-utils с отключённым glusterfs на i586. Сценарий из бага проверен на двух нодах в контейнерах (volume с 64 каталогами и 256 файлами, затем add-brick replica 2): - на 11.1-alt2 все 73 каталога так и остаются в heal, в glustershd.log "TYPE mismatch 2 vs 1 (IA_IFREG)"; - на 11.2-alt1 heal проходит полностью за несколько секунд, "granular-entry-heal enable" выполняется без ошибок, содержимое брик совпадает. Задание ждёт подтверждения от мейнтейнеров fio и samba.
glusterfs11-11.2-alt1 -> sisyphus: Tue Oct 06 2026 Vitaly Lipatov <lav@altlinux.ru> 11.2-alt1 - new version 11.2 - drop afr_selfheal_do patch breaking directory self-heal (closes: #59767) - build with libuserspace-rcu >= 0.15.7-alt2 (64-bit uatomic on i586) - fix Conflicts with glusterfs{8,9,10}-georeplication - move mount.glusterfs and umount.glusterfs to /usr/sbin - server: skip autoreqs from glusterd hook scripts (they run only for the configured integrations): drops hard deps on samba (/usr/sbin/smbd), dbus-tools (ganesha hook), openssh-clients/scp (geo-replication hook), policycoreutils, libselinux-utils, attr, which - server: skip autoreqs from control-cpu-load.sh/control-mem.sh (manual cgroup helpers): drops hard dep on /bin/systemctl - fix removal of the selinux hooks moved to add-brick/post - drop removal of /etc/init.d/glusterd (not installed anymore), use rm -v without -f