可能的 post_edited 事件回归问题?

Discourse Bug 报告::post_edited 事件在 latest-release 版本中回归

影响范围: Discourse latest-release 分支 (release +122)
状态: 已确认回归 - 可重现
日期: 2026年1月15日


摘要

在最近的 latest-release 构建中,:post_edited DiscourseEvent 不再发布。帖子编辑成功完成,修订版本也已创建,但插件所依赖的事件从未触发。这破坏了所有使用 post_created_edited 自动化触发器以及监听 :post_edited 事件的其他插件。


复现步骤(已确认)

我们通过在两个相同的 Azure AKS 环境上进行测试,确认了这是一个回归问题:

更新前(工作正常)

  • 版本: v2026.1.0-latest (较旧的构建)
  • 行为: :white_check_mark: :post_edited 事件正确触发
  • 自动化: :white_check_mark: 自动工作

更新后(已损坏)

  • 版本: latest-release +122 hours ago, release +122
  • 行为: :cross_mark: :post_edited 事件从未触发
  • 自动化: :cross_mark: 完全损坏

关键发现: 在更新之前,两个环境都能正常工作。更新到 latest-release +122 后都出现了问题。这明确证明了引入了回归。


环境详情

  • Discourse 版本: latest-release (release +122)
  • Rails 版本: 8.0.4
  • 基础设施: Azure Kubernetes Service (AKS)
  • Docker 镜像: discourse/base:2.0.20260109-0020
  • 部署: 标准 Discourse Docker 安装

测试过程

测试 1:事件监听器(证明事件从未触发)

# 在 Rails 控制台中
File.open('/tmp/post_edited_test.log', 'w') { |f| f.write("Test started at #{Time.now}\n") }

DiscourseEvent.on(:post_edited) do |post, topic_changed, revisor|
  File.open('/tmp/post_edited_test.log', 'a') do |f|
    f.write("[#{Time.now}] :post_edited fired! Post #{post.id}\n")
  end
end

然后在通过 Web 界面编辑任何帖子并检查:

cat /tmp/post_edited_test.log

latest-release +122 上的结果: 只显示“Test started” - 事件从未触发
在旧版本上的结果: 显示带有时间戳和帖子 ID 的事件条目

测试 2:验证修订版本的创建

post = Post.find(POST_ID)
puts "Post revisions: #{post.revisions.count}"
post.revisions.last(3).each { |rev| puts "  Revision #{rev.number}: #{rev.created_at}" }

结果: 修订版本已正确创建并带有正确的时间戳
结论: 编辑已成功处理,但 post_process_post 未被调用或事件未被触发

测试 3:手动触发事件(证明事件系统工作正常)

post = Post.find(POST_ID)
DiscourseEvent.trigger(:post_edited, post, false, PostRevisor.new(post))

结果: 事件处理程序正确执行
结论: 事件系统工作正常,但编辑期间的自动触发已损坏


预期行为

当通过 Web 界面编辑帖子时:

  1. 编辑成功保存 :white_check_mark:
  2. 创建帖子修订版本 :white_check_mark:
  3. 调用 PostRevisor#post_process_post :cross_mark:
  4. 触发 :post_edited 事件 :cross_mark:
  5. 事件处理程序执行 :cross_mark:

只有步骤 1-2 有效。步骤 3-5 已损坏。


实际行为

生产日志显示编辑完成成功:

Started PUT "/posts/3631" for 88.97.179.124 at 2026-01-15 13:06:19 +0000
Processing by PostsController#update as JSON
Completed 200 OK in 676ms

没有错误,没有异常,但没有发布 :post_edited 事件。

该事件应在 /var/www/discourse/lib/post_revisor.rb 的第 759 行触发:

def post_process_post
  @post.invalidate_oneboxes = true
  @post.trigger_post_process
  DiscourseEvent.trigger(:post_edited, @post, self.topic_changed?, self)
end

此方法从第 341 行调用,但事件未被触发。


影响

受影响的官方功能

  • Discourse 自动化: post_created_edited 触发器完全损坏
  • 依赖帖子编辑的任何自动化工作流都会静默失败

受影响的插件

所有监听 :post_edited 事件的插件都已损坏:

  • discourse-automation - 官方自动化触发器
  • discourse-ai - 对编辑后的帖子进行 AI 审核
  • discourse-doc-categories - 文档索引更新
  • discourse-topic-voting - 投票收回工作流
  • 任何使用帖子编辑事件的自定义插件

回归时间线

  1. 旧版本: v2026.1.0-latest - :post_edited 事件工作正常 :white_check_mark:
  2. 更新到: latest-release (release +122) - :post_edited 事件损坏 :cross_mark:
  3. 在以下环境中确认: 两个独立的生产环境(更新后都出现问题)

这明确证明了在最近的 latest-release 构建中引入了回归。


解决方法

通过 Rails 控制台手动触发可以工作:

automation = DiscourseAutomation::Automation.find(AUTOMATION_ID)
post = Post.find(POST_ID)
automation.trigger!({"post" => post})

这证实了自动化系统本身是正常的——只是自动事件触发已损坏。


配置说明

  • 已验证设置: 所有与编辑相关的设置都是标准/默认设置
  • 宽限期: 在宽限期之外进行了测试(无影响)
  • 插件: 安装了 50 个插件(标准的官方插件)
  • 无核心修改: 干净的 Discourse 安装
  • 环境: 两个测试环境都是相同的 Azure AKS 部署

关键证据

最重要发现:

我们有一个基于旧版本的正常运行的 DEV 环境。在更新到 latest-release +122 之后,自动化停止工作。这可以肯定地证明在最近的版本中引入了回归。

两个环境在处于同一版本后,现在表现出相同的损坏行为。


可复现性

100% 可复现 - 在两个独立的环境上进行了测试:

  1. 安装 Discourse latest-release (release +122)
  2. 创建带有 post_created_edited 触发器的自动化
  3. 编辑帖子
  4. 观察自动化从未触发
  5. 使用测试监听器确认 :post_edited 事件从未触发

摘要

这是 latest-release (release +122) 中的一个已确认的回归:post_edited 事件在以前的版本中工作正常,但在更新后停止工作。两个独立的环境都确认了相同的行为。这破坏了核心 Discourse 自动化功能以及所有依赖帖子编辑事件的插件。

1 个赞

DiscourseEvent 不是这样工作的——它不是跨进程的,而是进程内的。因此,事件只会被在触发事件的同一进程中的监听器捕获。

对于 Discourse 自动化的情况,我刚刚在本地使用以下设置进行了测试

并编辑了一个帖子,它成功发送了聊天消息

1 个赞

谢谢!我会重新审视这个问题,因为我显然误解了。希望我能用这些信息让我的插件正常工作。非常感谢,

感谢 @zogstrip ——我们还通过在通过 Web 界面编辑时观察生产日志进行了测试:

测试过程:

  1. 通过控制台清除了自动化冷却时间
  2. 观察日志:tail -f /var/www/discourse/log/production.log | grep "PDF Automation"
  3. 通过 Web 浏览器编辑帖子(与自动化相同的流程)
  4. 结果: 编辑成功完成(200 OK),但自动化从未触发

我们在 Azure AKS 上有两个相同的环境(DEV 和 PROD):

  • 更新前: DEV 自动化工作正常(出现日志文件条目)
  • 更新到 latest-release (+122) 后: DEV 和 PROD 的自动化都停止工作了
  • 通过 Web 界面测试: 仍然没有自动化触发

我们的自动化配置:

  • 触发器:post_created_edited
  • 脚本:自定义脚本化(run_pdf_generation
  • 过滤器:类别 ID 34,标签 “hd96-24”

是否有关于自定义脚本化或我们环境的特定内容阻止了自动化的触发? 之前更新后它能工作的事实表明 post_created_edited 触发器触发的方式发生了变化。

您能尝试一个使用相同触发器的“更简单”的自动化吗?/logs/中是否有任何可能相关的内容?

1 个赞

好主意——我将创建一个最简示例来重现这个问题,并在周一发送给您。周末愉快!:slight_smile:

您关于 DiscourseEvent 进程间问题的判断是完全正确的——非常感谢您的澄清!

在收到您的反馈后,我们使用相同的 post_created_edited 触发器对一个简单的 send_chat_message 自动化进行了适当的测试。当我们编辑帖子时,该自动化确实触发了(我们在日志中看到了它的处理过程,并由于聊天设置配置错误而收到了 500 错误,而不是触发器本身的问题)。

这证实了:post_created_edited 触发器工作正常。

我们的困惑来自于:

  1. 使用 Rails 控制台监听器进行测试(错误——进程间问题)
  2. 我们的自定义 PDF 脚本在重建过程中丢失了,并且我们难以将其持久化重新注册
  3. 触发器机制本身运行正常。抱歉造成了混淆,感谢您的帮助!

很高兴一切都按预期工作 :+1:

现在是_困难_的部分,需要找出您的自定义 run_pdf_generation 脚本不再起作用的根本原因 :sweat_smile:

1 个赞