Во всех пакетах, связанных с 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.