Skip to content

Commit

Permalink
namespaceFS directory object - head object fix
Browse files Browse the repository at this point in the history
Signed-off-by: Romy <35330373+romayalon@users.noreply.github.com>
  • Loading branch information
romayalon committed May 20, 2024
1 parent d611dc7 commit 8acd67c
Show file tree
Hide file tree
Showing 2 changed files with 37 additions and 10 deletions.
18 changes: 8 additions & 10 deletions src/sdk/namespace_fs.js
Original file line number Diff line number Diff line change
Expand Up @@ -899,11 +899,9 @@ class NamespaceFS {

const isDir = native_fs_utils.isDirectory(stat);
if (isDir) {
if (!stat.xattr?.[XATTR_DIR_CONTENT]) {
if (!stat.xattr?.[XATTR_DIR_CONTENT] || !params.key.endsWith('/')) {
throw error_utils.new_error_code('ENOENT', 'NoSuchKey');
} else if (stat.xattr?.[XATTR_DIR_CONTENT] === '0') {
stat.size = 0;
} else {
} else if (stat.xattr?.[XATTR_DIR_CONTENT] !== '0') {
// find dir object content file path and return its stat + xattr of its parent directory
const dir_content_path = await this._find_version_path(fs_context, params);
const dir_content_path_stat = await nb_native().fs.stat(fs_context, dir_content_path);
Expand Down Expand Up @@ -2288,19 +2286,19 @@ class NamespaceFS {
const create_time = stat.mtime.getTime();
const encryption = this._get_encryption_info(stat);
const version_id = return_version_id && this._is_versioning_enabled() && this._get_version_id_by_xattr(stat);
const delete_marker = stat.xattr[XATTR_DELETE_MARKER] === 'true';
const dir_content_type = stat.xattr[XATTR_DIR_CONTENT] && ((Number(stat.xattr[XATTR_DIR_CONTENT]) > 0 && 'application/octet-stream') || 'application/x-directory');
const content_type = stat.xattr[XATTR_CONTENT_TYPE] ||
const delete_marker = stat.xattr?.[XATTR_DELETE_MARKER] === 'true';
const dir_content_type = stat.xattr?.[XATTR_DIR_CONTENT] && ((Number(stat.xattr?.[XATTR_DIR_CONTENT]) > 0 && 'application/octet-stream') || 'application/x-directory');
const content_type = stat.xattr?.[XATTR_CONTENT_TYPE] ||
(isDir && dir_content_type) ||
mime.getType(key) || 'application/octet-stream';

const storage_class = s3_utils.parse_storage_class(stat.xattr[XATTR_STORAGE_CLASS_KEY]);
const storage_class = s3_utils.parse_storage_class(stat.xattr?.[XATTR_STORAGE_CLASS_KEY]);
const size = Number(stat.xattr?.[XATTR_DIR_CONTENT] || stat.size);

return {
obj_id: etag,
bucket,
key,
size: stat.size,
size,
etag,
create_time,
content_type,
Expand Down
29 changes: 29 additions & 0 deletions src/test/unit_tests/test_namespace_fs.js
Original file line number Diff line number Diff line change
Expand Up @@ -829,6 +829,19 @@ mocha.describe('namespace_fs folders tests', function() {
}));
});

mocha.it(`read folder object md - key doesn't end with /`, async function() {
try {
await ns_tmp.read_object_md({
bucket: upload_bkt,
key: upload_key_1.slice(0, upload_key_1.length - 1),
}, dummy_object_sdk);
assert.fail('should have failed with ENOENT');
} catch (err) {
assert.equal(err.code, 'ENOENT');
assert.equal(err.rpc_code, 'NO_SUCH_OBJECT');
}
});

mocha.it(`read folder object md full md`, async function() {
const get_md_res = await ns_tmp.read_object_md({
bucket: upload_bkt,
Expand Down Expand Up @@ -938,6 +951,22 @@ mocha.describe('namespace_fs folders tests', function() {
});


mocha.it(`read folder object > 0 content - should return size 100`, async function() {
const res = await ns_tmp.list_objects({
bucket: upload_bkt,
prefix: upload_key_1
}, dummy_object_sdk);
assert.equal(res.objects.find(obj => obj.key === upload_key_1).size, 100);
});

mocha.it(`read folder object = 0 content - should return size 0`, async function() {
const res = await ns_tmp.list_objects({
bucket: upload_bkt,
prefix: upload_key_3
}, dummy_object_sdk);
assert.equal(res.objects.find(obj => obj.key === upload_key_3).size, 0);
});

mocha.it(`read folder object > 0 content - should return data`, async function() {
const read_res = buffer_utils.write_stream();
await ns_tmp.read_object_stream({
Expand Down

0 comments on commit 8acd67c

Please sign in to comment.