From dc46d5e84f88c5cc869b78ba9db32ed4035b9121 Mon Sep 17 00:00:00 2001 From: Venkatesh Somyajulu Date: Thu, 3 Jul 2014 19:46:59 +0530 Subject: cluster/dht: Added logging of new layout for dir-selfheal Added a log which logs the new layout which will be used for the directory self healing It prints: a) Subvolume name b) Error --> Is needed because layout healing depends on the error and having it in log will help in debugging c) Start Starting of the layout range d) Stop Ending of the layout range Change-Id: I48c9c697716a899165ed29b737362a75c62e09b3 BUG: 1113066 Signed-off-by: Venkatesh Somyajulu Reviewed-on: http://review.gluster.org/8173 Tested-by: Gluster Build System Reviewed-by: Vijay Bellur --- xlators/cluster/dht/src/dht-common.c | 104 +++++++++++++++++++++++++++++++++ xlators/cluster/dht/src/dht-common.h | 3 + xlators/cluster/dht/src/dht-messages.h | 11 +++- xlators/cluster/dht/src/dht-selfheal.c | 8 +++ 4 files changed, 125 insertions(+), 1 deletion(-) (limited to 'xlators') diff --git a/xlators/cluster/dht/src/dht-common.c b/xlators/cluster/dht/src/dht-common.c index 45450d5f383..d50b818cb16 100644 --- a/xlators/cluster/dht/src/dht-common.c +++ b/xlators/cluster/dht/src/dht-common.c @@ -5592,3 +5592,107 @@ dht_inode_ctx_layout_get (inode_t *inode, xlator_t *this, dht_layout_t **layout) return ret; } + +void +dht_log_new_layout_for_dir_selfheal (xlator_t *this, loc_t *loc, + dht_layout_t *layout) +{ + + char string[2048] = {0}; + char *output_string = NULL; + int len = 0; + int off = 0; + int i = 0; + gf_loglevel_t log_level = gf_log_get_loglevel(); + int ret = 0; + int max_string_len = 0; + + if (log_level < GF_LOG_INFO) + return; + + if (!layout) + return; + + if (!layout->cnt) + return; + + if (!loc) + return; + + if (!loc->path) + return; + + max_string_len = sizeof (string); + + ret = snprintf (string, max_string_len, "Setting layout of %s with ", + loc->path); + + if (ret < 0) + return; + + len += ret; + + /* Calculation of total length of the string required to calloc + * output_string. Log includes subvolume-name, start-range, end-range and + * err value. + * + * This log will help to debug cases where: + * a) Different processes set different layout of a directory. + * b) Error captured in lookup, which will be filled in layout->err + * (like ENOENT, ESTALE etc) + */ + + for (i = 0; i < layout->cnt; i++) { + + ret = snprintf (string, max_string_len, + "[Subvol_name: %s, Err: %d , Start: " + "%"PRIu32 " , Stop: %"PRIu32 " ], ", + layout->list[i].xlator->name, + layout->list[i].err, layout->list[i].start, + layout->list[i].stop); + + if (ret < 0) + return; + + len += ret; + + } + + len++; + + output_string = GF_CALLOC (len, sizeof (char), gf_common_mt_char); + + if (!output_string) + return; + + ret = snprintf (output_string, len, "Setting layout of %s with ", + loc->path); + + if (ret < 0) + goto err; + + off += ret; + + + for (i = 0; i < layout->cnt; i++) { + + ret = snprintf (output_string + off, len - off, + "[Subvol_name: %s, Err: %d , Start: " + "%"PRIu32 " , Stop: %"PRIu32 " ], ", + layout->list[i].xlator->name, + layout->list[i].err, layout->list[i].start, + layout->list[i].stop); + + if (ret < 0) + goto err; + + off += ret; + + } + + gf_msg (this->name, GF_LOG_INFO, 0, DHT_MSG_LOG_FIXED_LAYOUT, + "%s", output_string); + +err: + GF_FREE (output_string); +} diff --git a/xlators/cluster/dht/src/dht-common.h b/xlators/cluster/dht/src/dht-common.h index e45418a73f6..5dee622a2a1 100644 --- a/xlators/cluster/dht/src/dht-common.h +++ b/xlators/cluster/dht/src/dht-common.h @@ -807,4 +807,7 @@ dht_inode_ctx_get1 (xlator_t *this, inode_t *inode, xlator_t **subvol); int dht_subvol_status (dht_conf_t *conf, xlator_t *subvol); +void +dht_log_new_layout_for_dir_selfheal (xlator_t *this, loc_t *loc, + dht_layout_t *layout); #endif/* _DHT_H */ diff --git a/xlators/cluster/dht/src/dht-messages.h b/xlators/cluster/dht/src/dht-messages.h index 7668e91ac99..80b20a61efd 100644 --- a/xlators/cluster/dht/src/dht-messages.h +++ b/xlators/cluster/dht/src/dht-messages.h @@ -45,7 +45,7 @@ */ #define GLFS_DHT_BASE GLFS_MSGID_COMP_DHT -#define GLFS_DHT_NUM_MESSAGES 35 +#define GLFS_DHT_NUM_MESSAGES 36 #define GLFS_MSGID_END (GLFS_DHT_BASE + GLFS_DHT_NUM_MESSAGES + 1) /* Messages with message IDs */ @@ -429,8 +429,17 @@ * @recommendedaction None * */ + #define DHT_MSG_LAYOUT_SET_FAILED (GLFS_DHT_BASE + 35) +/*! + * @messageid 109036 + * @diagnosis Informational message regarding layout range distribution + * for a directory across subvolumes + * @recommendedaction None + */ + +#define DHT_MSG_LOG_FIXED_LAYOUT (GLFS_DHT_BASE + 36) /*------------*/ #define glfs_msg_end_x GLFS_MSGID_END, "Invalid: End of messages" diff --git a/xlators/cluster/dht/src/dht-selfheal.c b/xlators/cluster/dht/src/dht-selfheal.c index 1e2d7438350..4b64acc8793 100644 --- a/xlators/cluster/dht/src/dht-selfheal.c +++ b/xlators/cluster/dht/src/dht-selfheal.c @@ -236,6 +236,8 @@ dht_fix_dir_xattr (call_frame_t *frame, loc_t *loc, dht_layout_t *layout) local->call_cnt = count = conf->subvolume_cnt; + dht_log_new_layout_for_dir_selfheal (this, loc, layout); + for (i = 0; i < layout->cnt; i++) { dht_selfheal_dir_xattr_persubvol (frame, loc, layout, i, NULL); @@ -306,6 +308,9 @@ dht_selfheal_dir_xattr (call_frame_t *frame, loc_t *loc, dht_layout_t *layout) } local->call_cnt = missing_xattr; + + dht_log_new_layout_for_dir_selfheal (this, loc, layout); + for (i = 0; i < layout->cnt; i++) { if (layout->list[i].err != -1 || !layout->list[i].stop) continue; @@ -430,6 +435,9 @@ dht_selfheal_dir_xattr_for_nameless_lookup (call_frame_t *frame, loc_t *loc, } local->call_cnt = missing_xattr; + + dht_log_new_layout_for_dir_selfheal (this, loc, layout); + for (i = 0; i < layout->cnt; i++) { if (layout->list[i].err != -1 || !layout->list[i].stop) continue; -- cgit