mirror of
https://github.com/stablyai/orca.git
synced 2026-09-21 16:02:20 +00:00
fix(memory): bound WSL Git environment cache
This commit is contained in:
@@ -28,6 +28,7 @@ import {
|
||||
import {
|
||||
disableWslGitReadEnvironment,
|
||||
getWslGitReadEnvironment,
|
||||
peekWslGitReadEnvironment,
|
||||
resetWslGitReadEnvironmentForTests,
|
||||
seedWslGitReadEnvironmentForTests,
|
||||
WSL_GIT_READ_ENVIRONMENT_WAIT_MS
|
||||
@@ -167,6 +168,14 @@ describe('WSL direct Git reads', () => {
|
||||
}
|
||||
})
|
||||
|
||||
it('bounds settled environment entries during distro churn', () => {
|
||||
for (let index = 0; index < 132; index += 1) {
|
||||
seedWslGitReadEnvironmentForTests(`distro-${index}`, LOGIN_ENVIRONMENT)
|
||||
}
|
||||
expect(peekWslGitReadEnvironment('distro-0')).toBeUndefined()
|
||||
expect(peekWslGitReadEnvironment('distro-131')).toEqual(LOGIN_ENVIRONMENT)
|
||||
})
|
||||
|
||||
it('runs an opted-in read directly with translated cwd and arguments', async () => {
|
||||
await withPlatform('win32', async () => {
|
||||
seedWslGitReadEnvironmentForTests(DISTRO, LOGIN_ENVIRONMENT)
|
||||
|
||||
@@ -15,12 +15,30 @@ const PROBE_TIMEOUT_MS = 10_000
|
||||
export const WSL_GIT_READ_ENVIRONMENT_WAIT_MS = 1_500
|
||||
const PROBE_MAX_BUFFER = 64 * 1024
|
||||
const TRANSIENT_PROBE_RETRY_MS = 30_000
|
||||
const MAX_WSL_GIT_READ_ENVIRONMENT_DISTROS = 128
|
||||
const environmentByDistro = new Map<string, Promise<WslGitReadEnvironment | null>>()
|
||||
// Why the null entries matter: a settled "no direct route" answer is what lets a read skip the
|
||||
// bounded probe wait entirely instead of racing an already-decided promise on every call.
|
||||
const settledEnvironmentByDistro = new Map<string, WslGitReadEnvironment | null>()
|
||||
const transientRetryAfterByDistro = new Map<string, number>()
|
||||
|
||||
function touchDistroState(distro: string): void {
|
||||
const settled = settledEnvironmentByDistro.get(distro)
|
||||
if (settledEnvironmentByDistro.has(distro)) {
|
||||
settledEnvironmentByDistro.delete(distro)
|
||||
settledEnvironmentByDistro.set(distro, settled ?? null)
|
||||
}
|
||||
while (settledEnvironmentByDistro.size > MAX_WSL_GIT_READ_ENVIRONMENT_DISTROS) {
|
||||
const oldest = settledEnvironmentByDistro.keys().next().value
|
||||
if (oldest === undefined) {
|
||||
break
|
||||
}
|
||||
settledEnvironmentByDistro.delete(oldest)
|
||||
environmentByDistro.delete(oldest)
|
||||
transientRetryAfterByDistro.delete(oldest)
|
||||
}
|
||||
}
|
||||
|
||||
type ProbeOutcome =
|
||||
| { kind: 'resolved'; environment: WslGitReadEnvironment }
|
||||
| { kind: 'rejected' }
|
||||
@@ -95,10 +113,12 @@ export function getWslGitReadEnvironment(distro: string): Promise<WslGitReadEnvi
|
||||
}
|
||||
if (outcome.kind === 'resolved') {
|
||||
settledEnvironmentByDistro.set(distro, outcome.environment)
|
||||
touchDistroState(distro)
|
||||
transientRetryAfterByDistro.delete(distro)
|
||||
return outcome.environment
|
||||
}
|
||||
settledEnvironmentByDistro.set(distro, null)
|
||||
touchDistroState(distro)
|
||||
if (outcome.kind === 'transient') {
|
||||
transientRetryAfterByDistro.set(distro, Date.now() + TRANSIENT_PROBE_RETRY_MS)
|
||||
}
|
||||
@@ -106,6 +126,7 @@ export function getWslGitReadEnvironment(distro: string): Promise<WslGitReadEnvi
|
||||
})
|
||||
environmentByDistro.set(distro, environment)
|
||||
}
|
||||
touchDistroState(distro)
|
||||
return environment
|
||||
}
|
||||
|
||||
@@ -133,6 +154,7 @@ export function invalidateWslGitReadEnvironment(distro: string): void {
|
||||
export function disableWslGitReadEnvironment(distro: string): void {
|
||||
environmentByDistro.set(distro, Promise.resolve(null))
|
||||
settledEnvironmentByDistro.set(distro, null)
|
||||
touchDistroState(distro)
|
||||
transientRetryAfterByDistro.delete(distro)
|
||||
}
|
||||
|
||||
@@ -148,5 +170,6 @@ export function seedWslGitReadEnvironmentForTests(
|
||||
): void {
|
||||
environmentByDistro.set(distro, Promise.resolve(environment))
|
||||
settledEnvironmentByDistro.set(distro, environment)
|
||||
touchDistroState(distro)
|
||||
transientRetryAfterByDistro.delete(distro)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user