mirror of
https://github.com/stablyai/orca.git
synced 2026-09-24 08:02:33 +00:00
* perf(computer): add mac helper owner-loss benchmark Measure the release helper's resident memory before and after its owner-session deadline. Record exact revisions, per-trial RSS, retained state, and clean-exit latency so lifecycle reclamation is reproducible. * fix(computer): reap mac helper after client loss Bind the detached macOS helper lifetime to authenticated socket ownership. Reap the helper after its final authenticated client disconnects, and add a startup deadline for sessions that never authenticate. * test(computer): harden owner benchmark cleanup * test(computer): make owner benchmark cleanup failure-safe * test(computer): close remaining owner cleanup races
64 lines
1.9 KiB
JavaScript
64 lines
1.9 KiB
JavaScript
import { closeSync, existsSync, readFileSync, rmSync } from 'node:fs'
|
|
import {
|
|
killRecordedAndMatchingProcesses,
|
|
runBenchmarkCleanupStages,
|
|
signalValidatedProcessGroup
|
|
} from './macos-computer-helper-owner-loss-processes.mjs'
|
|
|
|
export function cleanupOwnerLossTrial(options) {
|
|
const groupState = { stopped: false, anchorPid: null }
|
|
let error
|
|
let output = ''
|
|
try {
|
|
runBenchmarkCleanupStages([
|
|
() => {
|
|
if (options.failed && Number.isInteger(options.pid) && options.marker) {
|
|
signalValidatedProcessGroup(options.pid, options.marker, 'SIGSTOP', groupState)
|
|
}
|
|
},
|
|
() => {
|
|
if (options.failed && options.recordPath && options.tempDir) {
|
|
killRecordedAndMatchingProcesses(options.recordPath, options.helperPath, [
|
|
options.helperPath,
|
|
options.tempDir
|
|
])
|
|
}
|
|
},
|
|
() => {
|
|
if (options.failed && Number.isInteger(options.pid) && options.marker) {
|
|
signalValidatedProcessGroup(options.pid, options.marker, 'SIGKILL', groupState)
|
|
}
|
|
},
|
|
() => {
|
|
if (options.stderrDescriptor !== undefined) {
|
|
closeSync(options.stderrDescriptor)
|
|
}
|
|
},
|
|
() => {
|
|
if (options.stdoutDescriptor !== undefined) {
|
|
closeSync(options.stdoutDescriptor)
|
|
}
|
|
},
|
|
() => {
|
|
output = (options.outputPaths ?? [])
|
|
.filter((outputPath) => outputPath && existsSync(outputPath))
|
|
.map((outputPath) => readFileSync(outputPath, 'utf8'))
|
|
.join('')
|
|
},
|
|
() => {
|
|
if (options.launcherDir) {
|
|
rmSync(options.launcherDir, { recursive: true, force: true })
|
|
}
|
|
},
|
|
() => {
|
|
if (options.tempDir) {
|
|
rmSync(options.tempDir, { recursive: true, force: true })
|
|
}
|
|
}
|
|
])
|
|
} catch (caught) {
|
|
error = caught
|
|
}
|
|
return { error, output }
|
|
}
|