fix(sync): drop orphan session parts (#1183)
* fix(sync): drop orphan session parts * fix(sync): guard missing part cache --------- Co-authored-by: Isaac Sanchez <isanchez-hawkins@arize.com>
This commit is contained in:
committed by
GitHub
co-authored by
Isaac Sanchez
parent
b944bd812c
commit
e50a484633
@@ -1,11 +1,11 @@
|
|||||||
import { describe, expect, test } from "bun:test"
|
import { describe, expect, test } from "bun:test"
|
||||||
import type { Message, PermissionRequest, QuestionRequest } from "@opencode-ai/sdk/v2/client"
|
import type { Message, Part, PermissionRequest, QuestionRequest } from "@opencode-ai/sdk/v2/client"
|
||||||
import {
|
import {
|
||||||
canDisposeDirectory,
|
canDisposeDirectory,
|
||||||
hasPendingBlockingRequests,
|
hasPendingBlockingRequests,
|
||||||
pickDirectoriesToEvict,
|
pickDirectoriesToEvict,
|
||||||
} from "../eviction"
|
} from "../eviction"
|
||||||
import { getProtectedSessionCacheIds, pickSessionCacheEvictions } from "../session-cache"
|
import { dropSessionCaches, getProtectedSessionCacheIds, pickSessionCacheEvictions } from "../session-cache"
|
||||||
import { INITIAL_STATE, type DirState, type State } from "../types"
|
import { INITIAL_STATE, type DirState, type State } from "../types"
|
||||||
|
|
||||||
const DAY_MS = 24 * 60 * 60 * 1000
|
const DAY_MS = 24 * 60 * 60 * 1000
|
||||||
@@ -172,4 +172,20 @@ describe("session cache eviction", () => {
|
|||||||
expect(seen.has("ses_question")).toBe(true)
|
expect(seen.has("ses_question")).toBe(true)
|
||||||
expect(seen.has("ses_streaming")).toBe(true)
|
expect(seen.has("ses_streaming")).toBe(true)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
test("drops parts for evicted messages without part session ids", () => {
|
||||||
|
const store = buildState({
|
||||||
|
message: {
|
||||||
|
ses_old: [{ id: "msg_1", role: "user", time: { created: 1 } } as Message],
|
||||||
|
},
|
||||||
|
part: {
|
||||||
|
msg_1: [{ id: "prt_1", messageID: "msg_1" } as Part],
|
||||||
|
},
|
||||||
|
})
|
||||||
|
|
||||||
|
dropSessionCaches(store, ["ses_old"])
|
||||||
|
|
||||||
|
expect(store.message.ses_old).toBe(undefined)
|
||||||
|
expect(store.part.msg_1).toBe(undefined)
|
||||||
|
})
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -56,6 +56,17 @@ export function dropSessionCaches(store: SessionCache, sessionIDs: Iterable<stri
|
|||||||
const stale = new Set(Array.from(sessionIDs).filter(Boolean))
|
const stale = new Set(Array.from(sessionIDs).filter(Boolean))
|
||||||
if (stale.size === 0) return
|
if (stale.size === 0) return
|
||||||
|
|
||||||
|
const staleMessageIDs = new Set<string>()
|
||||||
|
for (const sessionID of stale) {
|
||||||
|
for (const message of store.message?.[sessionID] ?? []) {
|
||||||
|
if (message?.id) staleMessageIDs.add(message.id)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (const messageID of staleMessageIDs) {
|
||||||
|
if (store.part) delete store.part[messageID]
|
||||||
|
}
|
||||||
|
|
||||||
for (const key of Object.keys(store.part ?? {})) {
|
for (const key of Object.keys(store.part ?? {})) {
|
||||||
const parts = store.part[key]
|
const parts = store.part[key]
|
||||||
if (!parts?.some((part) => stale.has((part as { sessionID?: string })?.sessionID ?? "")))
|
if (!parts?.some((part) => stale.has((part as { sessionID?: string })?.sessionID ?? "")))
|
||||||
|
|||||||
Reference in New Issue
Block a user