mirror of
https://github.com/openclaw/openclaw.git
synced 2026-07-10 00:11:19 +00:00
fix(infra): swallow mid-stream read errors in session-cost readJsonlRecords (#101062)
* fix(infra): swallow mid-stream read errors in session-cost readJsonlRecords * fix(infra): keep usage cache strict on read errors --------- Co-authored-by: Vincent Koc <25068+vincentkoc@users.noreply.github.com> Co-authored-by: Vincent Koc <vincentkoc@ieee.org>
This commit is contained in:
parent
964fd53076
commit
325cdb7f1a
3 changed files with 158 additions and 1 deletions
47
scripts/proof/session-cost-usage-readline-errors.mts
Normal file
47
scripts/proof/session-cost-usage-readline-errors.mts
Normal file
|
|
@ -0,0 +1,47 @@
|
|||
// Real behavior proof: session log readline errors are swallowed at the
|
||||
// diagnostic boundary so callers get a truncated but stable result.
|
||||
//
|
||||
// The proof creates a real transcript session directory where the session file
|
||||
// is a directory instead of a file. `fs.createReadStream` on a directory emits
|
||||
// an EISDIR error on the stream. With the fix, `loadSessionLogs` returns an
|
||||
// empty array after the stream closes. Before the fix the unhandled stream error
|
||||
// rejected `loadSessionLogs`.
|
||||
|
||||
import fs from "node:fs/promises";
|
||||
import os from "node:os";
|
||||
import path from "node:path";
|
||||
import { fileURLToPath } from "node:url";
|
||||
|
||||
const repoRoot = path.dirname(path.dirname(path.dirname(fileURLToPath(import.meta.url))));
|
||||
const { loadSessionLogs } = await import(path.join(repoRoot, "src/infra/session-cost-usage.js"));
|
||||
|
||||
const tmpDir = await fs.mkdtemp(path.join(os.tmpdir(), "openclaw-proof-session-cost-"));
|
||||
const sessionsDir = path.join(tmpDir, "agents", "main", "sessions");
|
||||
await fs.mkdir(sessionsDir, { recursive: true });
|
||||
|
||||
// Make the session file a directory. createReadStream on a directory emits
|
||||
// EISDIR, which exercises the best-effort error handler in loadSessionLogs.
|
||||
const sessionFile = path.join(sessionsDir, "proof-session.jsonl");
|
||||
await fs.mkdir(sessionFile);
|
||||
|
||||
console.log("=== Proof: session-cost usage readline stream error catch ===\n");
|
||||
console.log(`Created directory-as-file at: ${sessionFile}`);
|
||||
console.log("Calling loadSessionLogs...\n");
|
||||
|
||||
try {
|
||||
const logs = await loadSessionLogs({ sessionFile });
|
||||
if (Array.isArray(logs) && logs.length === 0) {
|
||||
console.log("loadSessionLogs returned: []");
|
||||
console.log("\nPASS: EISDIR stream error was caught and loadSessionLogs returned empty logs.");
|
||||
} else {
|
||||
console.log(`\nFAIL: unexpected result: ${JSON.stringify(logs)}`);
|
||||
process.exitCode = 1;
|
||||
}
|
||||
} catch (err) {
|
||||
const message = err instanceof Error ? err.message : String(err);
|
||||
console.log(`\nFAIL: loadSessionLogs threw: ${message}`);
|
||||
console.log("The stream error should have been swallowed by loadSessionLogs.");
|
||||
process.exitCode = 1;
|
||||
} finally {
|
||||
await fs.rm(tmpDir, { recursive: true, force: true });
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue