diff --git a/src/routes/api/login.js b/src/routes/api/login.js index 3a520878c..8027c11ed 100644 --- a/src/routes/api/login.js +++ b/src/routes/api/login.js @@ -49,7 +49,7 @@ async function loginSync(req) { return { sourceId: sourceIdService.getCurrentSourceId(), - maxSyncId: await sql.getValue("SELECT MAX(id) FROM sync WHERE isSynced = 1") + maxSyncId: await sql.getValue("SELECT COALESCE(MAX(id), 0) FROM sync WHERE isSynced = 1") }; } diff --git a/src/routes/api/sync.js b/src/routes/api/sync.js index 88a3c5f40..8f8548017 100644 --- a/src/routes/api/sync.js +++ b/src/routes/api/sync.js @@ -50,7 +50,7 @@ async function getStats() { async function checkSync() { return { entityHashes: await contentHashService.getEntityHashes(), - maxSyncId: await sql.getValue('SELECT MAX(id) FROM sync WHERE isSynced = 1') + maxSyncId: await sql.getValue('SELECT COALESCE(MAX(id), 0) FROM sync WHERE isSynced = 1') }; } @@ -124,7 +124,7 @@ async function getChanged(req) { const ret = { syncs: await syncService.getSyncRecords(syncs), - maxSyncId: await sql.getValue('SELECT MAX(id) FROM sync WHERE isSynced = 1') + maxSyncId: await sql.getValue('SELECT COALESCE(MAX(id), 0) FROM sync WHERE isSynced = 1') }; if (ret.syncs.length > 0) { diff --git a/src/routes/index.js b/src/routes/index.js index 0f01699bf..28bd0e290 100644 --- a/src/routes/index.js +++ b/src/routes/index.js @@ -23,7 +23,7 @@ async function index(req, res) { treeFontSize: parseInt(options.treeFontSize), detailFontSize: parseInt(options.detailFontSize), sourceId: await sourceIdService.generateSourceId(), - maxSyncIdAtLoad: await sql.getValue("SELECT MAX(id) FROM sync"), + maxSyncIdAtLoad: await sql.getValue("SELECT COALESCE(MAX(id), 0) FROM sync"), instanceName: config.General ? config.General.instanceName : null, appCssNoteIds: await getAppCssNoteIds(), isDev: env.isDev(), diff --git a/src/services/sync.js b/src/services/sync.js index 30ba41053..13eae7426 100644 --- a/src/services/sync.js +++ b/src/services/sync.js @@ -123,7 +123,7 @@ async function doLogin() { } async function pullSync(syncContext) { - let appliedPulls = 0; + let atLeastOnePullApplied = false; while (true) { const lastSyncedPull = await getLastSyncedPull(); @@ -150,10 +150,10 @@ async function pullSync(syncContext) { await sql.transactional(async () => { for (const {sync, entity} of rows) { if (!sourceIdService.isLocalSourceId(sync.sourceId)) { - if (appliedPulls === 0 && sync.entity !== 'recent_notes') { // send only for first + if (!atLeastOnePullApplied && sync.entity !== 'recent_notes') { // send only for first ws.syncPullInProgress(); - appliedPulls++; + atLeastOnePullApplied = true; } await syncUpdateService.updateEntity(sync, entity, syncContext.sourceId); @@ -165,10 +165,10 @@ async function pullSync(syncContext) { await setLastSyncedPull(rows[rows.length - 1].sync.id); }); - log.info(`Pulled ${rows.length} changes in ${pulledDate - startDate}ms from ${changesUri} and applied them in ${Date.now() - pulledDate}ms`); + log.info(`Pulled ${rows.length} changes starting at syncId=${lastSyncedPull} in ${pulledDate - startDate}ms and applied them in ${Date.now() - pulledDate}ms, ${stats.outstandingPulls} outstanding pulls`); } - if (appliedPulls > 0) { + if (atLeastOnePullApplied) { ws.syncPullFinished(); } @@ -368,7 +368,7 @@ async function updatePushStats() { } async function getMaxSyncId() { - return await sql.getValue('SELECT MAX(id) FROM sync'); + return await sql.getValue('SELECT COALESCE(MAX(id), 0) FROM sync'); } sqlInit.dbReady.then(async () => {