@glassmkr/crucible 0.13.1 → 0.13.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -64,5 +64,81 @@ errors: 2 data errors
64
64
  expect(pools.map((p) => p.name)).toEqual(["tank", "data"]);
65
65
  expect(pools[1].state).toBe("FAULTED");
66
66
  });
67
+ // === Regressions from session-9/A.1 surfacing on ZFS 2.2.9 ===
68
+ it("routes the SLOG vdev into slog_vdevs[] (ZFS 2.2 tab-prefixed `logs` header)", () => {
69
+ // Real fixture captured on val-mz62hd 2026-05-21, ZFS 2.2.9 on
70
+ // AlmaLinux 9.6. The `logs` section header is TAB-prefixed with a
71
+ // trailing TAB. Older parser regex `^logs\s*$` never matched, so
72
+ // every SLOG vdev was misrouted into `vdevs[]` with class=stripe.
73
+ const raw = " pool: gmtest\n" +
74
+ " state: ONLINE\n" +
75
+ "config:\n" +
76
+ "\n" +
77
+ "\tNAME STATE READ WRITE CKSUM\n" +
78
+ "\tgmtest ONLINE 0 0 0\n" +
79
+ "\t mirror-0 ONLINE 0 0 0\n" +
80
+ "\t /var/tmp/zfs-test/disk1.img ONLINE 0 0 0\n" +
81
+ "\t /var/tmp/zfs-test/disk2.img ONLINE 0 0 0\n" +
82
+ "\tlogs\t\n" +
83
+ "\t /var/tmp/zfs-test/slog.img ONLINE 0 0 0\n" +
84
+ "\n" +
85
+ "errors: No known data errors\n";
86
+ const [p] = parseZpoolStatus(raw);
87
+ expect(p.vdevs.length).toBe(1);
88
+ expect(p.vdevs[0].name).toBe("mirror-0");
89
+ expect(p.vdevs[0].redundancy_class).toBe("mirror");
90
+ expect(p.slog_vdevs.length).toBe(1);
91
+ expect(p.slog_vdevs[0].name).toBe("/var/tmp/zfs-test/slog.img");
92
+ expect(p.slog_vdevs[0].state).toBe("ONLINE");
93
+ expect(p.slog_vdevs[0].redundancy_class).toBe("stripe");
94
+ });
95
+ it("flags never-scrubbed on fresh pools that omit the `scan:` line (ZFS 2.2)", () => {
96
+ // Real fixture: a freshly-created pool on ZFS 2.2.9 emits NO
97
+ // `scan:` line at all (not even "scan: none requested"). The
98
+ // older parser's `scrub_never_run` only triggered on the explicit
99
+ // "none requested" phrase, so freshly-created pools never fired
100
+ // the zfs_scrub_errors never-scrubbed branch. The fix asserts
101
+ // scrub_never_run on reaching `errors:` without having seen any
102
+ // `scan:` line.
103
+ const raw = " pool: gmtest\n" +
104
+ " state: ONLINE\n" +
105
+ "config:\n" +
106
+ "\n" +
107
+ "\tNAME STATE READ WRITE CKSUM\n" +
108
+ "\tgmtest ONLINE 0 0 0\n" +
109
+ "\n" +
110
+ "errors: No known data errors\n";
111
+ const [p] = parseZpoolStatus(raw);
112
+ expect(p.scrub_never_run).toBe(true);
113
+ expect(p.scrub_errors).toBeUndefined();
114
+ });
115
+ it("does NOT mark scrub_never_run when scrub history is present (regression check on the above)", () => {
116
+ // The complement: a pool with a real scrub history must NOT be
117
+ // flagged as never-scrubbed by the new fresh-pool logic.
118
+ const raw = " pool: tank\n" +
119
+ " state: ONLINE\n" +
120
+ " scan: scrub repaired 0B in 00:01:23 with 0 errors on Wed Jan 15 00:00:00 2026\n" +
121
+ "errors: No known data errors\n";
122
+ const [p] = parseZpoolStatus(raw);
123
+ expect(p.scrub_never_run).toBeUndefined();
124
+ expect(p.scrub_errors).toBe(0);
125
+ expect(p.scrub_repaired).toBe("0B");
126
+ });
127
+ it("section headers tolerate either tab-prefixed or unindented form (forwards-compat)", () => {
128
+ // ZFS 2.0 emitted section headers unindented (`logs\n`); ZFS 2.2
129
+ // uses tab-prefixed (`\tlogs\t\n`). The parser must handle both.
130
+ const oldStyle = " pool: oldzfs\n" +
131
+ " state: ONLINE\n" +
132
+ "config:\n" +
133
+ "\tNAME STATE\n" +
134
+ "\toldzfs ONLINE\n" +
135
+ "\t disk0 ONLINE\n" +
136
+ "logs\n" +
137
+ "\t log0 ONLINE\n" +
138
+ "errors: No known data errors\n";
139
+ const [p] = parseZpoolStatus(oldStyle);
140
+ expect(p.slog_vdevs.length).toBe(1);
141
+ expect(p.slog_vdevs[0].name).toBe("log0");
142
+ });
67
143
  });
68
144
  //# sourceMappingURL=zfs.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"zfs.test.js","sourceRoot":"","sources":["../../../src/collect/__tests__/zfs.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAE7C,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;IAChC,EAAE,CAAC,uBAAuB,EAAE,GAAG,EAAE;QAC/B,MAAM,GAAG,GAAG;;;;;;;;;;CAUf,CAAC;QACE,MAAM,KAAK,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC;QACpC,MAAM,CAAC,KAAK,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAC9B,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC;YAC7B,IAAI,EAAE,MAAM;YACZ,KAAK,EAAE,QAAQ;YACf,WAAW,EAAE,sBAAsB;YACnC,YAAY,EAAE,CAAC;YACf,cAAc,EAAE,IAAI;SACrB,CAAC,CAAC;QACH,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wBAAwB,EAAE,GAAG,EAAE;QAChC,MAAM,GAAG,GAAG;;;;;CAKf,CAAC;QACE,MAAM,CAAC,CAAC,CAAC,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC;QAClC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACjC,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC/B,MAAM,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE;QACpC,MAAM,GAAG,GAAG;;;;;CAKf,CAAC;QACE,MAAM,CAAC,CAAC,CAAC,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC;QAClC,MAAM,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrC,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,aAAa,EAAE,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE;QACpC,MAAM,CAAC,gBAAgB,CAAC,oBAAoB,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uBAAuB,EAAE,GAAG,EAAE;QAC/B,MAAM,GAAG,GAAG;;;;;;;;CAQf,CAAC;QACE,MAAM,KAAK,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC;QACpC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;QAC3D,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"zfs.test.js","sourceRoot":"","sources":["../../../src/collect/__tests__/zfs.test.ts"],"names":[],"mappings":"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"}
@@ -20,7 +20,7 @@
20
20
  // hosts without NVIDIA GPUs. The `which nvidia-smi` probe is the
21
21
  // gate; everything else short-circuits.
22
22
  import { existsSync } from "fs";
23
- import { run } from "../lib/exec.js";
23
+ import { run, runDetailed, looksLikeFieldRenameError } from "../lib/exec.js";
24
24
  const NVIDIA_SMI_TIMEOUT_MS = 5000;
25
25
  const DCGM_TIMEOUT_MS = 5000;
26
26
  const PROBE_TIMEOUT_MS = 2000;
@@ -162,9 +162,33 @@ const NVIDIA_SMI_CSV_FIELDS = [
162
162
  "fan.speed",
163
163
  ];
164
164
  async function collectTier1() {
165
- const csvOut = await run("nvidia-smi", [`--query-gpu=${NVIDIA_SMI_CSV_FIELDS.join(",")}`, "--format=csv,noheader,nounits"], NVIDIA_SMI_TIMEOUT_MS);
165
+ // Use runDetailed so we can distinguish "tool not installed" from
166
+ // "tool exited 0 with empty stdout but errored to stderr". The
167
+ // latter is the silent-no-op class that hid the v0.13.0
168
+ // retired_pages.double_bit_ecc typo for ~24h until a real GPU host
169
+ // triggered the trigger campaign.
170
+ const res = await runDetailed("nvidia-smi", [`--query-gpu=${NVIDIA_SMI_CSV_FIELDS.join(",")}`, "--format=csv,noheader,nounits"], NVIDIA_SMI_TIMEOUT_MS);
171
+ if (!res.installed) {
172
+ return { available: false, reason: "nvidia-smi not present (non-NVIDIA host or driver not installed)" };
173
+ }
174
+ if (res.timedOut) {
175
+ return { available: false, reason: "nvidia-smi query timed out" };
176
+ }
177
+ // exit 0 + empty stdout + stderr complains about a field rename is
178
+ // exactly the v0.13.0 / v0.13.2 bug shape. Surface this loudly with
179
+ // a reason that points an operator at the cause.
180
+ if (res.exitCode === 0 &&
181
+ (!res.stdout || res.stdout.trim().length === 0) &&
182
+ looksLikeFieldRenameError(res.stderr)) {
183
+ console.warn(`[gpu] nvidia-smi exited 0 with empty stdout but stderr looks like a field-name rename: ${res.stderr.trim().slice(0, 240)}`);
184
+ return {
185
+ available: false,
186
+ reason: `nvidia-smi exited 0 with empty stdout; stderr suggests a queried field has been renamed by the driver version. stderr=${res.stderr.trim().slice(0, 200)}`,
187
+ };
188
+ }
189
+ const csvOut = res.stdout;
166
190
  if (!csvOut) {
167
- return { available: false, reason: "nvidia-smi query timeout or returned no output" };
191
+ return { available: false, reason: "nvidia-smi query returned no output" };
168
192
  }
169
193
  const gpus = [];
170
194
  for (const line of csvOut.split("\n").map((l) => l.trim()).filter(Boolean)) {
@@ -262,27 +286,43 @@ async function enrichThrottleReasons(gpus) {
262
286
  if (!xmlOut)
263
287
  return;
264
288
  const gpuBlocks = xmlOut.split(/<gpu /).slice(1); // skip the header
289
+ // Positive-affirmation: count GPUs for which we found a recognisable
290
+ // throttle/event-reasons block. If we found NONE on a host that has
291
+ // active GPUs, the most likely cause is another driver-version XML
292
+ // tag rename (same shape as the v0.13.2 fix), and we want a loud
293
+ // warning so the next person sees it without re-running a campaign.
294
+ let matchedGpus = 0;
265
295
  for (let i = 0; i < gpuBlocks.length && i < gpus.length; i++) {
266
296
  const block = gpuBlocks[i];
267
- const reasonsBlock = block.match(/<clocks_throttle_reasons>([\s\S]*?)<\/clocks_throttle_reasons>/);
297
+ // Driver 535-: <clocks_throttle_reasons>; driver 550+: <clocks_event_reasons>.
298
+ // Per-element tags follow the same rename. Match either, then probe each
299
+ // reason key with both naming prefixes so we work across the rename
300
+ // boundary. Discovered 2026-05-20 on val-L4 (driver 550.163.01): power-cap
301
+ // throttling didn't trigger gpu_power_cap_throttling because the
302
+ // performance_state_reasons array stayed empty.
303
+ const reasonsBlock = block.match(/<clocks_event_reasons>([\s\S]*?)<\/clocks_event_reasons>/) ||
304
+ block.match(/<clocks_throttle_reasons>([\s\S]*?)<\/clocks_throttle_reasons>/);
268
305
  if (!reasonsBlock)
269
306
  continue;
307
+ matchedGpus++;
270
308
  const reasons = [];
271
- for (const [key, label] of [
272
- ["clocks_throttle_reason_gpu_idle", "gpu_idle"],
273
- ["clocks_throttle_reason_applications_clocks_setting", "applications_clocks_setting"],
274
- ["clocks_throttle_reason_sw_power_cap", "sw_power_cap"],
275
- ["clocks_throttle_reason_hw_slowdown", "hw_slowdown"],
276
- ["clocks_throttle_reason_hw_thermal_slowdown", "hw_thermal_slowdown"],
277
- ["clocks_throttle_reason_hw_power_brake_slowdown", "hw_power_brake"],
278
- ["clocks_throttle_reason_sw_thermal_slowdown", "sw_thermal_slowdown"],
279
- ["clocks_throttle_reason_sync_boost", "sync_boost"],
280
- ["clocks_throttle_reason_display_clock_setting", "display_clock_setting"],
309
+ for (const [suffix, label] of [
310
+ ["gpu_idle", "gpu_idle"],
311
+ ["applications_clocks_setting", "applications_clocks_setting"],
312
+ ["sw_power_cap", "sw_power_cap"],
313
+ ["hw_slowdown", "hw_slowdown"],
314
+ ["hw_thermal_slowdown", "hw_thermal_slowdown"],
315
+ ["hw_power_brake_slowdown", "hw_power_brake"],
316
+ ["sw_thermal_slowdown", "sw_thermal_slowdown"],
317
+ ["sync_boost", "sync_boost"],
318
+ ["display_clock_setting", "display_clock_setting"],
319
+ ["display_clocks_setting", "display_clock_setting"], // driver-550 plural
281
320
  ]) {
282
- const re = new RegExp(`<${key}>([^<]+)</${key}>`);
321
+ const re = new RegExp(`<clocks_(?:event|throttle)_reason_${suffix}>([^<]+)</clocks_(?:event|throttle)_reason_${suffix}>`);
283
322
  const m = reasonsBlock[1].match(re);
284
323
  if (m && /^(active|true)/i.test(m[1].trim())) {
285
- reasons.push(label);
324
+ if (!reasons.includes(label))
325
+ reasons.push(label);
286
326
  }
287
327
  }
288
328
  gpus[i].performance_state_reasons = reasons;
@@ -291,6 +331,18 @@ async function enrichThrottleReasons(gpus) {
291
331
  reasons.includes("hw_thermal_slowdown") ||
292
332
  reasons.includes("sw_thermal_slowdown");
293
333
  }
334
+ // Silent-regression-class defense: nvidia-smi returned XML with at
335
+ // least one <gpu> block but none had a recognisable throttle/event
336
+ // reasons sub-block. Most likely cause is a third XML rename the
337
+ // matcher doesn't cover; warn so the next investigator sees this
338
+ // without re-running a trigger campaign on a real GPU host.
339
+ if (gpus.length > 0 && matchedGpus === 0 && gpuBlocks.length > 0) {
340
+ console.warn("[gpu] enrichThrottleReasons: nvidia-smi -q -x emitted GPU blocks but none contained " +
341
+ "<clocks_event_reasons> or <clocks_throttle_reasons>. " +
342
+ "Likely a new driver-version XML rename; performance_state_reasons will be empty " +
343
+ "and the dashboard's gpu_power_cap_throttling + gpu_thermal_critical rules cannot fire. " +
344
+ "Inspect the output of `nvidia-smi -q -x | head -40` and extend the matcher in collect/gpu.ts.");
345
+ }
294
346
  }
295
347
  async function collectNvLinkBasic(gpuIndex) {
296
348
  const out = await run("nvidia-smi", ["nvlink", "--status", "-i", String(gpuIndex)], NVIDIA_SMI_TIMEOUT_MS);
@@ -1 +1 @@
1
- {"version":3,"file":"gpu.js","sourceRoot":"","sources":["../../src/collect/gpu.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"gpu.js","sourceRoot":"","sources":["../../src/collect/gpu.ts"],"names":[],"mappings":"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"}
@@ -34,6 +34,10 @@ export function parseZpoolStatus(zpoolStatus) {
34
34
  const pools = [];
35
35
  let current = null;
36
36
  let section = "none";
37
+ // Per-pool bookkeeping: did we see a `scan:` line for the current
38
+ // pool? Kept out of the serialized ZfsPool object so it doesn't
39
+ // leak into the snapshot.
40
+ let sawScanLine = false;
37
41
  for (const line of zpoolStatus.split("\n")) {
38
42
  const poolMatch = line.match(/^\s*pool:\s*(.+)/);
39
43
  if (poolMatch) {
@@ -47,6 +51,7 @@ export function parseZpoolStatus(zpoolStatus) {
47
51
  };
48
52
  pools.push(current);
49
53
  section = "none";
54
+ sawScanLine = false;
50
55
  continue;
51
56
  }
52
57
  if (!current)
@@ -59,10 +64,25 @@ export function parseZpoolStatus(zpoolStatus) {
59
64
  const errorsMatch = line.match(/^\s*errors:\s*(.+)/);
60
65
  if (errorsMatch) {
61
66
  current.errors_text = errorsMatch[1].trim();
67
+ // Fresh-pool case: ZFS 2.2+ omits the `scan:` line entirely
68
+ // until the first scrub is initiated. Reaching `errors:` without
69
+ // ever seeing `scan:` means this pool has never been scrubbed.
70
+ // The `errors:` line is the canonical end-of-pool marker, so
71
+ // this is a stable place to assert.
72
+ if (!sawScanLine && current.scrub_never_run === undefined) {
73
+ current.scrub_never_run = true;
74
+ }
62
75
  continue;
63
76
  }
64
- // Parse scrub info
77
+ // Parse scrub info. A `scan:` line may say "none requested" (the
78
+ // explicit never-run signal) OR may be absent entirely on a
79
+ // freshly-created pool (ZFS 2.2+ omits the line until a scrub
80
+ // is initiated). Fresh-pool case is handled at the end of the
81
+ // pool block: if we reach `errors:` without having seen `scan:`,
82
+ // we mark scrub_never_run. The handler below covers the
83
+ // explicit-string case.
65
84
  if (line.includes("scan:")) {
85
+ sawScanLine = true;
66
86
  if (line.includes("none requested")) {
67
87
  current.scrub_never_run = true;
68
88
  }
@@ -78,24 +98,27 @@ export function parseZpoolStatus(zpoolStatus) {
78
98
  }
79
99
  }
80
100
  }
81
- // Section switching. `config:` opens the vdev tree; `logs`,
82
- // `cache`, `spares` appear as bare lines (no colon, no leading
83
- // tab) within the config block as section markers per zpool(8).
101
+ // Section switching. `config:` opens the vdev tree. Section
102
+ // markers `logs`, `cache`, `spares` appear inside the config
103
+ // block. The exact whitespace varies by ZFS version: pre-2.0
104
+ // emitted them unindented; ZFS 2.2 emits a leading TAB and a
105
+ // trailing TAB (verified live on val-mz62hd 2026-05-21:
106
+ // "\tlogs\t\n"). The older parser only matched the unindented
107
+ // form, which routed every SLOG vdev into the wrong field on
108
+ // modern hosts. Match either form.
84
109
  if (line.startsWith("config:")) {
85
110
  section = "config";
86
111
  continue;
87
112
  }
88
- // Section headers in the config block ('logs', 'cache', 'spares')
89
- // appear unindented (no tab prefix) per the `zpool status` format.
90
- if (/^logs\s*$/.test(line)) {
113
+ if (/^\s*logs\s*$/.test(line)) {
91
114
  section = "logs";
92
115
  continue;
93
116
  }
94
- if (/^cache\s*$/.test(line)) {
117
+ if (/^\s*cache\s*$/.test(line)) {
95
118
  section = "cache";
96
119
  continue;
97
120
  }
98
- if (/^spares\s*$/.test(line)) {
121
+ if (/^\s*spares\s*$/.test(line)) {
99
122
  section = "spares";
100
123
  continue;
101
124
  }
@@ -1 +1 @@
1
- {"version":3,"file":"zfs.js","sourceRoot":"","sources":["../../src/collect/zfs.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"zfs.js","sourceRoot":"","sources":["../../src/collect/zfs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,73 @@
1
+ import { describe, it, expect } from "vitest";
2
+ import { run, runDetailed, looksLikeFieldRenameError } from "../exec.js";
3
+ describe("looksLikeFieldRenameError", () => {
4
+ // Real-world fixtures from the two Crucible bugs that motivated this
5
+ // defense. If the heuristic stops recognising these strings, the next
6
+ // driver-version rename will hide for hours again.
7
+ it("matches the v0.13.2 driver-550 clocks_event_reasons rename", () => {
8
+ expect(looksLikeFieldRenameError('Field "clocks_event_reasons.hw_power_brake" is not a valid field to query.')).toBe(true);
9
+ });
10
+ it("matches the v0.13.0 retired_pages.double_bit_ecc typo", () => {
11
+ expect(looksLikeFieldRenameError('Field "retired_pages.double_bit_ecc.count" is not a valid field to query.')).toBe(true);
12
+ });
13
+ it("matches generic 'unknown field' phrasing", () => {
14
+ expect(looksLikeFieldRenameError("ERROR: unknown field 'foo_bar'")).toBe(true);
15
+ });
16
+ it("matches 'no such field' phrasing", () => {
17
+ expect(looksLikeFieldRenameError("no such field: bar")).toBe(true);
18
+ });
19
+ it("matches XML tag-not-found pattern", () => {
20
+ expect(looksLikeFieldRenameError("<clocks_throttle_reasons>: not found in driver 550 output")).toBe(true);
21
+ });
22
+ it("does NOT match empty stderr", () => {
23
+ expect(looksLikeFieldRenameError("")).toBe(false);
24
+ });
25
+ it("does NOT match unrelated permission failures", () => {
26
+ expect(looksLikeFieldRenameError("Permission denied")).toBe(false);
27
+ });
28
+ it("does NOT match real GPU-lost faults (different bug class)", () => {
29
+ expect(looksLikeFieldRenameError("Unable to determine the device handle for GPU 0000:00:00.0: GPU is lost.")).toBe(false);
30
+ });
31
+ });
32
+ describe("runDetailed", () => {
33
+ it("returns installed=false on ENOENT", async () => {
34
+ const res = await runDetailed("/no/such/binary-9j43k", []);
35
+ expect(res.installed).toBe(false);
36
+ expect(res.stdout).toBeNull();
37
+ expect(res.exitCode).toBeNull();
38
+ });
39
+ it("returns installed=true + exit 0 + stdout for a normal command", async () => {
40
+ const res = await runDetailed("echo", ["hello"]);
41
+ expect(res.installed).toBe(true);
42
+ expect(res.exitCode).toBe(0);
43
+ expect(res.stdout?.trim()).toBe("hello");
44
+ expect(res.timedOut).toBe(false);
45
+ });
46
+ it("returns exitCode + stderr for a non-zero exit", async () => {
47
+ // `false` is /usr/bin/false on most systems; exits 1 with no output.
48
+ const res = await runDetailed("sh", ["-c", "echo bar >&2; exit 5"]);
49
+ expect(res.installed).toBe(true);
50
+ expect(res.exitCode).toBe(5);
51
+ expect(res.stderr.trim()).toBe("bar");
52
+ });
53
+ it("captures stderr even on exit 0 — the silent-no-op detection path", async () => {
54
+ // This is the v0.13.0 / v0.13.2 shape: tool returns success exit
55
+ // code but stderr says the field is unknown. runDetailed must
56
+ // capture the stderr so the caller can apply looksLikeFieldRenameError.
57
+ const res = await runDetailed("sh", ["-c", "echo 'Field \"foo\" is not a valid field to query.' >&2; exit 0"]);
58
+ expect(res.installed).toBe(true);
59
+ expect(res.exitCode).toBe(0);
60
+ expect(res.stdout?.trim()).toBe("");
61
+ expect(looksLikeFieldRenameError(res.stderr)).toBe(true);
62
+ });
63
+ });
64
+ describe("run (backwards-compat shim)", () => {
65
+ it("returns null when command not installed", async () => {
66
+ expect(await run("/no/such/binary-9j43k", [])).toBeNull();
67
+ });
68
+ it("returns stdout for a normal command", async () => {
69
+ const out = await run("echo", ["hi"]);
70
+ expect(out?.trim()).toBe("hi");
71
+ });
72
+ });
73
+ //# sourceMappingURL=exec.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exec.test.js","sourceRoot":"","sources":["../../../src/lib/__tests__/exec.test.ts"],"names":[],"mappings":"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"}
@@ -1 +1,10 @@
1
1
  export declare function run(cmd: string, args: string[], timeoutMs?: number): Promise<string | null>;
2
+ export interface RunDetailedResult {
3
+ installed: boolean;
4
+ exitCode: number | null;
5
+ stdout: string | null;
6
+ stderr: string;
7
+ timedOut: boolean;
8
+ }
9
+ export declare function runDetailed(cmd: string, args: string[], timeoutMs?: number): Promise<RunDetailedResult>;
10
+ export declare function looksLikeFieldRenameError(stderr: string): boolean;
package/dist/lib/exec.js CHANGED
@@ -1,19 +1,54 @@
1
1
  import { execFile } from "child_process";
2
2
  import { promisify } from "util";
3
3
  const execFileAsync = promisify(execFile);
4
+ // Backwards-compatible: existing callers get a string or null.
5
+ // The new runDetailed() returns stderr + exitCode + presence info so
6
+ // callers can distinguish "tool not installed" from "tool exited 0
7
+ // with empty stdout but errored to stderr". The latter is the silent-
8
+ // regression class that hid the v0.13.0 `retired_pages.double_bit_ecc`
9
+ // typo + the v0.13.2 `clocks_event_reasons` rename for ~24h each: in
10
+ // both cases nvidia-smi exited 0 with stderr saying "field not found"
11
+ // and Crucible's collectors processed empty stdout as "no data".
4
12
  export async function run(cmd, args, timeoutMs = 10000) {
13
+ const res = await runDetailed(cmd, args, timeoutMs);
14
+ return res.installed && res.stdout !== null ? res.stdout : null;
15
+ }
16
+ export async function runDetailed(cmd, args, timeoutMs = 10000) {
5
17
  try {
6
- const { stdout } = await execFileAsync(cmd, args, { timeout: timeoutMs });
7
- return stdout;
18
+ const { stdout, stderr } = await execFileAsync(cmd, args, { timeout: timeoutMs });
19
+ return { installed: true, exitCode: 0, stdout, stderr: stderr ?? "", timedOut: false };
8
20
  }
9
21
  catch (err) {
10
- if (err.code === "ENOENT")
11
- return null; // command not installed
12
- if (err.killed)
13
- return null; // timeout
14
- if (err.stdout)
15
- return err.stdout; // non-zero exit but has output
16
- return null;
22
+ if (err.code === "ENOENT") {
23
+ return { installed: false, exitCode: null, stdout: null, stderr: "", timedOut: false };
24
+ }
25
+ if (err.killed) {
26
+ return { installed: true, exitCode: null, stdout: null, stderr: "", timedOut: true };
27
+ }
28
+ return {
29
+ installed: true,
30
+ exitCode: typeof err.code === "number" ? err.code : null,
31
+ stdout: typeof err.stdout === "string" ? err.stdout : null,
32
+ stderr: typeof err.stderr === "string" ? err.stderr : "",
33
+ timedOut: false,
34
+ };
17
35
  }
18
36
  }
37
+ // Heuristic: does this stderr look like the "field/tag name not found"
38
+ // pattern that nvidia-smi (and others) emit when a query field has
39
+ // been renamed by a tool upgrade? Used by the gpu.ts collector's
40
+ // silent-no-op detector. The pattern is intentionally conservative:
41
+ // false positives degrade gracefully (an extra WARN log), false
42
+ // negatives are the original bug class we're trying to prevent.
43
+ export function looksLikeFieldRenameError(stderr) {
44
+ if (!stderr)
45
+ return false;
46
+ const lower = stderr.toLowerCase();
47
+ return (lower.includes("is not a valid field") ||
48
+ lower.includes("unknown field") ||
49
+ lower.includes("invalid field") ||
50
+ lower.includes("no such field") ||
51
+ lower.includes("not recognized") ||
52
+ /<[a-z_]+>.*not found/.test(lower));
53
+ }
19
54
  //# sourceMappingURL=exec.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"exec.js","sourceRoot":"","sources":["../../src/lib/exec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AAEjC,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AAE1C,MAAM,CAAC,KAAK,UAAU,GAAG,CAAC,GAAW,EAAE,IAAc,EAAE,SAAS,GAAG,KAAK;IACtE,IAAI,CAAC;QACH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,aAAa,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC;QAC1E,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAC,CAAC,wBAAwB;QAChE,IAAI,GAAG,CAAC,MAAM;YAAE,OAAO,IAAI,CAAC,CAAC,UAAU;QACvC,IAAI,GAAG,CAAC,MAAM;YAAE,OAAO,GAAG,CAAC,MAAM,CAAC,CAAC,+BAA+B;QAClE,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"exec.js","sourceRoot":"","sources":["../../src/lib/exec.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@glassmkr/crucible",
3
- "version": "0.13.1",
3
+ "version": "0.13.3",
4
4
  "description": "Lightweight bare metal server monitoring. IPMI, SMART, OS, network. Opinionated alerts.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",