From 08d435b920e4b8fe6447ef0f6987de29b8a362ee Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Tue, 22 Apr 2025 17:34:43 +0530 Subject: [PATCH 1/2] Debounce cluster refresh during uploads --- web/packages/new/photos/services/ml/index.ts | 25 ++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/web/packages/new/photos/services/ml/index.ts b/web/packages/new/photos/services/ml/index.ts index c568c8fac4..0adfeb5839 100644 --- a/web/packages/new/photos/services/ml/index.ts +++ b/web/packages/new/photos/services/ml/index.ts @@ -3,6 +3,7 @@ */ import { proxy, transfer } from "comlink"; +import debounce from "debounce"; import { isDesktop } from "ente-base/app"; import { blobCache } from "ente-base/blob-cache"; import { ensureElectron } from "ente-base/electron"; @@ -385,8 +386,6 @@ export const mlSync = async () => { _state.isSyncing = false; }; -const workerDidUnawaitedIndex = () => void updateClustersAndPeople(); - const updateClustersAndPeople = async () => { const masterKey = await masterKeyFromSession(); @@ -400,6 +399,28 @@ const updateClustersAndPeople = async () => { await updatePeopleState(); }; +/** + * A debounced variant of {@link updateClustersAndPeople} suitable for use + * during potential in-progress uploads. + * + * The debounce uses a long interval (30 seconds) to avoid unnecessary reruns of + * the expensive clustering as individual files get uploaded. Usually we + * wouldn't get here as the live queue will keep getting refilled and the worker + * would keep ticking, but it is possible, depending on timing, for the queue to + * drain in the middle of uploads too. + * + * Ideally, we'd like to do the cluster update just once when the upload has + * completed, however currently we don't have access to {@link uploadManager} + * from here. So this gets us near that ideal, without adding too much impact or + * requiring us to be aware of the uploadManager status. + */ +const debounceUpdateClustersAndPeople = debounce( + updateClustersAndPeople, + 30 * 1e3, +); + +const workerDidUnawaitedIndex = () => void debounceUpdateClustersAndPeople(); + /** * Run indexing on a file which was uploaded from this client. * From d303a40cc79e9c71bec6a1f52ca8200ef9715958 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Tue, 22 Apr 2025 18:49:53 +0530 Subject: [PATCH 2/2] Use promise variant --- web/packages/new/photos/services/ml/index.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/web/packages/new/photos/services/ml/index.ts b/web/packages/new/photos/services/ml/index.ts index 0adfeb5839..07cb348960 100644 --- a/web/packages/new/photos/services/ml/index.ts +++ b/web/packages/new/photos/services/ml/index.ts @@ -3,7 +3,6 @@ */ import { proxy, transfer } from "comlink"; -import debounce from "debounce"; import { isDesktop } from "ente-base/app"; import { blobCache } from "ente-base/blob-cache"; import { ensureElectron } from "ente-base/electron"; @@ -15,6 +14,7 @@ import type { UploadItem } from "ente-gallery/services/upload"; import type { EnteFile } from "ente-media/file"; import { FileType } from "ente-media/file-type"; import { throttled } from "ente-utils/promise"; +import pDebounce from "p-debounce"; import { getRemoteFlag, updateRemoteFlag } from "../remote-store"; import { setSearchPeople } from "../search"; import { @@ -414,7 +414,7 @@ const updateClustersAndPeople = async () => { * from here. So this gets us near that ideal, without adding too much impact or * requiring us to be aware of the uploadManager status. */ -const debounceUpdateClustersAndPeople = debounce( +const debounceUpdateClustersAndPeople = pDebounce( updateClustersAndPeople, 30 * 1e3, );