From 6aeddb9301461ef9b7f1d76ea0e8f088d1fe5a9d Mon Sep 17 00:00:00 2001 From: Fedor Indutny <79877362+indutny-signal@users.noreply.github.com> Date: Fri, 10 Jun 2022 09:09:21 -0700 Subject: [PATCH] Order unprocessed envelopes by receivedAtCounter --- ts/sql/Server.ts | 2 +- ...9-unprocessed-received-at-counter-index.ts | 28 +++++++++++++++++++ ...g-index.ts => 60-update-expiring-index.ts} | 13 +++++---- ts/sql/migrations/index.ts | 4 +++ ts/test-electron/SignalProtocolStore_test.ts | 9 +++--- ts/test-node/sql_migrations_test.ts | 8 ++++-- 6 files changed, 50 insertions(+), 14 deletions(-) create mode 100644 ts/sql/migrations/59-unprocessed-received-at-counter-index.ts rename ts/sql/migrations/{59-update-expiring-index.ts => 60-update-expiring-index.ts} (74%) diff --git a/ts/sql/Server.ts b/ts/sql/Server.ts index f51f9a433..cd9ec1bc2 100644 --- a/ts/sql/Server.ts +++ b/ts/sql/Server.ts @@ -3254,7 +3254,7 @@ async function getAllUnprocessedAndIncrementAttempts(): Promise< ` SELECT * FROM unprocessed - ORDER BY timestamp ASC; + ORDER BY receivedAtCounter ASC; ` ) .all(); diff --git a/ts/sql/migrations/59-unprocessed-received-at-counter-index.ts b/ts/sql/migrations/59-unprocessed-received-at-counter-index.ts new file mode 100644 index 000000000..9cbe17efa --- /dev/null +++ b/ts/sql/migrations/59-unprocessed-received-at-counter-index.ts @@ -0,0 +1,28 @@ +// Copyright 2022 Signal Messenger, LLC +// SPDX-License-Identifier: AGPL-3.0-only + +import type { Database } from 'better-sqlite3'; + +import type { LoggerType } from '../../types/Logging'; + +export default function updateToSchemaVersion59( + currentVersion: number, + db: Database, + logger: LoggerType +): void { + if (currentVersion >= 59) { + return; + } + + db.transaction(() => { + db.exec( + ` + CREATE INDEX unprocessed_byReceivedAtCounter ON unprocessed + (receivedAtCounter) + ` + ); + + db.pragma('user_version = 59'); + })(); + logger.info('updateToSchemaVersion59: success!'); +} diff --git a/ts/sql/migrations/59-update-expiring-index.ts b/ts/sql/migrations/60-update-expiring-index.ts similarity index 74% rename from ts/sql/migrations/59-update-expiring-index.ts rename to ts/sql/migrations/60-update-expiring-index.ts index 0d2f436ed..8f1519a98 100644 --- a/ts/sql/migrations/59-update-expiring-index.ts +++ b/ts/sql/migrations/60-update-expiring-index.ts @@ -5,12 +5,13 @@ import type { Database } from 'better-sqlite3'; import type { LoggerType } from '../../types/Logging'; -export default function updateToSchemaVersion59( +// TODO: DESKTOP-3694 +export default function updateToSchemaVersion60( currentVersion: number, db: Database, logger: LoggerType ): void { - if (currentVersion >= 59) { + if (currentVersion >= 60) { return; } @@ -23,17 +24,17 @@ export default function updateToSchemaVersion59( ON messages ( conversationId, - storyId + storyId, expirationStartTimestamp, expireTimer, - received_at, + received_at ) WHERE isStory IS 0 AND type IS 'incoming'; ` ); - db.pragma('user_version = 59'); + db.pragma('user_version = 60'); })(); - logger.info('updateToSchemaVersion59: success!'); + logger.info('updateToSchemaVersion60: success!'); } diff --git a/ts/sql/migrations/index.ts b/ts/sql/migrations/index.ts index 2e0ba9cc4..09c7e5565 100644 --- a/ts/sql/migrations/index.ts +++ b/ts/sql/migrations/index.ts @@ -34,6 +34,8 @@ import updateToSchemaVersion55 from './55-report-message-aci'; import updateToSchemaVersion56 from './56-add-unseen-to-message'; import updateToSchemaVersion57 from './57-rm-message-history-unsynced'; import updateToSchemaVersion58 from './58-update-unread'; +import updateToSchemaVersion59 from './59-unprocessed-received-at-counter-index'; +import updateToSchemaVersion60 from './60-update-expiring-index'; function updateToSchemaVersion1( currentVersion: number, @@ -1931,6 +1933,8 @@ export const SCHEMA_VERSIONS = [ updateToSchemaVersion56, updateToSchemaVersion57, updateToSchemaVersion58, + updateToSchemaVersion59, + updateToSchemaVersion60, ]; export function updateSchema(db: Database, logger: LoggerType): void { diff --git a/ts/test-electron/SignalProtocolStore_test.ts b/ts/test-electron/SignalProtocolStore_test.ts index ecfbee420..b9c5cb159 100644 --- a/ts/test-electron/SignalProtocolStore_test.ts +++ b/ts/test-electron/SignalProtocolStore_test.ts @@ -1658,7 +1658,7 @@ describe('SignalProtocolStore', () => { id: '0-dropped', envelope: 'old envelope', timestamp: NOW - 2 * durations.MONTH, - receivedAtCounter: 0, + receivedAtCounter: -1, version: 2, attempts: 0, }), @@ -1666,7 +1666,7 @@ describe('SignalProtocolStore', () => { id: '2-two', envelope: 'second', timestamp: NOW + 2, - receivedAtCounter: 0, + receivedAtCounter: 1, version: 2, attempts: 0, }), @@ -1674,7 +1674,7 @@ describe('SignalProtocolStore', () => { id: '3-three', envelope: 'third', timestamp: NOW + 3, - receivedAtCounter: 0, + receivedAtCounter: 2, version: 2, attempts: 0, }), @@ -1691,7 +1691,8 @@ describe('SignalProtocolStore', () => { const items = await store.getAllUnprocessedAndIncrementAttempts(); assert.strictEqual(items.length, 3); - // they are in the proper order because the collection comparator is 'timestamp' + // they are in the proper order because the collection comparator is + // 'receivedAtCounter' assert.strictEqual(items[0].envelope, 'first'); assert.strictEqual(items[1].envelope, 'second'); assert.strictEqual(items[2].envelope, 'third'); diff --git a/ts/test-node/sql_migrations_test.ts b/ts/test-node/sql_migrations_test.ts index 47ab9556a..f9eef2835 100644 --- a/ts/test-node/sql_migrations_test.ts +++ b/ts/test-node/sql_migrations_test.ts @@ -2287,9 +2287,9 @@ describe('SQL migrations test', () => { }); }); - describe('updateToSchemaVersion59', () => { + describe('updateToSchemaVersion60', () => { it('updates index to make query efficient', () => { - updateToVersion(47); + updateToVersion(60); const items = db .prepare( @@ -2320,7 +2320,9 @@ describe('SQL migrations test', () => { assert.notInclude(detail, 'SCAN'); assert.include( detail, - 'SEARCH messages USING INDEX expiring_message_by_conversation_and_received_at (expirationStartTimestamp=? AND expireTimer>?)' + 'SEARCH messages USING INDEX ' + + 'expiring_message_by_conversation_and_received_at ' + + '(conversationId=? AND storyId=?)' ); }); });