Loop infinito durante atualização do postgres

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!

Tenho enfrentado o mesmo problema há vários meses e não consigo atualizar minha instalação.

Ele entra em um loop e nunca tem sucesso. Um dos problemas durante o rebuild app é este:
mv: não é possível mover '/shared/postgres_data' para '/shared/postgres_data_old': Dispositivo ou recurso ocupado

Ao entrar no Docker, a versão do PostgreSQL que tenho é:

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

Estes são os erros que recebo:

FALHA

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

Pups::ExecError: /root/upgrade_postgres falhou com retorno #<Process::Status: pid 47 exit 1>

Localização da falha: /pups/lib/pups/exec_command.rb:112:in `spawn'

exec falhou com os parâmetros "/root/upgrade_postgres"

0c74c9de4d4315b63c0ef9055631f38c0cf4b3dd0be6500fd83ca0a5b13e0d9d

** FALHA NO BOOTSTRAP ** por favor, role para cima e procure mensagens de erro anteriores, pode haver mais de uma.

./discourse-doctor pode ajudar a diagnosticar o problema.

Parece que há um problema no script /pups/lib/pups/exec_command.rb executando spawn.

No entanto, consigo iniciar o aplicativo:
./launcher start app

Estes são os arquivos que tenho em /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

O que posso fazer?

Seu diretório compartilhado é algum tipo de montagem de rede?

Não, mas consegui fazer isso finalmente!

Os dois comandos mv em templates/postgres.template.yml não são verificados quanto à sua execução correta. O script sempre diz UPGRADE OF POSTGRES COMPLETE, o que não é verdade quando a movimentação falha.

Removi os comandos, movi os diretórios manualmente após entrar no Docker, e o próximo rebuild app está funcionando como antes! Estou tão feliz :smiley:
Obrigado.

Encontrei este problema durante a atualização mais recente do PostgreSQL de 13 para 15.

Em nossa implantação, nosso diretório /shared/postgres_data é montado em um dispositivo de armazenamento NVMe mais rápido, então movê-lo falhou com uma mensagem de erro Device or resource busy.

Corrigimos isso corrigindo o template do postgres da seguinte forma:

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:
           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

Em vez de tentar manipular o próprio diretório, apenas mova os conteúdos.

Por favor, considere integrar esta alteração para melhorar a confiabilidade das atualizações do banco de dados.

Eu acho que isso pode estar relacionado: FIX: improve postgres upgrade reliability by jcharaoui · Pull Request #989 · discourse/discourse_docker · GitHub

O PR foi mesclado :+1: