fix(memory-core): preserve vector dims on readonly recovery

This commit is contained in:
Ayaan Zaidi
2026-04-17 11:19:19 +05:30
parent bec52e5f7e
commit 26f7198eda
2 changed files with 17 additions and 1 deletions

View File

@@ -102,11 +102,12 @@ export async function runMemorySyncWithReadonlyRecovery(
try {
state.db.close();
} catch {}
const previousVectorDims = state.vector.dims;
state.db = state.openDatabase();
state.resetVectorState();
state.ensureSchema();
const meta = state.readMeta();
state.vector.dims = meta?.vectorDims;
state.vector.dims = meta?.vectorDims ?? previousVectorDims;
try {
await state.runSync(params);
state.readonlyRecoverySuccesses += 1;

View File

@@ -136,6 +136,7 @@ describe("memory manager readonly recovery", () => {
expect(harness.runSync).toHaveBeenCalledTimes(2);
expect(harness.openDatabase).toHaveBeenCalledTimes(1);
expect(harness.resetVectorState).toHaveBeenCalledTimes(1);
expect(harness.vector.dims).toBe(123);
expect(initialClose).toHaveBeenCalledTimes(1);
expectReadonlyRecoveryStatus(harness, params.expectedLastError);
}
@@ -194,6 +195,20 @@ describe("memory manager readonly recovery", () => {
expect(harness.vectorDegradedWriteWarningShown).toBe(false);
});
it("prefers reopened vector dims when metadata is available", async () => {
const { harness } = createReadonlyRecoveryHarness();
harness.readMeta.mockReturnValueOnce({ vectorDims: 768 });
harness.runSync.mockRejectedValueOnce(new Error("attempt to write a readonly database"));
await expect(
runSyncWithReadonlyRecovery(harness, {
reason: "test",
}),
).resolves.toBeUndefined();
expect(harness.vector.dims).toBe(768);
});
it("sets busy_timeout on memory sqlite connections", async () => {
const db = openMemoryDatabaseAtPath(indexPath, false);
const row = db.prepare("PRAGMA busy_timeout").get() as