Blob Blame History Raw
From 6bf6d849b209b4214ba8b468dc0fb2574dba0c04 Mon Sep 17 00:00:00 2001
From: Ravishankar N <ravishankar@redhat.com>
Date: Tue, 27 Sep 2016 12:50:50 +0530
Subject: [PATCH 92/94] afr: Ignore gluster internal (virtual) xattrs in metadata heal check

Patch in master:http://review.gluster.org/#/c/15548/
Patch in release-3.9:http://review.gluster.org/#/c/15577/
Patch in release-3.8:http://review.gluster.org/#/c/15578/

Problem:
In arbiter configuration, posix-xlator in the arbiter brick always sets
the GF_CONTENT_KEY in the response dict with a value 0. If the file size on
the data bricks is more than quick-read's max-file-size (64kb default),
those bricks don't set the key. Because of this difference in the no. of dict
elements, afr triggers metadata heal in lookup code path, in turn
leading to extra lookups+inodelks.

Fix:
Changed afr dict comparison logic to ignore all virtual xattrs and the
on-disk ones that we should not be healing.

Change-Id: I1ab0c9018c65efef97b052a00ee73f79cc7476c0
BUG: 1378867
Signed-off-by: Ravishankar N <ravishankar@redhat.com>
Reviewed-on: https://code.engineering.redhat.com/gerrit/85739
Reviewed-by: Pranith Kumar Karampuri <pkarampu@redhat.com>
Tested-by: Pranith Kumar Karampuri <pkarampu@redhat.com>
---
 libglusterfs/src/common-utils.c           |   16 ++++++++++++++++
 libglusterfs/src/common-utils.h           |    2 +-
 xlators/cluster/afr/src/afr-common.c      |   13 +++++++------
 xlators/storage/posix/src/posix-helpers.c |   18 +-----------------
 4 files changed, 25 insertions(+), 24 deletions(-)

diff --git a/libglusterfs/src/common-utils.c b/libglusterfs/src/common-utils.c
index e51933d..0ee956c 100644
--- a/libglusterfs/src/common-utils.c
+++ b/libglusterfs/src/common-utils.c
@@ -4533,6 +4533,22 @@ gf_zero_fill_stat (struct iatt *buf)
         buf->ia_ctime = 0;
 }
 
+gf_boolean_t
+gf_is_valid_xattr_namespace (char *key)
+{
+        static char *xattr_namespaces[] = {"trusted.", "security.", "system.",
+                                           "user.", NULL };
+        int i = 0;
+
+        for (i = 0; xattr_namespaces[i]; i++) {
+                if (strncmp (key, xattr_namespaces[i],
+                             strlen (xattr_namespaces[i])) == 0)
+                        return _gf_true;
+        }
+
+        return _gf_false;
+}
+
 int
 gf_bits_count (uint64_t n)
 {
diff --git a/libglusterfs/src/common-utils.h b/libglusterfs/src/common-utils.h
index d71c143..3aecc02 100644
--- a/libglusterfs/src/common-utils.h
+++ b/libglusterfs/src/common-utils.h
@@ -844,7 +844,7 @@ void
 gf_zero_fill_stat (struct iatt *buf);
 
 gf_boolean_t
-is_virtual_xattr (const char *k);
+gf_is_valid_xattr_namespace (char *k);
 
 const char *
 gf_inode_type_to_str (ia_type_t type);
diff --git a/xlators/cluster/afr/src/afr-common.c b/xlators/cluster/afr/src/afr-common.c
index db6a350..97d6f2f 100644
--- a/xlators/cluster/afr/src/afr-common.c
+++ b/xlators/cluster/afr/src/afr-common.c
@@ -1708,10 +1708,6 @@ afr_frame_return (call_frame_t *frame)
 }
 
 static char *afr_ignore_xattrs[] = {
-        GLUSTERFS_OPEN_FD_COUNT,
-        GLUSTERFS_PARENT_ENTRYLK,
-        GLUSTERFS_ENTRYLK_COUNT,
-        GLUSTERFS_INODELK_COUNT,
         GF_SELINUX_XATTR_KEY,
         QUOTA_SIZE_KEY,
         NULL
@@ -1732,8 +1728,13 @@ afr_is_xattr_ignorable (char *key)
 }
 
 static gf_boolean_t
-afr_xattr_match (dict_t *this, char *key1, data_t *value1, void *data)
+afr_xattr_match_needed (dict_t *this, char *key1, data_t *value1, void *data)
 {
+        /* Ignore all non-disk (i.e. virtual) xattrs right away. */
+        if (!gf_is_valid_xattr_namespace (key1))
+                return _gf_false;
+
+        /* Ignore on-disk xattrs that AFR doesn't need to heal. */
         if (!afr_is_xattr_ignorable (key1))
                 return _gf_true;
 
@@ -1743,7 +1744,7 @@ afr_xattr_match (dict_t *this, char *key1, data_t *value1, void *data)
 gf_boolean_t
 afr_xattrs_are_equal (dict_t *dict1, dict_t *dict2)
 {
-        return are_dicts_equal (dict1, dict2, afr_xattr_match, NULL);
+        return are_dicts_equal (dict1, dict2, afr_xattr_match_needed, NULL);
 }
 
 static int
diff --git a/xlators/storage/posix/src/posix-helpers.c b/xlators/storage/posix/src/posix-helpers.c
index f52836f..86c3339 100644
--- a/xlators/storage/posix/src/posix-helpers.c
+++ b/xlators/storage/posix/src/posix-helpers.c
@@ -117,22 +117,6 @@ posix_xattr_ignorable (char *key)
         return _is_in_array (posix_ignore_xattrs, key);
 }
 
-static gf_boolean_t
-posix_is_valid_namespace (char *key)
-{
-        static char *xattr_namespaces[] = {"trusted.", "security.", "system.",
-                                           "user.", NULL };
-        int i = 0;
-
-        for (i = 0; xattr_namespaces[i]; i++) {
-                if (strncmp (key, xattr_namespaces[i],
-                             strlen (xattr_namespaces[i])) == 0)
-                        return _gf_true;
-        }
-
-        return _gf_false;
-}
-
 static int
 _posix_xattr_get_set_from_backend (posix_xattr_filler_t *filler, char *key)
 {
@@ -142,7 +126,7 @@ _posix_xattr_get_set_from_backend (posix_xattr_filler_t *filler, char *key)
         char     val_buf[256] = {0};
         gf_boolean_t have_val   = _gf_false;
 
-        if (!posix_is_valid_namespace (key)) {
+        if (!gf_is_valid_xattr_namespace (key)) {
                 ret = -1;
                 goto out;
         }
-- 
1.7.1