From 2b61c8f7b8cabc10819d0cd3f49dc9a24e1dfb76 Mon Sep 17 00:00:00 2001 From: Zaid Humaimidi Date: Thu, 23 May 2024 13:22:35 -0700 Subject: [PATCH] Fix race condition when deleting multiple faults --- ui/faults-page.ts | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/ui/faults-page.ts b/ui/faults-page.ts index 8bb99d6..9e3ae92 100644 --- a/ui/faults-page.ts +++ b/ui/faults-page.ts @@ -46,6 +46,18 @@ const unpackSmartQuery = memoize((query) => { }); }); +async function deleteFaults(faults: Iterable): Promise { + const proms: Map> = new Map(); + for (const f of faults) { + const deviceId = f.split(":", 1)[0]; + let p = proms.get(deviceId); + if (p == null) p = store.deleteResource("faults", f); + else p = p.then(() => store.deleteResource("faults", f)); + proms.set(deviceId, p); + } + await Promise.all(proms.values()); +} + export function init( args: Record, ): Promise> { @@ -154,16 +166,10 @@ export const component: ClosureComponent = (): Component => { if (!confirm(`Deleting ${selected.size} faults. Are you sure?`)) return; - Promise.all( - Array.from(selected).map((id) => - store.deleteResource("faults", id), - ), - ) - .then((res) => { - notifications.push( - "success", - `${res.length} faults deleted`, - ); + const c = selected.size; + deleteFaults(selected) + .then(() => { + notifications.push("success", `${c} faults deleted`); store.setTimestamp(Date.now()); }) .catch((err) => {