Skip to content

Commit

Permalink
Order unprocessed envelopes by receivedAtCounter
Browse files Browse the repository at this point in the history
  • Loading branch information
indutny-signal committed Jun 10, 2022
1 parent 924c271 commit 6aeddb9
Show file tree
Hide file tree
Showing 6 changed files with 50 additions and 14 deletions.
2 changes: 1 addition & 1 deletion ts/sql/Server.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3254,7 +3254,7 @@ async function getAllUnprocessedAndIncrementAttempts(): Promise<
`
SELECT *
FROM unprocessed
ORDER BY timestamp ASC;
ORDER BY receivedAtCounter ASC;
`
)
.all();
Expand Down
28 changes: 28 additions & 0 deletions ts/sql/migrations/59-unprocessed-received-at-counter-index.ts
Original file line number Diff line number Diff line change
@@ -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!');
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}

Expand All @@ -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!');
}
4 changes: 4 additions & 0 deletions ts/sql/migrations/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -1931,6 +1933,8 @@ export const SCHEMA_VERSIONS = [
updateToSchemaVersion56,
updateToSchemaVersion57,
updateToSchemaVersion58,
updateToSchemaVersion59,
updateToSchemaVersion60,
];

export function updateSchema(db: Database, logger: LoggerType): void {
Expand Down
9 changes: 5 additions & 4 deletions ts/test-electron/SignalProtocolStore_test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1658,23 +1658,23 @@ describe('SignalProtocolStore', () => {
id: '0-dropped',
envelope: 'old envelope',
timestamp: NOW - 2 * durations.MONTH,
receivedAtCounter: 0,
receivedAtCounter: -1,
version: 2,
attempts: 0,
}),
store.addUnprocessed({
id: '2-two',
envelope: 'second',
timestamp: NOW + 2,
receivedAtCounter: 0,
receivedAtCounter: 1,
version: 2,
attempts: 0,
}),
store.addUnprocessed({
id: '3-three',
envelope: 'third',
timestamp: NOW + 3,
receivedAtCounter: 0,
receivedAtCounter: 2,
version: 2,
attempts: 0,
}),
Expand All @@ -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');
Expand Down
8 changes: 5 additions & 3 deletions ts/test-node/sql_migrations_test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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(
Expand Down Expand Up @@ -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=?)'
);
});
});
Expand Down

0 comments on commit 6aeddb9

Please sign in to comment.