Possibile race condition durante la modifica di un post

Problema

Le modifiche concorrenti a una pagina wiki possono causare comportamenti imprevisti. Nel mio caso, la relazione quoted_posts tra due post diventa errata.

Ciò può portare ad altri problemi quando quoted_posts viene utilizzato, ad esempio in User#refresh_avatar. L’assenza di quoted_posts impedisce di rigenerare tutti i post citati.

Possibile Causa

L’avviso introdotto da questo commit non è sufficiente a proteggere le modifiche concorrenti a un post, poiché il controllo non è atomico. Si tratta di una situazione rara, ma può comunque verificarsi.

PostRevisor#revise! chiama QuotedPost.extract_from(@post), che elimina tutti i quoted_posts se non ci sono citazioni in un post. Quando due modifiche chiamano PostRevisor#revise! contemporaneamente, una per aggiungere un post citato e l’altra per aggiungerne un altro, il contenuto del post potrebbe finire con la modifica che contiene le citazioni, mentre la relazione quoted_post viene distrutta dalla modifica senza alcuna citazione.

Possibile Soluzione

Forse dovremmo prendere in considerazione l’acquisizione di un lock Redis durante la modifica di un post.

3 Mi Piace

Questo è possibile, immagino, e non sono fortemente contrario all’aggiunta di un lock distribuito qui. La cosa complicata è che non voglio rischiare alcun deadlock, quindi dovremmo essere estremamente cauti.

Se l’editing concorrente è davvero la tua passione, perché non provare gli editing condivisi?

3 Mi Piace