@@ -119,7 +119,6 @@ import {
119119} from '../util/search' ;
120120import type { SyncTaskType } from '../util/syncTasks' ;
121121import { MAX_SYNC_TASK_ATTEMPTS } from '../util/syncTasks.types' ;
122- import { isMoreRecentThan } from '../util/timestamp' ;
123122import type {
124123 AdjacentMessagesByConversationOptionsType ,
125124 BackupCdnMediaObjectType ,
@@ -475,7 +474,7 @@ export const DataWriter: ServerWritableInterface = {
475474
476475 removeSyncTaskById,
477476 saveSyncTasks,
478- getAllSyncTasks ,
477+ dequeueOldestSyncTasks ,
479478
480479 getUnprocessedByIdsAndIncrementAttempts,
481480 getAllUnprocessedIds,
@@ -2158,47 +2157,68 @@ function saveSyncTask(db: WritableDB, task: SyncTaskType): void {
21582157
21592158 db . prepare ( query ) . run ( parameters ) ;
21602159}
2161- export function getAllSyncTasks ( db : WritableDB ) : Array < SyncTaskType > {
2160+
2161+ export function dequeueOldestSyncTasks (
2162+ db : WritableDB ,
2163+ previousRowId : number | null
2164+ ) : { tasks : Array < SyncTaskType > ; lastRowId : number | null } {
21622165 return db . transaction ( ( ) => {
2163- const [ selectAllQuery ] = sql `
2164- SELECT * FROM syncTasks ORDER BY createdAt ASC, sentAt ASC, id ASC
2166+ const orderBy = sqlFragment `ORDER BY rowid ASC` ;
2167+ const limit = sqlFragment `LIMIT 10000` ;
2168+ const predicate = sqlFragment `rowid > ${ previousRowId ?? 0 } ` ;
2169+
2170+ const [ deleteOldQuery , deleteOldParams ] = sql `
2171+ DELETE FROM syncTasks
2172+ WHERE
2173+ attempts >= ${ MAX_SYNC_TASK_ATTEMPTS } AND
2174+ createdAt < ${ Date . now ( ) - durations . WEEK }
21652175 ` ;
21662176
2167- const rows = db . prepare ( selectAllQuery ) . all ( ) ;
2177+ const result = db . prepare ( deleteOldQuery ) . run ( deleteOldParams ) ;
21682178
2169- const tasks : Array < SyncTaskType > = rows . map ( row => ( {
2170- ...row ,
2171- data : jsonToObject ( row . data ) ,
2172- } ) ) ;
2179+ if ( result . changes > 0 ) {
2180+ logger . info (
2181+ `dequeueOldestSyncTasks: Deleted ${ result . changes } expired sync tasks`
2182+ ) ;
2183+ }
21732184
2174- const [ query ] = sql `
2175- UPDATE syncTasks
2176- SET attempts = attempts + 1
2185+ const [ selectAllQuery , selectAllParams ] = sql `
2186+ SELECT rowid, * FROM syncTasks
2187+ WHERE ${ predicate }
2188+ ${ orderBy }
2189+ ${ limit }
21772190 ` ;
2178- db . prepare ( query ) . run ( ) ;
21792191
2180- const [ toDelete , toReturn ] = partition ( tasks , task => {
2181- if (
2182- isNormalNumber ( task . attempts ) &&
2183- task . attempts < MAX_SYNC_TASK_ATTEMPTS
2184- ) {
2185- return false ;
2186- }
2187- if ( isMoreRecentThan ( task . createdAt , durations . WEEK ) ) {
2188- return false ;
2189- }
2192+ const rows = db . prepare ( selectAllQuery ) . all ( selectAllParams ) ;
2193+ if ( ! rows . length ) {
2194+ return { tasks : [ ] , lastRowId : null } ;
2195+ }
21902196
2191- return true ;
2197+ const firstRowId = rows . at ( 0 ) ?. rowid ;
2198+ const lastRowId = rows . at ( - 1 ) ?. rowid ;
2199+
2200+ strictAssert ( firstRowId , 'dequeueOldestSyncTasks: firstRowId is null' ) ;
2201+ strictAssert ( lastRowId , 'dequeueOldestSyncTasks: lastRowId is null' ) ;
2202+
2203+ const tasks : Array < SyncTaskType > = rows . map ( row => {
2204+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
2205+ const { rowid : _rowid , ...rest } = row ;
2206+ return {
2207+ ...rest ,
2208+ data : jsonToObject ( row . data ) ,
2209+ } ;
21922210 } ) ;
21932211
2194- if ( toDelete . length > 0 ) {
2195- logger . warn ( `getAllSyncTasks: Removing ${ toDelete . length } expired tasks` ) ;
2196- toDelete . forEach ( task => {
2197- removeSyncTaskById ( db , task . id ) ;
2198- } ) ;
2199- }
2212+ const [ updateQuery , updateParams ] = sql `
2213+ UPDATE syncTasks
2214+ SET attempts = attempts + 1
2215+ WHERE rowid >= ${ firstRowId }
2216+ AND rowid <= ${ lastRowId }
2217+ ` ;
2218+
2219+ db . prepare ( updateQuery ) . run ( updateParams ) ;
22002220
2201- return toReturn ;
2221+ return { tasks , lastRowId } ;
22022222 } ) ( ) ;
22032223}
22042224
@@ -7498,7 +7518,7 @@ function enableMessageInsertTriggersAndBackfill(db: WritableDB): void {
74987518 VALUES
74997519 (new.rowid, new.body);
75007520 END;
7501-
7521+
75027522 DROP TRIGGER IF EXISTS messages_on_insert_insert_mentions;
75037523 CREATE TRIGGER messages_on_insert_insert_mentions AFTER INSERT ON messages
75047524 BEGIN
0 commit comments