Chave duplicada viola restrição de unicidade em uma tabela durante a atualização

Olá a todos, tenho um problema estranho com um fórum que mantenho.

Durante uma atualização, na página admin/upgrade ou no terminal, ela falhou e apresentei este erro:

--------------------------------------------------------------------------------
1 migração falhou!

Falha ao migrar o padrão
#<ActiveRecord::RecordNotUnique: PG::UniqueViolation: ERRO: valor de chave duplicada viola a restrição de unicidade "index_screened_ip_addresses_on_ip_address"
DETALHE: A chave (ip_address)=(10.0.0.0/8) já existe.

Felizmente, não quebrei o fórum; com o comando ./launcher restart app (./launcher destroy app / ./launcher start app me salvou uma vez quando tive uma página em branco após um reinício), então não há nenhuma emergência, por isso gostaria de alguma orientação.

Decidi inspecionar o banco de dados. Tenho algumas referências ao IP 10.0.0.0/8 que parecem ser alguns logs, mas na tabela screened_ip_addresses, não tenho nenhuma duplicata.

--
-- Entrada do TOC 6829 (classe 0 OID 382198)
-- Dependências: 657
-- Dados para Nome: screened_ip_addresses; Tipo: TABLE DATA; Esquema: public; Proprietário: -
--

COPY public.screened_ip_addresses (id, ip_address, action_type, match_count, last_match_at, created_at, updated_at) FROM stdin;
236	10.0.0.0/8	2	0	\N	2020-05-24 19:44:41.587257	2020-05-24 19:44:41.587257
237	192.168.0.0/16	2	0	\N	2020-05-24 19:44:47.150337	2020-05-24 19:44:47.150337
239	172.16.0.0/12	2	0	\N	2020-05-24 19:44:57.347656	2020-05-24 19:44:57.347656
240	fc00::/7	2	0	\N	2020-05-24 19:45:02.270948	2020-05-24 19:45:02.270948
261	154.71.107.147	1	0	\N	2020-06-05 13:15:17.718236	2020-06-07 00:27:57.204765
257	154.126.107.81	1	0	\N	2020-06-02 09:51:31.191431	2020-06-07 00:27:58.538628
259	197.1.186.242	1	0	\N	2020-06-05 08:39:52.218198	2020-06-07 00:27:58.985867
258	89.158.72.7	1	0	\N	2020-06-02 20:44:41.584317	2020-06-07 00:27:59.542337
260	196.179.229.13	1	0	\N	2020-06-05 08:39:52.227515	2020-06-07 00:28:00.288445
238	127.0.0.0/8	2	0	\N	2020-05-24 19:44:52.369958	2020-05-24 19:44:52.369958

O administrador do fórum me disse que limpou alguns IPs na página /admin/logs/screened_ip_addresses e adicionou alguns. Mas duvido que ele tenha tocado neste IP. O estranho é que diz que o IP foi adicionado há 14 dias (foi a última vez que atualizei, e provavelmente foi a atualização do PostgreSQL), embora o fórum seja de 2015. E em outros fóruns, ele verifica com a data de criação.

Então, acho que a tabela está um pouco bagunçada, mas não parece realmente ser o caso.

Não quero tentar a sorte demais, especialmente porque sou péssimo em SQL. Por isso, queria alguma orientação sobre o procedimento a seguir para garantir que posso atualizar com segurança :raised_hands:

Devo limpar a página /admin/logs/screened_ip_addresses, tentar purgar entradas desta tabela ou de outra?

Parece que o índice está corrompido. Você pode pesquisar em outros tópicos sobre índices corrompidos.

Primeiro, tente reconstruir o índice. Note também que muitas buscas não encontrarão as entradas duplicadas, pois assumem que o índice está funcionando corretamente.

Obrigado. Para ter certeza, seria algo assim?

cd /var/discourse
./launcher enter app
su postgres
psql
\connect discourse
REINDEX SCHEMA CONCURRENTLY public;

Se isso não ajudar porque o índice parece estar correto para o sistema, essa solução parece viável considerando o tamanho dessa tabela?

TRUNCATE public.screened_ip_addresses

Eu executo um reindex e depois adiciono manualmente esses IPs novamente?

Estou no celular, então você terá que ler a documentação, mas eu reconstruiria apenas public.screened_ip_addresses. Acho que ao fazer isso, você terá erros sobre os conflitos.

Obrigado, executei o comando e nenhum erro foi mencionado. Vou tentar outra reconstrução em algumas horas e ver o que acontece.

edit: ok, o reindexamento não fez nada

1 migração falhou!

Falha ao migrar o padrão
#<ActiveRecord::RecordNotUnique: PG::UniqueViolation: ERROR:  duplicate key value violates unique constraint "index_screened_ip_addresses_on_ip_address"
DETAIL:  Key (ip_address)=(10.0.0.0/8) already exists.
>

Reiniciei o aplicativo, limpei todos os IPs em /admin/logs/screened_ip_addresses e atualizei com sucesso.

Os IPs voltaram, não precisei adicioná-los manualmente

Talvez eu tenha sido um pouco cauteloso demais, mas como não é o meu fórum, não quis bagunçar as coisas. Obrigado @pfaffman pela ajuda!

Acho que na próxima vez verei se isso acontece novamente, mas pelo menos já sei como resolver.

Última atualização para este tópico. Na última vez, atualizei pela página admin/upgrade. Desta vez, quis reconstruir pelo terminal para ter certeza. Não houve problema de migração. Tudo correu bem.

Posso confirmar que o problema foi resolvido :raised_hands: