Only reset the idle duration on non-empty pulls

This commit is contained in:
Manav Rathi
2024-07-03 14:07:42 +05:30
parent 1b6d362314
commit 0fa0bf124a
2 changed files with 23 additions and 16 deletions

View File

@@ -94,6 +94,8 @@ type RemoteEmbedding = z.infer<typeof RemoteEmbedding>;
*
* This function should be called only after we have synced files with remote.
* See: [Note: Ignoring embeddings for unknown files].
*
* @returns true if at least one embedding was pulled, false otherwise.
*/
const pullEmbeddings = async (
model: EmbeddingModel,
@@ -127,6 +129,7 @@ const pullEmbeddings = async (
// scenario where this happens.
const localFilesByID = new Map(localFiles.map((f) => [f.id, f]));
let didPull = false;
let sinceTime = await embeddingSyncTime(model);
// TODO: eslint has fixed this spurious warning, but we're not on the latest
// version yet, so add a disable.
@@ -149,6 +152,7 @@ const pullEmbeddings = async (
file.key,
),
);
didPull = true;
count++;
} catch (e) {
log.warn(`Ignoring unparseable ${model} embedding`, e);
@@ -157,6 +161,7 @@ const pullEmbeddings = async (
await saveEmbeddingSyncTime(sinceTime, model);
log.info(`Fetched ${count} ${model} embeddings`);
}
return didPull;
};
/**
@@ -291,6 +296,8 @@ export const putEmbedding = async (
*
* This function should be called only after we have synced files with remote.
* See: [Note: Ignoring embeddings for unknown files].
*
* @returns true if at least one embedding was pulled, false otherwise.
*/
export const pullFaceEmbeddings = () =>
pullEmbeddings("file-ml-clip-face", (jsonString: string) =>

View File

@@ -1,13 +1,13 @@
import downloadManager from "@/new/photos/services/download";
import { markIndexingFailed, saveFaceIndex } from "@/new/photos/services/ml/db";
import type { FaceIndex } from "@/new/photos/services/ml/types";
import type { EnteFile } from "@/new/photos/types/file";
import log from "@/next/log";
// import { expose } from "comlink";
import downloadManager from "@/new/photos/services/download";
import { getKVN } from "@/next/kv";
import { ensureAuthToken } from "@/next/local-user";
import log from "@/next/log";
import { ensure } from "@/utils/ensure";
import { wait } from "@/utils/promise";
import { expose } from "comlink";
import { syncWithLocalFilesAndGetFilesToIndex } from ".";
import { fileLogID } from "../../utils/file";
import { pullFaceEmbeddings, putFaceIndex } from "./embedding";
@@ -128,15 +128,15 @@ export class MLWorker {
idleDuration: this.idleDuration,
}));
const next = () => void setTimeout(() => this.tick(), 0);
// If we've been asked to sync, do that irrespective of anything else.
if (this.shouldSync) {
this.shouldSync = false;
// Reset the idle duration as we start pulling.
this.idleDuration = idleDurationStart;
// Call tick again once the pull is done.
void this.pull().then(next);
void pull().then((didPull) => {
// Reset the idle duration if we did pull something.
if (didPull) this.idleDuration = idleDurationStart;
// Either ways, tick again.
void setTimeout(() => this.tick(), 0);
});
// Return without waiting for the pull.
return;
}
@@ -148,7 +148,7 @@ export class MLWorker {
// Everything is running smoothly. Reset the idle duration.
this.idleDuration = idleDurationStart;
// And tick again.
next();
void setTimeout(() => this.tick(), 0);
return;
}
@@ -165,14 +165,14 @@ export class MLWorker {
this.idleDuration = Math.min(this.idleDuration * 2, idleDurationMax);
this.idleTimeout = setTimeout(next, this.idleDuration * 1000);
}
private async pull() {
await pullFaceEmbeddings();
}
}
// TODO-ML: Temorarily disable
// expose(MLWorker);
expose(MLWorker);
/**
* Pull embeddings from remote.
*/
const pull = pullFaceEmbeddings;
/**
* Find out files which need to be indexed. Then index the next batch of them.