Skip to content

Commit 2f0d13a

Browse files
committed
src: change how fd counter is done
Because of a recent change in Node.js it is necessary to move where open/close fd's are tracked. Also update the test to check additional cases, and remove the check for GC close cleanup since it's deprecated.
1 parent 6e7e03a commit 2f0d13a

File tree

3 files changed

+42
-44
lines changed

3 files changed

+42
-44
lines changed

src/node_file-inl.h

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -352,12 +352,6 @@ int SyncCall(Environment* env, v8::Local<v8::Value> ctx,
352352
ctx_obj->Set(context,
353353
env->syscall_string(),
354354
OneByteString(isolate, syscall)).Check();
355-
} else {
356-
if (strncmp(syscall, "open", 4) == 0) {
357-
env->envinst_->inc_fs_handles_opened();
358-
} else if (strncmp(syscall, "close", 5) == 0) {
359-
env->envinst_->inc_fs_handles_closed();
360-
}
361355
}
362356
return err;
363357
}

src/node_file.cc

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1020,6 +1020,7 @@ void Close(const FunctionCallbackInfo<Value>& args) {
10201020
FS_SYNC_TRACE_BEGIN(close);
10211021
SyncCallAndThrowOnError(env, &req_wrap_sync, uv_fs_close, fd);
10221022
FS_SYNC_TRACE_END(close);
1023+
env->envinst_->inc_fs_handles_closed();
10231024
}
10241025
}
10251026

@@ -2038,6 +2039,7 @@ static void Open(const FunctionCallbackInfo<Value>& args) {
20382039
FS_SYNC_TRACE_END(open);
20392040
if (is_uv_error(result)) return;
20402041
env->AddUnmanagedFd(result);
2042+
env->envinst_->inc_fs_handles_opened();
20412043
args.GetReturnValue().Set(result);
20422044
}
20432045
}
@@ -2079,6 +2081,7 @@ static void OpenFileHandle(const FunctionCallbackInfo<Value>& args) {
20792081
}
20802082
FileHandle* fd = FileHandle::New(binding_data, result);
20812083
if (fd == nullptr) return;
2084+
env->envinst_->inc_fs_handles_opened();
20822085
args.GetReturnValue().Set(fd->object());
20832086
}
20842087
}

test/parallel/test-nsolid-file-handle-count.js

Lines changed: 39 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,9 @@ const fs = require('fs');
99
const baseOpened = nsolid.metrics().fsHandlesOpenedCount;
1010
const baseClosed = nsolid.metrics().fsHandlesClosedCount;
1111

12+
let oCntr = 0;
13+
let cCntr = 0;
14+
1215
function getOpened() {
1316
return nsolid.metrics().fsHandlesOpenedCount - baseOpened;
1417
}
@@ -23,54 +26,52 @@ try {
2326
// It's meant to throw and the exception is to be ignored.
2427
}
2528

26-
assert.strictEqual(getOpened(), 0);
27-
assert.strictEqual(getClosed(), 0);
29+
assert.strictEqual(getOpened(), oCntr);
30+
assert.strictEqual(getClosed(), cCntr);
2831

2932
const fd = fs.openSync(__filename);
30-
assert.strictEqual(getOpened(), 1);
31-
assert.strictEqual(getClosed(), 0);
33+
assert.strictEqual(getOpened(), ++oCntr);
34+
assert.strictEqual(getClosed(), cCntr);
3235

3336
fs.closeSync(fd);
34-
assert.strictEqual(getOpened(), 1);
35-
assert.strictEqual(getClosed(), 1);
37+
assert.strictEqual(getOpened(), oCntr);
38+
assert.strictEqual(getClosed(), ++cCntr);
39+
40+
fs.readFileSync(__filename);
41+
assert.strictEqual(getOpened(), ++oCntr);
42+
assert.strictEqual(getClosed(), ++cCntr);
3643

37-
fs.open(__filename, common.mustCall((err, fd) => {
38-
assert.ok(!err);
39-
assert.strictEqual(getOpened(), 2);
40-
assert.strictEqual(getClosed(), 1);
44+
fs.readFile(__filename, () => {
45+
assert.strictEqual(getOpened(), ++oCntr);
46+
assert.strictEqual(getClosed(), ++cCntr);
4147

42-
fs.close(fd, common.mustCall((err) => {
48+
fs.open(__filename, common.mustCall((err, fd) => {
4349
assert.ok(!err);
44-
assert.strictEqual(getOpened(), 2);
45-
assert.strictEqual(getClosed(), 2);
46-
47-
checkPromise().then(common.mustCall(() => {
48-
openFileHandle();
49-
setTimeout(() => {
50-
// The FileHandle should be out-of-scope and no longer accessed now.
51-
global.gc();
52-
setImmediate(() => {
53-
assert.strictEqual(getOpened(), 4);
54-
assert.strictEqual(getClosed(), 4);
55-
});
56-
}, 100);
57-
})).catch(common.mustNotCall());
50+
assert.strictEqual(getOpened(), ++oCntr);
51+
assert.strictEqual(getClosed(), cCntr);
52+
53+
fs.close(fd, common.mustCall((err) => {
54+
assert.ok(!err);
55+
assert.strictEqual(getOpened(), oCntr);
56+
assert.strictEqual(getClosed(), ++cCntr);
57+
58+
checkPromise()
59+
.then(common.mustCall(closePromiseFd))
60+
.catch(common.mustNotCall());
61+
}));
5862
}));
59-
}));
63+
});
6064

6165
async function checkPromise() {
62-
let fh = await fs.promises.open(__filename);
63-
assert.strictEqual(getOpened(), 3);
64-
assert.strictEqual(getClosed(), 2);
65-
fh = await fh.close();
66-
assert.strictEqual(fh, undefined);
67-
assert.strictEqual(getOpened(), 3);
68-
assert.strictEqual(getClosed(), 3);
66+
const fh = await fs.promises.open(__filename);
67+
assert.strictEqual(getOpened(), ++oCntr);
68+
assert.strictEqual(getClosed(), cCntr);
69+
return fh;
6970
}
7071

71-
async function openFileHandle() {
72-
const fh = await fs.promises.open(__filename);
73-
console.log(fh);
74-
assert.strictEqual(getOpened(), 4);
75-
assert.strictEqual(getClosed(), 3);
72+
async function closePromiseFd(fh) {
73+
fh = await fh.close();
74+
assert.strictEqual(fh, undefined);
75+
assert.strictEqual(getOpened(), oCntr);
76+
assert.strictEqual(getClosed(), ++cCntr);
7677
}

0 commit comments

Comments
 (0)