Возможное состояние гонки при редактировании поста

Проблема

Параллельное редактирование одной страницы вики может привести к непредвиденному поведению. В моём случае связь quoted_posts между двумя постами становится некорректной.

Это может привести к другим проблемам при использовании quoted_posts, например, в методе User#refresh_avatar. Отсутствие quoted_posts делает невозможным пересборку всех цитируемых постов.

Возможная причина

Предупреждение, добавленное в этом коммите, недостаточно для защиты от параллельного редактирования поста, так как проверка не является атомарной. Это редкая ситуация, но она всё же может произойти.

Метод PostRevisor#revise! вызывает QuotedPost.extract_from(@post), который удаляет все quoted_posts, если в посте нет ни одной цитаты. Когда два редактирования одновременно вызывают PostRevisor#revise!, одно из которых добавляет цитируемый пост, а другое — тоже добавляет цитируемый пост, содержимое поста может оказаться результатом редактирования с цитатами, при этом связь quoted_post будет разрушена редактированием без цитат.

Возможное решение

Возможно, стоит рассмотреть возможность получения блокировки Redis при редактировании поста.

3 лайка

Думаю, это возможно, и я не категорически против добавления распределённой блокировки здесь. Сложность в том, что я не хочу рисковать возникновением взаимных блокировок, поэтому нам нужно будет действовать крайне осторожно.

Если совместное редактирование — это именно то, что вам нужно, почему бы не попробовать функцию общих правок?

3 лайка