# 出现了很多“无法补充‘Reader’徽章”的错误

**URL:** <https://meta.discourse.org/t/got-a-lot-of-failed-to-backfill-reader-badge-errors/365756>\
**Category:** Support\
**Created:** [2025年五月12日 16:14 UTC](https://meta.discourse.org/t/got-a-lot-of-failed-to-backfill-reader-badge-errors/365756 "2025-05-12T16:14:49Z")\
**Posts on this page:** 7\
**Page:** 1

<div class="post-metadata">

**Author:** ![jimmy0017](https://avatars.discourse-cdn.com/v4/letter/j/76d3ee/32.png) [@jimmy0017](https://meta.discourse.org/u/jimmy0017)\
**Post date:** [2025年五月12日 16:14 UTC](https://meta.discourse.org/t/got-a-lot-of-failed-to-backfill-reader-badge-errors/365756/1 "2025-05-12T16:14:49Z")

</div>

日志中有很多此类错误。有什么我们可以做/应该做的吗？

信息：

> 作业异常：未能回填“Reader”徽章：{:revoked\_callback=\>#\<Proc:0x00007867ef8d9620 /var/www/discourse/app/jobs/regular/backfill\_badge.rb:20 (lambda)\>, :granted\_callback=\>#\<Proc:0x00007867ef8d95f8 /var/www/discourse/app/jobs/regular/backfill\_badge.rb:21 (lambda)\>}。原因：ERROR: 语句因语句超时而取消

跟踪：

```plaintext
/var/www/discourse/app/services/badge_granter.rb:505:in `rescue in backfill' 
/var/www/discourse/app/services/badge_granter.rb:385:in `backfill' 
/var/www/discourse/app/jobs/regular/backfill_badge.rb:18:in `execute' 
/var/www/discourse/app/jobs/base.rb:316:in `block (2 levels) in perform' 
rails_multisite-6.1.0/lib/rails_multisite/connection_management/null_instance.rb:49:in `with_connection'
rails_multisite-6.1.0/lib/rails_multisite/connection_management.rb:21:in `with_connection'
/var/www/discourse/app/jobs/base.rb:303:in `block in perform' 
/var/www/discourse/app/jobs/base.rb:299:in `each' 
/var/www/discourse/app/jobs/base.rb:299:in `perform' 
sidekiq-7.3.9/lib/sidekiq/processor.rb:220:in `execute_job' 
sidekiq-7.3.9/lib/sidekiq/processor.rb:185:in `block (4 levels) in process' 
sidekiq-7.3.9/lib/sidekiq/middleware/chain.rb:180:in `traverse' 
sidekiq-7.3.9/lib/sidekiq/middleware/chain.rb:183:in `block in traverse' 
/var/www/discourse/lib/sidekiq/discourse_event.rb:6:in `call' 
sidekiq-7.3.9/lib/sidekiq/middleware/chain.rb:182:in `traverse' 
sidekiq-7.3.9/lib/sidekiq/middleware/chain.rb:183:in `block in traverse' 
/var/www/discourse/lib/sidekiq/pausable.rb:131:in `call' 
sidekiq-7.3.9/lib/sidekiq/middleware/chain.rb:182:in `traverse' 
sidekiq-7.3.9/lib/sidekiq/middleware/chain.rb:183:in `block in traverse' 
sidekiq-7.3.9/lib/sidekiq/job/interrupt_handler.rb:9:in `call' 
sidekiq-7.3.9/lib/sidekiq/middleware/chain.rb:182:in `traverse' 
sidekiq-7.3.9/lib/sidekiq/middleware/chain.rb:183:in `block in traverse' 
sidekiq-7.3.9/lib/sidekiq/metrics/tracking.rb:26:in `track' 
sidekiq-7.3.9/lib/sidekiq/metrics/tracking.rb:134:in `call' 
sidekiq-7.3.9/lib/sidekiq/middleware/chain.rb:182:in `traverse' 
sidekiq-7.3.9/lib/sidekiq/middleware/chain.rb:173:in `invoke' 
sidekiq-7.3.9/lib/sidekiq/processor.rb:184:in `block (3 levels) in process' 
sidekiq-7.3.9/lib/sidekiq/processor.rb:145:in `block (6 levels) in dispatch' 
sidekiq-7.3.9/lib/sidekiq/job_retry.rb:118:in `local' 
sidekiq-7.3.9/lib/sidekiq/processor.rb:144:in `block (5 levels) in dispatch' 
sidekiq-7.3.9/lib/sidekiq/config.rb:39:in `block in <class:Config>' 
sidekiq-7.3.9/lib/sidekiq/processor.rb:139:in `block (4 levels) in dispatch' 
sidekiq-7.3.9/lib/sidekiq/processor.rb:281:in `stats' 
sidekiq-7.3.9/lib/sidekiq/processor.rb:134:in `block (3 levels) in dispatch' 
sidekiq-7.3.9/lib/sidekiq/job_logger.rb:15:in `call' 
sidekiq-7.3.9/lib/sidekiq/processor.rb:133:in `block (2 levels) in dispatch' 
sidekiq-7.3.9/lib/sidekiq/job_retry.rb:85:in `global' 
sidekiq-7.3.9/lib/sidekiq/processor.rb:132:in `block in dispatch' 
sidekiq-7.3.9/lib/sidekiq/job_logger.rb:40:in `prepare' 
sidekiq-7.3.9/lib/sidekiq/processor.rb:131:in `dispatch' 
sidekiq-7.3.9/lib/sidekiq/processor.rb:183:in `block (2 levels) in process' 
sidekiq-7.3.9/lib/sidekiq/processor.rb:182:in `handle_interrupt' 
sidekiq-7.3.9/lib/sidekiq/processor.rb:182:in `block in process' 
sidekiq-7.3.9/lib/sidekiq/processor.rb:181:in `handle_interrupt' 
sidekiq-7.3.9/lib/sidekiq/processor.rb:181:in `process' 
sidekiq-7.3.9/lib/sidekiq/processor.rb:86:in `process_one' 
sidekiq-7.3.9/lib/sidekiq/processor.rb:76:in `run' 
sidekiq-7.3.9/lib/sidekiq/component.rb:10:in `watchdog' 
sidekiq-7.3.9/lib/sidekiq/component.rb:19:in `block in safe_thread' 

```

---

<div class="post-metadata">

**Author:** ![JammyDodger](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/jammydodger/32/254611_2.png) [@JammyDodger](https://meta.discourse.org/u/JammyDodger)\
**Post date:** [2025年五月12日 20:52 UTC](https://meta.discourse.org/t/got-a-lot-of-failed-to-backfill-reader-badge-errors/365756/3 "2025-05-12T20:52:07Z")

</div>

这是否可能是由一个特别大的主题引起的问题？你们是否有可能给它带来负担的巨型主题？

如果徽章授予作业完全被它阻止了，那么可以考虑暂时禁用“阅读者”徽章，看看是否有帮助。

* * *

我确实找到了关于一个看似类似问题的资料：（虽然已经很老了）

> [@PostgreSQL runaway IO](https://meta.discourse.org/t/postgresql-runaway-io/91516/31):
>
> It is inherently extremely expensive to figure out if a user read EVERY single post on a topic across all topics across all users. If you don’t have the hardware to handle that I would recommend just disabling the reader badge. I am on the fence big time on the value of “calculateavgtime” I am not convinced we even need this long term

所以，这可能是查询对你们的配置来说太大了？

---

<div class="post-metadata">

**Author:** ![jimmy0017](https://avatars.discourse-cdn.com/v4/letter/j/76d3ee/32.png) [@jimmy0017](https://meta.discourse.org/u/jimmy0017)\
**Post date:** [2025年五月13日 01:12 UTC](https://meta.discourse.org/t/got-a-lot-of-failed-to-backfill-reader-badge-errors/365756/4 "2025-05-13T01:12:25Z")

</div>

我们没有一个巨大的主题。至少我没有意识到。如果有一个SQL命令让我运行并进行检查，那将会很好。  
我们有32核CPU + 128 GB内存……我不确定这是否是一个限制。如果我在数据库中需要更改什么，请告诉我。

---

<div class="post-metadata">

**Author:** ![JammyDodger](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/jammydodger/32/254611_2.png) [@JammyDodger](https://meta.discourse.org/u/JammyDodger)\
**Post date:** [2025年五月13日 08:35 UTC](https://meta.discourse.org/t/got-a-lot-of-failed-to-backfill-reader-badge-errors/365756/5 "2025-05-13T08:35:32Z")

</div>

> [@jimmy0017](#):
>
> 我们没有超级主题。至少我不知道。如果有一个 SQL 命令可以让我运行和检查，那就太好了。

我认为如果你有一个，你很可能会知道，但你可以将你的 `/latest` 列表切换到活动顺序，通过列标题或使用 `YourSite/latest?order=posts` 来仔细检查。

但像这样的数据浏览器中的内容也应该能显示前 10 名：

```sql
SELECT id AS topic_id
FROM topics
ORDER BY posts_count DESC
LIMIT 10

```

Reader 徽章的 SQL 在这里：

> <https://github.com/discourse/discourse/blob/c2ae2e244c3912dd5d9b42b07e76ccfb5b078872/lib/badge_queries.rb#L4-L19>

Reader 徽章不一定是其中最令人兴奋的徽章之一，所以如果你能接受禁用它并且这样可以解决所有问题，那可能是最简单的解决方法。但如果你想进一步探索它，我认为你可能需要查看你的 `post_timings` 表，看看它有多大。

---

<div class="post-metadata">

**Author:** ![jimmy0017](https://avatars.discourse-cdn.com/v4/letter/j/76d3ee/32.png) [@jimmy0017](https://meta.discourse.org/u/jimmy0017)\
**Post date:** [2025年五月13日 13:55 UTC](https://meta.discourse.org/t/got-a-lot-of-failed-to-backfill-reader-badge-errors/365756/6 "2025-05-13T13:55:48Z")

</div>

我看到了几个超级主题。但我们限制在1万条回复，并进行了划分。

我暂时会禁用它。不过这是 `rake db:stats`：

```plaintext
table_name | row_estimate | table_size | index_size | total_size
-----------------------------------------------------------------------------------------------
post_timings | 1707169280 | 70 GB | 61 GB | 132 GB
topic_views | 243936880 | 11 GB | 15 GB | 26 GB
user_auth_token_logs | 98783264 | 23 GB | 2775 MB | 25 GB

```

---

<div class="post-metadata">

**Author:** ![JammyDodger](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/jammydodger/32/254611_2.png) [@JammyDodger](https://meta.discourse.org/u/JammyDodger)\
**Post date:** [2025年五月13日 15:34 UTC](https://meta.discourse.org/t/got-a-lot-of-failed-to-backfill-reader-badge-errors/365756/7 "2025-05-13T15:34:32Z")

</div>

这确实看起来是个大问题。 🙂

万一您当时没有这样做（取决于您的论坛有多老），在 [PostgreSQL 13 update](https://meta.discourse.org/t/postgresql-13-update/172563) 中有以下建议：

> [@fitzy](#):
>
> ### 重新创建索引
> 
> 这次升级的主要功能是为我们最大的表（`post_timings` 表）及其索引节省大量空间。在成功更新后，您需要运行一个命令来重建索引并获得好处。
> 
> ```plaintext
> cd /var/discourse
> ./launcher enter app
> su postgres
> psql
> \connect discourse
> REINDEX SCHEMA CONCURRENTLY public;
> \q
> exit
> exit
> 
> ```
> 
> 如果您能在 `REINDEX` 之前和之后检查 `post_timings` 的大小，那将是一个很棒的数据分享！

不幸的是，我没有这方面的直接经验，所以我们可能需要等待一些聪明人出现进行更深入的研究。 🤓

---

<div class="post-metadata">

**Author:** ![jimmy0017](https://avatars.discourse-cdn.com/v4/letter/j/76d3ee/32.png) [@jimmy0017](https://meta.discourse.org/u/jimmy0017)\
**Post date:** [2025年五月13日 15:41 UTC](https://meta.discourse.org/t/got-a-lot-of-failed-to-backfill-reader-badge-errors/365756/8 "2025-05-13T15:41:41Z")

</div>

是的。我在升级到PostgreSQL 13时做过这个操作。昨天我也运行了一次。但数据库大小没有变化。希望有人能告诉我如何减少大小。非常感谢！
