<?xml version="1.0" encoding="UTF-8" ?>

<bugzilla version="5.2"
          urlbase="https://bugzilla.altlinux.org/"
          
          maintainer="jenya@basealt.ru"
>

    <bug>
          <bug_id>61065</bug_id>
          
          <creation_ts>2026-10-14 16:56:57 +0300</creation_ts>
          <short_desc>WAL archiving в cloud storage падает при первом запуске (os.unlink на S3-URL)</short_desc>
          <delta_ts>2026-10-14 16:56:57 +0300</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>4</classification_id>
          <classification>Development</classification>
          <product>Sisyphus</product>
          <component>barman</component>
          <version>unstable</version>
          <rep_platform>x86_64</rep_platform>
          <op_sys>Linux</op_sys>
          <bug_status>NEW</bug_status>
          <resolution></resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P5</priority>
          <bug_severity>normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Блинов Денис Вячеславович">blinovdv</reporter>
          <assigned_to name="Leontiy Volodin">lvol</assigned_to>
          <cc>lvol</cc>
          
          <qa_contact>qa-sisyphus</qa_contact>

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>302426</commentid>
    <comment_count>0</comment_count>
    <who name="Блинов Денис Вячеславович">blinovdv</who>
    <bug_when>2026-10-14 16:56:57 +0300</bug_when>
    <thetext>Версия пакета: barman (python3-module-barman)	3.20.1-alt1

Окружение: 
# apt-get update &amp;&amp; apt-get install -y barman postgresql16-server minio python3-module-boto3
# useradd -r -s /sbin/nologin -d /var/lib/minio minio
# mkdir -p /var/lib/minio/data &amp;&amp; chown -R minio:minio /var/lib/minio

# cat &gt; /etc/systemd/system/minio.service &lt;&lt; &apos;EOF&apos;
[Unit]
Description=MinIO Object Storage
After=network.target

[Service]
Type=simple
User=minio
Environment=MINIO_ROOT_USER=testuser
Environment=MINIO_ROOT_PASSWORD=testpass123
ExecStart=/usr/bin/minio server /var/lib/minio/data --address :9000 --console-address :9001
Restart=always

[Install]
WantedBy=multi-user.target
EOF

# systemctl daemon-reload &amp;&amp; systemctl enable --now minio

# useradd -r -s /sbin/nologin -d /var/lib/minio minio
mkdir -p /var/lib/minio/data
chown -R minio:minio /var/lib/minio

cat &gt; /etc/systemd/system/minio.service &lt;&lt; &apos;EOF&apos;
[Unit]
Description=MinIO Object Storage
After=network.target

[Service]
Type=simple
User=minio
Environment=MINIO_ROOT_USER=testuser
Environment=MINIO_ROOT_PASSWORD=testpass123
ExecStart=/usr/bin/minio server /var/lib/minio/data --address :9000 --console-address :9001
Restart=always

[Install]
WantedBy=multi-user.target
EOF

systemctl daemon-reload
systemctl enable --now minio

# runuser -u postgres -- /usr/bin/initdb -D /var/lib/pgsql/data -E UTF8

# cat &gt;&gt; /var/lib/pgsql/data/postgresql.conf &lt;&lt; &apos;EOF&apos;
wal_level = replica
archive_mode = on
max_wal_senders = 10
max_replication_slots = 10
listen_addresses = &apos;127.0.0.1&apos;
port = 5432
EOF

# cat &gt;&gt; /var/lib/pgsql/data/pg_hba.conf &lt;&lt; &apos;EOF&apos;
host    all             all             127.0.0.1/32            trust
host    replication     all             127.0.0.1/32            trust
EOF
# chown postgres:postgres /var/lib/pgsql/data/postgresql.conf /var/lib/pgsql/data/pg_hba.conf

# runuser -u postgres -- /usr/bin/pg_ctl -D /var/lib/pgsql/data -l /var/lib/pgsql/pg.log -w start
# psql -U postgres -h 127.0.0.1 -c &quot;CREATE ROLE barman WITH LOGIN SUPERUSER;&quot;

# mkdir -p /var/lock/barman /var/log/barman
chown barman:barman /var/lock/barman /var/log/barman

# cat &gt; /etc/barman/barman.conf &lt;&lt; &apos;BARMANCONF&apos;
[barman]
log_file = /var/log/barman/barman.log
barman_home = /var/lib/barman
barman_lock_directory = /var/lock/barman
retention_policy = REDUNDANCY 2

[master]
description = &quot;ALT POSTGRESQL BARMAN S3 TEST&quot;
conninfo = host=127.0.0.1 user=barman dbname=postgres
backup_method = local-to-cloud
wals_directory = s3://barman-backup/master/wals
basebackups_directory = s3://barman-backup/master/basebackups
slot_name = barman_slot_master
streaming_archiver = on
BARMANCONF
# chown barman:barman /etc/barman/barman.conf

# mkdir -p /var/lib/barman/.aws
# cat &gt; /var/lib/barman/.aws/credentials &lt;&lt; &apos;CRED&apos;
[default]
aws_access_key_id = testuser
aws_secret_access_key = testpass123
CRED
# cat &gt; /var/lib/barman/.aws/config &lt;&lt; &apos;CFG&apos;
[default]
region = us-east-1
endpoint_url = http://127.0.0.1:9000
CFG
# chown -R barman:barman /var/lib/barman/.aws
# chmod 600 /var/lib/barman/.aws/credentials

# systemctl enable --now crond

Шаги воспроизведения:

# psql -U postgres -h 127.0.0.1 -tAc &quot;SELECT pg_switch_wal();&quot; &amp;&amp; sleep 5
# runuser -u barman -- env AWS_DEFAULT_REGION=us-east-1 barman cron Либо просто дождаться следующего срабатывания barman cron (каждую минуту).

Проверить количество файлов:
# python3 -c &quot;
import boto3
cl = boto3.client(&apos;s3&apos;, endpoint_url=&apos;http://127.0.0.1:9000&apos;,
    aws_access_key_id=&apos;testuser&apos;, aws_secret_access_key=&apos;testpass123&apos;,
    region_name=&apos;us-east-1&apos;)
r = cl.list_objects_v2(Bucket=&apos;barman-backup&apos;, Prefix=&apos;master/wals/&apos;)
print(&apos;WAL in S3:&apos;, len(r.get(&apos;Contents&apos;, [])))
&quot;
Ожидаемый результат: в бакете есть файлы
Реальный резульатт: WAL in S3: 0        &lt;-- ОШИБКА: ожидалось &gt;= 1

Дополнительно:
В логе barman — PermissionError
grep -n &apos;Permission denied.*xlog.db&apos; /var/log/barman/barman.log

Локально WAL накопился (streaming-архивер его получил), но в S3 не улетел:

ls -la /var/lib/barman/master/streaming/
# 000000010000000000000001  (и далее) - файлы есть, но не архивированы в S3

Фактический traceback (из /var/log/barman/barman.log)
File &quot;/usr/lib/python3/site-packages/barman/cli.py&quot;, line 2070, in archive_wal
    server.archive_wal()
  File &quot;/usr/lib/python3/site-packages/barman/server.py&quot;, line 3737, in archive_wal
    self.backup_manager.archive_wal(verbose)
  File &quot;/usr/lib/python3/site-packages/barman/backup.py&quot;, line 1331, in archive_wal
    archiver.archive(verbose)
  File &quot;/usr/lib/python3/site-packages/barman/wal_archiver.py&quot;, line 815, in archive
    with self.server.xlogdb(&quot;a&quot;) as fxlogdb:
  File &quot;/usr/lib64/python3.12/contextlib.py&quot;, line 137, in __enter__
    return next(self.gen)
  File &quot;/usr/lib/python3/site-packages/barman/server.py&quot;, line 4020, in xlogdb
    self.rebuild_xlogdb(silent=True)
  File &quot;/usr/lib/python3/site-packages/barman/server.py&quot;, line 4063, in rebuild_xlogdb
    os.unlink(os.path.join(self.config.wals_directory, &quot;xlog.db&quot;))
PermissionError: [Errno 13] Permission denied: &apos;s3://barman-backup/master/wals/xlog.db&apos;

Цепочка логики ошибки получается такая:
1) archive()для каждого WAL-сегмента открывает xlogdb: with self.server.xlogdb(&quot;a&quot;) as fxlogdb
2) xlogdb(mode=&quot;a&quot;) проверяет существование файла xlogdb, os.path.exists() на S3-URL возвращает False (это не локальный путь), поэтому срабатывает ветка «файл не найден».
3) rebuild_xlogdb(silent=True) создаёт xlogdb и пытается зачистить «старый» файл xlog.db
4) os.unlink(&apos;s3://.../xlog.db&apos;) - системный вызов unlink(2) получает строку, начинающуюся с s3://. А потом понимаут её как относительный путь к файлу и возвращает EACCES (нет прав на запись в «каталог» s3:), а не ENOENT.
5) Получает PermissionError, а не FileNotFoundError, поэтому блок except FileNotFoundError: pass его не перехватывает. PermissionError пробрасывается наружу через rebuild_xlogdb → xlogdb() → archive() → archive_wal() и рвёт весь запуск barman cron.

Документация по barman cron: https://docs.pgbarman.org/release/3.20.1/user_guide/wal_archiving.html

В апстриме подобных багрепортов не найдено.</thetext>
  </long_desc>
      
      

    </bug>

</bugzilla>