Condição de corrida possível ao editar uma postagem

Problema

Edições concorrentes em uma página do wiki podem levar a comportamentos inesperados. No meu caso, a relação quoted_posts entre duas postagens ficou incorreta.

Isso pode levar a outros problemas quando quoted_posts é utilizado, como em User#refresh_avatar. A ausência de quoted_posts impede a recriação de todas as postagens citadas.

Possível Causa

O aviso introduzido por este commit não é suficiente para proteger edições concorrentes em uma postagem, pois a verificação não é atômica. Trata-se de uma situação rara, mas que ainda pode ocorrer.

PostRevisor#revise! chama QuotedPost.extract_from(@post), que exclui todas as quoted_posts se não houver nenhuma citação na postagem. Quando duas edições chamam PostRevisor#revise! simultaneamente, uma para adicionar uma postagem citada e outra para adicionar uma postagem citada, o conteúdo da postagem pode acabar com a edição que possui citações e a relação quoted_post destruída pela edição sem nenhuma citação.

Possível Correção

Talvez devêssemos considerar adquirir um bloqueio no Redis ao editar uma postagem.

3 curtidas

Isso é possível, eu acho, e não sou fortemente contra adicionar um bloqueio distribuído aqui. O difícil é que não quero correr o risco de deadlocks, então teríamos que ser extremamente cuidadosos.

Se a edição concorrente é realmente o seu estilo, por que não tentar as edições compartilhadas?

3 curtidas