From 4538d59b1d83910d6690ab8ce3edc1e55e4f5b30 Mon Sep 17 00:00:00 2001 From: clawbot Date: Tue, 10 Mar 2026 03:26:40 -0700 Subject: [PATCH] fix: remove PruneOrphanedMessages to preserve history within MAX_HISTORY PruneOrphanedMessages deleted messages that lost their client_queues references after PruneOldQueueEntries ran, even when those messages were within the MAX_HISTORY limit. This made MAX_HISTORY meaningless for low-traffic channels. RotateChannelMessages already caps messages per target. Queue pruning handles client_queues growth. Orphan cleanup is redundant. Closes https://git.eeqj.de/sneak/chat/issues/40 --- README.md | 3 +-- internal/db/queries.go | 22 ---------------------- internal/handlers/handlers.go | 14 -------------- 3 files changed, 1 insertion(+), 38 deletions(-) diff --git a/README.md b/README.md index 85a1895..04c8747 100644 --- a/README.md +++ b/README.md @@ -1789,8 +1789,7 @@ skew issues) and simpler than UUIDs (integer comparison vs. string comparison). ### Data Lifecycle - **Messages**: Rotated per `MAX_HISTORY` — oldest messages beyond the limit - are pruned periodically per target (channel or DM). Orphaned messages (no - longer referenced by any client queue) are also removed. + are pruned periodically per target (channel or DM). - **Queue entries**: Pruned automatically when older than `QUEUE_MAX_AGE` (default 48h). - **Channels**: Deleted when the last member leaves (ephemeral). diff --git a/internal/db/queries.go b/internal/db/queries.go index a4a4c26..2974649 100644 --- a/internal/db/queries.go +++ b/internal/db/queries.go @@ -1118,28 +1118,6 @@ func (database *Database) PruneOldQueueEntries( return deleted, nil } -// PruneOrphanedMessages deletes messages that are no -// longer referenced by any client_queues row and returns -// the number of rows removed. -func (database *Database) PruneOrphanedMessages( - ctx context.Context, -) (int64, error) { - res, err := database.conn.ExecContext(ctx, - `DELETE FROM messages WHERE id NOT IN - (SELECT DISTINCT message_id - FROM client_queues)`, - ) - if err != nil { - return 0, fmt.Errorf( - "prune orphaned messages: %w", err, - ) - } - - deleted, _ := res.RowsAffected() - - return deleted, nil -} - // RotateChannelMessages enforces MAX_HISTORY per channel // by deleting the oldest messages beyond the limit for // each msg_to target. Returns the total number of rows diff --git a/internal/handlers/handlers.go b/internal/handlers/handlers.go index 4876284..aa817db 100644 --- a/internal/handlers/handlers.go +++ b/internal/handlers/handlers.go @@ -245,18 +245,4 @@ func (hdlr *Handlers) pruneQueuesAndMessages( ) } } - - orphaned, err := hdlr.params.Database. - PruneOrphanedMessages(ctx) - if err != nil { - hdlr.log.Error( - "orphan message cleanup failed", - "error", err, - ) - } else if orphaned > 0 { - hdlr.log.Info( - "pruned orphaned messages", - "deleted", orphaned, - ) - } }