Auf einem selbst gehosteten Discourse-Forum ist ein Problem aufgetreten, bei dem der ReactionLikeSynchronizer scheinbar 500/504-Fehler bei Benutzeraktionen auslöst.
Der Job scheint stündlich dieselben 26.766 PostAction-Likes immer wieder in den Papierkorb zu verschieben, obwohl alle bereits als gelöscht markiert sind. Während dieser längeren Synchronisationsläufe scheinen normale Benutzeranfragen in PostgreSQL zu blockieren und die 30-Sekunden-Timeout-Schwelle von Pitchfork zu erreichen.
Umgebung
- Selbst gehostetes Discourse in der Version v2026.10.0-latest-277-ge1f6bd561
- PostgreSQL 18.4
discourse_reactions_like_sync_enabled = true- Dies ist ein älteres Forum, daher gibt es viele historische Reaktionsdaten
Benutzerberichte
- Reaktionen schlagen gelegentlich fehl und erzeugen eine „Etwas ist schiefgelaufen“-Meldung.
- Themen, die ein Benutzer besucht hat, werden manchmal weiterhin als ungelesen markiert.
- Die Meldungen häufen sich etwa einmal pro Stunde, jeweils zu Beginn der Stunde.
Protokolle und Daten
13:58:58 ReactionLikeSynchronizer startet
13:59:50 Pitchfork-Worker-Timeout / 500
14:00:02 Pitchfork-Worker-Timeout / 500
14:00:18 Pitchfork-Worker-Timeout / 500
14:00:48 ReactionLikeSynchronizer abgeschlossen
15:00:09 Synchronisation startet
15:01:16 Anfrage-Timeout / 500
15:01:40 Anfrage-Timeout / 500
15:01:45 Synchronisation abgeschlossen
Ausgabe des Synchronizers
Inserted 0 post action likes, recovered 0 trashed post action likes. (0 total)
Trashed 26766 post action likes.
Bemerkenswert ist, dass dieselbe Anzahl von 26.766 bei jedem geprüften Lauf auftritt.
Datenbankinhalte
SELECT
COUNT(*) AS total,
COUNT(*) FILTER (WHERE pa.deleted_at IS NULL) AS currently_active,
COUNT(*) FILTER (WHERE pa.deleted_at IS NOT NULL) AS already_trashed
FROM post_actions pa
JOIN discourse_reactions_reaction_users ru
ON ru.user_id = pa.user_id
AND ru.post_id = pa.post_id
JOIN discourse_reactions_reactions r
ON r.id = ru.reaction_id
WHERE pa.post_action_type_id = 2
AND r.reaction_value IN (
'-1','poop','face_with_symbols_on_mouth','enraged_face',
'face_vomiting','nauseated_face','angry','kitchen_knife',
'water_pistol','bomb','clown_face','unamused_face','roll_eyes',
'confused','smirking_face','disappointed_face','pensive_face',
'lying_face','weary_face','tired_face','confounded_face',
'persevering_face','smiling_face_with_horns','angry_face_with_horns',
'cigarette','person_gesturing_no','prohibited','no_entry',
'dagger','cross_mark'
);
total | currently_active | already_trashed
-------+------------------+-----------------
26766 | 0 | 26766
Anmerkungen
Sofern relevant: Es scheint so, als würde ReactionLikeSynchronizer#trash_excluded_post_actions Likes matchen, die ausgeschlossen wurden, selbst wenn sie bereits gelöscht wurden. Die Abfrage sieht wie folgt aus:
UPDATE post_actions
SET deleted_at = NOW()
FROM discourse_reactions_reaction_users ru
INNER JOIN discourse_reactions_reactions
ON discourse_reactions_reactions.id = ru.reaction_id
WHERE post_actions.user_id = ru.user_id
AND post_actions.post_id = ru.post_id
AND post_actions.post_action_type_id = :like
AND discourse_reactions_reactions.reaction_value IN (:excluded_from_like)
RETURNING post_actions.id
Bemerkenswert ist, dass hier gelöschte Aktionen nicht durch etwas wie AND post_actions.deleted_at IS NULL ausgeschlossen werden.
Dies führt offenbar dazu, dass derselbe Satz von Zeilen jede Stunde erneut verarbeitet wird. Ich kann bei Bedarf einen Stack Trace hinzufügen.
Als Workaround habe ich discourse_reactions_like_sync_enabled deaktiviert und beobachte, ob die stündlich auftretenden Fehler aufhören.