From 2f27896792d9f1e5faa5ad41ddcdd0b321f507c4 Mon Sep 17 00:00:00 2001 From: nadav mizrahi Date: Wed, 19 Feb 2025 19:51:21 +0200 Subject: [PATCH] NSFS | close stream when getting empty content dir Signed-off-by: nadav mizrahi --- src/sdk/namespace_fs.js | 7 ++++++- src/test/unit_tests/test_namespace_fs.js | 25 +++++++++++++++++++++++- 2 files changed, 30 insertions(+), 2 deletions(-) diff --git a/src/sdk/namespace_fs.js b/src/sdk/namespace_fs.js index b27f2689e0..1ed3ddbecf 100644 --- a/src/sdk/namespace_fs.js +++ b/src/sdk/namespace_fs.js @@ -1022,7 +1022,12 @@ class NamespaceFS { // NOTE: don't move this code after the open // this can lead to ENOENT failures due to file not exists when content size is 0 // if entry is a directory object and its content size = 0 - return empty response - if (await this._is_empty_directory_content(file_path, fs_context, params)) return null; + if (await this._is_empty_directory_content(file_path, fs_context, params)) { + res.end(); + // since we don't write anything to the stream wait_finished might not be needed. added just in case there is a delay + await stream_utils.wait_finished(res, { signal: object_sdk.abort_controller.signal }); + return null; + } file = await nb_native().fs.open( fs_context, diff --git a/src/test/unit_tests/test_namespace_fs.js b/src/test/unit_tests/test_namespace_fs.js index 8bed65b03f..9f9efb00cf 100644 --- a/src/test/unit_tests/test_namespace_fs.js +++ b/src/test/unit_tests/test_namespace_fs.js @@ -547,6 +547,7 @@ mocha.describe('namespace_fs', function() { const dir_2 = '/a/b/'; const upload_key_1 = dir_1 + 'upload_key_1/'; const upload_key_2 = dir_2 + 'upload_key_2/'; + const upload_key_empty = 'empty_key/'; const data = crypto.randomBytes(100); mocha.before(async function() { @@ -558,6 +559,22 @@ mocha.describe('namespace_fs', function() { console.log('upload_object with trailing / response', inspect(upload_res)); }); + mocha.it('get empty content dir', async function() { + await ns_tmp.upload_object({ + bucket: upload_bkt, + key: upload_key_empty, + source_stream: buffer_utils.buffer_to_read_stream(crypto.randomBytes(0)), + size: 0 + }, dummy_object_sdk); + + const read_res = buffer_utils.write_stream(); + await ns_tmp.read_object_stream({ + bucket: upload_bkt, + key: upload_key_empty, + }, dummy_object_sdk, read_res); + assert(read_res.writableEnded); + }); + mocha.it(`delete the path - stop when not empty and key with trailing /`, async function() { const upload_res = await ns_tmp.upload_object({ bucket: upload_bkt, @@ -574,11 +591,17 @@ mocha.describe('namespace_fs', function() { }); mocha.after(async function() { - const delete_res = await ns_tmp.delete_object({ + let delete_res = await ns_tmp.delete_object({ bucket: upload_bkt, key: upload_key_2, }, dummy_object_sdk); console.log('delete_object with trailing / (key 2) response', inspect(delete_res)); + + delete_res = await ns_tmp.delete_object({ + bucket: upload_bkt, + key: upload_key_empty, + }, dummy_object_sdk); + console.log('delete_object with trailing / (empty content dir) response', inspect(delete_res)); }); });