Skip to content

Commit 0d59dda

Browse files
CanadaHonkUlisesGascon
authored andcommitted
fs: improve error performance for rmdirSync
PR-URL: #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 0d04c8a commit 0d59dda

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
@@ -1220,9 +1220,7 @@ function rmdirSync(path, options) {
12201220
validateRmdirOptions(options);
12211221
}
12221222

1223-
const ctx = { path };
1224-
binding.rmdir(pathModule.toNamespacedPath(path), undefined, ctx);
1225-
return handleErrorFromBinding(ctx);
1223+
binding.rmdir(pathModule.toNamespacedPath(path));
12261224
}
12271225

12281226
/**

src/node_file.cc

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

15901590
const int argc = args.Length();
1591-
CHECK_GE(argc, 2);
1591+
CHECK_GE(argc, 1);
15921592

15931593
BufferValue path(env->isolate(), args[0]);
15941594
CHECK_NOT_NULL(*path);
15951595
THROW_IF_INSUFFICIENT_PERMISSIONS(
15961596
env, permission::PermissionScope::kFileSystemWrite, path.ToStringView());
15971597

1598-
FSReqBase* req_wrap_async = GetReqWrap(args, 1); // rmdir(path, req)
1599-
if (req_wrap_async != nullptr) {
1598+
if (argc > 1) {
1599+
FSReqBase* req_wrap_async = GetReqWrap(args, 1); // rmdir(path, req)
16001600
FS_ASYNC_TRACE_BEGIN1(
16011601
UV_FS_RMDIR, req_wrap_async, "path", TRACE_STR_COPY(*path))
16021602
AsyncCall(env, req_wrap_async, args, "rmdir", UTF8, AfterNoArgs,
16031603
uv_fs_rmdir, *path);
1604-
} else { // rmdir(path, undefined, ctx)
1605-
CHECK_EQ(argc, 3);
1606-
FSReqWrapSync req_wrap_sync;
1604+
} else { // rmdir(path)
1605+
FSReqWrapSync req_wrap_sync("rmdir", *path);
16071606
FS_SYNC_TRACE_BEGIN(rmdir);
1608-
SyncCall(env, args[2], &req_wrap_sync, "rmdir",
1609-
uv_fs_rmdir, *path);
1607+
SyncCallAndThrowOnError(env, &req_wrap_sync, uv_fs_rmdir, *path);
16101608
FS_SYNC_TRACE_END(rmdir);
16111609
}
16121610
}

typings/internalBinding/fs.d.ts

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

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

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

0 commit comments

Comments
 (0)