通知数量不一致且错误

我运营着一个刚成立一周的小型论坛,刚刚更新到最新版本,但仍在遇到这种非常奇怪的行为。通知计数(如“新消息”等)似乎与任何实际数量都不对应,而且会随机变化。

目前我看到“新消息 (3)”。

点击“新消息”后,我没有看到任何新帖子,而且“(3)”的计数也消失了。

点击返回主页后,菜单中不再显示“新消息 (3)”。

如果我重新加载页面,“新消息 (3)”又会出现。

点击“最新”时,我看到“未读 (2)”,但列表中的任何消息都没有未读标记。

点击“未读 (2)”后,系统显示没有任何未读消息。

有时当我点击“新消息”时,我没有看到任何新消息,却显示“未读 (1)”的标记。

我已经检查了 /sidekiq/,一切看起来正常,没有排队或积压的任务。

3 个赞

能否确认您的 Discourse 站点当前运行的版本?该信息应显示在您站点管理仪表板的顶部附近。

3 个赞

2.5.0.beta4

( 74db317974 )

2 个赞

您是否有任何已静音的标签或类别?

您是否有稳定的复现步骤?

2 个赞

没有任何静音设置,即使论坛中有新活动,这个问题也持续存在。如果您想亲眼看看,欢迎注册账号。(我尚未确认其他人是否也会看到此问题,还是仅我的账号独有。)

请查看您的管理部分,是否有警告信息?Sidekiq 是否正在运行?

1 个赞

没有警告,Sidekiq 看起来没问题。假设我理解正确。

您是否正在使用 Cloudflare 或类似的 CDN?我注意到即使关闭了加速功能,Cloudflare 仍存在一些通知延迟问题,例如 Rocket Loader。

1 个赞

哦,我漏掉了这个……所以确实存在持续性的问题。这意味着服务器告诉客户端有很多新主题,但当你深入查看时,这些主题却不存在。

我之前见过这种情况发生在定时发布的帖子中……你们使用定时发布功能吗?调试这个问题有点棘手,我们需要获取客户端认为新的主题 ID 列表。

如果这个问题现在仍然存在,请运行以下 SQL 查询:

SELECT 
           u.id AS user_id,
           topics.id AS topic_id,
           topics.created_at,
           highest_staff_post_number highest_post_number,
           last_read_post_number,
           c.id AS category_id,
           tu.notification_level
FROM topics
JOIN users u on u.id = 1
JOIN user_stats AS us ON us.user_id = u.id
JOIN user_options AS uo ON uo.user_id = u.id
JOIN categories c ON c.id = topics.category_id
LEFT JOIN topic_users tu ON tu.topic_id = topics.id AND tu.user_id = u.id
LEFT JOIN category_users ON category_users.category_id = topics.category_id AND category_users.user_id = 1
WHERE u.id = 1 AND
      
      topics.archetype <> 'private_message' AND
      ((1=0) OR ("topics"."deleted_at" IS NULL AND topics.created_at >= GREATEST(CASE
                  WHEN COALESCE(uo.new_topic_duration_minutes, 2880) = -1 THEN u.created_at
                  WHEN COALESCE(uo.new_topic_duration_minutes, 2880) = -2 THEN COALESCE(u.previous_visit_at,u.created_at)
                  ELSE ('2020-05-13 00:36:29.100619'::timestamp - INTERVAL '1 MINUTE' * COALESCE(uo.new_topic_duration_minutes, 2880))
               END, us.new_since, '2020-05-07 14:46:17') AND tu.last_read_post_number IS NULL AND COALESCE(tu.notification_level, 2) >= 2 AND topics.created_at > '2020-05-07 14:46:17' AND (category_users.last_seen_at IS NULL OR topics.created_at > category_users.last_seen_at))) AND
      
      
      topics.deleted_at IS NULL AND
      
      NOT (
        last_read_post_number IS NULL AND
        COALESCE(category_users.notification_level, 1) = 0
      )

UNION ALL

SELECT 
           u.id AS user_id,
           topics.id AS topic_id,
           topics.created_at,
           highest_staff_post_number highest_post_number,
           last_read_post_number,
           c.id AS category_id,
           tu.notification_level
FROM topics
JOIN users u on u.id = 1
JOIN user_stats AS us ON us.user_id = u.id
JOIN user_options AS uo ON uo.user_id = u.id
JOIN categories c ON c.id = topics.category_id
LEFT JOIN topic_users tu ON tu.topic_id = topics.id AND tu.user_id = u.id
LEFT JOIN category_users ON category_users.category_id = topics.category_id AND category_users.user_id = 1
WHERE u.id = 1 AND
       topics.updated_at >= us.first_unread_at AND 
      topics.archetype <> 'private_message' AND
      (("topics"."deleted_at" IS NULL AND tu.last_read_post_number < topics.highest_staff_post_number AND COALESCE(tu.notification_level, 1) >= 2) OR (1=0)) AND
      
      
      topics.deleted_at IS NULL AND
      
      NOT (
        last_read_post_number IS NULL AND
        COALESCE(category_users.notification_level, 1) = 0
      )

user_id = 1 替换为你的用户 ID(你可以通过运行 select id, username from users where username = '你的用户名' 来查找你的用户 ID)。

如果问题确实存在,能否安装 Data Explorer 插件并查看具体发生了什么?

1 个赞

没有使用 CDN,也没有定时发布帖子。这只是一个在 Linode VPS 的 Docker 中运行的标准 Discourse 安装,没有任何特殊配置。

我刚刚安装了数据探索插件,现在甚至连设置页面都无法加载。控制台报了一个 JS 错误并导致崩溃:

workbox-strategies.prod.js:1 Uncaught (in promise) no-response: no-response :: [{"url":"https://forum.livevideotech.today/admin/site_settings"}]
    at a.makeRequest (https://forum.livevideotech.today/javascripts/workbox/workbox-strategies.prod.js:1:2145)
1 个赞

有任何自定义插件吗?你是在 beta 分支还是 tests-passed 分支?如果你目前在 beta 分支,请暂时切换到 tests-passed。

一个插件:GitHub - discourse/discourse-solved: Allow accepted answers on topics · GitHub

我目前使用的是 2.5.0.beta4 版本,这是通过标准安装流程并运行提示的升级后得到的。

我不知道如何切换到特定分支,而且这样做听起来有风险,因为在尝试查找相关方法时,搜索结果中唯一的一条内容显示,有人曾尝试这样做,结果导致了数据库迁移失败。

我在命令行连接到数据库并执行了该查询,但没有返回任何结果:

discourse(#         last_read_post_number IS NULL AND
discourse(#         COALESCE(category_users.notification_level, 1) = 0
discourse(#       );
 user_id | topic_id | created_at | highest_post_number | last_read_post_number | category_id | notification_level
---------+----------+------------+---------------------+-----------------------+-------------+--------------------
(0 rows)

discourse=#

为了澄清一下,当前状态下,当我加载首页时,会看到“新 (1)”,但点击“新 (1)”后却看不到任何新帖子。返回首页后,“新 (1)”消失。重新加载页面后,它又会再次出现。

您正在运行一个旧的提交版本,且未处于 beta 模式。

能否从控制台重新构建?数据资源管理器应该可以正常工作。

系统显示我处于 4078b22887,这正好比 master 落后一个提交。

哦对了,抱歉,能否确认一下在站点设置中启用后,数据探索器是否仍然无法正常工作?另外,能否尝试在另一个浏览器(如 Firefox 或 Chrome)中打开,看看工作区错误是否依然存在?

我稍后再处理数据浏览器的问题,我不想每次修复时都反复重建并关闭论坛。我直接在命令行运行查询。

当前状态:“新(4)”

 user_id | topic_id |         created_at         | highest_post_number | last_read_post_number | category_id | notification_level
---------+----------+----------------------------+---------------------+-----------------------+-------------+--------------------
       1 |      116 | 2020-05-13 06:48:33.784078 |                   1 |                       |           5 |
       1 |      118 | 2020-05-13 07:29:47.423296 |                   1 |                       |           5 |
       1 |      117 | 2020-05-13 06:52:39.448473 |                   1 |                       |          13 |
       1 |       31 | 2020-05-03 14:13:53.109324 |                   4 |                     3 |           7 |                  2

点击“新(4)”后,我看到的是三条帖子:118、117、116。topic_id 31 并未显示。

返回首页后,状态变为“新(3)”。

但查询结果仍然返回相同的 4 条记录。

4 个赞

好的,这很有趣。你能跳转到主题 31 吗?它有什么异常吗?这是一个未读主题(last_read_post_number 是 3)……查询结果显示我们认为你有 3 条新消息和 1 条未读消息。

我一直在想,也许是你客户端的 Web Worker 缓存出了问题。

你用的是 Chrome 还是 Firefox……能试试另一个浏览器吗?或者尝试在无痕模式下使用浏览器(禁用所有扩展)?

4 个赞

哦,@martin 和我刚刚发现了一个 bug…… 碰巧你屏蔽了任何标签吗?

存在一个 bug:如果你屏蔽了标签,并且有任何 100% 未打标签的主题,这些主题最终会缺失在“未读”列表中。

3 个赞

我不确定这是否正是您的问题 @aaronpk……但此修复现已包含在以下提交中:

6 个赞