Невозможно «удалить все сообщения», когда есть сообщения, принадлежащие мега-теме

У меня возникла проблема на моём сообществе. Я не могу «удалить все сообщения» у определённых пользователей. Судя по всему, это происходит только со старыми аккаунтами, у которых много постов. Новые аккаунты не сталкиваются с этой проблемой.

Я проверил настройки сайта и увеличил лимит на удаление всех сообщений до 10 000.

Сейчас я пытаюсь удалить пользователя с примерно 900 постами. Пользователь не хочет быть анонимизирован и угрожает судебным иском, если аккаунт и сообщения не будут удалены. Я нажимаю кнопку «Удалить все», и примерно через минуту получаю это сообщение:

В консоли браузера я вижу ошибку 502 для поста:
image

Я просмотрел логи на своём сервере и увидел следующее после попытки удаления:

TypeError: undefined is not an object (evaluating ‘s.users’)
Url: https://myserver.com/assets/ember_jquery-d430881a3fb1403871256e5a02423c4b20a78793685e92088613ca9a701baf88.js
Line: 9
Column: 8994
Window Location: https://myserver/t/topic/64828/2502

Где я могу посмотреть, чтобы найти источник проблемы? В логах?

1 лайк

Попробуйте перейти в Администрирование / Журналы / Журналы ошибок. Затем попробуйте удалить сообщения снова. Надеюсь, в журнале появится запись о сообщении, вызывающем проблему.

4 лайка

Это ошибка, которая появляется в логе после попытки удалить все сообщения:

TypeError: undefined is not an object (evaluating ‘s.users’)
Url: https://myserver.com/assets/ember_jquery-d430881a3fb1403871256e5a02423c4b20a78793685e92088613ca9a701baf88.js
Line: 9
Column: 8994
Window Location: https://myserver.com/t/topic/64828/2502
1 лайк

Я заметил, что удаляет несколько постов (около 5), прежде чем появляется диалоговое окно с ошибкой. Не знаю, имеет ли это значение.

Верно, я должен был внимательнее прочитать ваш пост.

Похоже, что проблема возникает с темой, имеющей идентификатор 64828. Создал ли пользователь сообщения в этой теме?

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

image

Я также попробовал выполнить удаление через API-запрос, но, думаю, это будет то же самое, что и в интерфейсе.

Я написал небольшое приложение, которое вызывает API Discourse на моей установке. Оно удаляет каждый пост по отдельности, а не пакетно. Таким образом, для 700 постов выполняется 700 вызовов API. Это не самый эффективный способ, но он оказался полезным.

Я вижу, что есть 20 «проблемных» постов. Похоже, функция «удалить все» останавливается, как только сталкивается с одним из них, и не может их удалить. По какой-то причине API не смог удалить эти посты. Я вручную удалил большинство из них, зайдя в пост и нажав кнопку удаления, как это обычно делает модератор.

Осталось ещё около 5 постов, которые я не могу удалить ни через API, ни обычным способом. Между ними я не вижу никаких сходств. Некоторые находятся в огромных темах, другие — в небольших. Некоторые являются ответами, имеют лайки, содержат изображения, другие — нет. Когда я пытаюсь удалить их через стандартный интерфейс, появляется это окно с ошибкой:

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

При попытке удалить пост вручную я получаю этот лог:
23

Есть какие-нибудь идеи или предложения?

Все пять проблемных постов находятся в двух крупных темах. Мы недавно закрыли обе, потому что они становились слишком большими. В одной теме 55 тысяч постов, в другой — 17 тысяч. Я предполагаю, что при удалении поста из такой большой темы происходит значительная обработка данных, что приводит к某种类型的 таймауту, но это лишь предположение.

1 лайк

Я застрял. Я не могу удалить сообщения в этих обширных темах и не могу удалить сами темы. В обоих случаях появляется диалоговое окно с ошибкой 502 (Gateway Error).

:scream:

Вы пробовали удалить эти 5 сообщений через консоль?

./launcher enter app
rails c
Post.find(THE_POST_ID).destroy
2 лайка

Да! Это срабатывает. Я вообще не знаю Ruby или Rails, но могу объединить несколько постов в одну команду вот так:

Post.find(POST1_ID).destroy; Post.find(POST2_ID).destroy

Вероятно, я буду использовать это в будущем, когда несколько постов зависнут. Возможно ли (и безопасно ли) также удалять тему таким способом?

Как правило, сообщения в Discourse помечаются как удаленные мягко, а не жестко. Команда destroy удаляет их из базы данных, и я попросил вас использовать её только потому, что сообщения, которые вы пытались удалить, принадлежали невероятно длинным темам.

Я не рекомендую использовать этот метод ни для сообщений, ни для тем. Их невозможно восстановить, и, насколько я понимаю, вы работаете с базой данных сайта, находящегося в продакшене, что несет риск поломки всего сайта в случае ошибки. Однако, если вы хотите использовать команду destroy, вы свободны сделать это. Вы всегда должны создавать резервную копию, если планируете использовать такие команды.

Чтобы навсегда удалить тему, выполните:

Topic.find(ID_ТЕМЫ).destroy
1 лайк

Просто заметка: чтобы избежать подобных проблем с производительностью :arrow_up:, мы также добавили настройки для предотвращения создания мега-тем. Подробнее см. The MEGATOPIC: public good, or public menace?

2 лайка

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

Поскольку обычно происходит мягкое удаление постов, получается, что система записывает множество дополнительных данных вместо простого удаления записи. Возможно, именно поэтому удаление постов из мега-темы работает некорректно? Слишком много операций, и происходит тайм-аут?

Мне бы очень хотелось найти способ решить эту проблему, не прибегая к рискованной консольной команде.

Спасибо. Я изменил максимальный лимит тем на 2500. Пользователи некоторое время назад просили снять это ограничение, что привело к появлению таких гигантских тем. Однако такие темы не идут на пользу форуму. Во время пиковых нагрузок, когда множество людей отвечали в них, производительность сервера сильно страдала. В итоге мы закрыли их, чтобы предотвратить это, но теперь мы всё ещё застряли с этими огромными темами, которые вызывают другие проблемы.

Самое простое решение — чтобы некоторые модераторы взялись за дело и начали разделять (а затем закрывать) мега-темы на несколько тем, например:

  • :lock:[Название мега-темы] часть 1
  • :lock:[Название мега-темы] часть 2
  • :lock:[Название мега-темы] часть 3
  • :lock:[Название мега-темы] часть […]
  • :unlock:[Название мега-темы] часть 10

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

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

4 лайка

У нас уже есть функция (настройка сайта) именно для этого случая!

4 лайка