From 4d7ed49dfd304d51298120c20590a35487fa44d0 Mon Sep 17 00:00:00 2001 From: automated-signal <37887102+automated-signal@users.noreply.github.com> Date: Fri, 22 Nov 2024 13:13:20 -0600 Subject: [PATCH] Improve tap-to-view deletion query --- ts/services/tapToViewMessagesDeletionService.ts | 15 ++++++++++++--- ts/sql/Server.ts | 11 ++++++----- 2 files changed, 18 insertions(+), 8 deletions(-) diff --git a/ts/services/tapToViewMessagesDeletionService.ts b/ts/services/tapToViewMessagesDeletionService.ts index 23c05c5f2c8..0c25f94c89d 100644 --- a/ts/services/tapToViewMessagesDeletionService.ts +++ b/ts/services/tapToViewMessagesDeletionService.ts @@ -6,6 +6,7 @@ import { DataReader } from '../sql/Client'; import { clearTimeoutIfNecessary } from '../util/clearTimeoutIfNecessary'; import { getMessageQueueTime } from '../util/getMessageQueueTime'; import * as Errors from '../types/errors'; +import { strictAssert } from '../util/assert'; async function eraseTapToViewMessages() { try { @@ -15,8 +16,15 @@ async function eraseTapToViewMessages() { const maxTimestamp = Date.now() - getMessageQueueTime(); const messages = await DataReader.getTapToViewMessagesNeedingErase(maxTimestamp); + await Promise.all( messages.map(async fromDB => { + strictAssert(fromDB.isViewOnce === true, 'Must be view once'); + strictAssert( + (fromDB.received_at_ms ?? 0) <= maxTimestamp, + 'Must be older than maxTimestamp' + ); + const message = window.MessageCache.__DEPRECATED$register( fromDB.id, fromDB, @@ -55,13 +63,14 @@ class TapToViewMessagesDeletionService { } private async checkTapToViewMessages() { - const receivedAt = + const receivedAtMsForOldestTapToViewMessage = await DataReader.getNextTapToViewMessageTimestampToAgeOut(); - if (!receivedAt) { + if (!receivedAtMsForOldestTapToViewMessage) { return; } - const nextCheck = receivedAt + getMessageQueueTime(); + const nextCheck = + receivedAtMsForOldestTapToViewMessage + getMessageQueueTime(); window.SignalContext.log.info( 'checkTapToViewMessages: next check at', new Date(nextCheck).toISOString() diff --git a/ts/sql/Server.ts b/ts/sql/Server.ts index 3c9a9410a39..f8ec9703e04 100644 --- a/ts/sql/Server.ts +++ b/ts/sql/Server.ts @@ -4584,7 +4584,8 @@ function getNextTapToViewMessageTimestampToAgeOut( ` SELECT json FROM messages WHERE - isViewOnce = 1 + -- we want this query to use the messages_view_once index rather than received_at + likelihood(isViewOnce = 1, 0.01) AND (isErased IS NULL OR isErased != 1) ORDER BY received_at ASC, sent_at ASC LIMIT 1; @@ -4595,9 +4596,8 @@ function getNextTapToViewMessageTimestampToAgeOut( if (!row) { return undefined; } - const data = jsonToObject(row.json); - const result = data.received_at_ms || data.received_at; + const result = data.received_at_ms; return isNormalNumber(result) ? result : undefined; } @@ -4613,8 +4613,9 @@ function getTapToViewMessagesNeedingErase( WHERE isViewOnce = 1 AND (isErased IS NULL OR isErased != 1) - AND received_at <= $maxTimestamp - ORDER BY received_at ASC, sent_at ASC; + AND ( + IFNULL(json ->> '$.received_at_ms', 0) <= $maxTimestamp + ) ` ) .all({