From 0f30cf4a272738b58868aa058e326c3fe9609842 Mon Sep 17 00:00:00 2001 From: Marco van Dijk Date: Sun, 1 Dec 2024 16:02:21 +0100 Subject: [PATCH] Safe writing --- master/worker.js | 28 ++++++++++++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/master/worker.js b/master/worker.js index 61f1be2..da77b1f 100644 --- a/master/worker.js +++ b/master/worker.js @@ -75,6 +75,7 @@ let jsonString = ""; let lastLeaderboardCheck = 0; let lastStringify = 0; let isSynced = false; +let storageLock = false; /* * Function Skeletons @@ -87,6 +88,25 @@ function sleep(ms) { }); } +async function withStorageLock(fn) { + while (storageLock) { + await sleep(50); // Small delay before retry + } + storageLock = true; + try { + await fn(); + } finally { + storageLock = false; + } +} + +async function safeWrite(key, data) { + const tempKey = `${key}.tmp`; + await storage.setItem(tempKey, data); // Write to temp key + await storage.removeItem(key); // Remove original key + await storage.setItem(key, data); // Rename temp key to original +} + // Process the task queue continuously async function processQueue() { while (true) { @@ -141,7 +161,9 @@ async function getEnsDomain(addr) { ensObj.timestamp ); ensDomainCache[addr] = ensObj; - await storage.setItem("ensDomainCache", ensDomainCache); + await withStorageLock(async () => { + await safeWrite("ensDomainCache", ensDomainCache); + }); if (ensObj.domain) { // Update domain name return ensObj.domain; @@ -383,7 +405,9 @@ async function onOrchUpdate(id, obj, tag, region, livepeer_regions) { newObj.instances[obj.resolv.resolvedTarget] = newInstance; newObj.regionalStats[tag] = newRegion; orchCache[id.toLowerCase()] = newObj; - await storage.setItem("orchCache", orchCache); + await withStorageLock(async () => { + await safeWrite("orchCache", orchCache); + }); // Update prometheus stats updatePrometheus(tag, obj.resolv.resolvedTarget, newObj);