Improve tap-to-view deletion query

This commit is contained in:
automated-signal 2024-11-22 13:13:20 -06:00 committed by trevor-signal
parent c3cd61d658
commit 4d7ed49dfd
2 changed files with 18 additions and 8 deletions

View file

@ -6,6 +6,7 @@ import { DataReader } from '../sql/Client';
import { clearTimeoutIfNecessary } from '../util/clearTimeoutIfNecessary'; import { clearTimeoutIfNecessary } from '../util/clearTimeoutIfNecessary';
import { getMessageQueueTime } from '../util/getMessageQueueTime'; import { getMessageQueueTime } from '../util/getMessageQueueTime';
import * as Errors from '../types/errors'; import * as Errors from '../types/errors';
import { strictAssert } from '../util/assert';
async function eraseTapToViewMessages() { async function eraseTapToViewMessages() {
try { try {
@ -15,8 +16,15 @@ async function eraseTapToViewMessages() {
const maxTimestamp = Date.now() - getMessageQueueTime(); const maxTimestamp = Date.now() - getMessageQueueTime();
const messages = const messages =
await DataReader.getTapToViewMessagesNeedingErase(maxTimestamp); await DataReader.getTapToViewMessagesNeedingErase(maxTimestamp);
await Promise.all( await Promise.all(
messages.map(async fromDB => { 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( const message = window.MessageCache.__DEPRECATED$register(
fromDB.id, fromDB.id,
fromDB, fromDB,
@ -55,13 +63,14 @@ class TapToViewMessagesDeletionService {
} }
private async checkTapToViewMessages() { private async checkTapToViewMessages() {
const receivedAt = const receivedAtMsForOldestTapToViewMessage =
await DataReader.getNextTapToViewMessageTimestampToAgeOut(); await DataReader.getNextTapToViewMessageTimestampToAgeOut();
if (!receivedAt) { if (!receivedAtMsForOldestTapToViewMessage) {
return; return;
} }
const nextCheck = receivedAt + getMessageQueueTime(); const nextCheck =
receivedAtMsForOldestTapToViewMessage + getMessageQueueTime();
window.SignalContext.log.info( window.SignalContext.log.info(
'checkTapToViewMessages: next check at', 'checkTapToViewMessages: next check at',
new Date(nextCheck).toISOString() new Date(nextCheck).toISOString()

View file

@ -4584,7 +4584,8 @@ function getNextTapToViewMessageTimestampToAgeOut(
` `
SELECT json FROM messages SELECT json FROM messages
WHERE 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) AND (isErased IS NULL OR isErased != 1)
ORDER BY received_at ASC, sent_at ASC ORDER BY received_at ASC, sent_at ASC
LIMIT 1; LIMIT 1;
@ -4595,9 +4596,8 @@ function getNextTapToViewMessageTimestampToAgeOut(
if (!row) { if (!row) {
return undefined; return undefined;
} }
const data = jsonToObject<MessageType>(row.json); const data = jsonToObject<MessageType>(row.json);
const result = data.received_at_ms || data.received_at; const result = data.received_at_ms;
return isNormalNumber(result) ? result : undefined; return isNormalNumber(result) ? result : undefined;
} }
@ -4613,8 +4613,9 @@ function getTapToViewMessagesNeedingErase(
WHERE WHERE
isViewOnce = 1 isViewOnce = 1
AND (isErased IS NULL OR isErased != 1) AND (isErased IS NULL OR isErased != 1)
AND received_at <= $maxTimestamp AND (
ORDER BY received_at ASC, sent_at ASC; IFNULL(json ->> '$.received_at_ms', 0) <= $maxTimestamp
)
` `
) )
.all({ .all({