当存在属于大主题的帖子时,无法“删除所有帖子”

我的社区遇到了一个问题。我无法“删除某些用户的所有帖子”。据我观察,这仅发生在拥有大量帖子的旧账户上,新账户则没有这个问题。

我已检查了站点设置,并将“删除所有帖子”的限额提高到了 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 篇)。不知道这是否相关。

好的,我应该更仔细地阅读你的帖子。

看来是 ID 为 64828 的主题失败了。该用户在这个主题中发布过帖子吗?

抱歉,经过仔细检查,该错误似乎与其他问题有关。我现在看到这个错误,怀疑可能是请求超时导致的:

image

我也尝试通过 API 请求执行删除操作,但我想这应该与通过界面操作是一样的。

我写了一个小应用,在我的 Discourse 安装中调用 API。它会逐个删除帖子,而不是批量删除。因此,对于 700 篇帖子,它会进行 700 次 API 调用。这并不是最高效的方式,但确实帮上了忙。

我注意到有 20 篇“问题”帖子。看起来“全部删除”功能在遇到其中一篇时就会停止,无法继续删除。由于某种原因,API 也无法删除这些帖子。我现在已经手动删除了其中大部分,方法是进入帖子页面并点击删除按钮,就像版主通常做的那样。

目前仍有大约 5 篇帖子无法删除,无论是通过 API 还是常规方式。我看不出它们之间有什么共同点。有些帖子位于大型话题中,有些则在小型话题中。有些是回复,带有点赞和图片,有些则没有。当我尝试通过标准界面删除它们时,会弹出这个错误对话框:

一些用户也报告说,当他们尝试删除自己的帖子时,遇到了相同的对话框。我原本以为是连接问题或其他类似原因,因为他们中几乎所有人都在使用移动设备,但也可能是其他原因。

当我尝试手动删除时,看到了以下日志:
23

有什么想法或建议吗?

五个问题帖子都集中在两个大型主题中。我们最近关闭了这两个主题,因为它们变得过于庞大。其中一个主题有 5.5 万条帖子,另一个有 1.7 万条帖子。我猜测,当这样一个大型主题中的帖子被删除时,会涉及大量处理,从而导致某种类型的超时,但这只是猜测。

1 个赞

我现在卡住了。我无法删除那些大型话题中的帖子,也无法删除话题本身。这两种操作都会导致出现 502 网关错误对话框。

: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(THE_TOPIC_ID).destroy
1 个赞

顺便提一下,为了避免出现此类性能问题::arrow_up:,我们还引入了一些设置来防止创建巨型主题。详情请见 The MEGATOPIC: public good, or public menace?

2 个赞

感谢你的建议。这正如我所料,我会将 destroy 命令仅作为最后的手段。既然它通常只是软删除帖子,那听起来像是它执行了许多其他操作,而不仅仅是删除记录。这是否就是为什么在删除大型主题中的帖子时效果不佳的原因?是不是因为要处理的事情太多,导致超时了?

我希望有一种方法可以在不使用有风险的控制台命令的情况下解决这个问题。

谢谢。我们将主题数量上限调整为 2500。此前用户曾要求取消该限制,从而导致出现了这些巨型主题。然而,这些巨型主题对论坛并不利。在高峰期,当大量用户回复这些主题时,服务器性能受到了严重影响。我们最终不得不关闭它们以阻止这种情况发生,但现在我们仍受困于这些庞大的主题,它们正在引发其他问题。

最简单的解决方案是让一些版主开始工作,将巨型主题拆分为多个主题(然后关闭原主题),例如:

  • :lock:[巨型主题标题] 第 1 部分
  • :lock:[巨型主题标题] 第 2 部分
  • :lock:[巨型主题标题] 第 3 部分
  • :lock:[巨型主题标题] 第 […] 部分
  • :unlock:[巨型主题标题] 第 10 部分

每个部分将自动链接到前一部分和后一部分,因此用户不会遇到导航困难,同时您也肯定能解决性能问题。

是的,这确实是一项枯燥的工作,但这也正是为什么拥有包含 5.5 万或 1.7 万条帖子的主题完全无用的原因之一,因为没人会去阅读它们。

4 个赞

我们现在有一个功能(站点设置)专门用于此用途!

4 个赞