





















@@ -308,16 +308,17 @@ export abstract class MemoryManagerSyncOps {
308308return openMemoryDatabaseAtPath(dbPath, this.settings.store.vector.enabled);
309309}
310310311-private seedEmbeddingCache(sourceDb: DatabaseSync): void {
311+private async seedEmbeddingCache(sourceDb: DatabaseSync): Promise<void> {
312312if (!this.cache.enabled) {
313313return;
314314}
315+let transactionStarted = false;
315316try {
316317const rows = sourceDb
317318.prepare(
318319`SELECT provider, model, provider_key, hash, embedding, dims, updated_at FROM ${EMBEDDING_CACHE_TABLE}`,
319320)
320-.all() as Array<{
321+.iterate() as IterableIterator<{
321322provider: string;
322323model: string;
323324provider_key: string;
@@ -326,19 +327,23 @@ export abstract class MemoryManagerSyncOps {
326327dims: number | null;
327328updated_at: number;
328329}>;
329-if (!rows.length) {
330-return;
331-}
332-const insert = this.db.prepare(
333-`INSERT INTO ${EMBEDDING_CACHE_TABLE} (provider, model, provider_key, hash, embedding, dims, updated_at)
334- VALUES (?, ?, ?, ?, ?, ?, ?)
335- ON CONFLICT(provider, model, provider_key, hash) DO UPDATE SET
336- embedding=excluded.embedding,
337- dims=excluded.dims,
338- updated_at=excluded.updated_at`,
339-);
340-this.db.exec("BEGIN");
330+// Keep gateway health probes responsive while rebuilding large caches.
331+const SEED_EMBEDDING_YIELD_EVERY = 1000;
332+let rowCount = 0;
333+let insert: ReturnType<DatabaseSync["prepare"]> | null = null;
341334for (const row of rows) {
335+if (!insert) {
336+insert = this.db.prepare(
337+`INSERT INTO ${EMBEDDING_CACHE_TABLE} (provider, model, provider_key, hash, embedding, dims, updated_at)
338+ VALUES (?, ?, ?, ?, ?, ?, ?)
339+ ON CONFLICT(provider, model, provider_key, hash) DO UPDATE SET
340+ embedding=excluded.embedding,
341+ dims=excluded.dims,
342+ updated_at=excluded.updated_at`,
343+);
344+this.db.exec("BEGIN");
345+transactionStarted = true;
346+}
342347insert.run(
343348row.provider,
344349row.model,
@@ -348,12 +353,22 @@ export abstract class MemoryManagerSyncOps {
348353row.dims,
349354row.updated_at,
350355);
356+rowCount += 1;
357+if (rowCount % SEED_EMBEDDING_YIELD_EVERY === 0) {
358+await new Promise<void>((resolve) => {
359+setImmediate(resolve);
360+});
361+}
362+}
363+if (transactionStarted) {
364+this.db.exec("COMMIT");
351365}
352-this.db.exec("COMMIT");
353366} catch (err) {
354-try {
355-this.db.exec("ROLLBACK");
356-} catch {}
367+if (transactionStarted) {
368+try {
369+this.db.exec("ROLLBACK");
370+} catch {}
371+}
357372throw err;
358373}
359374}
@@ -1167,7 +1182,7 @@ export abstract class MemoryManagerSyncOps {
11671182targetPath: dbPath,
11681183tempPath: tempDbPath,
11691184build: async () => {
1170-this.seedEmbeddingCache(originalDb);
1185+await this.seedEmbeddingCache(originalDb);
11711186const shouldSyncMemory = this.sources.has("memory");
11721187const shouldSyncSessions = this.shouldSyncSessions(
11731188{ reason: params.reason, force: params.force },
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。