- Expédié
- 27 septembre 2026 à 06:14 UTC
- Auteur
- Kamo
- Commit
- 279a389
Le chat a échoué de deux façons un membre remarque à la fois: ouvrir une conversation montrée "Ne pouvait pas charger des messages" jusqu'à ce que Retry soit pressé, et un message envoyé parfois jamais arrivé. Les deux étaient MediaService répondant 500 avec YugabyteDB SQLState 40001, "Redémarrer la lecture requise" — enregistré quotidiennement sur les deux pods, et tous les 500 le web BFF enregistré cette semaine lignes vers le haut avec un. Yugabyte redémarre une lecture gratuite seulement lorsqu'il s'agit de la première déclaration de sa transaction. Les history load vérifie l'accès à sa troisième déclaration en lisant la ligne d'adhésion de l'appelant — la ligne qui ouvre la conversation marque lu dans le même instant. Un envoi écrit le message et puis lit le fichier et le domaine de l'org dans la même transaction. Soit lire la réunion en ligne écrit un moment plus tôt a échoué toute la demande; un moment plus tard, l'écriture s'est réglée, qui est Pourquoi Retry a toujours marché. - les requêtes de la fenêtre de chat (envoi, historique, lecture de marque, liste de chat, édition, visages, membres, les reçus) portent @RetryOnDbConflict, et leurs catch-alls laissent sortir un conflit **************** pour que le conseiller puisse la ré-exécuter dans une nouvelle transaction. Avalées dans un 500 il était invisible à la réessayer. Sûr : tout ce qu'un envoi annonce est après engagement. - Mark-read ne réécrit plus la ligne d'adhésion lorsque le pointeur est déjà là (ChatReadPointerRepository, une mise à jour gardée). Il a été appelé plusieurs fois par ouvert, et chaque réécriture était une chance pour la charge d'historique propre du membre ou envoyer à l'échec. Le reçu lu toujours sortir comme avant. - Un envoi peut porter un clientMessageId (ChatSendLedger, Redis): un réessayer d'un envoi qui commited est répondu avec la réponse de cet envoi, et un toujours en vol avec 409 Envoyer IN PROGRESS, afin que le client puisse réessayer sans afficher un message deux fois. Ouvre les yeux. Un cliquet **************** contient chaque @Transactional chat handler au Réessayer, et la réessayer à une prise qui laisse sortir le conflit. MediaControllerDbConflictTest replays l'échec de production à travers un vrai proxy: la tentative conflictuelle recule, une seconde transaction commis une fois, et rien n'est annoncé pour la tentative qui a échoué. 1384 tests ont réussi.
