Skip to content

Commit 135a8b7

Browse files
committed
fs: trace more fs api
1 parent 806ea92 commit 135a8b7

File tree

3 files changed

+91
-2
lines changed

3 files changed

+91
-2
lines changed

src/node_dir.cc

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,9 @@ void DirHandle::MemoryInfo(MemoryTracker* tracker) const {
135135
inline void DirHandle::GCClose() {
136136
if (closed_) return;
137137
uv_fs_t req;
138+
FS_DIR_SYNC_TRACE_BEGIN(closedir);
138139
int ret = uv_fs_closedir(nullptr, &req, dir_, nullptr);
140+
FS_DIR_SYNC_TRACE_END(closedir);
139141
uv_fs_req_cleanup(&req);
140142
closing_ = false;
141143
closed_ = true;

src/node_file.cc

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -302,7 +302,9 @@ FileHandle::TransferData::~TransferData() {
302302
if (fd_ > 0) {
303303
uv_fs_t close_req;
304304
CHECK_NE(fd_, -1);
305+
FS_SYNC_TRACE_BEGIN(close);
305306
CHECK_EQ(0, uv_fs_close(nullptr, &close_req, fd_, nullptr));
307+
FS_SYNC_TRACE_END(close);
306308
uv_fs_req_cleanup(&close_req);
307309
}
308310
}
@@ -327,7 +329,9 @@ inline void FileHandle::Close() {
327329
if (closed_ || closing_) return;
328330
uv_fs_t req;
329331
CHECK_NE(fd_, -1);
332+
FS_SYNC_TRACE_BEGIN(close);
330333
int ret = uv_fs_close(env()->event_loop(), &req, fd_, nullptr);
334+
FS_SYNC_TRACE_END(close);
331335
uv_fs_req_cleanup(&req);
332336

333337
struct err_detail { int ret; int fd; };
@@ -460,7 +464,10 @@ MaybeLocal<Promise> FileHandle::ClosePromise() {
460464

461465
CloseReq* req = new CloseReq(env(), close_req_obj, promise, object());
462466
auto AfterClose = uv_fs_callback_t{[](uv_fs_t* req) {
463-
BaseObjectPtr<CloseReq> close(CloseReq::from_req(req));
467+
CloseReq* req_wrap = CloseReq::from_req(req);
468+
FS_ASYNC_TRACE_END1(
469+
req->fs_type, req_wrap, "result", static_cast<int>(req->result))
470+
BaseObjectPtr<CloseReq> close(req_wrap);
464471
CHECK(close);
465472
close->file_handle()->AfterClose();
466473
if (!close->env()->can_call_into_js()) return;
@@ -474,6 +481,7 @@ MaybeLocal<Promise> FileHandle::ClosePromise() {
474481
}
475482
}};
476483
CHECK_NE(fd_, -1);
484+
FS_ASYNC_TRACE_BEGIN0(UV_FS_CLOSE, req)
477485
int ret = req->Dispatch(uv_fs_close, fd_, AfterClose);
478486
if (ret < 0) {
479487
req->Reject(UVException(isolate, ret, "close"));
@@ -569,7 +577,7 @@ int FileHandle::ReadStart() {
569577
read_wrap->buffer_ = EmitAlloc(recommended_read);
570578

571579
current_read_ = std::move(read_wrap);
572-
580+
FS_ASYNC_TRACE_BEGIN0(UV_FS_READ, current_read_.get())
573581
current_read_->Dispatch(uv_fs_read,
574582
fd_,
575583
&current_read_->buffer_,
@@ -579,6 +587,8 @@ int FileHandle::ReadStart() {
579587
FileHandle* handle;
580588
{
581589
FileHandleReadWrap* req_wrap = FileHandleReadWrap::from_req(req);
590+
FS_ASYNC_TRACE_END1(
591+
req->fs_type, req_wrap, "result", static_cast<int>(req->result))
582592
handle = req_wrap->file_handle_;
583593
CHECK_EQ(handle->current_read_.get(), req_wrap);
584594
}
@@ -652,9 +662,12 @@ int FileHandle::DoShutdown(ShutdownWrap* req_wrap) {
652662
FileHandleCloseWrap* wrap = static_cast<FileHandleCloseWrap*>(req_wrap);
653663
closing_ = true;
654664
CHECK_NE(fd_, -1);
665+
FS_ASYNC_TRACE_BEGIN0(UV_FS_CLOSE, wrap)
655666
wrap->Dispatch(uv_fs_close, fd_, uv_fs_callback_t{[](uv_fs_t* req) {
656667
FileHandleCloseWrap* wrap = static_cast<FileHandleCloseWrap*>(
657668
FileHandleCloseWrap::from_req(req));
669+
FS_ASYNC_TRACE_END1(
670+
req->fs_type, wrap, "result", static_cast<int>(req->result))
658671
FileHandle* handle = static_cast<FileHandle*>(wrap->stream());
659672
handle->AfterClose();
660673

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
'use strict';
2+
const common = require('../common');
3+
const assert = require('assert');
4+
const cp = require('child_process');
5+
const fs = require('fs');
6+
const path = require('path');
7+
8+
if (process.env.isChild === '1') {
9+
const { open, opendir } = require('fs/promises');
10+
const trace_events = require('trace_events');
11+
const tracing = trace_events.createTracing({ categories: ['node.fs.async', 'node.fs.sync', 'node.fs_dir.sync'] });
12+
tracing.enable();
13+
(async function test() {
14+
// Call FileHandle::Close(const FunctionCallbackInfo<Value>& args)
15+
{
16+
let filehandle = null;
17+
try {
18+
filehandle = await open(__filename, 'r');
19+
} finally {
20+
await filehandle.close();
21+
}
22+
}
23+
// Call void FileHandle::Close() during gc
24+
{
25+
let filehandle = null;
26+
try {
27+
filehandle = await open(__filename, 'r');
28+
} finally {
29+
// eslint-disable-next-line no-unused-vars
30+
filehandle = null;
31+
}
32+
}
33+
// Call void DirHandle::GCClose() during gc
34+
{
35+
let dir = await opendir('.');
36+
// eslint-disable-next-line no-unused-vars
37+
dir = null;
38+
}
39+
global.gc();
40+
})().then(common.mustCall());
41+
return;
42+
}
43+
44+
const tmpdir = require('../common/tmpdir');
45+
tmpdir.refresh();
46+
const traceFile = path.join(tmpdir.path, 'node_trace.1.log');
47+
48+
cp.spawnSync(process.execPath,
49+
['--expose-gc', __filename],
50+
{ cwd: tmpdir.path, encoding: 'utf8', env: { ...process.env, isChild: '1' } });
51+
52+
assert(fs.existsSync(traceFile));
53+
const data = fs.readFileSync(traceFile);
54+
const traces = JSON.parse(data.toString()).traceEvents;
55+
assert(traces.length > 0);
56+
57+
let syncClose = 0;
58+
let asyncClose = 0;
59+
let syncCloseDir = 0;
60+
61+
traces.forEach((trace) => {
62+
if (trace.cat === 'node,node.fs,node.fs.sync' && trace.name === 'fs.sync.close') {
63+
syncClose++;
64+
} else if (trace.cat === 'node,node.fs,node.fs.async' && trace.name === 'close') {
65+
asyncClose++;
66+
} else if (trace.cat === 'node,node.fs_dir,node.fs_dir.sync' && trace.name === 'fs_dir.sync.closedir') {
67+
syncCloseDir++;
68+
}
69+
});
70+
71+
// One begin event, one end event
72+
assert.strictEqual(syncClose, 2);
73+
assert.strictEqual(asyncClose, 2);
74+
assert.strictEqual(syncCloseDir, 2);

0 commit comments

Comments
 (0)