Infinite loop during postgres upgrade

Hi! Each time I launch /launcher rebuild app I get the following message (even if I launch it again) :

UPGRADE OF POSTGRES COMPLETE
Old 9.5 database is stored at /shared/postgres_data_old
To complete the upgrade, rebuild again using:
./launcher rebuild app

What information do you need to help me?

PS: The first time I ran it, the command stoped because I needed more space

Temporarily, I used the templates/postgres.9.5.template.yml template to avoid downtime. The app is running again, but I’d like to finish the update.

When I do a cleanup I get the following message : Old PostgreSQL backup data cluster detected taking up 1.2G detected. Would you like to remove it? (Y/n):

Sounds like a question for @tgxworld, but I am guessing that it failed due to lack of space but somehow didn’t catch that the upgrade had failed.

How much space do you have? And how big is your database?

Can you provide me with the full log generated during the rebuild? Thank you!

У меня уже несколько месяцев одна и та же проблема, и я не могу обновить свою установку.

Процесс зацикливается и никогда не завершается успешно. Одна из проблем при выполнении rebuild app заключается в следующем:
mv: не удалось переместить '/shared/postgres_data' в '/shared/postgres_data_old': Устройство или ресурс занят

При входе в Docker-контейнер версия PostgreSQL, которую я использую, следующая:

/usr/lib/postgresql/10/bin/postgres --version
postgres (PostgreSQL) 10.14 (Debian 10.14-1.pgdg100+1)

Вот ошибки, которые я получаю:

FAILED

--------------------

Pups::ExecError: /root/upgrade_postgres завершился с ошибкой #<Process::Status: pid 47 exit 1>

Место возникновения ошибки: /pups/lib/pups/exec_command.rb:112:in `spawn'

Выполнение команды не удалось с параметрами "/root/upgrade_postgres"

0c74c9de4d4315b63c0ef9055631f38c0cf4b3dd0be6500fd83ca0a5b13e0d9d

** НЕ УДАЛОСЬ ЗАПУСТИТЬСЯ ** пожалуйста, прокрутите вверх и поищите более ранние сообщения об ошибках, их может быть несколько.

./discourse-doctor может помочь диагностировать проблему.

Похоже, что проблема в скрипте /pups/lib/pups/exec_command.rb при выполнении spawn.

Тем не менее я могу запустить приложение:
./launcher start app

Вот файлы, которые у меня есть в /shared:

total 48
drwxr-xr-x 12 root      root     4096 Jan 12 13:12 .
drwxr-xr-x 57 root      root     4096 Dec 15 09:09 ..
drwxr-xr-x  3 discourse www-data 4096 Aug 20  2019 backups
drwxr-xr-x  4 root      root     4096 Aug 19  2019 log
drwxr-xr-x  2 postgres  postgres 4096 Aug 19  2019 postgres_backup
drwx------ 20 postgres  postgres 4096 Jan 12 13:14 postgres_data
drwx------ 19 postgres  postgres 4096 Jan 12 13:12 postgres_data_new
drwxrwxr-x  5 postgres  postgres 4096 Jan 12 13:14 postgres_run
drwxr-xr-x  2 redis     redis    4096 Jan 12 13:07 redis_data
drwxr-xr-x  4 root      root     4096 Aug 19  2019 state
drwxr-xr-x  4 discourse www-data 4096 Jan 12 13:14 tmp
drwxr-xr-x  4 discourse www-data 4096 Sep  8  2019 uploads

Что мне делать?

Ваш общий каталог — это какой-то сетевой том?

Нет, но я наконец-то смог это сделать!

Две команды mv в файле templates/postgres.template.yml не проверяются на корректность. Скрипт всегда выводит сообщение UPGRADE OF POSTGRES COMPLETE, что неверно, если перемещение завершилось с ошибкой.

Я удалил эти команды, затем вручную переместил директории после входа в Docker, и следующая команда rebuild app работает как раньше! Я так счастлив :smiley:
Спасибо.

Я столкнулся с этой проблемой при последнем обновлении с PostgreSQL 13 до 15.

В нашей среде развёртывания каталог /shared/postgres_data монтируется на более быстрое NVMe-устройство хранения, поэтому попытка его перемещения завершилась ошибкой «Устройство или ресурс занят».

Мы исправили это, применив патч к шаблону postgres следующим образом:

diff --git a/templates/postgres.template.yml b/templates/postgres.template.yml
index c24bfe6..03813c4 100644
--- a/templates/postgres.template.yml
+++ b/templates/postgres.template.yml
@@ -139,8 +139,10 @@ run:
            exit 1
          fi
 
-         mv /shared/postgres_data /shared/postgres_data_old
-         mv /shared/postgres_data_new /shared/postgres_data
+         mkdir /shared/postgres_data_old
+         mv /shared/postgres_data/* /shared/postgres_data_old
+         mv /shared/postgres_data_new/* /shared/postgres_data
+         rmdir /shared/postgres_data_new

Вместо попытки манипулировать самим каталогом, просто перемещаем его содержимое.

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

Я думаю, это может быть связано: FIX: improve postgres upgrade reliability by jcharaoui · Pull Request #989 · discourse/discourse_docker · GitHub

Запрос на слияние принят :+1: