Bug 59767 - Патч 0001-afr_selfheal_do-return-EIO-if-inode-type-is-not-IA_I.patch ломает self-heal директорий
Summary: Патч 0001-afr_selfheal_do-return-EIO-if-inode-type-is-not-IA_I.patch ломает s...
Status: NEW
Alias: None
Product: Branch p10
Classification: Unclassified
Component: glusterfs9 (show other bugs)
Version: не указана
Hardware: x86_64 Linux
: P5 major
Assignee: Vitaly Lipatov
QA Contact: qa-p10@altlinux.org
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2026-07-08 17:43 MSK by Vladimir Avtsenov
Modified: 2026-07-08 18:14 MSK (History)
1 user (show)

See Also:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Vladimir Avtsenov 2026-07-08 17:43:28 MSK
Во всех пакетах, связанных с 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
Comment 1 Vladimir Avtsenov 2026-07-08 18:14:26 MSK
Забыл добавить, что проблема затрагивает не только GlusterFS 9.X (на P10), но и GlusterFS 11.X (Sisyphus), т.к. этот патч присутствует во всех этих версиях GlusterFS.