我们的社区报告说,在我们大约两个月前更新到 Discourse 3.0 后,他们的书签有时会神秘地消失。我已经将投诉缩小到主要使用 /bookmarks(而不是 /my/activity/bookmarks)的用户——这两个之间存在相关的可用性问题,但我稍后会讨论这个问题。
现在我主要对 /bookmarks 的预期行为感到困惑,因为它们并不包含用户的所有书签(如 /my/activity/bookmarks 中列出的)。为什么会这样?对我自己的账户来说,差异几乎有 1/3 的书签丢失:这两个部分不应该本质上列出相同数量的书签/主题吗?
我曾以为 /bookmarks 只支持已加书签的帖子(而不是主题),但似乎并非如此:我们的用户会持续地给帖子/主题添加书签,在 /bookmarks 下可以正常看到,持续几个小时或几天,然后它就……消失了? 如果他们删除书签,重新添加书签,它会显示一段时间,然后又会消失。需要明确的是,书签总是在 /my/activity/bookmarks 下显示正常,所以书签本身是存在的——但不知何故,一段时间后在 /bookmarks 下不再显示。这两个部分的内容之间一定有区别,但我看不出来——我错过了什么?
现在,这个问题之所以让我们的用户特别恼火,是因为他们发现 /my/activity/bookmarks 对于他们主要用例来说是不可用的,即查找他们已加书签的哪些主题有更新(在特定类别中,或只是在整个论坛上)。
我可以看到 /my/activity/bookmarks 界面上有很多不错的功能,但它仍然无法满足他们的主要需求:能够按最后活动时间排序,同时又能看到哪些主题有更新(未读数量)。如果那里的排序也能正常工作,并且每个主题的未读帖子数量也能显示出来,那就太好了,但我不太确定在 /my/activity/bookmarks 下按类别过滤书签的功能会如何实现,所以也许 /bookmarks 的存在也是合理的。
总之,也许这是两个独立的问题(可能是一个 bug (?) 和一个用户体验问题),但它们是相关的:我一直在推动社区避免“消失的书签”,而是使用 /my/activity/bookmarks,但对于他们使用它的目的来说,它确实不起作用。也许如果我们理解了“消失”的书签,我们就能找到一个变通的方法——所以:为什么不是所有的书签都显示在 /bookmarks 下面?
5 个赞
Paulo:
就我个人而言,丢失的书签数量接近 1/3。
我已经缩小了部分差异,因为 /bookmarks 不包括已加书签的私人消息,并且如果一个主题有多个已加书签的帖子,它只会在 /bookmarks 下显示一次该主题。
然而,书签仍然丢失。我们有几位成员在他们的 /my/activity/bookmarks 下显示的主题,并不总是在 /bookmarks 下显示。强调“总”是因为最初它们总是显示的,直到几小时/几天后它们最终消失。
同样,这只是在我们更新到 Discourse 3.0 时才开始发生,所以我怀疑是一个 bug。
我的理解是,您可以为特定帖子添加书签,甚至可以为同一主题的多个帖子添加书签:
4 个赞
martin
(Martin Brennan)
2023 年5 月 19 日 18:28
8
This, along with bookmarking chat messages (which only works when the chat plugin is enabled) has been around for some time now, at least since FEATURE: Promote polymorphic bookmarks to default and migrate (#16729) · discourse/discourse@fcc2e7e · GitHub .
Paulo:
I can see a lot of nice functionality on the interface /my/activity/bookmarks but it still doesn’t do their primary use: being able to sort by last activity while at the same time seeing which topics have updates (number of unread). Would be great if sorting would work there too and if the number of unread posts in each topic would show, but I’m not sure how functionality to filter the bookmarks by category would work under /my/activity/bookmarks, so perhaps it’s justifiable that there’s /bookmarks too.
This is the crux of the issue really. We still have this old /bookmarks route, which is somewhat useful because of the unread/activity sorting but is missing key things from the new route, and also likely that the query it is using has some issues with post/topic bookmarks and doesn’t show chat bookmarks at all.
This makes sense technically since it’s just a topic list. not a post list, it’s one of the main differences between the old route and the new.
I am not sure what we need to do here, I will look into it more and discuss internally. It is not ideal to have both routes, it would be nicer if the new one could do the missing feature from the old one.
1 个赞
我意识到,也许我应该将我的一个主题分成两个:一个用于 UX ,另一个用于 Bug ,因为我的主要问题(书签消失)被可用性问题所掩盖。
与此同时,我一直在研究书签功能,并发现了另一个 bug ,但我仍然不明白为什么书签会随机从 /bookmarks 中消失。似乎有些主题比其他主题更容易出现这种情况,但原因不明。对我来说,最奇怪的是,在添加书签后,它似乎在 /bookmarks 下显示正常一段时间(任意的小时/天数),直到它从那里消失,并且只能通过删除书签并重新添加书签来“修复”。
需要明确的是,这不是设置书签提醒以删除书签的问题:没有涉及提醒,书签也没有被删除(它们仍然显示在 /my/activity/bookmarks 下)——它们只是在一段时间后 才从 /bookmarks 中消失。
2 个赞
已将其移至 Bug ,因为 Support 既不是这两个,希望在这里能获得更多关注。
抱歉间接顶帖,但我们有很多用户对此非常不满。也许 /bookmarks 默认未启用(即在 UI 中不可见)在某种程度上降低了这个 bug 的暴露率,但我无法想象这仅限于我们的论坛。
1 个赞
我们并非忽视您。 我们只是在研究如何最好地处理此事。希望很快能为您带来更多消息。
1 个赞
mcwumbly
(Dave McClure)
2023 年6 月 2 日 01:31
16
这个问题听起来很令人沮丧,但我还没有能够重现它,而且我还没有什么好主意可能导致它。
我现在将忽略用户体验问题,专注于这个 bug。
我将从重述问题开始:
理论上的重现步骤,但不一定 100% 确定:
从没有书签开始
转到 /bookmarks 并验证列表中没有主题
转到 /my/activity/bookmarks 并验证列表中没有书签
为一些帖子和主题添加书签。(例如,15 个书签分布在 10 个不同的主题中)
我们认为提醒功能在这里不起作用,但也许它们有关?
我们还不知道是添加帖子书签还是主题书签会产生影响
记下已添加书签的唯一主题数量
转到 /bookmarks 并验证列表中有 10 个主题
转到 /my/activity/bookmarks 并验证列表中有来自 10 个主题的 15 个项目
等待
返回 /my/activity/bookmarks 并验证列表中 仍然 有来自 10 个主题的 15 个项目
转到 /bookmarks 并看到列表中少于 10 个主题
如果有人能从一个全新的站点开始,并更确定地重现这个问题,那将非常有帮助,可以帮助我们识别这个问题。
如果没有,如果有人 看到 了这个问题,只需要按照这些步骤,也许我们可以提供一些调试步骤来帮助识别问题:
转到 /my/activity/bookmarks 并滚动到底部。
计算唯一主题的数量 (N)
转到 /bookmarks 并滚动到底部。
看到列表中少于 N 个主题
1 个赞
感谢您尝试解决这个问题——我知道这在有趣的 bug 修复列表中排名不高。
是的,这些步骤基本正确,我将在下面稍后提及一些小的注意事项。
话虽如此,由于问题的随机性(在某个时间随机发生在一个主题上,并在任意一段时间后消失),仅通过这些步骤来设置场景可能很难重现它,因为似乎需要常规使用,并且不清楚触发器是什么(可能是时间):我无法自行按需重现该 bug,报告此问题的用户在使用 /bookmarks 方面的活跃度都远高于我。
不过,我确实收到了几位不同用户受到此问题影响的报告,我已经通过账户假冒进行了验证。我已要求其中一些用户不要重新收藏那些已从 /bookmarks 中消失 的主题,因此,虽然我无法按需重现,但我仍然可以访问正在发生这种情况的账户,并且比较 /bookmarks 和 /my/activity/bookmarks 可以显示差异。
虽然我无法提供我们论坛的管理员访问权限,但我很乐意运行任何 SQL 查询或 Discourse API 请求(即使是以遇到此问题的用户身份)以提供帮助。如果您想查看,请通过私信联系我以获取我们论坛的详细信息。
我曾短暂地尝试过 /bookmarks.json 和 /my/activity/bookmarks.json 端点,但进展不大:似乎 /bookmarks 页面已经加载了第一页结果,并且只为更多页面命中该端点,而 /my/activity/bookmarks 似乎从端点获取所有书签数据。因此,我无法完全比较 API 响应。
我不是 Ruby 开发者,但试图弄清楚代码中这两个端点分别位于何处,以便尝试理解差异,但由于我不熟悉技术栈,我在控制器中迷失了方向,只找到了 UsersController#bookmarks。
现在,对这些步骤的一些评论,可能不是很相关,只是为了明确起见。
Dave McClure:
从没有书签开始
这可能是正确的,但我无法确认这一点,因为我们论坛上所有受影响的用户都是长期用户,拥有大量现有书签,并且是升级到 3.0 才出现此问题。但是,由于删除书签然后再次添加会重复出现此问题,我假设从空白状态开始也会发生这种情况。一位报告者说,在升级后这种情况更常见,之后频率降低了……但他们可能只是在不知不觉中丢失了书签。
Dave McClure:
我们不认为提醒在这里起作用,但也许它们会?
我们还不知道收藏帖子还是主题是否有区别
我已经与几位足够耐心帮助我理解这个问题的用户进行了核实,他们告诉我:
他们总是收藏主题,而不是帖子
他们从不使用书签上的提醒功能。
我想这并不意味着使用帖子和提醒就不会发生这种情况,只是它似乎不依赖于这些。
Dave McClure:
转到 /my/activity/bookmarks 并滚动到底部。
计算唯一主题的数量 (N)
转到 /bookmarks 并滚动到底部。
看到列表中少于 N 个主题
一个小说明,只是为了提到 /my/activity/bookmarks 也可以显示来自私信的书签,所以不同的 N 也可能来自那里(这让我一度感到困惑)。
再次强调,如果对您有任何帮助,我很乐意运行 SQL 查询、API 请求或提供更多信息。我完全意识到由于其随机行为,调试此问题很棘手,但这也是它让用户感到沮丧的原因。
1 个赞
mcwumbly
(Dave McClure)
2023 年6 月 6 日 20:50
23
有一种理论是,也许 topic_users.bookmarked 字段在某种程度上不同步了。如果您找到了一个有问题的主题,能否尝试查询该用户/主题组合的 topic_users 表,看看 bookmarked 是 true 还是 false?
另外,我想知道新的实验性 /filter 功能是否会显示带有 in:bookmarked 的“丢失”主题,例如 Discourse Meta
1 个赞
是的,似乎是这样。
我查看了一个“丢失”的书签,发现它的topic_users.bookmarked被设置为false。这个主题没有显示在/bookmarks下,但它在/my/activity/bookmarks下。
我不确定这是否相关,但该记录的topic_users.last_posted_at日期将近一个月(大约在它消失的时候),而相关主题几乎每天都有新帖子。
总之,我不确定是什么影响了那个bookmarked标志,但我猜它是有嫌疑的。
还有什么我可以检查的吗?
我很乐意尝试,但我们使用的是稳定版(3.0.3),所以还没有这个功能。
2 个赞
nat
(Natalie T)
2023 年6 月 9 日 03:23
25
这非常有帮助。谢谢你。如果你知道在更新到 3.0.3 之前是哪个版本,那将有助于我们确定 bug 是在什么时候引入的。
我不能保证我们何时能优先处理这个问题,但我认为当我们开始处理时,我们有了一些可以依据的东西。
2 个赞
我们一直都在稳定分支上,所以之前可能是 2.8.14 版本。我们在 3 月 11 日更新,很可能是更新到了 3.0.1,而第一个投诉出现在 3 月 18 日,所以我猜理论上也有可能是更新到了 3.0.2。因此,恐怕在这之间有很多 2.9 的 beta 版本。
如果文件系统上有某个日志可以推断出之前的版本,我可以仔细检查一下,但 2.8.14...3.0.2 应该是正确的。
不确定这是否有帮助,因为我对 schema 不熟悉,但我运行了下面的查询:
SELECT
topic_users.user_id,
topic_users.topic_id
FROM
bookmarks,
topic_users
WHERE
bookmarks.user_id = topic_users.user_id
AND bookmarkable_type = 'Topic'
AND bookmarks.bookmarkable_id = topic_users.topic_id
AND topic_users.bookmarked = false;
并得到了 3000 多个匹配项。
我猜在任何生产系统上都可以运行类似的东西来查找一些“丢失”的书签,这希望能离复现问题更近一步。如果我说的是显而易见的事情,请原谅,我只是想提供帮助。
2 个赞
FWIW,我们现在使用的是 3.1.2 版本,但问题仍然存在。
用户报告说,有些书签每天会“消失”多达 5 次(每次都会重新添加书签)。目前,该功能太糟糕了,无法使用,而且没有好的替代方案能提供相同的功能级别。
现在有了重现它的方法(通过 SQL 查询),以及引入该 bug 的版本范围,我是否可以期望这个问题在某个时候得到解决?
mcwumbly
(Dave McClure)
2023 年10 月 30 日 12:48
29
哦,既然你现在使用的是 3.1.2 版本,下次看到这个问题时,你能检查一下 /filter 中是否也缺少这些主题,或者它们是否在那里显示吗?
我认为知道这个问题的答案将有助于我们决定在这里怎么做。
3 个赞
我已使用 /filter 功能进行了测试,似乎该问题也出现在包含 in:bookmarked 搜索时。
由于它们消失的随机性,我通过首先使用我之前发布的 SQL 查询找到一个“有问题”的书签,然后假冒该用户进行测试,并成功找到了一个书签,该书签:
书签存在于 /my/activity/bookmarks(正如预期的那样)。
但书签根本没有列在 /bookmarks 中(但应该列出)。
并且,在 /filter?q=in%3Abookmarked 中也没有显示。
查询 bookmarks 数据库表,它当然存在。然而,查询 topic_users 表时,bookmarked 列被设置为 false,我猜测这可能与问题有关?
需要明确的是,该账户也有书签,这些书签在上述所有 3 个地方都显示(正如应该的那样)——但这只是一个临时状态,它们最终会“消失”。SQL 查询似乎只返回有问题的那部分。因此,在繁忙的生产系统上运行它并假冒相应用户应该可以重现该问题。
1 个赞
mcwumbly
(Dave McClure)
2023 年11 月 2 日 15:40
32
谢谢 @mentalstring 。我将把这些新信息带回团队,看看我们接下来会拿出什么。
2 个赞
martin
(Martin Brennan)
2023 年11 月 3 日 05:23
36
@mentalstring 感谢您这么长时间的耐心等待,很抱歉这么久才找到问题的根源。今天,根据您提供的数据以及在 Meta 的 Data Explorer 中的一份报告,我找到了原因并找到了重现问题的方法。重现步骤:
收藏一个主题,但不要收藏主题内的任何帖子
删除或恢复主题内的任何帖子
这是由我多年前添加的这个作业引起的,它没有考虑到主题级别的收藏:
# frozen_string_literal: true
module Jobs
class SyncTopicUserBookmarked < ::Jobs::Base
def execute(args = {})
topic_id = args[:topic_id]
DB.exec(<<~SQL, topic_id: topic_id)
UPDATE topic_users SET bookmarked = true
FROM bookmarks AS b
INNER JOIN posts ON posts.id = b.bookmarkable_id AND b.bookmarkable_type = 'Post'
WHERE NOT topic_users.bookmarked AND
posts.deleted_at IS NULL AND
topic_users.topic_id = posts.topic_id AND
topic_users.user_id = b.user_id #{topic_id.present? ? "AND topic_users.topic_id = :topic_id" : ""}
SQL
DB.exec(<<~SQL, topic_id: topic_id)
UPDATE topic_users SET bookmarked = false
WHERE topic_users.bookmarked AND
This file has been truncated. show original
因此,修复程序即将推出,同时还将进行数据迁移以纠正现有记录。合并后我会再次在此处发布。
3 个赞