Condition de concurrence possible lors de la modification d'un message

Problème

Des modifications concurrentes sur une page wiki peuvent entraîner un comportement inattendu. Dans mon cas, la relation quoted_posts entre deux publications devient incorrecte.

Cela peut entraîner d’autres problèmes lorsque quoted_posts est utilisé, comme dans User#refresh_avatar. L’absence de quoted_posts empêche de retransformer toutes les publications citées.

Cause possible

L’avertissement introduit par ce commit ne suffit pas à protéger les modifications concurrentes d’une publication, car la vérification n’est pas atomique. Il s’agit d’une situation rare, mais elle peut tout de même se produire.

PostRevisor#revise! appelle QuotedPost.extract_from(@post), qui supprime toutes les quoted_posts s’il n’y a aucune citation dans une publication. Lorsque deux modifications appellent PostRevisor#revise! simultanément, l’une pour ajouter une publication citée et l’autre également pour ajouter une publication citée, le contenu de la publication peut se retrouver avec la modification contenant des citations, tandis que la relation quoted_post est détruite par la modification sans aucune citation.

Correction possible

Nous devrions peut-être envisager d’acquérir un verrou Redis lors de la modification d’une publication.

3 « J'aime »

C’est possible, je suppose, et je ne suis pas fermement opposé à l’ajout d’un verrou distribué ici. Le problème est que je ne veux pas risquer des interblocages, nous devrions donc être extrêmement prudents.

Si l’édition concurrente est vraiment votre tasse de thé, pourquoi ne pas essayer les éditions partagées ?

3 « J'aime »