Perf: N+1 query storm when listing messages (batch enrichment) #84

Closed
opened 2026-07-08 02:40:32 +00:00 by icub3d · 0 comments
Owner

Category: Performance — found in code review 2026-07-07.

Problem

server/src/messages/handlers.rs:90 (enrich_message) runs 3 separate queries per message (list_attachments_for_message, list_reaction_counts, get_thread_summary), awaited in a for loop (:221). A 50-message page ≈ 150 sequential round-trips. A batched list_thread_summaries(&[id]) already exists (storage/sqlite/threads.rs:91) but the list path uses the single-row variant.

Fix

  • Collect the page's message IDs, then run 3 batch queries: attachments WHERE message_id IN (...), reaction counts grouped by message_id, and the existing list_thread_summaries. Assemble in memory.
  • Add list_attachments_for_messages(&[String]) and list_reaction_counts_for_messages(&[String], viewer).

Turns ~150 queries into 3.

**Category: Performance** — found in code review 2026-07-07. ## Problem `server/src/messages/handlers.rs:90` (`enrich_message`) runs **3 separate queries per message** (`list_attachments_for_message`, `list_reaction_counts`, `get_thread_summary`), awaited in a `for` loop (`:221`). A 50-message page ≈ 150 sequential round-trips. A batched `list_thread_summaries(&[id])` already exists (`storage/sqlite/threads.rs:91`) but the list path uses the single-row variant. ## Fix - [ ] Collect the page's message IDs, then run 3 batch queries: attachments `WHERE message_id IN (...)`, reaction counts grouped by message_id, and the existing `list_thread_summaries`. Assemble in memory. - [ ] Add `list_attachments_for_messages(&[String])` and `list_reaction_counts_for_messages(&[String], viewer)`. Turns ~150 queries into 3.
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
icub3d/decentcom#84
No description provided.