Notifiche create in modo errato per post vecchi

Ieri il mio sito ha iniziato a generare notifiche per vecchi post all’improvviso. Questo è il numero di notifiche ‘posted’ (notification_type = 9) create più di un’ora dopo nei giorni scorsi:

Query utilizzata per generare la tabella
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

Ecco alcuni esempi (dall’esecuzione della CTE nella query sopra):

La prima riga evidenziata è stata creata l’8 dicembre, ma un utente che sta monitorando quella categoria ha ricevuto una notifica il 25 dicembre (e, da quanto mi hanno riferito altri utenti, stanno ricevendo notifiche su post che avevano già visto).

La seconda riga evidenziata è stata creata il 29 settembre, modificata il giorno successivo e notificata il 25 dicembre.

Ho appena ricostruito il contenitore, quindi sto eseguendo l’ultima versione di Discourse. Per ora ho disattivato le notifiche via email.

Avete qualche idea su come diagnosticare il problema? Immagino che si tratti di una coda bloccata per qualche motivo o qualcosa di simile. C’è un modo per scoprire cosa sta generando queste notifiche?

1 Mi Piace

Immagino che si tratti di job Sidekiq falliti in passato per qualche motivo e che tu abbia “risolto” qualcosa in modo che quelle notifiche vengano inviate ora invece che al momento previsto. Puoi controllare /sidekiq e vedere se ce ne sono di quelle che puoi eliminare prima che vengano elaborati.

2 Mi Piace

È un’ottima ipotesi, Jay. Posso notare un aumento negli ultimi giorni, quando gli utenti hanno segnalato il problema:

Ho controllato la coda pianificata e non sembra esserci una lunga coda di messaggi in attesa di elaborazione. Piuttosto, ogni circa 10 minuti vengono aggiunte alcune decine di queste notifiche obsolete.

È possibile risalire a ciò che potrebbe inviare questi dati a Sidekiq?

1 Mi Piace

Il problema sembrava essersi risolto da solo (fortunatamente) dopo alcuni giorni, ma un’analisi più approfondita mi ha fatto capire che la mia query SQL iniziale era incompleta: il campo notifications.post_number punta al primo messaggio non letto in un determinato argomento, ma ogni volta che viene creato un nuovo messaggio, il suo notification.created_at viene aggiornato al nuovo posts.created_at.

Ciò spiegava alcune delle discrepanze temporali che osservavo, ma non il picco che misteriosamente è apparso e poi scomparso.

Per correggere la query, avrei dovuto prima controllare post_timings per trovare l’ultimo topic_id/post_number visualizzato dall’utente in questione e utilizzare il suo created_at invece di quello proveniente da notifications.

1 Mi Piace