summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--xlators/cluster/dht/src/dht-common.c104
-rw-r--r--xlators/cluster/dht/src/dht-common.h3
-rw-r--r--xlators/cluster/dht/src/dht-messages.h11
-rw-r--r--xlators/cluster/dht/src/dht-selfheal.c8
4 files changed, 125 insertions, 1 deletions
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;