mirror of
https://github.com/coder/coder.git
synced 2026-09-24 15:04:27 +08:00
fix: keep chat attachments while a linking chat exists
Fixes https://linear.app/codercom/issue/CODAGT-616/keep-chat-attachments-while-chats-remain-unarchived Chat attachments could disappear even though the chat was still available. This happened when a message was saved without recording which attachments it used, or when cleanup deleted attachments before an archived chat itself was removed. Creating a chat, sending or queuing a message, and editing a message now record both the message and which attachments it uses as one operation. If the chat is already at the 50-attachment limit, the chat change fails without being partially saved. Concurrent attachment writes serialize the 50-file cap per chat. Cleanup locks candidates and checks again for new links before deleting. If a file becomes unavailable after input validation, create, send, and edit return a clear client error and roll back the chat change. An attachment stays available while any chat that uses it still exists. After an archived chat reaches the end of its retention period and is deleted, an old attachment that no remaining chat uses can be cleaned up. The retention guide and unavailable-attachment UI text document this lifecycle. This change cannot restore attachments that were already deleted. The database migration adds two indexes so attachment cleanup stays fast as attachments accumulate. > This PR was authored by Mux (AI) on Mike's behalf.
This commit is contained in:
@@ -17,10 +17,10 @@ A background process runs approximately every 10 minutes to remove expired
|
||||
conversation data. Only archived conversations are eligible for deletion —
|
||||
active (non-archived) conversations are never purged.
|
||||
|
||||
When an archived conversation exceeds the retention period, it is deleted along
|
||||
with its messages, diff statuses, and queued messages via cascade. Orphaned
|
||||
files (not referenced by any active or recently-archived conversation) are also
|
||||
deleted. Both operations run in batches of 1,000 rows per cycle.
|
||||
When an archived conversation exceeds the retention period, Coder deletes it along with its messages, diff statuses, and queued messages.
|
||||
Coder retains an attached file while any conversation references it, regardless of whether the conversation is active or archived.
|
||||
A file that exceeds the retention period becomes eligible for deletion only after no conversations reference it.
|
||||
Conversation and file cleanup operations run in batches of 1,000 rows per cycle.
|
||||
|
||||
## Configuration
|
||||
|
||||
@@ -37,13 +37,12 @@ PUT /api/experimental/chats/config/retention-days
|
||||
|
||||
## What gets deleted
|
||||
|
||||
| Data | Condition | Cascade |
|
||||
|------------------------|------------------------------------------------------------------------------------------------|---------------------------------------------------------------|
|
||||
| Archived conversations | Archived longer than retention period | Messages, diff statuses, queued messages deleted via CASCADE. |
|
||||
| Conversation files | Older than retention period AND not referenced by any active or recently-archived conversation | — |
|
||||
| Data | Condition | Cascade |
|
||||
|------------------------|--------------------------------------------------------------------|---------------------------------------------------------------|
|
||||
| Archived conversations | Archived longer than retention period | Messages, diff statuses, queued messages deleted via CASCADE. |
|
||||
| Conversation files | Older than retention period and not referenced by any conversation | None |
|
||||
|
||||
## Unarchive safety
|
||||
|
||||
If a user unarchives a conversation whose files were purged, stale file
|
||||
references are automatically cleaned up by FK cascades. The conversation
|
||||
remains usable but previously attached files are no longer available.
|
||||
Archiving a conversation does not make its attached files eligible for deletion.
|
||||
If you unarchive a conversation before Coder purges it, its attachments remain available, even when the files exceed the retention period.
|
||||
|
||||
Reference in New Issue
Block a user