diff options
author | Ravishankar N <ravishankar@redhat.com> | 2016-09-23 10:47:03 +0530 |
---|---|---|
committer | Pranith Kumar Karampuri <pkarampu@redhat.com> | 2016-09-26 06:25:40 -0700 |
commit | 5afc6aba906a21aee19c2f1baaa7d9eb762ae0ac (patch) | |
tree | 08bb1d0c81eb58b145457cab171b241a05311345 /xlators | |
parent | 3bf8f05a8a0eccd723a9478a5c925d099a145a1a (diff) |
afr: Ignore gluster internal (virtual) xattrs in metadata heal check
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.
Also removed is_virtual_xattr() function. The original callers to this
function (upcall) don't seem to need it anymore.
Change-Id: I05730bdd39d8fb0b9a49a5fc9c0bb01f0d3bb308
BUG: 1378684
Signed-off-by: Ravishankar N <ravishankar@redhat.com>
Reviewed-on: http://review.gluster.org/15548
NetBSD-regression: NetBSD Build System <jenkins@build.gluster.org>
CentOS-regression: Gluster Build System <jenkins@build.gluster.org>
Smoke: Gluster Build System <jenkins@build.gluster.org>
Reviewed-by: Pranith Kumar Karampuri <pkarampu@redhat.com>
Diffstat (limited to 'xlators')
-rw-r--r-- | xlators/cluster/afr/src/afr-common.c | 13 | ||||
-rw-r--r-- | xlators/storage/posix/src/posix-helpers.c | 18 |
2 files changed, 8 insertions, 23 deletions
diff --git a/xlators/cluster/afr/src/afr-common.c b/xlators/cluster/afr/src/afr-common.c index 8c59da7ecca..a92be5fe85c 100644 --- a/xlators/cluster/afr/src/afr-common.c +++ b/xlators/cluster/afr/src/afr-common.c @@ -1816,10 +1816,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 @@ -1840,8 +1836,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; @@ -1851,7 +1852,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 6162f2649e1..becbd94c226 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; } |