Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions docs/source/build.rst
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ Building Recorder with CMake
- HDF5 (required)
- NetCDF (optional) - Needed for NetCDF tracing
- PnetCDF (optional) - Needed for PnetCDF tracing
- DAOS (optional) - Needed for DAOS (DFS and native DAOS API) tracing
- Arrow (optional) > 5.0.0 - Needed for building Parquet convertor.
- CUDA (optional) - Needed for CUDA kernels interception.

Expand Down Expand Up @@ -46,6 +47,13 @@ need to use ``-DCMAKE_PREFIX_PATH`` to indicate their locations:
Recorder can also be built with PnetCDF to trace PnetCDF calls, use `-DRECORDER_WITH_PNETCDF=/path/to/pnetcdf/install`
to build Recorder with the specified PnetCDF.

Recorder can also be built with DAOS to trace the DAOS File System (DFS) API and the
native DAOS API. Use `-DRECORDER_WITH_DAOS=/path/to/daos/install` to build Recorder with
the specified DAOS installation. The given path must contain ``include/daos.h`` and
``include/daos_fs.h`` as well as ``lib`` (or ``lib64``) with ``libdaos.so`` and ``libdfs.so``.
When DAOS is not found, Recorder is built without DAOS tracing and all other layers are
unaffected.

(2) Intercepting ``fcntl()`` call:

Since v2.1.7, ``fcntl(int fd, int cmd, ...)`` is intercepted. The
Expand Down
7 changes: 6 additions & 1 deletion docs/source/usage.rst
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,10 @@ library (use ldd to check).*
Configure tracing layers
------------------------

Currently, Recorder is capable of tracing POSIX, MPI, MPI-IO, HDF5, NetCDF and PnetCDF calls.
Currently, Recorder is capable of tracing POSIX, MPI, MPI-IO, HDF5, NetCDF, PnetCDF and
DAOS calls. DAOS tracing covers both the DAOS File System (DFS) API and the native DAOS
API (container, object, array and key-value), and is only available when Recorder was
built with DAOS (see the build instructions).
By default, all supported I/O layers are enabled.
At runtime (generally before running your application), you can set
the following environment variables to dynamically enable/disable
Expand All @@ -50,6 +53,8 @@ the tracing of certain layers.

* export RECORDER_PNETCDF_TRACING=[1|0] (default: 1)

* export RECORDER_DAOS_TRACING=[1|0] (default: 1)

* export RECORDER_MPI_TRACING=[1|0] (default: 0)


Expand Down
67 changes: 67 additions & 0 deletions include/recorder-gotcha.h
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,11 @@
#include "netcdf_meta.h"
#endif

#ifdef RECORDER_WITH_DAOS
#include "daos.h"
#include "daos_fs.h"
#endif

#include "gotcha/gotcha.h"
#include "recorder-logger.h"

Expand Down Expand Up @@ -103,6 +108,7 @@ bool gotcha_mpiio_tracing();
bool gotcha_hdf5_tracing();
bool gotcha_pnetcdf_tracing();
bool gotcha_netcdf_tracing();
bool gotcha_daos_tracing();


/**
Expand Down Expand Up @@ -167,6 +173,8 @@ bool gotcha_netcdf_tracing();
intercept = gotcha_pnetcdf_tracing(); \
if (func_type == RECORDER_NETCDF) \
intercept = gotcha_netcdf_tracing(); \
if (func_type == RECORDER_DAOS) \
intercept = gotcha_daos_tracing(); \
if (intercept) { \
void* funcptr = gotcha_get_wrappee(WRAPPEE_HANDLE(func)); \
GOTCHA_REAL_CALL(func) = (WRAPPER_TYPE(func)) (funcptr); \
Expand Down Expand Up @@ -2348,4 +2356,63 @@ GOTCHA_WRAP(nc_def_opaque, int, (int ncid, size_t size, const char *name, nc_typ
GOTCHA_WRAP(nc_inq_opaque, int, (int ncid, nc_type xtype, char *name, size_t *sizep));
#endif /* RECORDER_WITH_NETCDF */


/* DAOS Function Calls */
#ifdef RECORDER_WITH_DAOS
/* DFS API */
GOTCHA_WRAP(dfs_mount, int, (daos_handle_t poh, daos_handle_t coh, int flags, dfs_t **dfs));
GOTCHA_WRAP(dfs_umount, int, (dfs_t *dfs));
GOTCHA_WRAP(dfs_global2local, int, (daos_handle_t poh, daos_handle_t coh, int flags, d_iov_t glob, dfs_t **dfs));
GOTCHA_WRAP(dfs_lookup, int, (dfs_t *dfs, const char *path, int flags, dfs_obj_t **obj, mode_t *mode, struct stat *stbuf));
GOTCHA_WRAP(dfs_lookup_rel, int, (dfs_t *dfs, dfs_obj_t *parent, const char *name, int flags, dfs_obj_t **obj, mode_t *mode, struct stat *stbuf));
GOTCHA_WRAP(dfs_open, int, (dfs_t *dfs, dfs_obj_t *parent, const char *name, mode_t mode, int flags, daos_oclass_id_t cid, daos_size_t chunk_size, const char *value, dfs_obj_t **obj));
GOTCHA_WRAP(dfs_dup, int, (dfs_t *dfs, dfs_obj_t *obj, int flags, dfs_obj_t **new_obj));
GOTCHA_WRAP(dfs_obj_global2local, int, (dfs_t *dfs, int flags, d_iov_t glob, dfs_obj_t **obj));
GOTCHA_WRAP(dfs_release, int, (dfs_obj_t *obj));
GOTCHA_WRAP(dfs_read, int, (dfs_t *dfs, dfs_obj_t *obj, d_sg_list_t *sgl, daos_off_t off, daos_size_t *read_size, daos_event_t *ev));
GOTCHA_WRAP(dfs_readx, int, (dfs_t *dfs, dfs_obj_t *obj, dfs_iod_t *iod, d_sg_list_t *sgl, daos_size_t *read_size, daos_event_t *ev));
GOTCHA_WRAP(dfs_write, int, (dfs_t *dfs, dfs_obj_t *obj, d_sg_list_t *sgl, daos_off_t off, daos_event_t *ev));
GOTCHA_WRAP(dfs_writex, int, (dfs_t *dfs, dfs_obj_t *obj, dfs_iod_t *iod, d_sg_list_t *sgl, daos_event_t *ev));
GOTCHA_WRAP(dfs_get_size, int, (dfs_t *dfs, dfs_obj_t *obj, daos_size_t *size));
GOTCHA_WRAP(dfs_punch, int, (dfs_t *dfs, dfs_obj_t *obj, daos_off_t offset, daos_size_t len));
GOTCHA_WRAP(dfs_remove, int, (dfs_t *dfs, dfs_obj_t *parent, const char *name, bool force, daos_obj_id_t *oid));
GOTCHA_WRAP(dfs_ostat, int, (dfs_t *dfs, dfs_obj_t *obj, struct stat *stbuf));
GOTCHA_WRAP(dfs_osetattr, int, (dfs_t *dfs, dfs_obj_t *obj, struct stat *stbuf, int flags));
/* Native DAOS API - Container */
GOTCHA_WRAP(daos_cont_open2, int, (daos_handle_t poh, const char *cont, unsigned int flags, daos_handle_t *coh, daos_cont_info_t *info, daos_event_t *ev));
GOTCHA_WRAP(daos_cont_global2local, int, (daos_handle_t poh, d_iov_t glob, daos_handle_t *coh));
GOTCHA_WRAP(daos_cont_close, int, (daos_handle_t coh, daos_event_t *ev));
/* Native DAOS API - Object */
GOTCHA_WRAP(daos_obj_open, int, (daos_handle_t coh, daos_obj_id_t oid, unsigned int mode, daos_handle_t *oh, daos_event_t *ev));
GOTCHA_WRAP(daos_obj_fetch, int, (daos_handle_t oh, daos_handle_t th, uint64_t flags, daos_key_t *dkey, unsigned int nr, daos_iod_t *iods, d_sg_list_t *sgls, daos_iom_t *ioms, daos_event_t *ev));
GOTCHA_WRAP(daos_obj_update, int, (daos_handle_t oh, daos_handle_t th, uint64_t flags, daos_key_t *dkey, unsigned int nr, daos_iod_t *iods, d_sg_list_t *sgls, daos_event_t *ev));
GOTCHA_WRAP(daos_obj_punch, int, (daos_handle_t oh, daos_handle_t th, uint64_t flags, daos_event_t *ev));
GOTCHA_WRAP(daos_obj_punch_dkeys, int, (daos_handle_t oh, daos_handle_t th, uint64_t flags, unsigned int nr, daos_key_t *dkeys, daos_event_t *ev));
GOTCHA_WRAP(daos_obj_punch_akeys, int, (daos_handle_t oh, daos_handle_t th, uint64_t flags, daos_key_t *dkey, unsigned int nr, daos_key_t *akeys, daos_event_t *ev));
GOTCHA_WRAP(daos_obj_list_dkey, int, (daos_handle_t oh, daos_handle_t th, uint32_t *nr, daos_key_desc_t *kds, d_sg_list_t *sgl, daos_anchor_t *anchor, daos_event_t *ev));
GOTCHA_WRAP(daos_obj_list_akey, int, (daos_handle_t oh, daos_handle_t th, daos_key_t *dkey, uint32_t *nr, daos_key_desc_t *kds, d_sg_list_t *sgl, daos_anchor_t *anchor, daos_event_t *ev));
GOTCHA_WRAP(daos_obj_list_recx, int, (daos_handle_t oh, daos_handle_t th, daos_key_t *dkey, daos_key_t *akey, daos_size_t *size, uint32_t *nr, daos_recx_t *recxs, daos_epoch_range_t *eprs, daos_anchor_t *anchor, bool incr_order, daos_event_t *ev));
GOTCHA_WRAP(daos_obj_close, int, (daos_handle_t oh, daos_event_t *ev));
/* Native DAOS API - Array */
GOTCHA_WRAP(daos_array_create, int, (daos_handle_t coh, daos_obj_id_t oid, daos_handle_t th, daos_size_t cell_size, daos_size_t chunk_size, daos_handle_t *oh, daos_event_t *ev));
GOTCHA_WRAP(daos_array_open, int, (daos_handle_t coh, daos_obj_id_t oid, daos_handle_t th, unsigned int mode, daos_size_t *cell_size, daos_size_t *chunk_size, daos_handle_t *oh, daos_event_t *ev));
GOTCHA_WRAP(daos_array_open_with_attr, int, (daos_handle_t coh, daos_obj_id_t oid, daos_handle_t th, unsigned int mode, daos_size_t cell_size, daos_size_t chunk_size, daos_handle_t *oh, daos_event_t *ev));
GOTCHA_WRAP(daos_array_read, int, (daos_handle_t oh, daos_handle_t th, daos_array_iod_t *iod, d_sg_list_t *sgl, daos_event_t *ev));
GOTCHA_WRAP(daos_array_write, int, (daos_handle_t oh, daos_handle_t th, daos_array_iod_t *iod, d_sg_list_t *sgl, daos_event_t *ev));
GOTCHA_WRAP(daos_array_get_size, int, (daos_handle_t oh, daos_handle_t th, daos_size_t *size, daos_event_t *ev));
GOTCHA_WRAP(daos_array_set_size, int, (daos_handle_t oh, daos_handle_t th, daos_size_t size, daos_event_t *ev));
GOTCHA_WRAP(daos_array_stat, int, (daos_handle_t oh, daos_handle_t th, daos_array_stbuf_t *stbuf, daos_event_t *ev));
GOTCHA_WRAP(daos_array_punch, int, (daos_handle_t oh, daos_handle_t th, daos_array_iod_t *iod, daos_event_t *ev));
GOTCHA_WRAP(daos_array_destroy, int, (daos_handle_t oh, daos_handle_t th, daos_event_t *ev));
GOTCHA_WRAP(daos_array_close, int, (daos_handle_t oh, daos_event_t *ev));
/* Native DAOS API - Key-Value */
GOTCHA_WRAP(daos_kv_open, int, (daos_handle_t coh, daos_obj_id_t oid, unsigned int mode, daos_handle_t *oh, daos_event_t *ev));
GOTCHA_WRAP(daos_kv_get, int, (daos_handle_t oh, daos_handle_t th, uint64_t flags, const char *key, daos_size_t *size, void *buf, daos_event_t *ev));
GOTCHA_WRAP(daos_kv_put, int, (daos_handle_t oh, daos_handle_t th, uint64_t flags, const char *key, daos_size_t size, const void *buf, daos_event_t *ev));
GOTCHA_WRAP(daos_kv_remove, int, (daos_handle_t oh, daos_handle_t th, uint64_t flags, const char *key, daos_event_t *ev));
GOTCHA_WRAP(daos_kv_list, int, (daos_handle_t oh, daos_handle_t th, uint32_t *nr, daos_key_desc_t *kds, d_sg_list_t *sgl, daos_anchor_t *anchor, daos_event_t *ev));
GOTCHA_WRAP(daos_kv_destroy, int, (daos_handle_t oh, daos_handle_t th, daos_event_t *ev));
GOTCHA_WRAP(daos_kv_close, int, (daos_handle_t oh, daos_event_t *ev));
#endif /* RECORDER_WITH_DAOS */

#endif /* __RECORDER_GOTCHA_H */
21 changes: 21 additions & 0 deletions include/recorder-logger.h
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@
#define RECORDER_FTRACE 4
#define RECORDER_PNETCDF 5
#define RECORDER_NETCDF 6
#define RECORDER_DAOS 7

#define RECORDER_USER_FUNCTION 255

Expand Down Expand Up @@ -73,6 +74,7 @@ typedef struct RecorderMetadata_t {
bool hdf5_tracing;
bool pnetcdf_tracing;
bool netcdf_tracing;
bool daos_tracing;
bool store_tid; // Wether to store thread id
bool store_call_depth; // Wether to store the call depth
double start_ts;
Expand Down Expand Up @@ -890,6 +892,25 @@ static const char* func_list[] = {
"nc_inq_enum", "nc_inq_enum_member", "nc_inq_enum_ident",
"nc_free_vlen", "nc_free_vlens", "nc_def_vlen",
"nc_inq_vlen", "nc_def_opaque", "nc_inq_opaque",

// DAOS - DFS API and native DAOS API
"dfs_mount", "dfs_umount", "dfs_global2local",
"dfs_lookup", "dfs_lookup_rel", "dfs_open",
"dfs_dup", "dfs_obj_global2local", "dfs_release",
"dfs_read", "dfs_readx", "dfs_write",
"dfs_writex", "dfs_get_size", "dfs_punch",
"dfs_remove", "dfs_ostat", "dfs_osetattr",
"daos_cont_open2", "daos_cont_global2local", "daos_cont_close",
"daos_obj_open", "daos_obj_fetch", "daos_obj_update",
"daos_obj_punch", "daos_obj_punch_dkeys", "daos_obj_punch_akeys",
"daos_obj_list_dkey", "daos_obj_list_akey", "daos_obj_list_recx",
"daos_obj_close", "daos_array_create", "daos_array_open",
"daos_array_open_with_attr", "daos_array_read", "daos_array_write",
"daos_array_get_size", "daos_array_set_size", "daos_array_stat",
"daos_array_punch", "daos_array_destroy", "daos_array_close",
"daos_kv_open", "daos_kv_get", "daos_kv_put",
"daos_kv_remove", "daos_kv_list", "daos_kv_destroy",
"daos_kv_close",
};

#endif /* __RECORDER_LOGGER_H */
1 change: 1 addition & 0 deletions include/recorder.h
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@
#define RECORDER_HDF5_TRACING "RECORDER_HDF5_TRACING"
#define RECORDER_PNETCDF_TRACING "RECORDER_PNETCDF_TRACING"
#define RECORDER_NETCDF_TRACING "RECORDER_NETCDF_TRACING"
#define RECORDER_DAOS_TRACING "RECORDER_DAOS_TRACING"


/**
Expand Down
24 changes: 24 additions & 0 deletions lib/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,29 @@ else()
message("-- " "NetCDF not found. Will build Recorder without it.")
endif()

# Look for DAOS (DFS + native DAOS API)
# DAOS is not a CMAKE project, we use find_path() to locate it
# this requires users to set -DRECORDER_WITH_DAOS=/xx/xx/
find_path(DAOS_INCLUDE_DIRS daos.h ${RECORDER_WITH_DAOS}/include)
find_path(DAOS_FS_INCLUDE_DIRS daos_fs.h ${RECORDER_WITH_DAOS}/include)
find_path(DAOS_LIBRARY_FOUND libdaos.so ${RECORDER_WITH_DAOS}/lib ${RECORDER_WITH_DAOS}/lib64)
find_path(DFS_LIBRARY_FOUND libdfs.so ${RECORDER_WITH_DAOS}/lib ${RECORDER_WITH_DAOS}/lib64)
if(DAOS_INCLUDE_DIRS AND DAOS_FS_INCLUDE_DIRS AND DAOS_LIBRARY_FOUND AND DFS_LIBRARY_FOUND)
message("-- " "Found DAOS:" ${RECORDER_WITH_DAOS})
set(RECORDER_SRCS
${CMAKE_CURRENT_SOURCE_DIR}/recorder-daos.c
${RECORDER_SRCS}
)
include_directories(${DAOS_INCLUDE_DIRS})
set(DAOS_LIBRARIES ${DAOS_LIBRARY_FOUND}/libdaos.so ${DFS_LIBRARY_FOUND}/libdfs.so)
set(RECORDER_EXT_INCLUDE_DEPENDENCIES ${DAOS_INCLUDE_DIRS}
${RECORDER_EXT_INCLUDE_DEPENDENCIES})
set(RECORDER_EXT_LIB_DEPENDENCIES
${DAOS_LIBRARIES} ${RECORDER_EXT_LIB_DEPENDENCIES})
else()
message("-- " "DAOS not found. Will build Recorder without it.")
endif()


find_package(MPI REQUIRED)
if(MPI_FOUND)
Expand Down Expand Up @@ -172,6 +195,7 @@ target_compile_definitions(recorder
PRIVATE $<$<BOOL:${HAVE___FXSTAT64}>:HAVE___FXSTAT64>
PRIVATE $<$<AND:$<BOOL:${PNETCDF_INCLUDE_DIRS}>,$<BOOL:${PNETCDF_LIBRARY_FOUND}>>:RECORDER_WITH_PNETCDF>
PRIVATE $<$<AND:$<BOOL:${NETCDF_INCLUDE_DIRS}>,$<BOOL:${NETCDF_LIBRARY_FOUND}>>:RECORDER_WITH_NETCDF>
PRIVATE $<$<AND:$<BOOL:${DAOS_INCLUDE_DIRS}>,$<BOOL:${DAOS_FS_INCLUDE_DIRS}>,$<BOOL:${DAOS_LIBRARY_FOUND}>,$<BOOL:${DFS_LIBRARY_FOUND}>>:RECORDER_WITH_DAOS>
PRIVATE $<$<BOOL:${RECORDER_ENABLE_FCNTL_TRACE}>:RECORDER_ENABLE_FCNTL_TRACE>
PRIVATE $<$<BOOL:${RECORDER_ENABLE_CUDA_TRACE}>:RECORDER_ENABLE_CUDA_TRACE>
)
Expand Down
Loading
Loading