Skip to content

Commit f68494d

Browse files
committed
fs: improve error performance for rmdirSync
1 parent 2059913 commit f68494d

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
@@ -1216,9 +1216,7 @@ function rmdirSync(path, options) {
12161216
validateRmdirOptions(options);
12171217
}
12181218

1219-
const ctx = { path };
1220-
binding.rmdir(pathModule.toNamespacedPath(path), undefined, ctx);
1221-
return handleErrorFromBinding(ctx);
1219+
binding.rmdir(pathModule.toNamespacedPath(path));
12221220
}
12231221

12241222
/**

src/node_file.cc

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

14931493
const int argc = args.Length();
1494-
CHECK_GE(argc, 2);
1494+
CHECK_GE(argc, 1);
14951495

14961496
BufferValue path(env->isolate(), args[0]);
14971497
CHECK_NOT_NULL(*path);
14981498
THROW_IF_INSUFFICIENT_PERMISSIONS(
14991499
env, permission::PermissionScope::kFileSystemWrite, path.ToStringView());
15001500

1501-
FSReqBase* req_wrap_async = GetReqWrap(args, 1); // rmdir(path, req)
1502-
if (req_wrap_async != nullptr) {
1501+
if (argc > 1) {
1502+
FSReqBase* req_wrap_async = GetReqWrap(args, 1); // rmdir(path, req)
15031503
FS_ASYNC_TRACE_BEGIN1(
15041504
UV_FS_RMDIR, req_wrap_async, "path", TRACE_STR_COPY(*path))
15051505
AsyncCall(env, req_wrap_async, args, "rmdir", UTF8, AfterNoArgs,
15061506
uv_fs_rmdir, *path);
1507-
} else { // rmdir(path, undefined, ctx)
1508-
CHECK_EQ(argc, 3);
1509-
FSReqWrapSync req_wrap_sync;
1507+
} else { // rmdir(path)
1508+
FSReqWrapSync req_wrap_sync("rmdir", *path);
15101509
FS_SYNC_TRACE_BEGIN(rmdir);
1511-
SyncCall(env, args[2], &req_wrap_sync, "rmdir",
1512-
uv_fs_rmdir, *path);
1510+
SyncCallAndThrowOnError(env, &req_wrap_sync, uv_fs_rmdir, *path);
15131511
FS_SYNC_TRACE_END(rmdir);
15141512
}
15151513
}

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)