From: Haomai Wang Date: Mon, 9 Mar 2015 03:51:16 +0000 (+0800) Subject: librbd: Add librbd interface impl and tracing for metadata X-Git-Tag: v9.0.0~153^2~12 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=c983c3cf866ebdff0e93376661edf33bc0b5df8e;p=ceph.git librbd: Add librbd interface impl and tracing for metadata Signed-off-by: Haomai Wang --- diff --git a/src/librbd/librbd.cc b/src/librbd/librbd.cc index 2d1e56777a39..1369ddb2bb65 100644 --- a/src/librbd/librbd.cc +++ b/src/librbd/librbd.cc @@ -793,6 +793,39 @@ namespace librbd { return r; } + int Image::metadata_set(const std::string &key, const std::string &value) + { + ImageCtx *ictx = (ImageCtx *)ctx; + tracepoint(librbd, metadata_set_enter, ictx, key.c_str(), value.c_str()); + int r = librbd::metadata_set(ictx, key, value); + tracepoint(librbd, metadata_set_exit, r); + return r; + } + + int Image::metadata_remove(const std::string &key) + { + ImageCtx *ictx = (ImageCtx *)ctx; + tracepoint(librbd, metadata_remove_enter, ictx, key.c_str()); + int r = librbd::metadata_remove(ictx, key); + tracepoint(librbd, metadata_remove_exit, r); + return r; + } + + int Image::metadata_list(map *pairs) + { + ImageCtx *ictx = (ImageCtx *)ctx; + tracepoint(librbd, metadata_list_enter, ictx); + int r = librbd::metadata_list(ictx, pairs); + if (r >= 0) { + for (map::const_iterator it = pairs->begin(); + it != pairs->end(); ++it) { + tracepoint(librbd, metadata_list_entry, it->first.c_str(), it->second.c_str()); + } + } + tracepoint(librbd, metadata_list_exit, r); + return r; + } + } // namespace librbd extern "C" void rbd_version(int *major, int *minor, int *extra) @@ -1698,6 +1731,60 @@ extern "C" int rbd_invalidate_cache(rbd_image_t image) return r; } +extern "C" int rbd_metadata_set(rbd_image_t image, const char *key, const char *value) +{ + librbd::ImageCtx *ictx = (librbd::ImageCtx *)image; + tracepoint(librbd, metadata_set_enter, ictx, key, value); + int r = librbd::metadata_set(ictx, key, value); + tracepoint(librbd, metadata_set_exit, r); + return r; +} + +extern "C" int rbd_metadata_remove(rbd_image_t image, const char *key) +{ + librbd::ImageCtx *ictx = (librbd::ImageCtx *)image; + tracepoint(librbd, metadata_remove_enter, ictx, key); + int r = librbd::metadata_remove(ictx, key); + tracepoint(librbd, metadata_remove_exit, r); + return r; +} + +extern "C" int rbd_metadata_list(rbd_image_t image, char *key, size_t *key_len, char *value, size_t *val_len) +{ + librbd::ImageCtx *ictx = (librbd::ImageCtx *)image; + tracepoint(librbd, metadata_list_enter, ictx); + map pairs; + int r = librbd::metadata_list(ictx, &pairs); + size_t key_total_len = 0, val_total_len = 0; + bool too_short = false; + for (map::iterator it = pairs.begin(); + it != pairs.end(); ++it) { + key_total_len += it->first.size() + 1; + val_total_len += it->second.length() + 1; + } + if (*key_len < key_total_len || *val_len < key_total_len) + too_short = true; + *key_len = key_total_len; + *val_len = val_total_len; + if (too_short) { + tracepoint(librbd, metadata_list_exit, -ERANGE); + return -ERANGE; + } + + char *key_p = key, *value_p = value; + + for (map::iterator it = pairs.begin(); + it != pairs.end(); ++it) { + strncpy(key_p, it->first.c_str(), it->first.size()); + key_p += it->first.size() + 1; + strncpy(value_p, it->second.c_str(), it->second.size()); + value_p += it->second.length() + 1; + tracepoint(librbd, metadata_list_entry, it->first.c_str(), it->second.c_str()); + } + tracepoint(librbd, metadata_list_exit, r); + return r; +} + extern "C" int rbd_aio_is_complete(rbd_completion_t c) { librbd::RBD::AioCompletion *comp = (librbd::RBD::AioCompletion *)c; diff --git a/src/tracing/librbd.tp b/src/tracing/librbd.tp index bc0b662cc21d..fd74475f9f60 100644 --- a/src/tracing/librbd.tp +++ b/src/tracing/librbd.tp @@ -479,6 +479,70 @@ TRACEPOINT_EVENT(librbd, invalidate_cache_exit, ) ) +TRACEPOINT_EVENT(librbd, metadata_set_enter, + TP_ARGS( + void*, imagectx, + const char*, key, + const char*, value), + TP_FIELDS( + ctf_integer_hex(void*, imagectx, imagectx) + ctf_string(key, key) + ctf_string(value, value) + ) +) + +TRACEPOINT_EVENT(librbd, metadata_set_exit, + TP_ARGS( + int, retval), + TP_FIELDS( + ctf_integer(int, retval, retval) + ) +) + +TRACEPOINT_EVENT(librbd, metadata_remove_enter, + TP_ARGS( + void*, imagectx, + const char*, key), + TP_FIELDS( + ctf_integer_hex(void*, imagectx, imagectx) + ctf_string(key, key) + ) +) + +TRACEPOINT_EVENT(librbd, metadata_remove_exit, + TP_ARGS( + int, retval), + TP_FIELDS( + ctf_integer(int, retval, retval) + ) +) + +TRACEPOINT_EVENT(librbd, metadata_list_enter, + TP_ARGS( + void*, imagectx), + TP_FIELDS( + ctf_integer_hex(void*, imagectx, imagectx) + ) +) + +TRACEPOINT_EVENT(librbd, metadata_list_entry, + TP_ARGS( + const char*, key, + const char*, value), + TP_FIELDS( + ctf_string(key, key) + ctf_string(value, value) + ) +) + +TRACEPOINT_EVENT(librbd, metadata_list_exit, + TP_ARGS( + int, retval), + TP_FIELDS( + ctf_integer(int, retval, retval) + ) +) + TRACEPOINT_EVENT(librbd, flush_enter, TP_ARGS( void*, imagectx,