Repository navigation
[v24.x backport] fs: stop recursive mkdir from retrying ENOENT forever - #66927
Closed
junaidkhan80121 wants to merge 229 commits into
Closed
junaidkhan80121 wants to merge 229 commits into
junaidkhan80121 wants to merge 229 commits into
Conversation
Backport of nodejs#66340 to v24.x-staging. Also covers nested procfs paths from nodejs#66890. Fixes: nodejs#66268 Fixes: nodejs#66890
Contributor
|
Welcome to Node.js, and thank you for your first contribution! Before review, please take a moment to read:
Please make sure every commit is signed off. For a first pull request, GitHub Actions require collaborator approval and Jenkins CI must be started by a collaborator or triager, so an initial wait is normal. |
Signed-off-by: Antoine du Hamel <[email protected]> PR-URL: nodejs#63790 Reviewed-By: Filip Skokan <[email protected]> Reviewed-By: Chemi Atlow <[email protected]> Reviewed-By: Jake Yuesong Li <[email protected]> Reviewed-By: Marco Ippolito <[email protected]> Reviewed-By: Luigi Pinca <[email protected]> Reviewed-By: Trivikram Kamat <[email protected]> Reviewed-By: Matteo Collina <[email protected]>
Signed-off-by: avivkeller <[email protected]> PR-URL: nodejs#64830 Fixes: nodejs#58887 Reviewed-By: Moshe Atlow <[email protected]> Reviewed-By: Chemi Atlow <[email protected]>
Upgrades the experimental tag filter introduced by stage 1 to accept a boolean expression instead of a literal tag name. Grammar: `and`/`&&`, `or`/`||`, `not`/`!`, parentheses for grouping, and `*` wildcards inside identifiers. Standard precedence (`not > and > or`); binary operators are left-associative. Word forms require whitespace separation; punctuation forms do not. Untagged tests evaluate `false` for any include expression and `true` for `not X`, so excluding tags does not accidentally remove untagged tests. The flag and `testTagFilters` option are still repeatable; multiple expressions still AND together. Malformed expressions fail fast at the parent process at startup. Tag value validation tightens to reject whitespace, operator characters (`& | ! ( ) *`), and the reserved words `and`/`or`/`not` in any casing - a breaking change relative to the stage 1 ship, acceptable at Stability 1.0 (Early development). Signed-off-by: atlowChemi <[email protected]> PR-URL: nodejs#63054 Reviewed-By: Moshe Atlow <[email protected]> Reviewed-By: Benjamin Gruenbaum <[email protected]>
A portable compile cache is meant to be reused wherever the same module layout is found, which includes being generated once (at build time, say) and shipped read-only with an application for whoever runs it. On platforms with uids the cache subdirectory is suffixed with the uid of the user who created it, so such a cache is only ever found by that one user. Omit the suffix in portable mode: a user who cannot write to the directory still reads it, and a failed write is only a cache miss. Signed-off-by: Shelley Vohr <[email protected]> PR-URL: nodejs#65293 Reviewed-By: James M Snell <[email protected]>
Signed-off-by: James M Snell <[email protected]> Assisted-by: Opencode/Opus PR-URL: nodejs#65309 Reviewed-By: Tim Perry <[email protected]> Reviewed-By: Ethan Arrowood <[email protected]>
The helpers report the command, both streams, and the exit condition on failure, so mismatches are diagnosed consistently across tests. Signed-off-by: greenhead <[email protected]> PR-URL: nodejs#65552 Refs: nodejs#65377 Reviewed-By: Aviv Keller <[email protected]> Reviewed-By: Chemi Atlow <[email protected]> Reviewed-By: Luigi Pinca <[email protected]> Reviewed-By: Antoine du Hamel <[email protected]>
Signed-off-by: Antoine du Hamel <[email protected]> PR-URL: nodejs#65572 Refs: https://github.com/nodejs/node/pull/65552/changes#r3862720795 Reviewed-By: Filip Skokan <[email protected]> Reviewed-By: Luigi Pinca <[email protected]>
`uvimpl::Work::AfterThreadPoolWork()` and the thread-safe function's `DispatchOne()` and `Finalize()` opened an `AsyncResource::CallbackScope` with only a `HandleScope`. `InternalCallbackScope` expects the resource's environment context to be entered and otherwise asserts that `Environment::GetCurrent(isolate)` is that environment, so with two environments on one isolate an addon's async work completion or thread-safe function call aborted the process whenever the other environment's context was current when the loop ran the callback. Enter the node-api env's context first, as `CallFinalizer()` and the zlib and WebCrypto thread pool callbacks already do. In `Finalize()` the scope covers only the finalizer call, since `MaybeDelete()` can free the env whose persistent handle `context()` returns. Signed-off-by: Shelley Vohr <[email protected]> PR-URL: nodejs#65406 Reviewed-By: Chengzhong Wu <[email protected]>
Pass input, output, and version values through environment variables instead of expanding them into shell source. Split benchmark categories and PR numbers into arrays to retain separate arguments. Signed-off-by: Filip Skokan <[email protected]> Assisted-by: Codex PR-URL: nodejs#66013 Reviewed-By: Antoine du Hamel <[email protected]> Reviewed-By: James M Snell <[email protected]> Reviewed-By: Xuguang Mei <[email protected]> Reviewed-By: Ulises Gascón <[email protected]>
PR-URL: nodejs#65813 Reviewed-By: Filip Skokan <[email protected]> Reviewed-By: Luigi Pinca <[email protected]> Reviewed-By: Colin Ihrig <[email protected]>
Remove allocations and repeated work performed for every request: - reuse a per-connection updateOutgoingData closure and a shared 'finish' listener instead of binding two functions per request, reaching resOnFinish through the connection state stored on the response - cache the ServerResponse options object per server (custom response classes keep receiving a fresh object) - check for Host, Expect, Content-Length and Transfer-Encoding by scanning rawHeaders instead of materializing req.headers, which was built (with per-name toLowerCase calls) for every request even when the application never reads it - cache the rendered status line per status code when the reason phrase is the default, skipping its character validation - cache the complete 'Date: ...' header line in the utcDate cache and the keep-alive header pair for the current server settings - compute the lenient-validation option chain once per message Signed-off-by: Matteo Collina <[email protected]> PR-URL: nodejs#65802 Reviewed-By: Robert Nagy <[email protected]> Reviewed-By: James M Snell <[email protected]> Reviewed-By: Tim Perry <[email protected]> Reviewed-By: Gürgün Dayıoğlu <[email protected]>
type-long-settimeout.any.js and type-long-setinterval.any.js arm setTimeout(assert_unreached, 100) as a guard. Under load it can fire after done(), and the resulting uncaught exception can reach the WPT runner before the completion message, failing the spec. Use a script modifier to clear the guard timer from a completion callback, for these two fixtures only. The guard still fails the test when done() is never called. Signed-off-by: marcopiraccini <[email protected]> PR-URL: nodejs#63106 Reviewed-By: Paolo Insogna <[email protected]> Reviewed-By: Filip Skokan <[email protected]>
Signed-off-by: Tim Perry <[email protected]> PR-URL: nodejs#66093 Reviewed-By: Xuguang Mei <[email protected]> Reviewed-By: James M Snell <[email protected]>
libuv reports the event loop metrics exposed through `performance.nodeTiming.uvMetricsInfo` as `uint64_t` counters, but they were copied into an `Int32Array` (and, before that, converted using `v8::Integer::New()`), so they wrapped around after 2^31 on long-running processes. Store the metrics in a `Float64Array` instead. Values are now exact up to `Number.MAX_SAFE_INTEGER`. Assisted-by: OpenCode Signed-off-by: James M Snell <[email protected]> PR-URL: nodejs#66094 Reviewed-By: Rafael Gonzaga <[email protected]> Reviewed-By: Chengzhong Wu <[email protected]>
`performanceNodeTiming.uvMetricsInfo` is a property, not a method, so document its value using `Type:` rather than `Returns:`. Assisted-by: OpenCode Signed-off-by: James M Snell <[email protected]> PR-URL: nodejs#66094 Reviewed-By: Rafael Gonzaga <[email protected]> Reviewed-By: Chengzhong Wu <[email protected]>
`performance.nodeTiming.uvMetricsInfo` returns the libuv event loop metrics as numbers, which are only exact up to `Number.MAX_SAFE_INTEGER`. Add `uvMetricsInfoBigInt`, which returns the same metrics as bigints backed by `uint64_t` storage, carrying the full 64-bit range reported by libuv. A single native call fills both a `Float64Array` and a `BigUint64Array`, so `uvMetricsInfo` does not pay for bigint allocation and conversion. The new property is omitted from `toJSON()`, as `JSON.stringify()` cannot serialize bigints. Assisted-by: OpenCode Signed-off-by: James M Snell <[email protected]> PR-URL: nodejs#66094 Reviewed-By: Rafael Gonzaga <[email protected]> Reviewed-By: Chengzhong Wu <[email protected]>
Short-lived streams (create, a few chunks, close) pay a fixed cost per stream that dominates once the per-chunk path is lean. Streams created internally (transform stream sides, tee branches, ReadableStream.from, transferred streams) were built by wrapper constructors that swapped the prototype of every instance and then assigned an own, enumerable `constructor` property to look like a public stream. Each internal stream therefore had its own hidden class and `Object.keys(stream)` reported `['constructor']`. The public constructors now accept the internal construction sentinel and leave controller setup to the caller, so every ReadableStream and WritableStream shares one hidden class and no per-instance prototype swap or own property is needed. The queue ring buffer grew after a push filled it, so the initial 8-slot ring held only three (value, size) pairs and a four-chunk stream reallocated every time. Growing before the push lets the ring hold four pairs. pipeTo observed the source's closed promise with two reactions and, on teardown, let the reader and writer release paths probe and reject promise records that only the pipe could have observed. One reaction pair now watches the source, and finalize drops the records before release. Signed-off-by: Matteo Collina <[email protected]> PR-URL: nodejs#66052 Reviewed-By: Paolo Insogna <[email protected]> Reviewed-By: Antoine du Hamel <[email protected]> Reviewed-By: James M Snell <[email protected]> Reviewed-By: Yagiz Nizipli <[email protected]>
Bumps [codecov/codecov-action](https://github.com/codecov/codecov-action) from 7.0.0 to 7.1.0. - [Release notes](https://github.com/codecov/codecov-action/releases) - [Changelog](https://github.com/codecov/codecov-action/blob/main/CHANGELOG.md) - [Commits](codecov/codecov-action@fb8b358...0b35c9e) --- updated-dependencies: - dependency-name: codecov/codecov-action dependency-version: 7.1.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <[email protected]> PR-URL: nodejs#66103 Reviewed-By: Filip Skokan <[email protected]> Reviewed-By: Antoine du Hamel <[email protected]> Reviewed-By: Colin Ihrig <[email protected]> Reviewed-By: Luigi Pinca <[email protected]>
Observing the same entry type more than once on a PerformanceObserver,
through repeated `observe({ type })` calls or duplicates in
`entryTypes`, incremented the internal observer count each time, while
`disconnect()` decremented it only once per observed type. The counts
never returned to zero, so GC tracking stayed installed, and entries
for types such as `'http'` and `'dns'` kept being created after all
observers had disconnected.
Count each entry type at most once per observer.
Assisted-by: OpenCode
Signed-off-by: James M Snell <[email protected]>
PR-URL: nodejs#66097
Reviewed-By: Xuguang Mei <[email protected]>
Reviewed-By: Matteo Collina <[email protected]>
Whether the V8 GC callbacks used for `'gc'` performance entries were installed was tracked by a boolean in JavaScript, separately from the native state, and the two could get out of sync. After deserializing a user-land snapshot built while a `'gc'` PerformanceObserver was active, the boolean claimed the callbacks were installed, although V8 GC callbacks do not survive a snapshot. Observing `'gc'` again did not install them, and disconnecting removed callbacks that had never been registered, crashing the process. Track the installation state in `PerformanceState` instead, and replace the install and remove bindings with a single idempotent `updateGarbageCollectionTracking()` binding, which registers the callbacks if and only if there are `'gc'` observers. Assisted-by: OpenCode Signed-off-by: James M Snell <[email protected]> PR-URL: nodejs#66097 Reviewed-By: Xuguang Mei <[email protected]> Reviewed-By: Matteo Collina <[email protected]>
V8 GC callbacks do not survive a snapshot, so a `'gc'` PerformanceObserver that was active while building a user-land snapshot received no entries after deserialization, unless another `'gc'` observer was created. When `'gc'` is observed while building a snapshot, add a deserialize callback that registers the GC callbacks again if `'gc'` observers are still active. Assisted-by: OpenCode Signed-off-by: James M Snell <[email protected]> PR-URL: nodejs#66097 Reviewed-By: Xuguang Mei <[email protected]> Reviewed-By: Matteo Collina <[email protected]>
tls.connect() can throw while validating TLS options. For proxied HTTPS requests, it is called after the CONNECT response has been received, so the throw happens asynchronously from the original https.request() call and ends the process as an uncaught exception. Catch the error, close the tunnel socket, and propagate it to the request. Signed-off-by: Christian Aurich <[email protected]> PR-URL: nodejs#66096 Reviewed-By: Xuguang Mei <[email protected]> Reviewed-By: James M Snell <[email protected]> Reviewed-By: Robert Nagy <[email protected]>
Signed-off-by: Guilherme Araújo <[email protected]> PR-URL: nodejs#64190 Reviewed-By: Matteo Collina <[email protected]> Reviewed-By: Vinícius Lourenço Claro Cardoso <[email protected]> Reviewed-By: Ilyas Shabi <[email protected]> Reviewed-By: Gürgün Dayıoğlu <[email protected]> Reviewed-By: James M Snell <[email protected]>
`FileHandle::TransferData` uses `-1` to indicate that it no longer owns a file descriptor. However, its destructor only closes descriptors greater than 0. If a transferred `FileHandle` owns fd 0 and the message is discarded, the descriptor is left open. Treat fd 0 like any other valid descriptor and only skip `-1`. Signed-off-by: Christian Aurich <[email protected]> PR-URL: nodejs#66095 Reviewed-By: Xuguang Mei <[email protected]> Reviewed-By: James M Snell <[email protected]>
Fix several issues with `Utf8Stream` flushing: * `flush()` now writes buffered data regardless of `minLength` and invokes the callback only after pending writes complete, including when `minLength` is zero and a write is in flight. * Multiple concurrent `flush()` calls are tracked correctly and `end()` waits for pending flushes before closing. * `flushSync()` throws `ERR_INVALID_STATE` if called while an asynchronous write is in progress instead of corrupting output. * Periodic flushes no longer stack up while a flush is pending. * `fsync` is skipped for stdout/stderr file descriptors. * `reopen()`, `end()` and `destroy()` behave correctly when the stream is destroyed while still opening. Signed-off-by: James M Snell <[email protected]> Assisted-by: Opencode PR-URL: nodejs#66473 Reviewed-By: Matteo Collina <[email protected]>
Signed-off-by: RafaelGSS <[email protected]> PR-URL: nodejs#66599 Reviewed-By: Ulises Gascón <[email protected]> Reviewed-By: Vinícius Lourenço Claro Cardoso <[email protected]> Reviewed-By: Luigi Pinca <[email protected]>
Copy validated header names directly into the shallow result instead of using ObjectAssign on the internal null-prototype map. Signed-off-by: Roberto Bianchi <[email protected]> PR-URL: nodejs#66592 Reviewed-By: Tim Perry <[email protected]> Reviewed-By: Matteo Collina <[email protected]> Reviewed-By: Gürgün Dayıoğlu <[email protected]>
main() read `buf` instead of `buffer`, so every run measured Buffer.allocUnsafeSlow() even when labeled buffer=fast. Also benchmark the slow variant and trim the byteLength matrix. Signed-off-by: RafaelGSS <[email protected]> PR-URL: nodejs#66604 Reviewed-By: Ulises Gascón <[email protected]> Reviewed-By: Luigi Pinca <[email protected]> Reviewed-By: Minwoo Jung <[email protected]>
A failing todo subtest does not fail its parent, so the parent suite was recorded as passed in the rerun state file along with its children. On the next run the suite was replayed synthetically and the failing todo subtest was marked as passed instead of being rerun. Do not record a passed test whose descendant failed, so the suite body runs again while passing siblings are still replayed from their own entries. Document that a failing todo test counts as not yet passed. Signed-off-by: Barak <[email protected]> PR-URL: nodejs#66605 Reviewed-By: Benjamin Gruenbaum <[email protected]> Reviewed-By: Moshe Atlow <[email protected]> Reviewed-By: Chemi Atlow <[email protected]>
The data is already a random Buffer, so passing it through TextEncoder decoded it as UTF-8 and re-encoded it, making subtle.digest hash a different and larger input than createHash. Signed-off-by: RafaelGSS <[email protected]> PR-URL: nodejs#66608 Reviewed-By: Ulises Gascón <[email protected]> Reviewed-By: Luigi Pinca <[email protected]>
When the last consumer of a share() or shareSync() detached, the min cursor fell back to the end of the buffer, so every buffered entry was trimmed, including entries that the detaching consumer had not read. The source had already produced that data, so consumers that attached later silently skipped it. Keep the buffer while there are no consumers, as broadcast() already does, so late-joining consumers start at the oldest entry still in the buffer. Document that the source stays open until the share is cancelled or disposed. Assisted-by: OpenCode Signed-off-by: James M Snell <[email protected]> PR-URL: nodejs#66483 Reviewed-By: Trivikram Kamat <[email protected]>
When an async source yielded an already-batched Uint8Array[] value, from() passed it through as-is, however large it was. Every other input shape (a sync source, or an array passed to from() or fromSync() directly) splits such batches into batches of at most 128 chunks, which bounds the memory transforms must allocate per batch. Apply the same bound to async sources. Batches within the bound are still passed through without copying. Assisted-by: OpenCode Signed-off-by: James M Snell <[email protected]> PR-URL: nodejs#66483 Reviewed-By: Trivikram Kamat <[email protected]>
The ERR_INVALID_ARG_TYPE messages for async iterable and promise inputs read "must be an a synchronous input (not AsyncIterable)", because the error formatter adds "an" to expected-type strings that contain uppercase letters. Rephrase them in lowercase. Assisted-by: OpenCode Signed-off-by: James M Snell <[email protected]> PR-URL: nodejs#66483 Reviewed-By: Trivikram Kamat <[email protected]>
PR-URL: nodejs#66620 Refs: simdjson/simdjson#2913 Refs: nodejs#66495 Reviewed-By: Yagiz Nizipli <[email protected]> Reviewed-By: Antoine du Hamel <[email protected]> Reviewed-By: Richard Lau <[email protected]>
Signed-off-by: Mike McCready <[email protected]> PR-URL: nodejs#65750 Reviewed-By: Richard Lau <[email protected]> Reviewed-By: Stefan Stojanovic <[email protected]> Reviewed-By: Luigi Pinca <[email protected]> Reviewed-By: Gürgün Dayıoğlu <[email protected]> Reviewed-By: Colin Ihrig <[email protected]> Reviewed-By: Ulises Gascón <[email protected]>
Signed-off-by: lazerg <[email protected]> Assisted-by: Claude Code PR-URL: nodejs#66565 Fixes: nodejs#66562 Reviewed-By: Antoine du Hamel <[email protected]> Reviewed-By: Jacob Smith <[email protected]>
AbortSignal.any() copies the source WeakRefs of a composite input into the new composite, so nested composites share them. Those WeakRefs were also used as the unregister tokens for the registrations that prune a composite's sources once they are collected. When an inner composite was collected first, its cleanup therefore also unregistered the outer composite from the same sources. An observed outer composite then stayed in gcPersistentSignals, together with its listeners, even after all of its sources were gone and nothing could abort it anymore. Use each composite's own WeakRef as the unregister token instead, so collecting one composite only removes its own registrations. Fixes: nodejs#66612 Refs: nodejs#62367 Assisted-by: Claude Code Signed-off-by: journaltraces <[email protected]> PR-URL: nodejs#66617 Reviewed-By: Chemi Atlow <[email protected]> Reviewed-By: Gürgün Dayıoğlu <[email protected]>
Pulls in nodejs/node-pr-labeler#20, which counts each subsystem once before applying the four-subsystem limit that collapses labels into `lib / src`. Until now any PR touching three or more files under a two-label rule (e.g. `src/quic/`, `src/crypto/`) was collapsed even though it only touched one subsystem. Signed-off-by: Soul Lee <[email protected]> PR-URL: nodejs#66606 Refs: nodejs/node-pr-labeler@dfe5eb3 Reviewed-By: Luigi Pinca <[email protected]> Reviewed-By: Antoine du Hamel <[email protected]>
Add deps/v8/** to the QUIC workflow's pull request path filter so V8 updates trigger its build and tests. Assisted-by: Codex Signed-off-by: inoway46 <[email protected]> PR-URL: nodejs#66602 Refs: nodejs#66537 Refs: https://github.com/nodejs/node/actions/runs/37675498427/job/112978479932 Reviewed-By: Richard Lau <[email protected]> Reviewed-By: Tim Perry <[email protected]>
Reuse the values array instead of allocating a second result array. Signed-off-by: Roberto Bianchi <[email protected]> PR-URL: nodejs#66488 Reviewed-By: Gürgün Dayıoğlu <[email protected]> Reviewed-By: Tim Perry <[email protected]>
PR-URL: nodejs#66663 Reviewed-By: Jiawen Geng <[email protected]> Reviewed-By: Xuguang Mei <[email protected]>
PR-URL: nodejs#66655 Reviewed-By: Colin Ihrig <[email protected]> Reviewed-By: Chemi Atlow <[email protected]> Reviewed-By: Luigi Pinca <[email protected]> Reviewed-By: Xuguang Mei <[email protected]>
In the non-default parse() path, a key with more than one percent escape could corrupt non-ASCII characters in its value. Keep key characters out of the value's encoding check. Assisted-by: claude:opus-5.5 Signed-off-by: vedchaudhari <[email protected]> PR-URL: nodejs#66553 Refs: nodejs#66175 Reviewed-By: Yagiz Nizipli <[email protected]>
A source without pull() has nothing observable left to do in its post-start step, since the started flag only gates calls into the pull algorithm. Set the flag right away instead of from a microtask, so a push-style ReadableStream allocates neither the closure nor the task and is not kept alive until the next microtask checkpoint. pipeTo and tee hold the only references to their reader and writer, so their [[closedPromise]] records are never observed as promises. Install the watchers as the records themselves, as pipeTo's ready hook already does, instead of materializing a promise plus reaction per side, and hand the erroring/release probes one shared pending promise. The tee's cancel promise is likewise materialized by the first branch cancel. Microtask ordering is unchanged: each hook enqueues its watcher at the position the promise reaction would have had. node benchmark/compare.js --runs 20 over benchmark/webstreams (46 rows, all others within the confidence interval): webstreams/creation.js kind='ReadableStream' *** +172.40% webstreams/creation.js kind='ReadableStream.tee' *** +20.47% webstreams/creation.js kind='ReadableStreamBYOBReader' *** +15.66% webstreams/creation.js kind='ReadableStreamDefaultReader' *** +14.53% webstreams/lifecycle.js kind='pipe-to' (40 runs) ** +10.98% Signed-off-by: Matteo Collina <[email protected]> PR-URL: nodejs#66424 Reviewed-By: Paolo Insogna <[email protected]> Reviewed-By: Gürgün Dayıoğlu <[email protected]> Reviewed-By: James M Snell <[email protected]>
PR-URL: nodejs#66652 Reviewed-By: Colin Ihrig <[email protected]> Reviewed-By: Luigi Pinca <[email protected]>
Signed-off-by: RafaelGSS <[email protected]> PR-URL: nodejs#66649 Reviewed-By: Luigi Pinca <[email protected]> Reviewed-By: Antoine du Hamel <[email protected]>
Call uv_fs_req_cleanup() before returning for directories, otherwise the path buffer allocated by uv_fs_stat() leaks on Windows. Signed-off-by: RafaelGSS <[email protected]> PR-URL: nodejs#66555 Reviewed-By: Ulises Gascón <[email protected]>
Python 3.15 removed CGIHTTPRequestHandler, which WPT pywebsocket3 still uses. This breaks host configuration in the current undici WPT action. Signed-off-by: Filip Skokan <[email protected]> PR-URL: nodejs#66699 Reviewed-By: Mike McCready <[email protected]> Reviewed-By: Richard Lau <[email protected]>
Signed-off-by: RafaelGSS <[email protected]> PR-URL: nodejs#66556 Reviewed-By: Ulises Gascón <[email protected]>
Signed-off-by: James M Snell <[email protected]> PR-URL: nodejs-private/node-private#986 Fixes: https://hackerone.com/reports/3996423 CVE-ID: CVE-2026-106071
Contributor
|
This PR is now outdated due to a release of Node.js 24.x. Backports are difficult to handle for first-time contributors, so I'm not sure if I should recommend you continue with this. Note that Node.js 26 is now the official Active LTS version (26.13.0 was the first release) and the preferred one to be using in general. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
ShouldRetryENOENT) so recursivefs.mkdirstops retrying forever whenmkdirreturnsENOENTeven though the parent exists (e.g. under/proc)./proc/.../deepercase from fs.mkdir(path, { recursive: true }) never returns when an intermediate mkdir fails with ENOENT although its parent exists (e.g. under /proc) #66890.Test plan
python3 tools/test.py parallel/test-fs-mkdir-recursive-enoent parallel/test-heapdump-fs-mkdir-recursivefs.mkdirSync('/proc/nope/deeper', { recursive: true })→ENOENT(no hang)Refs: #66340
Fixes: #66890