Mögliche Race Condition beim Bearbeiten eines Beitrags

Problem

Gleichzeitige Bearbeitungen einer Wiki-Seite können zu unerwartetem Verhalten führen. In meinem Fall wurde die Beziehung quoted_posts zwischen zwei Beiträgen fehlerhaft.

Dies kann zu weiteren Problemen führen, wenn quoted_posts verwendet wird, wie beispielsweise in User#refresh_avatar. Durch das Fehlen von quoted_posts ist es nicht möglich, alle zitierten Beiträge neu zu verarbeiten.

Mögliche Ursache

Die Warnung, die durch diesen Commit eingeführt wurde, reicht nicht aus, um gleichzeitige Bearbeitungen eines Beitrags zu schützen, da die Prüfung nicht atomar ist. Dies ist eine seltene Situation, kann jedoch dennoch auftreten.

PostRevisor#revise! ruft QuotedPost.extract_from(@post) auf, was alle quoted_posts löscht, wenn ein Beitrag keine Zitate enthält. Wenn zwei Bearbeitungen gleichzeitig PostRevisor#revise! aufrufen, wobei eine Bearbeitung ein Zitat hinzufügt und die andere ebenfalls ein Zitat hinzufügt, kann der Beitragstext am Ende so aussehen, als ob er die Bearbeitung mit den Zitaten enthält, während die quoted_post-Beziehung durch die Bearbeitung ohne Zitate zerstört wurde.

Mögliche Lösung

Vielleicht sollten wir erwägen, beim Bearbeiten eines Beitrags eine Redis-Sperre zu verwenden.

3 „Gefällt mir“

Das ist wohl möglich, und ich bin nicht strikt gegen das Hinzufügen einer verteilten Sperre hier. Das Tückische ist, dass ich keine Deadlocks riskieren möchte, also müssten wir extrem vorsichtig sein.

Wenn gleichzeitiges Bearbeiten wirklich dein Ding ist, warum nicht geteilte Bearbeitungen ausprobieren?

3 „Gefällt mir“