fix(memory): bound qmd embed backoff · openclaw/openclaw@caac973
steipete
·
2026-05-31
·
via Recent Commits to openclaw:main
| Original file line number | Diff line number | Diff line change |
|---|
@@ -3822,6 +3822,40 @@ describe("QmdMemoryManager", () => {
|
3822 | 3822 | await manager.close(); |
3823 | 3823 | }); |
3824 | 3824 | |
| 3825 | +it("does not store qmd embed backoff when the process clock is invalid", async () => { |
| 3826 | +cfg = { |
| 3827 | + ...cfg, |
| 3828 | +memory: { |
| 3829 | +backend: "qmd", |
| 3830 | +qmd: { |
| 3831 | +includeDefaultMemory: false, |
| 3832 | +searchMode: "query", |
| 3833 | +update: { |
| 3834 | +interval: "0s", |
| 3835 | +debounceMs: 0, |
| 3836 | +onBoot: false, |
| 3837 | +}, |
| 3838 | +paths: [{ path: workspaceDir, pattern: "**/*.md", name: "workspace" }], |
| 3839 | +}, |
| 3840 | +}, |
| 3841 | +} as OpenClawConfig; |
| 3842 | +const dateNowSpy = vi.spyOn(Date, "now").mockReturnValue(8_640_000_000_000_001); |
| 3843 | +const { manager } = await createManager({ mode: "status" }); |
| 3844 | +try { |
| 3845 | +( |
| 3846 | +manager as unknown as { |
| 3847 | +noteEmbedFailure: (reason: string, err: unknown) => void; |
| 3848 | +} |
| 3849 | +).noteEmbedFailure("manual", new Error("embed failed")); |
| 3850 | +} finally { |
| 3851 | +dateNowSpy.mockRestore(); |
| 3852 | +} |
| 3853 | + |
| 3854 | +const status = manager.status() as { custom?: { qmd?: { embedBackoffUntil?: number | null } } }; |
| 3855 | +expect(status.custom?.qmd?.embedBackoffUntil).toBeNull(); |
| 3856 | +await manager.close(); |
| 3857 | +}); |
| 3858 | + |
3825 | 3859 | it("runs periodic embed maintenance even when regular update scheduling is disabled", async () => { |
3826 | 3860 | vi.useFakeTimers(); |
3827 | 3861 | cfg = { |
|
| Original file line number | Diff line number | Diff line change |
|---|
@@ -49,7 +49,11 @@ import {
|
49 | 49 | type ResolvedQmdConfig, |
50 | 50 | type ResolvedQmdMcporterConfig, |
51 | 51 | } from "openclaw/plugin-sdk/memory-core-host-engine-storage"; |
52 | | -import { addTimerTimeoutGraceMs } from "openclaw/plugin-sdk/number-runtime"; |
| 52 | +import { |
| 53 | +addTimerTimeoutGraceMs, |
| 54 | +isFutureDateTimestampMs, |
| 55 | +resolveExpiresAtMsFromDurationMs, |
| 56 | +} from "openclaw/plugin-sdk/number-runtime"; |
53 | 57 | import { |
54 | 58 | localeLowercasePreservingWhitespace, |
55 | 59 | normalizeLowercaseStringOrEmpty, |
@@ -1701,7 +1705,7 @@ export class QmdMemoryManager implements MemorySearchManager {
|
1701 | 1705 | return false; |
1702 | 1706 | } |
1703 | 1707 | const now = Date.now(); |
1704 | | -if (this.embedBackoffUntil !== null && now < this.embedBackoffUntil) { |
| 1708 | +if (this.embedBackoffUntil !== null && isFutureDateTimestampMs(this.embedBackoffUntil)) { |
1705 | 1709 | return false; |
1706 | 1710 | } |
1707 | 1711 | const embedIntervalMs = this.qmd.update.embedIntervalMs; |
@@ -1808,7 +1812,7 @@ export class QmdMemoryManager implements MemorySearchManager {
|
1808 | 1812 | QMD_EMBED_BACKOFF_MAX_MS, |
1809 | 1813 | QMD_EMBED_BACKOFF_BASE_MS * 2 ** Math.max(0, this.embedFailureCount - 1), |
1810 | 1814 | ); |
1811 | | -this.embedBackoffUntil = Date.now() + delayMs; |
| 1815 | +this.embedBackoffUntil = resolveExpiresAtMsFromDurationMs(delayMs) ?? null; |
1812 | 1816 | log.warn( |
1813 | 1817 | `qmd embed failed (${reason}): ${String(err)}; backing off for ${Math.ceil(delayMs / 1000)}s`, |
1814 | 1818 | ); |
|
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。