Les modifications ne sont pas enregistrées dans la table user_actions

Je pensais que chaque fois qu’un utilisateur modifie le message d’un autre, cette action serait enregistrée dans la table user_actions, mais je viens de réaliser que cela ne se produit que sporadiquement (uniquement pour certains utilisateurs, à certains moments).

Est-ce le comportement attendu ou y a-t-il une autre condition que je ne prends pas en compte ?

Il est difficile de fournir une procédure étape par étape pour reproduire ce problème, mais voici comment je l’ai détecté :

  1. Trouver un message avec une notification d’édition :
  2. Interroger la table user_actions pour le acting_user_id donné (l’éditeur), le user_id donné (l’utilisateur modifié) et le topic_id donné. Dans mon cas :
select * from user_actions ua 
where ua.acting_user_id = 229 
and ua.user_id = 259 
and ua.target_topic_id = 1907;

Voici ce que j’obtiens :

  • Le type d’action 2 signifie que l’utilisateur modifié a reçu un LIKE de la part de l’éditeur.
  • Le type d’action 6 signifie que l’éditeur a répondu à l’utilisateur modifié.
  id   | action_type | user_id | target_topic_id | target_post_id | target_user_id | acting_user_id |         created_at         |         updated_at
-------+-------------+---------+-----------------+----------------+----------------+----------------+----------------------------+----------------------------
 78476 |           2 |     259 |            1907 |          17893 |                |            229 | 2020-03-20 03:39:12.255619 | 2020-03-20 03:39:12.395574
 78478 |           6 |     259 |            1907 |          17900 |                |            229 | 2020-03-20 03:44:04.847102 | 2020-03-20 03:44:04.847102

Je peux confirmer ces deux actions dans l’interface utilisateur, mais je m’attendrais également à trouver un action_type 11 indiquant l’ÉDITION.

Outre la visibilité de l’édition dans l’interface, je peux également confirmer son existence dans la table post_revisions en interrogeant via le target_post_id :

select id, user_id, post_id, number, created_at, updated_at from post_revisions pr where post_id = 17893;

  id  | user_id | post_id | number |         created_at         |         updated_at         |
------+---------+---------+--------+----------------------------+----------------------------+--------
 8927 |     229 |   17893 |      2 | 2020-03-20 03:40:06.644576 | 2020-03-20 03:43:32.769535 |

Alors, pourquoi cette action n’apparaît-elle pas dans user_actions ?

1 « J'aime »

Edits are not meant to be stored there, they are stored in post_revisions.

2 « J'aime »

Right, not the edit. I mean the user_action EDIT event:

The thing is that it’s triggered 90% of the time. I don’t understand why it doesn’t work the other 10%

1 « J'aime »

Je viens de réaliser que soit je ne comprends pas complètement les cas où une notification d’édition est créée, soit c’est un problème beaucoup plus répandu que je ne le pensais.

Hypothèses principales

Si l’utilisateur A modifie ce que l’utilisateur B a écrit, plusieurs choses se produisent :

  • Une nouvelle ligne est ajoutée à la table post_revisions.
  • Une nouvelle ligne est ajoutée à la table user_actions avec action_type = 11.
  • En accédant à /u/userB/notifications/edits, l’utilisateur B pourra voir qu’une nouvelle édition a été effectuée par l’utilisateur A (cela dépend de user_actions).
  • En cliquant sur l’icône de crayon dans son message, l’utilisateur B pourra voir la modification réelle effectuée par l’utilisateur A (cela dépend de post_revisions).

Test

Si les hypothèses ci-dessus sont correctes, cette requête devrait afficher toutes les lignes de la table post_revisions pour les messages créés par l’utilisateur B (dans ce cas, l’identifiant 259) qui ont été modifiés par n’importe quel utilisateur (autre que lui-même ou l’utilisateur système), ainsi que les lignes correspondantes dans user_actions pour action_type = 11.

with my_user_posts as (
  select
    p.id,
    p.user_id
  from
    posts p
  where
    p.user_id = 259 -- choisissez un identifiant d'utilisateur
)
select
  up.user_id as my_user_id,
  ua.user_id as target_user_id,
  pr.post_id,
  ua.target_post_id,
  pr.user_id as editor_user_id,
  ua.acting_user_id,
  ua.action_type,
  pr.created_at as edit_created_at,
  ua.created_at as action_created_at
from
  post_revisions pr
  inner join my_user_posts up on up.id = pr.post_id
  and up.user_id != pr.user_id -- pas d'auto-modifications
  and pr.user_id != -1 -- pas de modifications système
  left join user_actions ua on ua.target_post_id = pr.post_id
  and ua.action_type = 11 -- uniquement les actions ÉDITION
order by
  pr.post_id,
  pr.created_at;

Résultat attendu

Chaque ligne contient à la fois les données de post_revisions et les données de user_actions.

Résultat réel

Certaines lignes de post_revisions ne correspondent à aucune donnée dans user_actions. Par conséquent, l’utilisateur peut voir les révisions en cliquant sur le crayon dans chaque message, mais n’a pas été informé de recevoir plusieurs modifications.

Actions que j’ai tentées

  • Ajouter une modification supplémentaire à un ancien message sans données user_action. Résultat : les données user_action n’apparaissent toujours pas.
  • Créer un faux utilisateur, copier le contenu avant modification d’un message sans données user_action, créer un nouveau message avec ce contenu et appliquer la même modification qu’avec un autre utilisateur. Résultat : les données user_action apparaissent correctement.
  • Répéter les procédures ci-dessus lorsque l’utilisateur est actif ou hors ligne. Résultat : aucune modification.
  • Répéter les procédures ci-dessus en modifiant la période de grâce pour les modifications. Résultat : aucune modification.

Conclusions

  • Le problème ne semble pas être :

    • spécifique à l’utilisateur. Il survient pratiquement pour chaque utilisateur.
    • spécifique à la connexion. Le fait que l’utilisateur soit actif ou hors ligne ne modifie pas le résultat.
    • spécifique au temps. Modifier la période de grâce pour les modifications n’a eu aucun effet.
  • Le problème semble être :

    • spécifique à l’action. Je n’ai constaté aucun problème de notification pour les autres actions (LIKE, WAS_LIKED, RESPONSE, REPLY, MENTION ou QUOTE). Le seul problème concerne les actions ÉDITION.

    • spécifique au message. Cela ne se produit pas pour tous les messages, seulement pour certains (apparemment de manière aléatoire).

  • Une possibilité est que quelque chose se produise lors de la création de certains messages et empêche l’enregistrement des actions user_actions de type ÉDITION, mais je ne sais pas ce que cela pourrait être.

  • Il est également possible que cela soit prévu par conception et qu’il existe des conditions spécifiques dans lesquelles les utilisateurs ne sont pas informés des modifications, mais je n’ai trouvé aucune documentation à ce sujet.

Étapes suivantes

  • Si vous connaissez une raison pour laquelle les notifications de modification ne sont pas déclenchées à chaque modification, veuillez me le faire savoir.
  • Si vous disposez de votre propre instance Discourse, pourriez-vous exécuter la requête SQL ci-dessus sur certains de vos identifiants d’utilisateur pour vérifier si vous observez également des données manquantes dans user_actions et me faire un retour ?
1 « J'aime »

Je veux juste être certain à 100 % que vous avez bien compris les délais de grâce pour les modifications, qui s’appliquent même si c’est un autre utilisateur qui modifie le message.

(Oui, si l’utilisateur A modifie le message de l’utilisateur B, une révision de modification forcée est toujours créée, mais cela ne signifie pas que si l’utilisateur A modifie le message de l’utilisateur B 6 fois en 60 secondes, il y aura 6 révisions et 6 notifications générées. Il n’y aura qu’une seule révision et une seule notification, comme vous pouvez le voir sur la capture d’écran ci-dessus.)

Chacune de ces modifications est-elle espacée de plus de 5 minutes ?

2 « J'aime »

Merci pour ton commentaire, Jeff. Je peux confirmer que oui, ces modifications sont espacées de plus de 5 minutes. Mais même si ce n’était pas le cas, tant qu’une seule post_revision est créée, ne devrait-il pas toujours y avoir un EDIT user_action correspondant ?

En passant, j’ai aussi essayé de définir la période de grâce pour l’édition à 0, et dans ce cas, deux post_revisions identiques sont créées pour chaque modification. Je ne sais pas si c’est intentionnel ou s’il s’agit d’un bug sans rapport.

Je voulais juste m’en assurer, c’est bien de confirmer.

1 « J'aime »

Quelqu’un pourrait-il exécuter la requête ci-dessus sur son site Discourse pour vérifier s’il obtient également des post_revisions sans user_actions correspondantes de type 11 ?

En fouillant dans notre code, je pense que vous n’obtenez le type d’action utilisateur 11 que si vous modifiez le message de quelqu’un d’autre ou déclenchez une notification concernant cette modification d’une autre manière.

3 « J'aime »

Merci, Sam. C’est ce à quoi je m’attendais, mais ce n’est pas ce que j’ai constaté (sur mon site, du moins). Comme vous pouvez le voir dans les résultats de ma requête, dans certains cas, l’utilisateur A modifie un message de l’utilisateur B (ce qui ajoute une ligne dans post_revisions), mais il n’existe aucune ligne correspondante dans user_actions (avec action_type 11). C’est ce que je ne comprends pas.

Avez-vous un cas reproductible du problème, est-ce un incident isolé ?

1 « J'aime »

Cela se produit de manière continue et sporadique depuis que j’ai créé mon site. Comme je l’ai mentionné plus haut, je n’ai pas réussi à identifier le motif.

Si vous avez besoin d’un extrait de données ou d’autres informations, je suis ravi de vous aider.

Pour être sûr d’avoir bien compris, le vrai bug que vous signalez ici est le suivant :

Dans certaines conditions, l’utilisateur A modifie un message de l’utilisateur B, mais l’utilisateur B n’est pas notifié ?

1 « J'aime »

Exactement. La notification n’apparaît pas ici ni dans la boîte utilisateur (car les deux dépendent de user_actions) :

Cependant, elle apparaît bien dans le coin supérieur droit du message (car cela dépend de post_revisions) :

J’ai écrit une requête pour tester cela. Si vous l’exécutez sur votre site (avec différents identifiants d’utilisateur), vous devriez également constater des lacunes.

1 « J'aime »

S’agit-il d’une instance hébergée par nos soins ou d’une instance auto-hébergée ?

Notre notification se déclenche ici :

La condition est assez stricte :

La notification est créée ici :

Ce qui pourrait rompre ce processus est :

  1. Sidekiq saturé par des tâches ou en pause

  2. Un cas extrêmement rare d’interruption de la tâche en plein milieu de la notification

2 « J'aime »

Je peux vous donner un exemple concret dans une instance hébergée par vous.

Cet article (id 1067), créé par l’utilisateur 3 le 2019-08-03 à 19:22 UTC, a été édité par moi-même (utilisateur 2) quelques minutes après sa création.

Cependant, aucune user_action de type 11 n’a été créée (contrairement aux deux autres modifications que cet utilisateur a reçues ce jour-là sur les articles 1001 et 1003) !

Vous pouvez le voir plus clairement en exécutant cette requête :

with my_user_posts as (
  select
    p.id,
    p.user_id
  from
    posts p
  where
    p.user_id = 3 -- choisissez un identifiant d'utilisateur
)
select
  up.user_id as my_user_id,
  ua.user_id as target_user_id,
  pr.post_id,
  ua.target_post_id,
  pr.user_id as editor_user_id,
  ua.acting_user_id,
  ua.action_type,
  pr.created_at as edit_created_at,
  ua.created_at as action_created_at
from
  post_revisions pr
  inner join my_user_posts up on up.id = pr.post_id
  and up.user_id != pr.user_id -- pas d'auto-éditions
  and pr.user_id != -1 -- pas d'édits système
  left join user_actions ua on ua.target_post_id = pr.post_id
  and ua.action_type = 11 -- uniquement les actions de type EDIT  
WHERE
  pr.created_at between '2019-08-03' et '2019-08-04'
order by
  pr.post_id,
  pr.created_at

J’ai effectué quelques calculs et, selon la date, entre 7 % et 25 % des post_revisions non auto-éditées ne possèdent pas de user_action correspondante.

Il semblerait qu’il y ait un bug ici @Nacho_Caballero après tout… Restez en ligne. Merci d’avoir persévéré sur ce sujet.

3 « J'aime »

Nous avions ce bug :

J’ai amélioré l’implémentation avec cette fonctionnalité :

Nous avions un cas limite où, lorsqu’un utilisateur aimait un message d’un autre utilisateur puis le modifiait ensuite, nous ne notifions pas la modification.

De plus, j’ai ajouté un mécanisme de sécurité garantissant que nous notifions inconditionnellement une fois par jour, même s’il s’agit du même éditeur. (Nous supprimons les notifications de modification répétées du même éditeur pendant 1 jour). Cette option n’est pas configurable pour le moment.

6 « J'aime »

Excellent. Cela a beaucoup de sens. Merci beaucoup pour la correction !

1 « J'aime »