Recompilação falha em db:migrate com PG12

Executar “./launcher rebuild app” falha em db:migrate. Note que estamos usando PostgreSQL v12.

Isso destruiu nosso fórum. O contêiner docker voltou a funcionar, mas o fórum não. Felizmente, fiz um snapshot da VM antes de atualizar, estou restaurando agora.

Log:

Tasks: TOP => db:migrate
(Ver trace completo executando a tarefa com --trace)
I, [2022-04-14T15:20:51.896917 #1]  INFO -- : == 20220304162250 EnableUnaccentExtension: migrando =========
-- enable_extension("unaccent")

I, [2022-04-14T15:20:51.897218 #1]  INFO -- : Terminando processos assíncronos
I, [2022-04-14T15:20:51.897265 #1]  INFO -- : Enviando INT para HOME=/var/lib/postgresql USER=postgres exec chpst -u postgres:postgres:ssl-cert -U postgres:postgres:ssl-cert /usr/lib/postgresql/12/bin/postmaster -D /etc/postgresql/12/main pid: 1710
I, [2022-04-14T15:20:51.897396 #1]  INFO -- : Enviando TERM para exec chpst -u redis -U redis /usr/bin/redis-server /etc/redis/redis.conf pid: 1827
2022-04-14 15:20:51.897 UTC [1710] LOG:  solicitação de desligamento rápido recebida
1827:signal-handler (1649949651) SIGTERM recebido agendando desligamento...
2022-04-14 15:20:51.900 UTC [1710] LOG:  abortando quaisquer transações ativas
2022-04-14 15:20:51.902 UTC [1710] LOG:  worker em segundo plano "logical replication launcher" (PID 1719) saiu com código de saída 1
2022-04-14 15:20:51.904 UTC [1714] LOG:  desligando
1827:M 14 Apr 2022 15:20:51.913 # Desligamento solicitado pelo usuário...
1827:M 14 Apr 2022 15:20:51.914 * Salvando o snapshot RDB final antes de sair.
2022-04-14 15:20:51.965 UTC [1710] LOG:  sistema de banco de dados foi desligado
1827:M 14 Apr 2022 15:20:53.157 * DB salvo em disco
1827:M 14 Apr 2022 15:20:53.157 # Redis está pronto para sair, tchau tchau...


FALHOU
--------------------
Pups::ExecError: cd /var/www/discourse & su discourse -c 'bundle exec rake db:migrate' falhou com retorno #<Process::Status: pid 2118 exit 1>
Localização da falha: /usr/local/lib/ruby/gems/2.7.0/gems/pups-1.1.1/lib/pups/exec_command.rb:117:in `spawn'
exec falhou com os parâmetros {"cd"=>"$home", "hook"=>"db_migrate", "cmd"=>["su discourse -c 'bundle exec rake db:migrate'"]}
bootstrap falhou com código de saída 1
** FALHA AO INICIALIZAR ** por favor, role para cima e procure por mensagens de erro anteriores, pode haver mais de uma.
./discourse-doctor pode ajudar a diagnosticar o problema.
2dcd9aeca614c9e06ef748f673eb68203db6eae5c445253b416d666663879d6d
==================== FIM DO LOG DE RECONSTRUÇÃO ====================
Falha ao reconstruir o aplicativo.

Eles não são separados e não há PG externo. A atualização PG13 também falha (de forma não destrutiva, ao contrário da atualização de hoje) e, para ser honesto, não recebi suporte sobre como corrigi-la aqui.

Acredito (não consigo verificar, obviamente) que tínhamos apenas um contêiner aparecendo no docker ps. A instalação padrão agora tem 2 contêineres?

Esta extensão tornou-se disponível como uma extensão “confiável” no PostgreSQL 13+, onde pode ser habilitada por qualquer usuário.

Como você está executando uma versão mais antiga do PostgreSQL, terá que contornar isso, instalando e habilitando esta extensão para o usuário Discourse e, potencialmente, tentando enganar o Discourse para que considere esta extensão como já instalada. Ou então, migrar para a versão atual suportada do PostgreSQL.

1 curtida

OK. Resumindo, vocês não estão mais oferecendo suporte ao PG12. Sugiro postar isso no tópico de upgrade do PG13 em algum lugar, e provavelmente nos anúncios do 2.9.0b4 também.

1 curtida

Se você está preocupado com o tempo de inatividade, uma solução seria replicar o servidor para o novo host. Algo como community/archived/setting-up-postgres-hot-standby.md at master · GoogleCloudPlatform/community · GitHub. (Você pode encontrar instruções mais recentes ou que façam mais sentido para você…). Isso permitiria migrar para o novo banco de dados enquanto o antigo continuava a funcionar. Mas isso está longe de ser simples.

Essa é uma ótima ideia, se fosse mysql, ms-sql ou oracle eu faria isso, mas dada a minha falta de experiência com postgres eu provavelmente apenas aceitaria o tempo de inatividade.

1 curtida

Minha restauração finalmente terminou, depois de mais de 4 horas. E o Discourse estava disparando erros 502. Este snapshot foi tirado antes da atualização, então isso é super bizarro.

De qualquer forma, olhando os logs do nginx, encontrei este erro

2022/04/14 19:36:21 [error] 493#493: *350 connect() failed (111: Connection refused) while connecting to upstream, client: 216.228.112.21, server: _, request: "POST /message-bus/15f7a893581d489e930634c8f3ed1134/poll?dlp=t HTTP/2.0", upstream: "http://127.0.0.1:3000/message-bus/15f7a893581d489e930634c8f3ed1134/poll?dlp=t", host: "forum.quartertothree.com", referrer: "https://forum.quartertothree.com/c/movies/8"

e depois nos logs do ruby,

/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/bootsnap-1.10.3/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:30:in `require': cannot load such file -- /var/www/discourse/lib/freedom_patches/schema_cache_concurrency.rb (LoadError)

Com certeza, este arquivo pertencia a root:root e tinha permissões 0000. Mudá-lo para discourse:root e 644 para corresponder aos outros arquivos naquele diretório nos fez voltar a funcionar. Ufa!

Alguma ideia de como esse arquivo foi apagado/alterado? Ele também tem 0 bytes, muito estranho.


root@forum-app:/shared/log/rails# ls -la /var/www/discourse/lib/freedom_patches/schema_cache_concurrency.rb
-rw-r--r-- 1 discourse root 0 Feb 10 17:41 /var/www/discourse/lib/freedom_patches/schema_cache_concurrency.rb
1 curtida

Este :point_up:

Agora estamos enfrentando novamente todo o problema de “espaço insuficiente porque a atualização requer 300 GB”.

Boa sorte para você. Pelo que pude apurar, não há uma solução real além de restaurar um backup para um host novo.

Obrigado, mas basicamente morto.

Tentei fazer o “Restaurar para uma Instalação Limpa”, mas não funciona, o PG não coopera. Tentei fazer o downgrade da versão do discourse e voltar para o PG12, mas então se torna um carnaval de luz com todos os plugins.

Você tentou reconstruir com este template do postgres em vez do padrão?

discourse_docker/templates/postgres.12.template.yml at main · discourse/discourse_docker · GitHub

1 curtida

Primeiramente: Obrigado pela ajuda.

Sim, eu alterei o template, como parte da estratégia “ok, isso não está funcionando” para que eu pudesse voltar para o PG12 (embora isso me faça questionar como vou atualizar o PG então :thinking: ).

Eu tive que “caçar” um commit específico, mas aparentemente este é uma aposta segura: Version bump to v2.8.0.beta10 (#15382) · discourse/discourse@07c0104 · GitHub

Eu tentei commits mais recentes, mas o erro enable_extension("unaccent") ainda está presente, o que implica que nesses commits a mudança para depender dele já foi feita.

Aguardando o resultado desta tentativa.

Atualização: Não, falhou na restauração durante a fase de “descompactação do dump” e agora está morto novamente.

Olá, Se você tiver um backup do Discourse, sugiro que faça isso em um servidor diferente para tentar primeiro.

Acredito que você encontrou esse problema ao atualizar uma instância do Discourse que estava executando uma versão mais antiga.

Portanto, tente instalar uma cópia do Discourse editando manualmente o yml para usar o Discourse “stable” e fixar a versão do postgres para 12.

Se a compilação for bem-sucedida, tente restaurar o backup. Esperançosamente, ele será restaurado com sucesso.
Se for bem-sucedido, alterne o template do postgres 12 de volta para o template padrão do postgres e comente a tag “stable” para que o Discourse seja reconstruído com os testes mais recentes aprovados.

Acredito que, se o backup for recuperável, ele deverá então sobreviver às atualizações do postgres e do Discourse.

Me avise se você encontrar algum problema.

2 curtidas

Estou praticamente em "limbo" agora. Tentei sua sugestão com PG12 e "Stable". Não funciona, a restauração simplesmente para. Então, estou formatando a máquina mais uma vez para tentar novamente do zero, porque agora ela não faz a reconstrução do aplicativo.

Enquanto essa máquina tenta "voltar para PG12", estou tentando ver se consigo avançar na outra: Se eu tentar atualizar o PG com uma instalação limpa, ele falha após Criando funções ausentes no esquema discourse_functions... (começa a retornar 500) e tail -f shared/data/log/var-log/postgres/current mostra que o contêiner de dados está "se movendo", embora esteja cheio de "erros" como este:

discourse@discourse ERRO:  relação \"user_auth_tokens\" não existe em caractere 34
discourse@discourse DECLARAÇÃO:  SELECT \"user_auth_tokens\".* FROM \"user_auth_tokens\" WHERE ((auth_token = 'XXXX=' OR
                                  prev_auth_token = 'XXXX=') AND rotated_at > '2022-03-09 10:21:44.051357') LIMIT 1
discourse@discourse ERRO:  relação \"application_requests\" não existe em caractere 41
discourse@discourse DECLARAÇÃO:  SELECT \"application_requests\".\"id\" FROM \"application_requests\" WHERE \"application_requests\".\"date\" = '2022-05-08' AND \"application_requests\".\"req_type\" = 0 LIMIT 1

No entanto, o Discourse pode estar inativo, mas a máquina está sendo usada, então… ela está funcionando, mas leva horas e horas? Porque eu a deixei rodando por mais de 1 hora e nada mudou.

Neste ponto, já estou pensando se isso não deveria ir aqui, lol.

PD: Tentei 2 backups diferentes, já que fiz 2 antes da aventura.

Não entendi o que você quer dizer com “simplesmente para”. Você recebe alguma mensagem de erro? A tela congela? Algo mais?

1 curtida

Isso não é bom - você não conseguiu restaurar seu backup da versão antiga do Discourse com PG12 para uma nova com PG13? Você pode postar as mensagens de erro, etc.? Todos aqui me asseguraram repetidamente que isso funcionaria.

1 curtida

Em que sentido? Há algum erro?

Isso resolveu o problema:

CREATE EXTENSION unaccent;

sem ter que atualizar o PG

1 curtida

Teria sido bom saber há um ano, mas obrigado!

Para quem estiver lendo, finalmente fizemos uma restauração completa para uma instalação limpa em uma nova VM e funcionou bem.

3 curtidas