Notificações sendo criadas incorretamente para posts antigos

Ontem meu site começou a gerar notificações para posts antigos do nada. Este é o número de notificações de ‘publicado’ (notification_type = 9) criadas mais de uma hora atrás nos últimos dias:

Consulta que usei para gerar a tabela
WITH pre AS (
	SELECT
		p.id as post_id,
		to_char(n.created_at,
			'YYYY-MM-DD') AS notified_day,
		p.topic_id,
		round(least(EXTRACT(EPOCH FROM n.created_at - p.created_at)::numeric, EXTRACT(EPOCH FROM n.created_at - p.updated_at)::numeric) / 3600)  AS hours_diff,
		p.created_at,
		p.updated_at,
		n.created_at,
		u.username
	FROM
		notifications n
	LEFT JOIN posts p ON p.post_number = n.post_number
		AND p.topic_id = n.topic_id
	left join users u on u.id = n.user_id
WHERE
	round(least(EXTRACT(EPOCH FROM n.created_at - p.created_at)::numeric, EXTRACT(EPOCH FROM n.created_at - p.updated_at)::numeric) / 3600) > 0
	AND n.notification_type = 9
ORDER BY
	n.created_at DESC
LIMIT 400
)
SELECT
	count(*), 
	notified_day
FROM
	pre
GROUP BY
	notified_day
ORDER BY
	notified_day DESC

Aqui estão alguns exemplos (ao executar a CTE na consulta acima):

A primeira linha destacada foi criada em 8 de dezembro, mas um usuário que está acompanhando aquela categoria recebeu uma notificação em 25 de dezembro (e, pelo que outros usuários me relataram, eles estão sendo notificados sobre posts que já haviam visto).

A segunda linha destacada foi criada em 29 de setembro, modificada um dia depois e notificada em 25 de dezembro.

Acabei de reconstruir o container, então estou executando a versão mais recente do Discourse. Por enquanto, desabilitei as notificações por e-mail.

Alguma ideia de como diagnosticar isso? Suponho que seja uma fila que ficou bloqueada por algum motivo ou algo assim. Existe alguma maneira de descobrir o que está gerando essas notificações?

1 curtida

Minha suposição é que se tratam de jobs do Sidekiq que falharam no passado por algum motivo e que você “corrigiu” algo, fazendo com que essas notificações sejam enviadas agora, em vez de quando deveriam ser. Você pode acessar /sidekiq e verificar se há jobs que podem ser excluídos antes de serem processados.

2 curtidas

Essa é uma ótima suposição, Jay. Consigo notar um aumento nos últimos dias, desde que os usuários relataram o problema:

Verifiquei a fila agendada e não parece haver uma longa fila de mensagens não processadas. Em vez disso, algumas dezenas dessas notificações antigas parecem ser adicionadas a cada 10 minutos, mais ou menos.

É possível rastrear o que pode estar enviando essas notificações para o Sidekiq?

1 curtida

O problema parece ter se resolvido sozinho (felizmente) após alguns dias, mas uma investigação mais aprofundada me ajudou a perceber que minha consulta SQL inicial estava incompleta: o campo notifications.post_number aponta para a primeira mensagem não lida em um determinado tópico, mas toda vez que uma nova mensagem é criada, seu notification.created_at é atualizado para o novo posts.created_at.

Isso explicava algumas das discrepâncias de tempo que eu estava observando, mas não o aumento que apareceu e desapareceu misteriosamente.

Para corrigir a consulta, eu teria que primeiro verificar post_timings para encontrar o último topic_id/post_number que o usuário em questão havia visto e usar seu created_at em vez daquele vindo de notifications.

1 curtida