🤡 一个小丑表情引发的血案

2026-04-11 12:281阅读0评论SEO基础
  • 内容介绍
  • 文章标签
  • 相关推荐
问题描述:

这个事情实在过于离奇,这里做一个简单的排查记录,给自己提个醒下次再仔细一点。

社区的 discourse 版本是每天滚动更新的,这让我们及时避免了很多 bug 用上了很多新特性,当然也出过几次意外。

昨天的版本滚动更新之后,社区开始间歇性地报错 Bad Gateway (502) 。上服务器一看,workers 全挂,日志里看到的都是 workers 超时。

我们分析了一下 status.linux.do 日志,发现 502 发生的非常规律,一般是1个小时一次(也有例外),无一例外都发生在整点之后的几分钟。

尝试回滚版本,发现还真能解决问题。于是将范围锁定在这两个提交版本之间:419827bd ... 802fa4c3,逐个查看 commits。

这些提交里,只对 category.rb 有一次较大的改动,但这个改动只有一个 job 用到,那个 job 是 24 小时运行一次,不应该是它。

剩下的提交几乎没有对 rb 文件做什么改动,都是些一眼可见不会对性能造成什么影响的修改。

去代码里打了一堆日志,终于在一次 502 之后的日志分析中发现了一个 502 时运行过异常的任务: Jobs::DiscourseReactions::ScheduledLikeSynchronizer

其实之前的排查也感觉到它不寻常,运行时间高达 180+ 秒,但都没当回事。因为 sidekiq 里几十上百秒的任务多得很,它们都是后台运行,没把服务器弄挂过。

我跟进这个脚本一看,直接倒吸一口凉气,一个 ActiveRecord::Base.transaction do 事务起手,里面操作的全是:post_actionsuser_actionspoststopicsuser_statstopic_users 这些高频表!

180+ 秒的行锁不放,那 workers 可不死完了么。。

再看提交记录,跟 Reactions 插件最相关的提交就是 3f3dfa61 UX: Reactions default improvements (#38776)。这个提交中settings.yml有一个不起眼的改动:

type: emoji_list default: "-1" validator: "ReactionsExcludedFromLikeSiteSettingValidator" area: "emojis"

变为

discourse_reactions_excluded_from_like: type: emoji_list default: "-1|poop|face_with_symbols_on_mouth|enraged_face|face_vomiting|nauseated_face|angry|kitchen_knife|water_pistol|bomb|clown_face|unamused_face|roll_eyes|confused|smirking_face|disappointed_face|pensive_face|lying_face|weary_face|tired_face|confounded_face|persevering_face|smiling_face_with_horns|angry_face_with_horns|cigarette|person_gesturing_no|prohibited|no_entry|dagger|cross_mark" validator: "ReactionsExcludedFromLikeSiteSettingValidator" area: "emojis"

简单来说就是设置列表里加了一些不算赞的表情。之前 review 的时候也注意到了它,没当回事,因为这里新加的表情我们都没在用。直到看见这个唤起远古记忆的数据:

SELECT reaction_value, count(*) FROM discourse_reactions_reactions GROUP BY reaction_value ORDER BY count DESC; reaction_value | count ----------------+--------- heart | 3656567 +1 | 372580 laughing | 317150 tieba_087 | 181617 open_mouth | 127642 distorted_face | 116042 hugs | 77945 clap | 75342 bili_057 | 28981 confetti_ball | 21645 clown_face | 3671 (11 rows)

真相大白,原来我们之前使用过 clown_face 也就是小丑表情

其实到这里事情就很清楚了,就因为这个表情,将原本十几秒的任务变成了一百多秒,导致了每个小时大量的 workers 因为事务的行锁而超时。

只需要把 clown_face 表情从 SiteSetting.discourse_reactions_excluded_from_like 里拿掉,一切就恢复正常了。

这种事,谁能想得到啊?我想不到,Claude、Gemini、ChatGPT也想不到,它们叽里呱啦说一堆废话。打死它们,它们也不会意识到是这个改动出了问题。

这下对AI替代人类的焦虑要轻一些了

网友解答:
--【壹】--:


我喜欢发扭曲脸,我有罪。。我应该多发发小丑脸的


--【贰】--:

前排前排


--【叁】--:


--【肆】--:

前排前排


--【伍】--:


--【陆】--:


--【柒】--:

前排前排


--【捌】--:

前排前排


--【玖】--:

我以为,是我IP不够纯粹呢


--【拾】--:

前排,围观


--【拾壹】--:

前排前排


--【拾贰】--:

可恶的小丑


--【拾叁】--:

哈哈,可恶的小丑


--【拾肆】--:

所以应该多点表情!


--【拾伍】--:

前排前排


--【拾陆】--:

前排围观


--【拾柒】--:

哈哈哈哈


--【拾捌】--:

前排围观


--【拾玖】--:

前排前排

问题描述:

这个事情实在过于离奇,这里做一个简单的排查记录,给自己提个醒下次再仔细一点。

社区的 discourse 版本是每天滚动更新的,这让我们及时避免了很多 bug 用上了很多新特性,当然也出过几次意外。

昨天的版本滚动更新之后,社区开始间歇性地报错 Bad Gateway (502) 。上服务器一看,workers 全挂,日志里看到的都是 workers 超时。

我们分析了一下 status.linux.do 日志,发现 502 发生的非常规律,一般是1个小时一次(也有例外),无一例外都发生在整点之后的几分钟。

尝试回滚版本,发现还真能解决问题。于是将范围锁定在这两个提交版本之间:419827bd ... 802fa4c3,逐个查看 commits。

这些提交里,只对 category.rb 有一次较大的改动,但这个改动只有一个 job 用到,那个 job 是 24 小时运行一次,不应该是它。

剩下的提交几乎没有对 rb 文件做什么改动,都是些一眼可见不会对性能造成什么影响的修改。

去代码里打了一堆日志,终于在一次 502 之后的日志分析中发现了一个 502 时运行过异常的任务: Jobs::DiscourseReactions::ScheduledLikeSynchronizer

其实之前的排查也感觉到它不寻常,运行时间高达 180+ 秒,但都没当回事。因为 sidekiq 里几十上百秒的任务多得很,它们都是后台运行,没把服务器弄挂过。

我跟进这个脚本一看,直接倒吸一口凉气,一个 ActiveRecord::Base.transaction do 事务起手,里面操作的全是:post_actionsuser_actionspoststopicsuser_statstopic_users 这些高频表!

180+ 秒的行锁不放,那 workers 可不死完了么。。

再看提交记录,跟 Reactions 插件最相关的提交就是 3f3dfa61 UX: Reactions default improvements (#38776)。这个提交中settings.yml有一个不起眼的改动:

type: emoji_list default: "-1" validator: "ReactionsExcludedFromLikeSiteSettingValidator" area: "emojis"

变为

discourse_reactions_excluded_from_like: type: emoji_list default: "-1|poop|face_with_symbols_on_mouth|enraged_face|face_vomiting|nauseated_face|angry|kitchen_knife|water_pistol|bomb|clown_face|unamused_face|roll_eyes|confused|smirking_face|disappointed_face|pensive_face|lying_face|weary_face|tired_face|confounded_face|persevering_face|smiling_face_with_horns|angry_face_with_horns|cigarette|person_gesturing_no|prohibited|no_entry|dagger|cross_mark" validator: "ReactionsExcludedFromLikeSiteSettingValidator" area: "emojis"

简单来说就是设置列表里加了一些不算赞的表情。之前 review 的时候也注意到了它,没当回事,因为这里新加的表情我们都没在用。直到看见这个唤起远古记忆的数据:

SELECT reaction_value, count(*) FROM discourse_reactions_reactions GROUP BY reaction_value ORDER BY count DESC; reaction_value | count ----------------+--------- heart | 3656567 +1 | 372580 laughing | 317150 tieba_087 | 181617 open_mouth | 127642 distorted_face | 116042 hugs | 77945 clap | 75342 bili_057 | 28981 confetti_ball | 21645 clown_face | 3671 (11 rows)

真相大白,原来我们之前使用过 clown_face 也就是小丑表情

其实到这里事情就很清楚了,就因为这个表情,将原本十几秒的任务变成了一百多秒,导致了每个小时大量的 workers 因为事务的行锁而超时。

只需要把 clown_face 表情从 SiteSetting.discourse_reactions_excluded_from_like 里拿掉,一切就恢复正常了。

这种事,谁能想得到啊?我想不到,Claude、Gemini、ChatGPT也想不到,它们叽里呱啦说一堆废话。打死它们,它们也不会意识到是这个改动出了问题。

这下对AI替代人类的焦虑要轻一些了

网友解答:
--【壹】--:


我喜欢发扭曲脸,我有罪。。我应该多发发小丑脸的


--【贰】--:

前排前排


--【叁】--:


--【肆】--:

前排前排


--【伍】--:


--【陆】--:


--【柒】--:

前排前排


--【捌】--:

前排前排


--【玖】--:

我以为,是我IP不够纯粹呢


--【拾】--:

前排,围观


--【拾壹】--:

前排前排


--【拾贰】--:

可恶的小丑


--【拾叁】--:

哈哈,可恶的小丑


--【拾肆】--:

所以应该多点表情!


--【拾伍】--:

前排前排


--【拾陆】--:

前排围观


--【拾柒】--:

哈哈哈哈


--【拾捌】--:

前排围观


--【拾玖】--:

前排前排