Skip to content

Commit e1c7fc3

Browse files
authored
DAOS-17523 dfs: Show dir/file object classes correctly (#17956)
client/dfs/mnt/dfs_query() updated to lookup file and directory object classes if default attributes fields are 0 Signed-off-by: Oleg Neverovitch oleg.neverovitch@hpe.com
1 parent 72f5677 commit e1c7fc3

3 files changed

Lines changed: 46 additions & 0 deletions

File tree

src/client/dfs/mnt.c

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
#include <math.h>
1313
#include <daos/common.h>
1414
#include <daos/container.h>
15+
#include <daos/object.h>
1516

1617
#include "dfs_internal.h"
1718

@@ -828,11 +829,31 @@ dfs_cont_put(dfs_t *dfs, daos_handle_t coh)
828829
int
829830
dfs_query(dfs_t *dfs, dfs_attr_t *attr)
830831
{
832+
int rc;
833+
831834
if (dfs == NULL || !dfs->mounted || attr == NULL)
832835
return EINVAL;
833836

834837
memcpy(attr, &dfs->attr, sizeof(dfs_attr_t));
835838

839+
if (!dfs->attr.da_dir_oclass_id) {
840+
rc = daos_obj_get_oclass(dfs->coh, DAOS_OT_MULTI_HASHED, 0, 0,
841+
&attr->da_dir_oclass_id);
842+
if (rc) {
843+
D_ERROR("daos_obj_get_oclass() failed " DF_RC "\n", DP_RC(rc));
844+
return daos_der2errno(rc);
845+
}
846+
}
847+
848+
if (!dfs->attr.da_file_oclass_id) {
849+
rc = daos_obj_get_oclass(dfs->coh, DAOS_OT_ARRAY_BYTE, 0, 0,
850+
&attr->da_file_oclass_id);
851+
if (rc) {
852+
D_ERROR("daos_obj_get_oclass() failed " DF_RC "\n", DP_RC(rc));
853+
return daos_der2errno(rc);
854+
}
855+
}
856+
836857
return 0;
837858
}
838859

src/tests/suite/dfs_unit_test.c

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,8 @@ dfs_test_mount(void **state)
4343
daos_handle_t poh_tmp, coh_tmp;
4444
dfs_t *dfs;
4545
int rc;
46+
dfs_attr_t attr = {0};
47+
daos_oclass_id_t exp_doc, exp_foc;
4648

4749
if (arg->myrank != 0)
4850
return;
@@ -84,6 +86,17 @@ dfs_test_mount(void **state)
8486
assert_rc_equal(rc, 0);
8587
rc = dfs_mount(arg->pool.poh, coh, O_RDWR, &dfs);
8688
assert_int_equal(rc, 0);
89+
90+
/** check if dir/file oclass is what is expected*/
91+
rc = dfs_query(dfs, &attr);
92+
assert_rc_equal(rc, 0);
93+
rc = daos_obj_get_oclass(coh, DAOS_OT_MULTI_HASHED, 0, 0, &exp_doc);
94+
assert_rc_equal(rc, 0);
95+
assert_int_equal(attr.da_dir_oclass_id, exp_doc);
96+
rc = daos_obj_get_oclass(coh, DAOS_OT_ARRAY_BYTE, 0, 0, &exp_foc);
97+
assert_rc_equal(rc, 0);
98+
assert_int_equal(attr.da_file_oclass_id, exp_foc);
99+
87100
rc = dfs_umount(dfs);
88101
assert_int_equal(rc, 0);
89102
rc = daos_cont_close(coh, NULL);

utils/node_local_test.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2130,6 +2130,18 @@ def test_cont_list(self):
21302130
@needs_dfuse_with_opt(caching=False)
21312131
def test_oclass(self):
21322132
"""Test container object class options"""
2133+
2134+
container = create_cont(self.conf, self.pool, ctype="POSIX", label='oclass_test')
2135+
rc = run_daos_cmd(self.conf,
2136+
['container', 'query',
2137+
self.pool.id(), container.id()],
2138+
show_stdout=True, use_json=True)
2139+
print(rc)
2140+
assert rc.returncode == 0
2141+
assert rc.json['response'].get('dir_object_class') not in (None, 'UNKNOWN')
2142+
assert rc.json['response'].get('file_object_class') not in (None, 'UNKNOWN')
2143+
container.destroy()
2144+
21332145
container = create_cont(self.conf, self.pool, ctype="POSIX", label='oclass_test',
21342146
oclass='S1', dir_oclass='S2', file_oclass='S4')
21352147
rc = run_daos_cmd(self.conf,

0 commit comments

Comments
 (0)