fix(memory): bound WSL Git environment cache

This commit is contained in:
m4air
2026-09-19 16:49:23 -07:00
parent bd756fadb6
commit ccc18e8be4
2 changed files with 32 additions and 0 deletions
@@ -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)
+23
View File
@@ -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)
}