Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit 31e837c

Browse files
CanadaHonkLei Shi
authored and
Lei Shi
committedNov 27, 2023
fs: improve error performance for rmdirSync
PR-URL: nodejs#49846 Refs: nodejs/performance#106 Reviewed-By: Yagiz Nizipli <[email protected]> Reviewed-By: Joyee Cheung <[email protected]> Reviewed-By: Vinícius Lourenço Claro Cardoso <[email protected]>
1 parent 810905c commit 31e837c

File tree

4 files changed

+50
-12
lines changed

4 files changed

+50
-12
lines changed
 

‎benchmark/fs/bench-rmdirSync.js

+42
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
'use strict';
2+
3+
const common = require('../common');
4+
const fs = require('fs');
5+
const tmpdir = require('../../test/common/tmpdir');
6+
tmpdir.refresh();
7+
8+
const bench = common.createBenchmark(main, {
9+
type: ['existing', 'non-existing'],
10+
n: [1e4],
11+
});
12+
13+
function main({ n, type }) {
14+
switch (type) {
15+
case 'existing': {
16+
for (let i = 0; i < n; i++) {
17+
fs.mkdirSync(tmpdir.resolve(`rmdirsync-bench-dir-${i}`));
18+
}
19+
20+
bench.start();
21+
for (let i = 0; i < n; i++) {
22+
fs.rmdirSync(tmpdir.resolve(`rmdirsync-bench-dir-${i}`));
23+
}
24+
bench.end(n);
25+
break;
26+
}
27+
case 'non-existing': {
28+
bench.start();
29+
for (let i = 0; i < n; i++) {
30+
try {
31+
fs.rmdirSync(tmpdir.resolve(`.non-existent-folder-${i}`));
32+
} catch {
33+
// do nothing
34+
}
35+
}
36+
bench.end(n);
37+
break;
38+
}
39+
default:
40+
new Error('Invalid type');
41+
}
42+
}

‎lib/fs.js

+1-3
Original file line numberDiff line numberDiff line change
@@ -1218,9 +1218,7 @@ function rmdirSync(path, options) {
12181218
validateRmdirOptions(options);
12191219
}
12201220

1221-
const ctx = { path };
1222-
binding.rmdir(pathModule.toNamespacedPath(path), undefined, ctx);
1223-
return handleErrorFromBinding(ctx);
1221+
binding.rmdir(pathModule.toNamespacedPath(path));
12241222
}
12251223

12261224
/**

‎src/node_file.cc

+6-8
Original file line numberDiff line numberDiff line change
@@ -1500,25 +1500,23 @@ static void RMDir(const FunctionCallbackInfo<Value>& args) {
15001500
Environment* env = Environment::GetCurrent(args);
15011501

15021502
const int argc = args.Length();
1503-
CHECK_GE(argc, 2);
1503+
CHECK_GE(argc, 1);
15041504

15051505
BufferValue path(env->isolate(), args[0]);
15061506
CHECK_NOT_NULL(*path);
15071507
THROW_IF_INSUFFICIENT_PERMISSIONS(
15081508
env, permission::PermissionScope::kFileSystemWrite, path.ToStringView());
15091509

1510-
FSReqBase* req_wrap_async = GetReqWrap(args, 1); // rmdir(path, req)
1511-
if (req_wrap_async != nullptr) {
1510+
if (argc > 1) {
1511+
FSReqBase* req_wrap_async = GetReqWrap(args, 1); // rmdir(path, req)
15121512
FS_ASYNC_TRACE_BEGIN1(
15131513
UV_FS_RMDIR, req_wrap_async, "path", TRACE_STR_COPY(*path))
15141514
AsyncCall(env, req_wrap_async, args, "rmdir", UTF8, AfterNoArgs,
15151515
uv_fs_rmdir, *path);
1516-
} else { // rmdir(path, undefined, ctx)
1517-
CHECK_EQ(argc, 3);
1518-
FSReqWrapSync req_wrap_sync;
1516+
} else { // rmdir(path)
1517+
FSReqWrapSync req_wrap_sync("rmdir", *path);
15191518
FS_SYNC_TRACE_BEGIN(rmdir);
1520-
SyncCall(env, args[2], &req_wrap_sync, "rmdir",
1521-
uv_fs_rmdir, *path);
1519+
SyncCallAndThrowOnError(env, &req_wrap_sync, uv_fs_rmdir, *path);
15221520
FS_SYNC_TRACE_END(rmdir);
15231521
}
15241522
}

‎typings/internalBinding/fs.d.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -191,7 +191,7 @@ declare namespace InternalFSBinding {
191191
function rename(oldPath: string, newPath: string): void;
192192

193193
function rmdir(path: string, req: FSReqCallback): void;
194-
function rmdir(path: string, req: undefined, ctx: FSSyncContext): void;
194+
function rmdir(path: string): void;
195195
function rmdir(path: string, usePromises: typeof kUsePromises): Promise<void>;
196196

197197
function stat(path: StringOrBuffer, useBigint: boolean, req: FSReqCallback<Float64Array | BigUint64Array>): void;

0 commit comments

Comments
 (0)
Please sign in to comment.