D’accord, il s’agit du célèbre problème de la valeur maximale des entiers. Nous devons passer à bigint pour le résoudre. Je vais jeter un coup d’œil à cela.
Pour l’instant, votre solution de contournement consiste à exécuter :
cd /var/discourse/
./launcher enter app
su postgres
psql
\x
\connect discourse
ALTER TABLE notifications ALTER COLUMN id SET DATA TYPE bigint
\q
exit
C’est la valeur par défaut pour les nouvelles installations, mais les anciennes installations ont le mauvais type de données.
L’exécution de cette solution de contournement peut être difficile car elle va bloquer la table ; vous devrez peut-être réduire d’abord la charge de votre serveur web.
Concernant la solution de contournement, est-ce que cela devrait être relativement sûr à faire ? On ne s’inquiète pas des temps d’arrêt, mais juste de casser quelque chose.
Cela utilise le conteneur unique standard app.yml. Pour alléger la charge web, pensez-vous que le passage en mode lecture seule et l’exécution de ./launcher stop app, ./launcher start app avant d’appliquer la solution de contournement devraient suffire ?
Merci, Sam, j’ai appliqué la solution de contournement. Cependant, je n’ai reçu aucun retour après avoir saisi :
ALTER TABLE notifications ALTER COLUMN id SET DATA TYPE bigint
Je ne sais pas si le processus est encore en cours. Actuellement, je rencontre toujours la même erreur (dans la liste des jobs morts de /sidekiq, pour les derniers essais « à l’instant ») pour :
J’ai exécuté la commande (aucune confirmation ni retour reçu, comme pour la précédente). Le forum ne s’est pas ralenti, donc je ne sais pas si cela a fonctionné. J’obtiens toujours les mêmes erreurs pour le moment.
Peut-être serait-il préférable d’attendre la migration officielle.
Vous vous demandez où nous en sommes sur ce sujet ? Les erreurs ont-elles cessé ?
À l’origine, nous envisagions de procéder à une migration officielle, mais les risques dépassent largement les avantages. Nous constatons qu’il est extrêmement rare de rencontrer des bases de données contenant plus de 2 147 483 647 publications. 2,1 milliards est un nombre vraiment énorme.
L’inconvénient d’augmenter la taille partout est que les besoins en stockage augmentent.
Nous en sommes actuellement à envisager d’ajouter une tâche rake qui « libère de l’espace » si vous êtes dans un cas atypique où vous avez des tables dans Discourse contenant 2 milliards de lignes (ou qui en ont contenu 2 milliards lors de leur évolution).
Je viens de passer à la version 2.8.0.beta6 et je rencontre toujours des erreurs de dépassement de capacité entière.
Je pense que ce sont simplement les notifications qui ont atteint un nombre massif, ce qui est plus réaliste pour atteindre la limite par rapport au nombre de publications. De nombreux sujets volumineux avec de nombreuses réponses, likes, etc. provenant de différents utilisateurs peuvent générer un grand nombre de notifications.
Nous venons de rencontrer ce problème dans notre configuration également (devforum.roblox.com) ! Nous utilisons la version v2.8.9, mais nous passerons bientôt à la version 3.0.1.
Nous avons remarqué que quelque chose n’allait pas lorsque les utilisateurs ont commencé à voir des erreurs 403/500 en essayant d’aimer/ne plus aimer des publications.
Ensuite, je suis tombé sur ce fil de discussion et j’ai vérifié notre table de notifications :
=> SELECT id FROM notifications ORDER BY 1 DESC LIMIT 1;
id
------------
2147483647
(1 row)
@sam La solution de contournement ci-dessus est-elle toujours la meilleure suggestion, ou une tâche rake a-t-elle été davantage prise en compte depuis septembre 2021 ?
Oui, cela reste le seul correctif ici. Je crains de le changer dans le cœur, mais je suppose que cela continuera à se produire sur les forums gigantesques si nous ne corrigeons pas cela.
Le revers de la médaille est une augmentation du stockage.
Savez-vous s’il existe des utilisations dans le service post_actions (ou quelque part dans le processus de notification) qui pourraient encore attendre des entiers après l’exécution de ALTER ?
Nous constatons des erreurs 5xx sur les appels like/unlike vers /post_actions avec la réponse
{"errors":["The requested URL or resource could not be found."],"error_type":"not_found"}
De plus, certaines tâches échouent autour des notifications (Jobs::BookmarkReminderNotifications, Jobs::GrantAnniversaryBadges, Jobs::PostAlert).
J’ai ajouté la trace de la pile pour PostAlert dans mon message précédent ; il semble y avoir un problème lancé pour une limite d’entier par consolidate_or_create dans notification.rb.
Pour notre utilisation, l’augmentation du stockage n’est pas une préoccupation majeure si nous pouvons restaurer la fonctionnalité