Skip to content

Commit b612de7

Browse files
committed
DAOS-16837 container: Add client-side DFS metrics (#15544)
If metrics are enabled for a POSIX container, create a new pool/$UUID/container/$UUID/dfs metrics root in the client telemetry to provide DFS-oriented metrics (POSIX ops, file I/Os, etc). Also fixes a bug in the agent code for pruning unused client telemetry segments. Required-githooks: true Signed-off-by: Michael MacDonald <mjmac@google.com>
1 parent 806b655 commit b612de7

File tree

24 files changed

+631
-25
lines changed

24 files changed

+631
-25
lines changed

src/client/dfs/SConscript

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ def scons():
4444
libraries = ['daos_common', 'daos', 'uuid', 'gurt']
4545

4646
dfs_src = ['common.c', 'cont.c', 'dir.c', 'file.c', 'io.c', 'lookup.c', 'mnt.c', 'obj.c',
47-
'pipeline.c', 'readdir.c', 'rename.c', 'xattr.c', 'dfs_sys.c']
47+
'pipeline.c', 'readdir.c', 'rename.c', 'xattr.c', 'dfs_sys.c', 'metrics.c']
4848
dfs = denv.d_library('dfs', dfs_src, LIBS=libraries)
4949
denv.Install('$PREFIX/lib64/', dfs)
5050

src/client/dfs/common.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -625,6 +625,8 @@ entry_stat(dfs_t *dfs, daos_handle_t th, daos_handle_t oh, const char *name, siz
625625
stbuf->st_atim.tv_sec = stbuf->st_mtim.tv_sec;
626626
stbuf->st_atim.tv_nsec = stbuf->st_mtim.tv_nsec;
627627
}
628+
629+
DFS_OP_STAT_INCR(dfs, DOS_STAT);
628630
return 0;
629631
}
630632

@@ -710,6 +712,7 @@ open_dir(dfs_t *dfs, dfs_obj_t *parent, int flags, daos_oclass_id_t cid, struct
710712
D_ASSERT(rc == 0);
711713
dir->d.chunk_size = entry->chunk_size;
712714
dir->d.oclass = entry->oclass;
715+
DFS_OP_STAT_INCR(dfs, DOS_MKDIR);
713716
return 0;
714717
}
715718
}
@@ -742,6 +745,7 @@ open_dir(dfs_t *dfs, dfs_obj_t *parent, int flags, daos_oclass_id_t cid, struct
742745
oid_cp(&dir->oid, entry->oid);
743746
dir->d.chunk_size = entry->chunk_size;
744747
dir->d.oclass = entry->oclass;
748+
DFS_OP_STAT_INCR(dfs, DOS_OPENDIR);
745749
return 0;
746750
}
747751

src/client/dfs/dfs_internal.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515
#include <daos.h>
1616
#include <daos_fs.h>
1717

18+
#include "metrics.h"
19+
1820
/** D-key name of SB metadata */
1921
#define SB_DKEY "DFS_SB_METADATA"
2022

@@ -105,6 +107,8 @@ typedef uint16_t dfs_layout_ver_t;
105107

106108
/** object struct that is instantiated for a DFS open object */
107109
struct dfs_obj {
110+
/** DFS mount point of object */
111+
dfs_t *dfs;
108112
/** DAOS object ID */
109113
daos_obj_id_t oid;
110114
/** DAOS object open handle */
@@ -184,6 +188,8 @@ struct dfs {
184188
struct dfs_mnt_hdls *cont_hdl;
185189
/** the root dir stat buf */
186190
struct stat root_stbuf;
191+
/** DFS top-level metrics */
192+
struct dfs_metrics *metrics;
187193
};
188194

189195
struct dfs_entry {

src/client/dfs/dir.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ dfs_mkdir(dfs_t *dfs, dfs_obj_t *parent, const char *name, mode_t mode, daos_ocl
6565
if (rc != 0)
6666
return daos_der2errno(rc);
6767

68+
DFS_OP_STAT_INCR(dfs, DOS_MKDIR);
6869
return rc;
6970
}
7071

@@ -220,6 +221,7 @@ dfs_remove(dfs_t *dfs, dfs_obj_t *parent, const char *name, bool force, daos_obj
220221
if (oid)
221222
oid_cp(oid, entry.oid);
222223

224+
DFS_OP_STAT_INCR(dfs, DOS_UNLINK);
223225
out:
224226
rc = check_tx(th, rc);
225227
if (rc == ERESTART)

src/client/dfs/io.c

Lines changed: 42 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,20 @@
1515

1616
#include "dfs_internal.h"
1717

18+
static void
19+
dfs_update_file_metrics(dfs_t *dfs, daos_size_t read_bytes, daos_size_t write_bytes)
20+
{
21+
if (dfs == NULL || dfs->metrics == NULL)
22+
return;
23+
24+
if (read_bytes > 0)
25+
d_tm_inc_gauge(dfs->metrics->dm_read_bytes, read_bytes);
26+
if (write_bytes > 0)
27+
d_tm_inc_gauge(dfs->metrics->dm_write_bytes, write_bytes);
28+
}
29+
1830
struct dfs_read_params {
31+
dfs_t *dfs;
1932
daos_size_t *read_size;
2033
daos_array_iod_t arr_iod;
2134
daos_range_t rg;
@@ -35,6 +48,8 @@ read_cb(tse_task_t *task, void *data)
3548
D_GOTO(out, rc);
3649
}
3750

51+
DFS_OP_STAT_INCR(params->dfs, DOS_READ);
52+
dfs_update_file_metrics(params->dfs, params->arr_iod.arr_nr_read, 0);
3853
*params->read_size = params->arr_iod.arr_nr_read;
3954
out:
4055
D_FREE(params);
@@ -61,6 +76,7 @@ dfs_read_int(dfs_t *dfs, dfs_obj_t *obj, daos_off_t off, dfs_iod_t *iod, d_sg_li
6176
if (params == NULL)
6277
D_GOTO(err_task, rc = -DER_NOMEM);
6378

79+
params->dfs = dfs;
6480
params->read_size = read_size;
6581

6682
/** set array location */
@@ -90,6 +106,7 @@ dfs_read_int(dfs_t *dfs, dfs_obj_t *obj, daos_off_t off, dfs_iod_t *iod, d_sg_li
90106
* completion cb that frees params in this case, so we can just ignore the rc here.
91107
*/
92108
dc_task_schedule(task, true);
109+
93110
return 0;
94111

95112
err_params:
@@ -125,6 +142,7 @@ dfs_read(dfs_t *dfs, dfs_obj_t *obj, d_sg_list_t *sgl, daos_off_t off, daos_size
125142
daos_event_launch(ev);
126143
daos_event_complete(ev, 0);
127144
}
145+
DFS_OP_STAT_INCR(dfs, DOS_READ);
128146
return 0;
129147
}
130148

@@ -146,7 +164,9 @@ dfs_read(dfs_t *dfs, dfs_obj_t *obj, d_sg_list_t *sgl, daos_off_t off, daos_size
146164
return daos_der2errno(rc);
147165
}
148166

167+
DFS_OP_STAT_INCR(dfs, DOS_READ);
149168
*read_size = iod.arr_nr_read;
169+
dfs_update_file_metrics(dfs, iod.arr_nr_read, 0);
150170
return 0;
151171
}
152172

@@ -173,6 +193,7 @@ dfs_readx(dfs_t *dfs, dfs_obj_t *obj, dfs_iod_t *iod, d_sg_list_t *sgl, daos_siz
173193
daos_event_launch(ev);
174194
daos_event_complete(ev, 0);
175195
}
196+
DFS_OP_STAT_INCR(dfs, DOS_READ);
176197
return 0;
177198
}
178199

@@ -189,7 +210,9 @@ dfs_readx(dfs_t *dfs, dfs_obj_t *obj, dfs_iod_t *iod, d_sg_list_t *sgl, daos_siz
189210
return daos_der2errno(rc);
190211
}
191212

213+
DFS_OP_STAT_INCR(dfs, DOS_READ);
192214
*read_size = arr_iod.arr_nr_read;
215+
dfs_update_file_metrics(dfs, arr_iod.arr_nr_read, 0);
193216
return 0;
194217
}
195218

@@ -223,6 +246,7 @@ dfs_write(dfs_t *dfs, dfs_obj_t *obj, d_sg_list_t *sgl, daos_off_t off, daos_eve
223246
daos_event_launch(ev);
224247
daos_event_complete(ev, 0);
225248
}
249+
DFS_OP_STAT_INCR(dfs, DOS_WRITE);
226250
return 0;
227251
}
228252

@@ -238,8 +262,12 @@ dfs_write(dfs_t *dfs, dfs_obj_t *obj, d_sg_list_t *sgl, daos_off_t off, daos_eve
238262
daos_event_errno_rc(ev);
239263

240264
rc = daos_array_write(obj->oh, DAOS_TX_NONE, &iod, sgl, ev);
241-
if (rc)
265+
if (rc == 0) {
266+
DFS_OP_STAT_INCR(dfs, DOS_WRITE);
267+
dfs_update_file_metrics(dfs, 0, buf_size);
268+
} else {
242269
D_ERROR("daos_array_write() failed, " DF_RC "\n", DP_RC(rc));
270+
}
243271

244272
return daos_der2errno(rc);
245273
}
@@ -248,6 +276,8 @@ int
248276
dfs_writex(dfs_t *dfs, dfs_obj_t *obj, dfs_iod_t *iod, d_sg_list_t *sgl, daos_event_t *ev)
249277
{
250278
daos_array_iod_t arr_iod;
279+
daos_size_t buf_size;
280+
int i;
251281
int rc;
252282

253283
if (dfs == NULL || !dfs->mounted)
@@ -266,6 +296,7 @@ dfs_writex(dfs_t *dfs, dfs_obj_t *obj, dfs_iod_t *iod, d_sg_list_t *sgl, daos_ev
266296
daos_event_launch(ev);
267297
daos_event_complete(ev, 0);
268298
}
299+
DFS_OP_STAT_INCR(dfs, DOS_WRITE);
269300
return 0;
270301
}
271302

@@ -276,9 +307,18 @@ dfs_writex(dfs_t *dfs, dfs_obj_t *obj, dfs_iod_t *iod, d_sg_list_t *sgl, daos_ev
276307
if (ev)
277308
daos_event_errno_rc(ev);
278309

310+
buf_size = 0;
311+
if (dfs->metrics != NULL && sgl != NULL)
312+
for (i = 0; i < sgl->sg_nr; i++)
313+
buf_size += sgl->sg_iovs[i].iov_len;
314+
279315
rc = daos_array_write(obj->oh, DAOS_TX_NONE, &arr_iod, sgl, ev);
280-
if (rc)
316+
if (rc == 0) {
317+
DFS_OP_STAT_INCR(dfs, DOS_WRITE);
318+
dfs_update_file_metrics(dfs, 0, buf_size);
319+
} else {
281320
D_ERROR("daos_array_write() failed (%d)\n", rc);
321+
}
282322

283323
return daos_der2errno(rc);
284324
}

src/client/dfs/lookup.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ lookup_rel_path(dfs_t *dfs, dfs_obj_t *root, const char *path, int flags, dfs_ob
5757
obj->d.oclass = root->d.oclass;
5858
obj->d.chunk_size = root->d.chunk_size;
5959
obj->mode = root->mode;
60+
obj->dfs = dfs;
6061
strncpy(obj->name, root->name, DFS_MAX_NAME + 1);
6162

6263
rc = daos_obj_open(dfs->coh, obj->oid, daos_mode, &obj->oh, NULL);

0 commit comments

Comments
 (0)