d2787b
From d806760f1d4c78a2519b01f1c2d07aba0c533755 Mon Sep 17 00:00:00 2001
d2787b
From: Pranith Kumar K <pkarampu@redhat.com>
d2787b
Date: Fri, 28 Aug 2020 16:03:54 +0530
d2787b
Subject: [PATCH 608/610] cluster/ec: Track heal statistics in shd
d2787b
d2787b
With this change we should be able to inspect number of heals
d2787b
attempted and completed by each shd.
d2787b
d2787b
> Upstream patch: https://review.gluster.org/#/c/glusterfs/+/24926/
d2787b
> fixes: #1453
d2787b
> Change-Id: I10f5d86efcc0a8e4d648da808751d37725682c39
d2787b
> Signed-off-by: Pranith Kumar K <pkarampu@redhat.com>
d2787b
d2787b
BUG: 1853631
d2787b
Change-Id: I10f5d86efcc0a8e4d648da808751d37725682c39
d2787b
Signed-off-by: Sheetal Pamecha <spamecha@redhat.com>
d2787b
Reviewed-on: https://code.engineering.redhat.com/gerrit/c/rhs-glusterfs/+/280208
d2787b
Tested-by: RHGS Build Bot <nigelb@redhat.com>
d2787b
Reviewed-by: Sunil Kumar Heggodu Gopala Acharya <sheggodu@redhat.com>
d2787b
---
d2787b
 xlators/cluster/ec/src/ec-heald.c | 49 ++++++++++++++++++++++++++++++++++++++-
d2787b
 xlators/cluster/ec/src/ec-types.h |  5 ++++
d2787b
 xlators/cluster/ec/src/ec.c       |  6 +++++
d2787b
 3 files changed, 59 insertions(+), 1 deletion(-)
d2787b
d2787b
diff --git a/xlators/cluster/ec/src/ec-heald.c b/xlators/cluster/ec/src/ec-heald.c
d2787b
index 4f4b6aa..cd4d3ad 100644
d2787b
--- a/xlators/cluster/ec/src/ec-heald.c
d2787b
+++ b/xlators/cluster/ec/src/ec-heald.c
d2787b
@@ -152,15 +152,58 @@ ec_shd_index_purge(xlator_t *subvol, inode_t *inode, char *name)
d2787b
     return ret;
d2787b
 }
d2787b
 
d2787b
+static gf_boolean_t
d2787b
+ec_is_heal_completed(char *status)
d2787b
+{
d2787b
+    char *bad_pos = NULL;
d2787b
+    char *zero_pos = NULL;
d2787b
+
d2787b
+    if (!status) {
d2787b
+        return _gf_false;
d2787b
+    }
d2787b
+
d2787b
+    /*Logic:
d2787b
+     * Status will be of the form Good: <binary>, Bad: <binary>
d2787b
+     * If heal completes, if we do strchr for '0' it should be present after
d2787b
+     * 'Bad:' i.e. strRchr for ':'
d2787b
+     * */
d2787b
+
d2787b
+    zero_pos = strchr(status, '0');
d2787b
+    bad_pos = strrchr(status, ':');
d2787b
+    if (!zero_pos || !bad_pos) {
d2787b
+        /*malformed status*/
d2787b
+        return _gf_false;
d2787b
+    }
d2787b
+
d2787b
+    if (zero_pos > bad_pos) {
d2787b
+        return _gf_true;
d2787b
+    }
d2787b
+
d2787b
+    return _gf_false;
d2787b
+}
d2787b
+
d2787b
 int
d2787b
 ec_shd_selfheal(struct subvol_healer *healer, int child, loc_t *loc,
d2787b
                 gf_boolean_t full)
d2787b
 {
d2787b
     dict_t *xdata = NULL;
d2787b
+    dict_t *dict = NULL;
d2787b
     uint32_t count;
d2787b
     int32_t ret;
d2787b
+    char *heal_status = NULL;
d2787b
+    ec_t *ec = healer->this->private;
d2787b
+
d2787b
+    GF_ATOMIC_INC(ec->stats.shd.attempted);
d2787b
+    ret = syncop_getxattr(healer->this, loc, &dict, EC_XATTR_HEAL, NULL,
d2787b
+                          &xdata);
d2787b
+    if (ret == 0) {
d2787b
+        if (dict && (dict_get_str(dict, EC_XATTR_HEAL, &heal_status) == 0)) {
d2787b
+            if (ec_is_heal_completed(heal_status)) {
d2787b
+                GF_ATOMIC_INC(ec->stats.shd.completed);
d2787b
+            }
d2787b
+        }
d2787b
+    }
d2787b
 
d2787b
-    ret = syncop_getxattr(healer->this, loc, NULL, EC_XATTR_HEAL, NULL, &xdata);
d2787b
     if (!full && (loc->inode->ia_type == IA_IFDIR)) {
d2787b
         /* If we have just healed a directory, it's possible that
d2787b
          * other index entries have appeared to be healed. */
d2787b
@@ -179,6 +222,10 @@ ec_shd_selfheal(struct subvol_healer *healer, int child, loc_t *loc,
d2787b
         dict_unref(xdata);
d2787b
     }
d2787b
 
d2787b
+    if (dict) {
d2787b
+        dict_unref(dict);
d2787b
+    }
d2787b
+
d2787b
     return ret;
d2787b
 }
d2787b
 
d2787b
diff --git a/xlators/cluster/ec/src/ec-types.h b/xlators/cluster/ec/src/ec-types.h
d2787b
index 700dc39..ef7a7fe 100644
d2787b
--- a/xlators/cluster/ec/src/ec-types.h
d2787b
+++ b/xlators/cluster/ec/src/ec-types.h
d2787b
@@ -626,6 +626,11 @@ struct _ec_statistics {
d2787b
                                 requests. (Basically memory allocation
d2787b
                                 errors). */
d2787b
     } stripe_cache;
d2787b
+    struct {
d2787b
+        gf_atomic_t attempted; /*Number of heals attempted on
d2787b
+                                files/directories*/
d2787b
+        gf_atomic_t completed; /*Number of heals complted on files/directories*/
d2787b
+    } shd;
d2787b
 };
d2787b
 
d2787b
 struct _ec {
d2787b
diff --git a/xlators/cluster/ec/src/ec.c b/xlators/cluster/ec/src/ec.c
d2787b
index 047cdd8..24de9e8 100644
d2787b
--- a/xlators/cluster/ec/src/ec.c
d2787b
+++ b/xlators/cluster/ec/src/ec.c
d2787b
@@ -649,6 +649,8 @@ ec_statistics_init(ec_t *ec)
d2787b
     GF_ATOMIC_INIT(ec->stats.stripe_cache.evicts, 0);
d2787b
     GF_ATOMIC_INIT(ec->stats.stripe_cache.allocs, 0);
d2787b
     GF_ATOMIC_INIT(ec->stats.stripe_cache.errors, 0);
d2787b
+    GF_ATOMIC_INIT(ec->stats.shd.attempted, 0);
d2787b
+    GF_ATOMIC_INIT(ec->stats.shd.completed, 0);
d2787b
 }
d2787b
 
d2787b
 int32_t
d2787b
@@ -1445,6 +1447,10 @@ ec_dump_private(xlator_t *this)
d2787b
                        GF_ATOMIC_GET(ec->stats.stripe_cache.allocs));
d2787b
     gf_proc_dump_write("errors", "%" GF_PRI_ATOMIC,
d2787b
                        GF_ATOMIC_GET(ec->stats.stripe_cache.errors));
d2787b
+    gf_proc_dump_write("heals-attempted", "%" GF_PRI_ATOMIC,
d2787b
+                       GF_ATOMIC_GET(ec->stats.shd.attempted));
d2787b
+    gf_proc_dump_write("heals-completed", "%" GF_PRI_ATOMIC,
d2787b
+                       GF_ATOMIC_GET(ec->stats.shd.completed));
d2787b
 
d2787b
     return 0;
d2787b
 }
d2787b
-- 
d2787b
1.8.3.1
d2787b