У меня возникла проблема на моём сообществе. Я не могу «удалить все сообщения» у определённых пользователей. Судя по всему, это происходит только со старыми аккаунтами, у которых много постов. Новые аккаунты не сталкиваются с этой проблемой.
Я проверил настройки сайта и увеличил лимит на удаление всех сообщений до 10 000.
Сейчас я пытаюсь удалить пользователя с примерно 900 постами. Пользователь не хочет быть анонимизирован и угрожает судебным иском, если аккаунт и сообщения не будут удалены. Я нажимаю кнопку «Удалить все», и примерно через минуту получаю это сообщение:
Попробуйте перейти в Администрирование / Журналы / Журналы ошибок. Затем попробуйте удалить сообщения снова. Надеюсь, в журнале появится запись о сообщении, вызывающем проблему.
Приношу извинения, при более внимательном рассмотрении эта ошибка, похоже, связана с чем-то другим.
Сейчас я вижу вот это, и подозреваю, что это может быть вызвано тайм-аутом запроса:
Я написал небольшое приложение, которое вызывает API Discourse на моей установке. Оно удаляет каждый пост по отдельности, а не пакетно. Таким образом, для 700 постов выполняется 700 вызовов API. Это не самый эффективный способ, но он оказался полезным.
Я вижу, что есть 20 «проблемных» постов. Похоже, функция «удалить все» останавливается, как только сталкивается с одним из них, и не может их удалить. По какой-то причине API не смог удалить эти посты. Я вручную удалил большинство из них, зайдя в пост и нажав кнопку удаления, как это обычно делает модератор.
Осталось ещё около 5 постов, которые я не могу удалить ни через API, ни обычным способом. Между ними я не вижу никаких сходств. Некоторые находятся в огромных темах, другие — в небольших. Некоторые являются ответами, имеют лайки, содержат изображения, другие — нет. Когда я пытаюсь удалить их через стандартный интерфейс, появляется это окно с ошибкой:
Некоторые из моих пользователей сообщали, что получают такое же окно, когда пытаются удалить свои собственные посты. Я предположил, что это связано с проблемами соединения или чем-то подобным, поскольку почти все они используют мобильные устройства, но это может быть что-то другое.
При попытке удалить пост вручную я получаю этот лог:
Все пять проблемных постов находятся в двух крупных темах. Мы недавно закрыли обе, потому что они становились слишком большими. В одной теме 55 тысяч постов, в другой — 17 тысяч. Я предполагаю, что при удалении поста из такой большой темы происходит значительная обработка данных, что приводит к某种类型的 таймауту, но это лишь предположение.
Я застрял. Я не могу удалить сообщения в этих обширных темах и не могу удалить сами темы. В обоих случаях появляется диалоговое окно с ошибкой 502 (Gateway Error).
Как правило, сообщения в Discourse помечаются как удаленные мягко, а не жестко. Команда destroy удаляет их из базы данных, и я попросил вас использовать её только потому, что сообщения, которые вы пытались удалить, принадлежали невероятно длинным темам.
Я не рекомендую использовать этот метод ни для сообщений, ни для тем. Их невозможно восстановить, и, насколько я понимаю, вы работаете с базой данных сайта, находящегося в продакшене, что несет риск поломки всего сайта в случае ошибки. Однако, если вы хотите использовать команду destroy, вы свободны сделать это. Вы всегда должны создавать резервную копию, если планируете использовать такие команды.
Просто заметка: чтобы избежать подобных проблем с производительностью , мы также добавили настройки для предотвращения создания мега-тем. Подробнее см. The MEGATOPIC: public good, or public menace?
Спасибо за совет. Всё как я и ожидал, и я буду использовать команду destroy только в крайнем случае.
Поскольку обычно происходит мягкое удаление постов, получается, что система записывает множество дополнительных данных вместо простого удаления записи. Возможно, именно поэтому удаление постов из мега-темы работает некорректно? Слишком много операций, и происходит тайм-аут?
Мне бы очень хотелось найти способ решить эту проблему, не прибегая к рискованной консольной команде.
Спасибо. Я изменил максимальный лимит тем на 2500. Пользователи некоторое время назад просили снять это ограничение, что привело к появлению таких гигантских тем. Однако такие темы не идут на пользу форуму. Во время пиковых нагрузок, когда множество людей отвечали в них, производительность сервера сильно страдала. В итоге мы закрыли их, чтобы предотвратить это, но теперь мы всё ещё застряли с этими огромными темами, которые вызывают другие проблемы.
Самое простое решение — чтобы некоторые модераторы взялись за дело и начали разделять (а затем закрывать) мега-темы на несколько тем, например:
[Название мега-темы] часть 1
[Название мега-темы] часть 2
[Название мега-темы] часть 3
[Название мега-темы] часть […]
[Название мега-темы] часть 10
Каждая часть будет автоматически связана с предыдущей и следующей, поэтому у пользователей не должно возникнуть проблем с навигацией, и вы точно решите проблему производительности.
Да, это будет скучная работа, но именно поэтому наличие темы с 55 тысячами или 17 тысячами сообщений абсолютно бесполезно, ведь никто их не прочтёт.