From c3a99ff6a0441c388b42e5fc1967f37060578ee4 Mon Sep 17 00:00:00 2001 From: tophf Date: Tue, 18 May 2021 11:00:44 +0300 Subject: [PATCH] randomize sync interval to avoid infinite deadlocks --- background/sync-manager.js | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/background/sync-manager.js b/background/sync-manager.js index e5656df2..df545e3e 100644 --- a/background/sync-manager.js +++ b/background/sync-manager.js @@ -28,6 +28,7 @@ const syncMan = (() => { login: false, }; let lastError = null; + let lastInterval = Math.random(); let ctrl; let currentDrive; /** @type {Promise|boolean} will be `true` to avoid wasting a microtask tick on each `await` */ @@ -40,9 +41,14 @@ const syncMan = (() => { {runNow: true}); }); - chrome.alarms.onAlarm.addListener(info => { - if (info.name === 'syncNow') { - syncMan.syncNow(); + chrome.alarms.onAlarm.addListener(async ({name}) => { + if (name === 'syncNow') { + await syncMan.syncNow(); + /* We want to fire the alarm once per SYNC_INTERVAL at a random point within the range, + * so the new delay includes the leftover portion from the last range. */ + const r = Math.random(); + schedule(SYNC_DELAY + SYNC_INTERVAL * (1 - lastInterval + r)); + lastInterval = r; } }); @@ -248,7 +254,6 @@ const syncMan = (() => { function schedule(delay = SYNC_DELAY) { chrome.alarms.create('syncNow', { delayInMinutes: delay, - periodInMinutes: SYNC_INTERVAL, }); }