Notifications créées incorrectement pour d'anciens posts

Hier, mon site a commencé à générer des notifications pour d’anciennes publications sans raison apparente. Voici le nombre de notifications de type « publié » (notification_type = 9) créées plus d’une heure après leur publication au cours des derniers jours :

Requête utilisée pour générer le tableau
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

Voici quelques exemples (obtenus en exécutant la CTE dans la requête ci-dessus) :

La première ligne mise en évidence a été créée le 8 décembre, mais un utilisateur suivant cette catégorie a reçu une notification le 25 décembre (et d’après ce que d’autres utilisateurs m’ont rapporté, ils reçoivent des notifications concernant des publications qu’ils avaient déjà vues).

La deuxième ligne mise en évidence a été créée le 29 septembre, modifiée un jour plus tard, et notifiée le 25 décembre.

Je viens de reconstruire le conteneur, j’exécute donc la dernière version de Discourse. Pour l’instant, j’ai désactivé les notifications par e-mail.

Avez-vous des idées pour résoudre ce problème ? Je suppose qu’il s’agit soit d’une file d’attente bloquée pour une raison quelconque, soit d’un problème similaire. Existe-t-il un moyen de déterminer ce qui génère ces notifications ?

1 « J'aime »

Je parie qu’il s’agit de tâches Sidekiq qui ont échoué par le passé pour une raison quelconque et que vous avez « corrigé » quelque chose, ce qui fait que ces notifications partent maintenant plutôt qu’au moment prévu. Vous pouvez consulter /sidekiq et voir s’il y en a que vous pouvez supprimer avant qu’elles ne soient traitées.

2 « J'aime »

C’est une excellente hypothèse, Jay. Je constate une augmentation ces derniers jours depuis que les utilisateurs ont signalé le problème :

J’ai vérifié la file d’attente planifiée et il ne semble pas y avoir une longue file de messages non traités. En revanche, quelques dizaines de ces notifications obsolètes semblent être ajoutées toutes les 10 minutes environ.

Serait-il possible de remonter à l’origine de ce qui envoie ces éléments à Sidekiq ?

1 « J'aime »

Le problème semblait se résoudre tout seul (heureusement) après quelques jours, mais une analyse plus approfondie m’a permis de réaliser que ma requête SQL initiale était incomplète : le champ notifications.post_number pointe vers le premier message non lu dans un sujet donné, mais chaque fois qu’un nouveau message est créé, sa notification.created_at est mise à jour avec la nouvelle valeur de posts.created_at.

Cela expliquait certaines des incohérences de temps que j’observais, mais pas la hausse mystérieuse qui est apparue puis disparu.

Pour corriger la requête, je devais d’abord vérifier post_timings afin de trouver le dernier topic_id/post_number que l’utilisateur donné avait consulté, et utiliser son created_at au lieu de celui provenant de notifications.

1 « J'aime »