autobuild v6.0-4
Resolves: bz#1480907 bz#1702298 bz#1703455 bz#1704181 bz#1704562 Resolves: bz#1707246 bz#1708067 bz#1708116 bz#1708121 bz#1709087 Resolves: bz#1711249 bz#1711296 bz#1714078 bz#1714124 bz#1716385 Resolves: bz#1716626 bz#1716821 bz#1716865 bz#1717927 Signed-off-by: Rinku Kothiya <rkothiya@redhat.com>
This commit is contained in:
parent
d2b03be249
commit
9dfd1f220c
@ -0,0 +1,36 @@
|
||||
From e44b75fdb86dcf759204816c873b4f9f4efbefa8 Mon Sep 17 00:00:00 2001
|
||||
From: Susant Palai <spalai@redhat.com>
|
||||
Date: Tue, 21 May 2019 16:17:09 +0530
|
||||
Subject: [PATCH 142/169] lock: check null value of dict to avoid log flooding
|
||||
|
||||
> updates: bz#1712322
|
||||
> Change-Id: I120a1d23506f9ebcf88c7ea2f2eff4978a61cf4a
|
||||
> Signed-off-by: Susant Palai <spalai@redhat.com>
|
||||
(backport of fix https://review.gluster.org/#/c/glusterfs/+/22756/)
|
||||
|
||||
BUG: bz#1704181
|
||||
Change-Id: I2a192236328ebb39666ffef1146df312c08a377d
|
||||
Signed-off-by: Susant Palai <spalai@redhat.com>
|
||||
Reviewed-on: https://code.engineering.redhat.com/gerrit/171325
|
||||
Tested-by: RHGS Build Bot <nigelb@redhat.com>
|
||||
Reviewed-by: Sunil Kumar Heggodu Gopala Acharya <sheggodu@redhat.com>
|
||||
---
|
||||
xlators/features/locks/src/posix.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/xlators/features/locks/src/posix.c b/xlators/features/locks/src/posix.c
|
||||
index 3f1c7a7..adb0df5 100644
|
||||
--- a/xlators/features/locks/src/posix.c
|
||||
+++ b/xlators/features/locks/src/posix.c
|
||||
@@ -121,7 +121,7 @@ fetch_pathinfo(xlator_t *, inode_t *, int32_t *, char **);
|
||||
|
||||
#define PL_CHECK_LOCK_ENFORCE_KEY(frame, dict, name, this, loc, fd, priv) \
|
||||
do { \
|
||||
- if (dict_get(dict, GF_ENFORCE_MANDATORY_LOCK) || \
|
||||
+ if ((dict && (dict_get(dict, GF_ENFORCE_MANDATORY_LOCK))) || \
|
||||
(name && (strcmp(name, GF_ENFORCE_MANDATORY_LOCK) == 0))) { \
|
||||
inode_t *__inode = (loc ? loc->inode : fd->inode); \
|
||||
pl_inode_t *__pl_inode = pl_inode_get(this, __inode, NULL); \
|
||||
--
|
||||
1.8.3.1
|
||||
|
@ -0,0 +1,42 @@
|
||||
From 43fb1d9d3890c44108b466d308177428fb8217aa Mon Sep 17 00:00:00 2001
|
||||
From: Jiffin Tony Thottan <jthottan@redhat.com>
|
||||
Date: Mon, 27 May 2019 10:11:39 +0530
|
||||
Subject: [PATCH 143/169] packaging : Change the dependency on nfs-ganesha to
|
||||
2.7 for glusterfs-ganesha
|
||||
|
||||
Change-Id: I16a3f32eddfcbf745d67de9dc7440e2fc6ef2315
|
||||
fixes: bz#1714078
|
||||
Signed-off-by: Jiffin Tony Thottan <jthottan@redhat.com>
|
||||
Reviewed-on: https://code.engineering.redhat.com/gerrit/171471
|
||||
Tested-by: RHGS Build Bot <nigelb@redhat.com>
|
||||
Reviewed-by: Sunil Kumar Heggodu Gopala Acharya <sheggodu@redhat.com>
|
||||
---
|
||||
glusterfs.spec.in | 5 ++++-
|
||||
1 file changed, 4 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/glusterfs.spec.in b/glusterfs.spec.in
|
||||
index 86a1527..ed58356 100644
|
||||
--- a/glusterfs.spec.in
|
||||
+++ b/glusterfs.spec.in
|
||||
@@ -460,7 +460,7 @@ Summary: NFS-Ganesha configuration
|
||||
Group: Applications/File
|
||||
|
||||
Requires: %{name}-server%{?_isa} = %{version}-%{release}
|
||||
-Requires: nfs-ganesha-gluster >= 2.4.1
|
||||
+Requires: nfs-ganesha-gluster >= 2.7.3
|
||||
Requires: pcs, dbus
|
||||
%if ( 0%{?rhel} && 0%{?rhel} == 6 )
|
||||
Requires: cman, pacemaker, corosync
|
||||
@@ -1933,6 +1933,9 @@ fi
|
||||
%endif
|
||||
|
||||
%changelog
|
||||
+* Mon May 27 2019 Jiffin Tony Thottan <jthottan@redhat.com>
|
||||
+- Change the dependency to 2.7.3 on nfs-ganesha for glusterfs-ganesha (#1714078)
|
||||
+
|
||||
* Sun Apr 7 2019 Jiffin Tony Thottan <jthottan@redhat.com>
|
||||
- DOWNSTREAM ONLY - revert of 83abcb(gnfs in an optional subpackage)
|
||||
|
||||
--
|
||||
1.8.3.1
|
||||
|
114
0144-cluster-ec-honor-contention-notifications-for-partia.patch
Normal file
114
0144-cluster-ec-honor-contention-notifications-for-partia.patch
Normal file
@ -0,0 +1,114 @@
|
||||
From ff8a74250209f4279f67dd89c3e57b2289a1b7d1 Mon Sep 17 00:00:00 2001
|
||||
From: Xavi Hernandez <xhernandez@redhat.com>
|
||||
Date: Thu, 9 May 2019 11:07:18 +0200
|
||||
Subject: [PATCH 144/169] cluster/ec: honor contention notifications for
|
||||
partially acquired locks
|
||||
|
||||
EC was ignoring lock contention notifications received while a lock was
|
||||
being acquired. When a lock is partially acquired (some bricks have
|
||||
granted the lock but some others not yet) we can receive notifications
|
||||
from acquired bricks, which should be honored, since we may not receive
|
||||
more notifications after that.
|
||||
|
||||
Since EC was ignoring them, once the lock was acquired, it was not
|
||||
released until the eager-lock timeout, causing unnecessary delays on
|
||||
other clients.
|
||||
|
||||
This fix takes into consideration the notifications received before
|
||||
having completed the full lock acquisition. After that, the lock will
|
||||
be releaed as soon as possible.
|
||||
|
||||
Upstream patch:
|
||||
> BUG: 1708156
|
||||
> Upstream patch link: https://review.gluster.org/c/glusterfs/+/22690
|
||||
> Change-Id: I2a306dbdb29fb557dcab7788a258bd75d826cc12
|
||||
> Signed-off-by: Xavi Hernandez <xhernandez@redhat.com>
|
||||
|
||||
Fixes: bz#1703455
|
||||
Change-Id: I2a306dbdb29fb557dcab7788a258bd75d826cc12
|
||||
Signed-off-by: Xavi Hernandez <xhernandez@redhat.com>
|
||||
Reviewed-on: https://code.engineering.redhat.com/gerrit/171525
|
||||
Tested-by: RHGS Build Bot <nigelb@redhat.com>
|
||||
Reviewed-by: Sunil Kumar Heggodu Gopala Acharya <sheggodu@redhat.com>
|
||||
---
|
||||
...or-inodelk-contention-notify-on-partial-locks.t | 54 ++++++++++++++++++++++
|
||||
xlators/cluster/ec/src/ec-common.c | 2 +-
|
||||
2 files changed, 55 insertions(+), 1 deletion(-)
|
||||
create mode 100644 tests/bugs/ec/bug-1708156-honor-inodelk-contention-notify-on-partial-locks.t
|
||||
|
||||
diff --git a/tests/bugs/ec/bug-1708156-honor-inodelk-contention-notify-on-partial-locks.t b/tests/bugs/ec/bug-1708156-honor-inodelk-contention-notify-on-partial-locks.t
|
||||
new file mode 100644
|
||||
index 0000000..67fdb18
|
||||
--- /dev/null
|
||||
+++ b/tests/bugs/ec/bug-1708156-honor-inodelk-contention-notify-on-partial-locks.t
|
||||
@@ -0,0 +1,54 @@
|
||||
+#!/bin/bash
|
||||
+
|
||||
+. $(dirname $0)/../../include.rc
|
||||
+. $(dirname $0)/../../volume.rc
|
||||
+
|
||||
+function do_ls() {
|
||||
+ local dir="${1}"
|
||||
+ local i
|
||||
+
|
||||
+ for i in {1..50}; do
|
||||
+ ls -l $M0/${dir} >/dev/null &
|
||||
+ ls -l $M1/${dir} >/dev/null &
|
||||
+ ls -l $M2/${dir} >/dev/null &
|
||||
+ ls -l $M3/${dir} >/dev/null &
|
||||
+ done
|
||||
+ wait
|
||||
+}
|
||||
+
|
||||
+function measure_time() {
|
||||
+ {
|
||||
+ LC_ALL=C
|
||||
+ time -p "${@}"
|
||||
+ } 2>&1 | awk '/^real/ { print $2 * 1000 }'
|
||||
+}
|
||||
+
|
||||
+cleanup
|
||||
+
|
||||
+TEST glusterd
|
||||
+TEST pidof glusterd
|
||||
+TEST $CLI volume create $V0 disperse 6 redundancy 2 $H0:$B0/${V0}{0..5}
|
||||
+
|
||||
+TEST $CLI volume set $V0 disperse.eager-lock on
|
||||
+TEST $CLI volume set $V0 disperse.other-eager-lock on
|
||||
+TEST $CLI volume set $V0 features.locks-notify-contention on
|
||||
+TEST $CLI volume set $V0 disperse.eager-lock-timeout 10
|
||||
+TEST $CLI volume set $V0 disperse.other-eager-lock-timeout 10
|
||||
+
|
||||
+TEST $CLI volume start $V0
|
||||
+TEST $GFS --volfile-id=/$V0 --volfile-server=$H0 $M0
|
||||
+TEST $GFS --volfile-id=/$V0 --volfile-server=$H0 $M1
|
||||
+TEST $GFS --volfile-id=/$V0 --volfile-server=$H0 $M2
|
||||
+TEST $GFS --volfile-id=/$V0 --volfile-server=$H0 $M3
|
||||
+EXPECT_WITHIN $CHILD_UP_TIMEOUT "6" ec_child_up_count $V0 0 $M0
|
||||
+EXPECT_WITHIN $CHILD_UP_TIMEOUT "6" ec_child_up_count $V0 0 $M1
|
||||
+EXPECT_WITHIN $CHILD_UP_TIMEOUT "6" ec_child_up_count $V0 0 $M2
|
||||
+EXPECT_WITHIN $CHILD_UP_TIMEOUT "6" ec_child_up_count $V0 0 $M3
|
||||
+TEST mkdir $M0/dir
|
||||
+TEST touch $M0/dir/file.{1..10}
|
||||
+
|
||||
+# Run multiple 'ls' concurrently from multiple clients so that they collide and
|
||||
+# cause partial locks.
|
||||
+TEST [[ $(measure_time do_ls dir) -lt 10000 ]]
|
||||
+
|
||||
+cleanup
|
||||
diff --git a/xlators/cluster/ec/src/ec-common.c b/xlators/cluster/ec/src/ec-common.c
|
||||
index b1ba5e9..e85aa8b 100644
|
||||
--- a/xlators/cluster/ec/src/ec-common.c
|
||||
+++ b/xlators/cluster/ec/src/ec-common.c
|
||||
@@ -2497,7 +2497,7 @@ ec_lock_release(ec_t *ec, inode_t *inode)
|
||||
goto done;
|
||||
}
|
||||
lock = ctx->inode_lock;
|
||||
- if ((lock == NULL) || !lock->acquired || lock->release) {
|
||||
+ if ((lock == NULL) || lock->release) {
|
||||
goto done;
|
||||
}
|
||||
|
||||
--
|
||||
1.8.3.1
|
||||
|
@ -0,0 +1,65 @@
|
||||
From 55d47524c0c8a88204129c3a94d71779aae00beb Mon Sep 17 00:00:00 2001
|
||||
From: Mohit Agrawal <moagrawa@redhat.com>
|
||||
Date: Tue, 28 May 2019 08:18:12 +0530
|
||||
Subject: [PATCH 145/169] core: Capture process memory usage at the time of
|
||||
call gf_msg_nomem
|
||||
|
||||
Problem: All gluster processes call gf_mgm_nomem while calloc/malloc/realloc
|
||||
throw an error but the message does not capture current memory usage of
|
||||
gluster process
|
||||
|
||||
Solution: Call getrusage to capture current memory usage of gluster
|
||||
process
|
||||
|
||||
> Change-Id: I2e0319da1f33b177fa042fdc9e7268068576c9c3
|
||||
> fixes: bz#1708051
|
||||
> Reviewed on upstream link https://review.gluster.org/#/c/glusterfs/+/22688/
|
||||
> Cherry pick from commit 8e1d53f14730ac1b1ca0ce9d9a0ccb32578fd4fb
|
||||
|
||||
BUG: 1709087
|
||||
Change-Id: I2e0319da1f33b177fa042fdc9e7268068576c9c3
|
||||
Signed-off-by: Mohit Agrawal <moagrawa@redhat.com>
|
||||
Reviewed-on: https://code.engineering.redhat.com/gerrit/171587
|
||||
Tested-by: RHGS Build Bot <nigelb@redhat.com>
|
||||
Reviewed-by: Sunil Kumar Heggodu Gopala Acharya <sheggodu@redhat.com>
|
||||
---
|
||||
libglusterfs/src/logging.c | 7 +++++--
|
||||
1 file changed, 5 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/libglusterfs/src/logging.c b/libglusterfs/src/logging.c
|
||||
index 5d46916..7f0eff6 100644
|
||||
--- a/libglusterfs/src/logging.c
|
||||
+++ b/libglusterfs/src/logging.c
|
||||
@@ -17,6 +17,7 @@
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <syslog.h>
|
||||
+#include <sys/resource.h>
|
||||
|
||||
#ifdef HAVE_BACKTRACE
|
||||
#include <execinfo.h>
|
||||
@@ -1196,6 +1197,7 @@ _gf_msg_nomem(const char *domain, const char *file, const char *function,
|
||||
glusterfs_ctx_t *ctx = NULL;
|
||||
int wlen = 0;
|
||||
int priority;
|
||||
+ struct rusage r_usage;
|
||||
|
||||
this = THIS;
|
||||
ctx = this->ctx;
|
||||
@@ -1231,10 +1233,11 @@ _gf_msg_nomem(const char *domain, const char *file, const char *function,
|
||||
"]"
|
||||
" [%s:%d:%s] %s: no memory "
|
||||
"available for size (%" GF_PRI_SIZET
|
||||
- ")"
|
||||
+ ") current memory usage in kilobytes %ld"
|
||||
" [call stack follows]\n",
|
||||
timestr, gf_level_strings[level], (uint64_t)0, basename,
|
||||
- line, function, domain, size);
|
||||
+ line, function, domain, size,
|
||||
+ (!getrusage(RUSAGE_SELF, &r_usage) ? r_usage.ru_maxrss : 0));
|
||||
if (-1 == ret) {
|
||||
goto out;
|
||||
}
|
||||
--
|
||||
1.8.3.1
|
||||
|
146
0146-dht-Custom-xattrs-are-not-healed-in-case-of-add-bric.patch
Normal file
146
0146-dht-Custom-xattrs-are-not-healed-in-case-of-add-bric.patch
Normal file
@ -0,0 +1,146 @@
|
||||
From 8cc721ee43ac8038eecb712278378710ad0745ed Mon Sep 17 00:00:00 2001
|
||||
From: root <root@localhost.localdomain>
|
||||
Date: Sun, 7 Apr 2019 19:31:17 +0530
|
||||
Subject: [PATCH 146/169] dht: Custom xattrs are not healed in case of
|
||||
add-brick
|
||||
|
||||
Problem: If any custom xattrs are set on the directory before
|
||||
add a brick, xattrs are not healed on the directory
|
||||
after adding a brick.
|
||||
|
||||
Solution: xattr are not healed because dht_selfheal_dir_mkdir_lookup_cbk
|
||||
checks the value of MDS and if MDS value is not negative
|
||||
selfheal code path does not take reference of MDS xattrs.Change the
|
||||
condition to take reference of MDS xattr so that custom xattrs are
|
||||
populated on newly added brick
|
||||
|
||||
> Updates: bz#1702299
|
||||
> Change-Id: Id14beedb98cce6928055f294e1594b22132e811c
|
||||
> Signed-off-by: Mohit Agrawal <moagrawa@redhat.com>
|
||||
> (Cherry pick from commit aa52259de7b50625b754ce9fb5c0f38e22d79dd6)
|
||||
> (Reviewed on upstream link https://review.gluster.org/#/c/glusterfs/+/22520/)
|
||||
|
||||
BUG: 1702298
|
||||
Change-Id: Id14beedb98cce6928055f294e1594b22132e811c
|
||||
Signed-off-by: Mohit Agrawal <moagrawa@redhat.com>
|
||||
Reviewed-on: https://code.engineering.redhat.com/gerrit/171591
|
||||
Tested-by: RHGS Build Bot <nigelb@redhat.com>
|
||||
Reviewed-by: Sunil Kumar Heggodu Gopala Acharya <sheggodu@redhat.com>
|
||||
---
|
||||
tests/bugs/bug-1702299.t | 67 ++++++++++++++++++++++++++++++++++
|
||||
xlators/cluster/dht/src/dht-selfheal.c | 9 +----
|
||||
2 files changed, 68 insertions(+), 8 deletions(-)
|
||||
create mode 100644 tests/bugs/bug-1702299.t
|
||||
|
||||
diff --git a/tests/bugs/bug-1702299.t b/tests/bugs/bug-1702299.t
|
||||
new file mode 100644
|
||||
index 0000000..1cff2ed
|
||||
--- /dev/null
|
||||
+++ b/tests/bugs/bug-1702299.t
|
||||
@@ -0,0 +1,67 @@
|
||||
+#!/bin/bash
|
||||
+. $(dirname $0)/../include.rc
|
||||
+. $(dirname $0)/../volume.rc
|
||||
+. $(dirname $0)/../dht.rc
|
||||
+cleanup;
|
||||
+
|
||||
+function get_getfattr {
|
||||
+ local path=$1
|
||||
+ echo `getfattr -n user.foo $path` | cut -f2 -d"=" | sed -e 's/^"//' -e 's/"$//'
|
||||
+}
|
||||
+
|
||||
+function set_fattr {
|
||||
+ for i in `seq 1 10`
|
||||
+ do
|
||||
+ setfattr -n user.foo -v "newabc" ./tmp${i}
|
||||
+ if [ "$?" = "0" ]
|
||||
+ then
|
||||
+ succ=$((succ+1))
|
||||
+ else
|
||||
+ fail=$((fail+1))
|
||||
+ fi
|
||||
+ done
|
||||
+}
|
||||
+
|
||||
+
|
||||
+
|
||||
+TEST glusterd
|
||||
+TEST pidof glusterd
|
||||
+TEST $CLI volume create $V0 $H0:$B0/${V0}{0,1,2,3}
|
||||
+TEST $CLI volume start $V0
|
||||
+
|
||||
+TEST glusterfs --volfile-id=$V0 --volfile-server=$H0 --entry-timeout=0 --attribute-timeout=0 $M0;
|
||||
+
|
||||
+cd $M0
|
||||
+TEST mkdir tmp{1..10}
|
||||
+
|
||||
+succ=fail=0
|
||||
+## set user.foo xattr with value newabc after kill one brick
|
||||
+set_fattr
|
||||
+count=10
|
||||
+EXPECT "$succ" echo $count
|
||||
+count=0
|
||||
+EXPECT "$fail" echo $count
|
||||
+
|
||||
+cd -
|
||||
+
|
||||
+# Add-brick
|
||||
+TEST $CLI volume add-brick $V0 $H0:$B0/${V0}{4,5}
|
||||
+
|
||||
+cd $M0
|
||||
+## At this point dht code will heal xattr on down brick only for those dirs
|
||||
+## hashed subvol was up at the time of update xattr
|
||||
+TEST stat ./tmp{1..10}
|
||||
+
|
||||
+
|
||||
+## Count the user.foo xattr value with newabc on brick and compare with succ value
|
||||
+count=`getfattr -n user.foo $B0/${V0}4/tmp{1..10} | grep "user.foo" | grep -iw "newabc" | wc -l`
|
||||
+EXPECT "$succ" echo $count
|
||||
+
|
||||
+## Count the user.foo xattr value with newabc on brick and compare with succ value
|
||||
+count=`getfattr -n user.foo $B0/${V0}5/tmp{1..10} | grep "user.foo" | grep -iw "newabc" | wc -l`
|
||||
+EXPECT "$succ" echo $count
|
||||
+
|
||||
+
|
||||
+cd -
|
||||
+TEST umount $M0
|
||||
+cleanup
|
||||
diff --git a/xlators/cluster/dht/src/dht-selfheal.c b/xlators/cluster/dht/src/dht-selfheal.c
|
||||
index 5420fca..f5dfff9 100644
|
||||
--- a/xlators/cluster/dht/src/dht-selfheal.c
|
||||
+++ b/xlators/cluster/dht/src/dht-selfheal.c
|
||||
@@ -1310,12 +1310,8 @@ dht_selfheal_dir_mkdir_lookup_cbk(call_frame_t *frame, void *cookie,
|
||||
int this_call_cnt = 0;
|
||||
int missing_dirs = 0;
|
||||
dht_layout_t *layout = NULL;
|
||||
- dht_conf_t *conf = 0;
|
||||
xlator_t *prev = 0;
|
||||
loc_t *loc = NULL;
|
||||
- int check_mds = 0;
|
||||
- int errst = 0;
|
||||
- int32_t mds_xattr_val[1] = {0};
|
||||
char gfid_local[GF_UUID_BUF_SIZE] = {0};
|
||||
int index = -1;
|
||||
|
||||
@@ -1324,7 +1320,6 @@ dht_selfheal_dir_mkdir_lookup_cbk(call_frame_t *frame, void *cookie,
|
||||
local = frame->local;
|
||||
layout = local->layout;
|
||||
loc = &local->loc;
|
||||
- conf = this->private;
|
||||
prev = cookie;
|
||||
|
||||
if (!gf_uuid_is_null(local->gfid))
|
||||
@@ -1347,9 +1342,7 @@ dht_selfheal_dir_mkdir_lookup_cbk(call_frame_t *frame, void *cookie,
|
||||
|
||||
if (!op_ret) {
|
||||
dht_iatt_merge(this, &local->stbuf, stbuf);
|
||||
- check_mds = dht_dict_get_array(xattr, conf->mds_xattr_key,
|
||||
- mds_xattr_val, 1, &errst);
|
||||
- if (dict_get(xattr, conf->mds_xattr_key) && check_mds && !errst) {
|
||||
+ if (prev == local->mds_subvol) {
|
||||
dict_unref(local->xattr);
|
||||
local->xattr = dict_ref(xattr);
|
||||
}
|
||||
--
|
||||
1.8.3.1
|
||||
|
@ -0,0 +1,80 @@
|
||||
From d7795a592883cfb01da76b6905a7c9eb1e912bef Mon Sep 17 00:00:00 2001
|
||||
From: Mohit Agrawal <moagrawa@redhat.com>
|
||||
Date: Tue, 28 May 2019 08:28:29 +0530
|
||||
Subject: [PATCH 147/169] glusterd: bulkvoldict thread is not handling all
|
||||
volumes
|
||||
|
||||
Problem: In commit ac70f66c5805e10b3a1072bd467918730c0aeeb4 I
|
||||
missed one condition to populate volume dictionary in
|
||||
multiple threads while brick_multiplex is enabled.Due
|
||||
to that glusterd is not sending volume dictionary for
|
||||
all volumes to peer.
|
||||
|
||||
Solution: Update the condition in code as well as update test case
|
||||
also to avoid the issue
|
||||
|
||||
> Change-Id: I06522dbdfee4f7e995d9cc7b7098fdf35340dc52
|
||||
> fixes: bz#1711250
|
||||
> Cherry pick from commit 4a5fb52eb1c5387a0fb8bfa1253e5227c7c255e8
|
||||
> Reviewed on upstream link https://review.gluster.org/#/c/glusterfs/+/22739/
|
||||
|
||||
BUG: 1711249
|
||||
Change-Id: I06522dbdfee4f7e995d9cc7b7098fdf35340dc52
|
||||
Signed-off-by: Mohit Agrawal <moagrawa@redhat.com>
|
||||
Reviewed-on: https://code.engineering.redhat.com/gerrit/171589
|
||||
Tested-by: RHGS Build Bot <nigelb@redhat.com>
|
||||
Reviewed-by: Sunil Kumar Heggodu Gopala Acharya <sheggodu@redhat.com>
|
||||
---
|
||||
tests/bugs/glusterd/bug-1699339.t | 16 ++++++++++------
|
||||
xlators/mgmt/glusterd/src/glusterd-utils.c | 2 +-
|
||||
2 files changed, 11 insertions(+), 7 deletions(-)
|
||||
|
||||
diff --git a/tests/bugs/glusterd/bug-1699339.t b/tests/bugs/glusterd/bug-1699339.t
|
||||
index 3e950f4..bb8d4f4 100644
|
||||
--- a/tests/bugs/glusterd/bug-1699339.t
|
||||
+++ b/tests/bugs/glusterd/bug-1699339.t
|
||||
@@ -52,18 +52,22 @@ done
|
||||
|
||||
TEST kill_glusterd 1
|
||||
|
||||
-vol1=$(printf "%s-vol%02d" $V0 1)
|
||||
+TESTS_EXPECTED_IN_LOOP=4
|
||||
+for i in `seq 1 3 15`
|
||||
+do
|
||||
+vol1=$(printf "%s-vol%02d" $V0 $i)
|
||||
TEST $CLI_2 volume set $vol1 performance.readdir-ahead on
|
||||
-vol2=$(printf "%s-vol%02d" $V0 2)
|
||||
-TEST $CLI_2 volume set $vol2 performance.readdir-ahead on
|
||||
+done
|
||||
|
||||
# Bring back 1st glusterd
|
||||
TEST $glusterd_1
|
||||
EXPECT_WITHIN $PROBE_TIMEOUT 2 peer_count
|
||||
|
||||
+TESTS_EXPECTED_IN_LOOP=4
|
||||
+for i in `seq 1 3 15`
|
||||
+do
|
||||
+vol1=$(printf "%s-vol%02d" $V0 $i)
|
||||
EXPECT_WITHIN $PROBE_TIMEOUT "on" volinfo_field_1 $vol1 performance.readdir-ahead
|
||||
-
|
||||
-vol_name=$(printf "%s-vol%02d" $V0 2)
|
||||
-EXPECT_WITHIN $PROBE_TIMEOUT "on" volinfo_field_1 $vol2 performance.readdir-ahead
|
||||
+done
|
||||
|
||||
cleanup
|
||||
diff --git a/xlators/mgmt/glusterd/src/glusterd-utils.c b/xlators/mgmt/glusterd/src/glusterd-utils.c
|
||||
index efa5a86..8f1525e 100644
|
||||
--- a/xlators/mgmt/glusterd/src/glusterd-utils.c
|
||||
+++ b/xlators/mgmt/glusterd/src/glusterd-utils.c
|
||||
@@ -3542,7 +3542,7 @@ glusterd_add_volumes_to_export_dict(dict_t **peer_data)
|
||||
if ((i + 1) != totthread) {
|
||||
arg->end = ((i + 1) * vol_per_thread_limit);
|
||||
} else {
|
||||
- arg->end = ((i * vol_per_thread_limit) + endindex);
|
||||
+ arg->end = (((i + 1) * vol_per_thread_limit) + endindex);
|
||||
}
|
||||
th_ret = gf_thread_create_detached(
|
||||
&th_id, glusterd_add_bulk_volumes_create_thread, arg,
|
||||
--
|
||||
1.8.3.1
|
||||
|
@ -0,0 +1,70 @@
|
||||
From 92aadb6a5eeec75edf7f5a11a0ebd861dd85ca6b Mon Sep 17 00:00:00 2001
|
||||
From: N Balachandran <nbalacha@redhat.com>
|
||||
Date: Mon, 20 May 2019 15:23:42 +0530
|
||||
Subject: [PATCH 148/169] cluster/dht: Lookup all files when processing
|
||||
directory
|
||||
|
||||
A rebalance process currently only looks up files
|
||||
that it is supposed to migrate. This could cause issues
|
||||
when lookup-optimize is enabled as the dir layout can be
|
||||
updated with the commit hash before all files are looked up.
|
||||
This is expecially problematic if one of the rebalance processes
|
||||
fails to complete as clients will try to access files whose
|
||||
linkto files might not have been created.
|
||||
Each process will now lookup every file in the directory it is
|
||||
processing.
|
||||
Pros: Less likely that files will be inaccessible.
|
||||
Cons: More lookup requests sent to the bricks and a potential
|
||||
performance hit.
|
||||
Note: this does not handle races such as when a layout is updated on disk
|
||||
just as the create fop is sent by the client.
|
||||
|
||||
upstream : https://review.gluster.org/#/c/glusterfs/+/22746/
|
||||
|
||||
>Change-Id: I22b55846effc08d3b827c3af9335229335f67fb8
|
||||
>fixes: bz#1711764
|
||||
|
||||
BUG#1714124
|
||||
|
||||
Change-Id: Ica6a9459befe53957f080001a2dda525b3b14d1c
|
||||
Signed-off-by: N Balachandran <nbalacha@redhat.com>
|
||||
Reviewed-on: https://code.engineering.redhat.com/gerrit/172080
|
||||
Tested-by: RHGS Build Bot <nigelb@redhat.com>
|
||||
Reviewed-by: Mohit Agrawal <moagrawa@redhat.com>
|
||||
---
|
||||
xlators/cluster/dht/src/dht-rebalance.c | 12 ++++++------
|
||||
1 file changed, 6 insertions(+), 6 deletions(-)
|
||||
|
||||
diff --git a/xlators/cluster/dht/src/dht-rebalance.c b/xlators/cluster/dht/src/dht-rebalance.c
|
||||
index efbe8a4..559f046 100644
|
||||
--- a/xlators/cluster/dht/src/dht-rebalance.c
|
||||
+++ b/xlators/cluster/dht/src/dht-rebalance.c
|
||||
@@ -2741,12 +2741,6 @@ gf_defrag_migrate_single_file(void *opaque)
|
||||
goto out;
|
||||
}
|
||||
|
||||
- if (!gf_defrag_should_i_migrate(this, rebal_entry->local_subvol_index,
|
||||
- entry->d_stat.ia_gfid)) {
|
||||
- gf_msg_debug(this->name, 0, "Don't migrate %s ", entry_loc.path);
|
||||
- goto out;
|
||||
- }
|
||||
-
|
||||
gf_uuid_copy(entry_loc.gfid, entry->d_stat.ia_gfid);
|
||||
|
||||
gf_uuid_copy(entry_loc.pargfid, loc->gfid);
|
||||
@@ -2772,6 +2766,12 @@ gf_defrag_migrate_single_file(void *opaque)
|
||||
goto out;
|
||||
}
|
||||
|
||||
+ if (!gf_defrag_should_i_migrate(this, rebal_entry->local_subvol_index,
|
||||
+ entry->d_stat.ia_gfid)) {
|
||||
+ gf_msg_debug(this->name, 0, "Don't migrate %s ", entry_loc.path);
|
||||
+ goto out;
|
||||
+ }
|
||||
+
|
||||
iatt_ptr = &iatt;
|
||||
|
||||
hashed_subvol = dht_subvol_get_hashed(this, &entry_loc);
|
||||
--
|
||||
1.8.3.1
|
||||
|
452
0149-glusterd-Optimize-code-to-copy-dictionary-in-handsha.patch
Normal file
452
0149-glusterd-Optimize-code-to-copy-dictionary-in-handsha.patch
Normal file
@ -0,0 +1,452 @@
|
||||
From 86eee7e829bb33cac9b611da511ecbd2f03fab25 Mon Sep 17 00:00:00 2001
|
||||
From: Mohit Agrawal <moagrawal@redhat.com>
|
||||
Date: Fri, 17 May 2019 19:26:48 +0530
|
||||
Subject: [PATCH 149/169] glusterd: Optimize code to copy dictionary in
|
||||
handshake code path
|
||||
|
||||
Problem: While high no. of volumes are configured around 2000
|
||||
glusterd has bottleneck during handshake at the time
|
||||
of copying dictionary
|
||||
|
||||
Solution: To avoid the bottleneck serialize a dictionary instead
|
||||
of copying key-value pair one by one
|
||||
|
||||
> Change-Id: I9fb332f432e4f915bc3af8dcab38bed26bda2b9a
|
||||
> fixes: bz#1711297
|
||||
> Cherry picked from commit f8f09178bb890924a8050b466cc2e7a0a30e35a7
|
||||
> (Reviewed on upstream link https://review.gluster.org/#/c/glusterfs/+/22742/)
|
||||
|
||||
BUG: 1711296
|
||||
Change-Id: I9fb332f432e4f915bc3af8dcab38bed26bda2b9a
|
||||
Signed-off-by: Mohit Agrawal <moagrawal@redhat.com>
|
||||
Reviewed-on: https://code.engineering.redhat.com/gerrit/172255
|
||||
Reviewed-by: Atin Mukherjee <amukherj@redhat.com>
|
||||
Tested-by: RHGS Build Bot <nigelb@redhat.com>
|
||||
---
|
||||
libglusterfs/src/dict.c | 6 +-
|
||||
libglusterfs/src/glusterfs/dict.h | 6 +
|
||||
libglusterfs/src/libglusterfs.sym | 1 +
|
||||
xlators/mgmt/glusterd/src/glusterd-rpc-ops.c | 27 ++--
|
||||
xlators/mgmt/glusterd/src/glusterd-utils.c | 187 +++++++++++++++++++++++----
|
||||
xlators/mgmt/glusterd/src/glusterd-utils.h | 3 +-
|
||||
xlators/mgmt/glusterd/src/glusterd.h | 5 +
|
||||
7 files changed, 194 insertions(+), 41 deletions(-)
|
||||
|
||||
diff --git a/libglusterfs/src/dict.c b/libglusterfs/src/dict.c
|
||||
index 4cd1fcf..6917df9 100644
|
||||
--- a/libglusterfs/src/dict.c
|
||||
+++ b/libglusterfs/src/dict.c
|
||||
@@ -2799,10 +2799,6 @@ dict_rename_key(dict_t *this, char *key, char *replace_key)
|
||||
* 4 4 4 <key len> <value len>
|
||||
*/
|
||||
|
||||
-#define DICT_HDR_LEN 4
|
||||
-#define DICT_DATA_HDR_KEY_LEN 4
|
||||
-#define DICT_DATA_HDR_VAL_LEN 4
|
||||
-
|
||||
/**
|
||||
* dict_serialized_length_lk - return the length of serialized dict. This
|
||||
* procedure has to be called with this->lock held.
|
||||
@@ -2812,7 +2808,7 @@ dict_rename_key(dict_t *this, char *key, char *replace_key)
|
||||
* : failure: -errno
|
||||
*/
|
||||
|
||||
-static int
|
||||
+int
|
||||
dict_serialized_length_lk(dict_t *this)
|
||||
{
|
||||
int ret = -EINVAL;
|
||||
diff --git a/libglusterfs/src/glusterfs/dict.h b/libglusterfs/src/glusterfs/dict.h
|
||||
index 52b833f..022f564 100644
|
||||
--- a/libglusterfs/src/glusterfs/dict.h
|
||||
+++ b/libglusterfs/src/glusterfs/dict.h
|
||||
@@ -91,6 +91,9 @@ typedef struct _data_pair data_pair_t;
|
||||
#define DICT_MAX_FLAGS 256
|
||||
#define DICT_FLAG_SET 1
|
||||
#define DICT_FLAG_CLEAR 0
|
||||
+#define DICT_HDR_LEN 4
|
||||
+#define DICT_DATA_HDR_KEY_LEN 4
|
||||
+#define DICT_DATA_HDR_VAL_LEN 4
|
||||
|
||||
struct _data {
|
||||
char *data;
|
||||
@@ -412,4 +415,7 @@ are_dicts_equal(dict_t *one, dict_t *two,
|
||||
gf_boolean_t (*value_ignore)(char *k));
|
||||
int
|
||||
dict_has_key_from_array(dict_t *dict, char **strings, gf_boolean_t *result);
|
||||
+
|
||||
+int
|
||||
+dict_serialized_length_lk(dict_t *this);
|
||||
#endif
|
||||
diff --git a/libglusterfs/src/libglusterfs.sym b/libglusterfs/src/libglusterfs.sym
|
||||
index cf5757c..ec474e7 100644
|
||||
--- a/libglusterfs/src/libglusterfs.sym
|
||||
+++ b/libglusterfs/src/libglusterfs.sym
|
||||
@@ -405,6 +405,7 @@ dict_rename_key
|
||||
dict_reset
|
||||
dict_serialize
|
||||
dict_serialized_length
|
||||
+dict_serialized_length_lk
|
||||
dict_serialize_value_with_delim
|
||||
dict_set
|
||||
dict_setn
|
||||
diff --git a/xlators/mgmt/glusterd/src/glusterd-rpc-ops.c b/xlators/mgmt/glusterd/src/glusterd-rpc-ops.c
|
||||
index 4ec9700..45f8f17 100644
|
||||
--- a/xlators/mgmt/glusterd/src/glusterd-rpc-ops.c
|
||||
+++ b/xlators/mgmt/glusterd/src/glusterd-rpc-ops.c
|
||||
@@ -1528,11 +1528,9 @@ glusterd_rpc_friend_add(call_frame_t *frame, xlator_t *this, void *data)
|
||||
|
||||
RCU_READ_UNLOCK;
|
||||
|
||||
- ret = glusterd_add_volumes_to_export_dict(&peer_data);
|
||||
- if (ret) {
|
||||
- gf_msg(this->name, GF_LOG_ERROR, 0, GD_MSG_DICT_SET_FAILED,
|
||||
- "Unable to add list of volumes "
|
||||
- "in the peer_data dict for handshake");
|
||||
+ peer_data = dict_new();
|
||||
+ if (!peer_data) {
|
||||
+ errno = ENOMEM;
|
||||
goto out;
|
||||
}
|
||||
|
||||
@@ -1563,10 +1561,23 @@ glusterd_rpc_friend_add(call_frame_t *frame, xlator_t *this, void *data)
|
||||
}
|
||||
}
|
||||
|
||||
- ret = dict_allocate_and_serialize(peer_data, &req.vols.vols_val,
|
||||
- &req.vols.vols_len);
|
||||
- if (ret)
|
||||
+ /* Don't add any key-value in peer_data dictionary after call this function
|
||||
+ */
|
||||
+ ret = glusterd_add_volumes_to_export_dict(peer_data, &req.vols.vols_val,
|
||||
+ &req.vols.vols_len);
|
||||
+ if (ret) {
|
||||
+ gf_msg(this->name, GF_LOG_ERROR, 0, GD_MSG_DICT_SET_FAILED,
|
||||
+ "Unable to add list of volumes "
|
||||
+ "in the peer_data dict for handshake");
|
||||
goto out;
|
||||
+ }
|
||||
+
|
||||
+ if (!req.vols.vols_len) {
|
||||
+ ret = dict_allocate_and_serialize(peer_data, &req.vols.vols_val,
|
||||
+ &req.vols.vols_len);
|
||||
+ if (ret)
|
||||
+ goto out;
|
||||
+ }
|
||||
|
||||
ret = glusterd_submit_request(
|
||||
peerinfo->rpc, &req, frame, peerinfo->peer, GLUSTERD_FRIEND_ADD, NULL,
|
||||
diff --git a/xlators/mgmt/glusterd/src/glusterd-utils.c b/xlators/mgmt/glusterd/src/glusterd-utils.c
|
||||
index 8f1525e..2bc4836 100644
|
||||
--- a/xlators/mgmt/glusterd/src/glusterd-utils.c
|
||||
+++ b/xlators/mgmt/glusterd/src/glusterd-utils.c
|
||||
@@ -3466,11 +3466,118 @@ out:
|
||||
return NULL;
|
||||
}
|
||||
|
||||
+int
|
||||
+glusterd_dict_searialize(dict_t *dict_arr[], int count, int totcount, char *buf)
|
||||
+{
|
||||
+ int i = 0;
|
||||
+ int32_t keylen = 0;
|
||||
+ int64_t netword = 0;
|
||||
+ data_pair_t *pair = NULL;
|
||||
+ int dict_count = 0;
|
||||
+ int ret = 0;
|
||||
+
|
||||
+ netword = hton32(totcount);
|
||||
+ memcpy(buf, &netword, sizeof(netword));
|
||||
+ buf += DICT_HDR_LEN;
|
||||
+
|
||||
+ for (i = 0; i < count; i++) {
|
||||
+ if (dict_arr[i]) {
|
||||
+ dict_count = dict_arr[i]->count;
|
||||
+ pair = dict_arr[i]->members_list;
|
||||
+ while (dict_count) {
|
||||
+ if (!pair) {
|
||||
+ gf_msg("glusterd", GF_LOG_ERROR, 0,
|
||||
+ LG_MSG_PAIRS_LESS_THAN_COUNT,
|
||||
+ "less than count data pairs found!");
|
||||
+ ret = -1;
|
||||
+ goto out;
|
||||
+ }
|
||||
+
|
||||
+ if (!pair->key) {
|
||||
+ gf_msg("glusterd", GF_LOG_ERROR, 0, LG_MSG_NULL_PTR,
|
||||
+ "pair->key is null!");
|
||||
+ ret = -1;
|
||||
+ goto out;
|
||||
+ }
|
||||
+
|
||||
+ keylen = strlen(pair->key);
|
||||
+ netword = hton32(keylen);
|
||||
+ memcpy(buf, &netword, sizeof(netword));
|
||||
+ buf += DICT_DATA_HDR_KEY_LEN;
|
||||
+ if (!pair->value) {
|
||||
+ gf_msg("glusterd", GF_LOG_ERROR, 0, LG_MSG_NULL_PTR,
|
||||
+ "pair->value is null!");
|
||||
+ ret = -1;
|
||||
+ goto out;
|
||||
+ }
|
||||
+
|
||||
+ netword = hton32(pair->value->len);
|
||||
+ memcpy(buf, &netword, sizeof(netword));
|
||||
+ buf += DICT_DATA_HDR_VAL_LEN;
|
||||
+
|
||||
+ memcpy(buf, pair->key, keylen);
|
||||
+ buf += keylen;
|
||||
+ *buf++ = '\0';
|
||||
+
|
||||
+ if (pair->value->data) {
|
||||
+ memcpy(buf, pair->value->data, pair->value->len);
|
||||
+ buf += pair->value->len;
|
||||
+ }
|
||||
+
|
||||
+ pair = pair->next;
|
||||
+ dict_count--;
|
||||
+ }
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+out:
|
||||
+ for (i = 0; i < count; i++) {
|
||||
+ if (dict_arr[i])
|
||||
+ dict_unref(dict_arr[i]);
|
||||
+ }
|
||||
+ return ret;
|
||||
+}
|
||||
+
|
||||
+int
|
||||
+glusterd_dict_arr_serialize(dict_t *dict_arr[], int count, char **buf,
|
||||
+ u_int *length)
|
||||
+{
|
||||
+ ssize_t len = 0;
|
||||
+ int i = 0;
|
||||
+ int totcount = 0;
|
||||
+ int ret = 0;
|
||||
+
|
||||
+ for (i = 0; i < count; i++) {
|
||||
+ if (dict_arr[i]) {
|
||||
+ len += dict_serialized_length_lk(dict_arr[i]);
|
||||
+ totcount += dict_arr[i]->count;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ // Subtract HDR_LEN except one dictionary
|
||||
+ len = len - ((count - 1) * DICT_HDR_LEN);
|
||||
+
|
||||
+ *buf = GF_MALLOC(len, gf_common_mt_char);
|
||||
+ if (*buf == NULL) {
|
||||
+ ret = -ENOMEM;
|
||||
+ goto out;
|
||||
+ }
|
||||
+
|
||||
+ if (length != NULL) {
|
||||
+ *length = len;
|
||||
+ }
|
||||
+
|
||||
+ ret = glusterd_dict_searialize(dict_arr, count, totcount, *buf);
|
||||
+
|
||||
+out:
|
||||
+ return ret;
|
||||
+}
|
||||
+
|
||||
int32_t
|
||||
-glusterd_add_volumes_to_export_dict(dict_t **peer_data)
|
||||
+glusterd_add_volumes_to_export_dict(dict_t *peer_data, char **buf,
|
||||
+ u_int *length)
|
||||
{
|
||||
int32_t ret = -1;
|
||||
- dict_t *dict = NULL;
|
||||
dict_t *dict_arr[128] = {
|
||||
0,
|
||||
};
|
||||
@@ -3496,10 +3603,6 @@ glusterd_add_volumes_to_export_dict(dict_t **peer_data)
|
||||
priv = this->private;
|
||||
GF_ASSERT(priv);
|
||||
|
||||
- dict = dict_new();
|
||||
- if (!dict)
|
||||
- goto out;
|
||||
-
|
||||
/* Count the total number of volumes */
|
||||
cds_list_for_each_entry(volinfo, &priv->volumes, vol_list) volcnt++;
|
||||
|
||||
@@ -3520,14 +3623,15 @@ glusterd_add_volumes_to_export_dict(dict_t **peer_data)
|
||||
cds_list_for_each_entry(volinfo, &priv->volumes, vol_list)
|
||||
{
|
||||
count++;
|
||||
- ret = glusterd_add_volume_to_dict(volinfo, dict, count, "volume");
|
||||
+ ret = glusterd_add_volume_to_dict(volinfo, peer_data, count,
|
||||
+ "volume");
|
||||
if (ret)
|
||||
goto out;
|
||||
|
||||
if (!dict_get_sizen(volinfo->dict, VKEY_FEATURES_QUOTA))
|
||||
continue;
|
||||
|
||||
- ret = glusterd_vol_add_quota_conf_to_dict(volinfo, dict, count,
|
||||
+ ret = glusterd_vol_add_quota_conf_to_dict(volinfo, peer_data, count,
|
||||
"volume");
|
||||
if (ret)
|
||||
goto out;
|
||||
@@ -3569,34 +3673,34 @@ glusterd_add_volumes_to_export_dict(dict_t **peer_data)
|
||||
|
||||
gf_log(this->name, GF_LOG_INFO,
|
||||
"Finished dictionary popluation in all threads");
|
||||
- for (i = 0; i < totthread; i++) {
|
||||
- dict_copy_with_ref(dict_arr[i], dict);
|
||||
- dict_unref(dict_arr[i]);
|
||||
- }
|
||||
- gf_log(this->name, GF_LOG_INFO,
|
||||
- "Finished merger of all dictionraies into single one");
|
||||
}
|
||||
|
||||
- ret = dict_set_int32n(dict, "count", SLEN("count"), volcnt);
|
||||
+ ret = dict_set_int32n(peer_data, "count", SLEN("count"), volcnt);
|
||||
if (ret)
|
||||
goto out;
|
||||
|
||||
- ctx.dict = dict;
|
||||
+ ctx.dict = peer_data;
|
||||
ctx.prefix = "global";
|
||||
ctx.opt_count = 1;
|
||||
ctx.key_name = "key";
|
||||
ctx.val_name = "val";
|
||||
dict_foreach(priv->opts, _add_dict_to_prdict, &ctx);
|
||||
ctx.opt_count--;
|
||||
- ret = dict_set_int32n(dict, "global-opt-count", SLEN("global-opt-count"),
|
||||
- ctx.opt_count);
|
||||
+ ret = dict_set_int32n(peer_data, "global-opt-count",
|
||||
+ SLEN("global-opt-count"), ctx.opt_count);
|
||||
if (ret)
|
||||
goto out;
|
||||
|
||||
- *peer_data = dict;
|
||||
+ if (totthread) {
|
||||
+ gf_log(this->name, GF_LOG_INFO,
|
||||
+ "Finished merger of all dictionraies into single one");
|
||||
+ dict_arr[totthread++] = peer_data;
|
||||
+ ret = glusterd_dict_arr_serialize(dict_arr, totthread, buf, length);
|
||||
+ gf_log(this->name, GF_LOG_INFO,
|
||||
+ "Serialize dictionary data return is %d", ret);
|
||||
+ }
|
||||
+
|
||||
out:
|
||||
- if (ret)
|
||||
- dict_unref(dict);
|
||||
|
||||
gf_msg_trace(this->name, 0, "Returning %d", ret);
|
||||
return ret;
|
||||
@@ -4940,6 +5044,7 @@ glusterd_import_friend_volumes_synctask(void *opaque)
|
||||
xlator_t *this = NULL;
|
||||
glusterd_conf_t *conf = NULL;
|
||||
dict_t *peer_data = NULL;
|
||||
+ glusterd_friend_synctask_args_t *arg = NULL;
|
||||
|
||||
this = THIS;
|
||||
GF_ASSERT(this);
|
||||
@@ -4947,8 +5052,20 @@ glusterd_import_friend_volumes_synctask(void *opaque)
|
||||
conf = this->private;
|
||||
GF_ASSERT(conf);
|
||||
|
||||
- peer_data = (dict_t *)opaque;
|
||||
- GF_ASSERT(peer_data);
|
||||
+ arg = opaque;
|
||||
+ if (!arg)
|
||||
+ goto out;
|
||||
+
|
||||
+ peer_data = dict_new();
|
||||
+ if (!peer_data) {
|
||||
+ goto out;
|
||||
+ }
|
||||
+
|
||||
+ ret = dict_unserialize(arg->dict_buf, arg->dictlen, &peer_data);
|
||||
+ if (ret) {
|
||||
+ errno = ENOMEM;
|
||||
+ goto out;
|
||||
+ }
|
||||
|
||||
ret = dict_get_int32n(peer_data, "count", SLEN("count"), &count);
|
||||
if (ret)
|
||||
@@ -4980,6 +5097,11 @@ glusterd_import_friend_volumes_synctask(void *opaque)
|
||||
out:
|
||||
if (peer_data)
|
||||
dict_unref(peer_data);
|
||||
+ if (arg) {
|
||||
+ if (arg->dict_buf)
|
||||
+ GF_FREE(arg->dict_buf);
|
||||
+ GF_FREE(arg);
|
||||
+ }
|
||||
|
||||
gf_msg_debug("glusterd", 0, "Returning with %d", ret);
|
||||
return ret;
|
||||
@@ -5146,7 +5268,7 @@ glusterd_compare_friend_data(dict_t *peer_data, int32_t *status, char *hostname)
|
||||
gf_boolean_t update = _gf_false;
|
||||
xlator_t *this = NULL;
|
||||
glusterd_conf_t *priv = NULL;
|
||||
- dict_t *peer_data_copy = NULL;
|
||||
+ glusterd_friend_synctask_args_t *arg = NULL;
|
||||
|
||||
this = THIS;
|
||||
GF_ASSERT(this);
|
||||
@@ -5188,12 +5310,23 @@ glusterd_compare_friend_data(dict_t *peer_data, int32_t *status, char *hostname)
|
||||
* first brick to come up before attaching the subsequent bricks
|
||||
* in case brick multiplexing is enabled
|
||||
*/
|
||||
- peer_data_copy = dict_copy_with_ref(peer_data, NULL);
|
||||
- glusterd_launch_synctask(glusterd_import_friend_volumes_synctask,
|
||||
- peer_data_copy);
|
||||
+ arg = GF_CALLOC(1, sizeof(*arg), gf_common_mt_char);
|
||||
+ ret = dict_allocate_and_serialize(peer_data, &arg->dict_buf,
|
||||
+ &arg->dictlen);
|
||||
+ if (ret < 0) {
|
||||
+ gf_log(this->name, GF_LOG_ERROR,
|
||||
+ "dict_serialize failed while handling "
|
||||
+ " import friend volume request");
|
||||
+ goto out;
|
||||
+ }
|
||||
+
|
||||
+ glusterd_launch_synctask(glusterd_import_friend_volumes_synctask, arg);
|
||||
}
|
||||
|
||||
out:
|
||||
+ if (ret && arg) {
|
||||
+ GF_FREE(arg);
|
||||
+ }
|
||||
gf_msg_debug(this->name, 0, "Returning with ret: %d, status: %d", ret,
|
||||
*status);
|
||||
return ret;
|
||||
diff --git a/xlators/mgmt/glusterd/src/glusterd-utils.h b/xlators/mgmt/glusterd/src/glusterd-utils.h
|
||||
index 3647c34..6ad8062 100644
|
||||
--- a/xlators/mgmt/glusterd/src/glusterd-utils.h
|
||||
+++ b/xlators/mgmt/glusterd/src/glusterd-utils.h
|
||||
@@ -227,7 +227,8 @@ glusterd_volume_brickinfo_get_by_brick(char *brick, glusterd_volinfo_t *volinfo,
|
||||
gf_boolean_t construct_real_path);
|
||||
|
||||
int32_t
|
||||
-glusterd_add_volumes_to_export_dict(dict_t **peer_data);
|
||||
+glusterd_add_volumes_to_export_dict(dict_t *peer_data, char **buf,
|
||||
+ u_int *length);
|
||||
|
||||
int32_t
|
||||
glusterd_compare_friend_data(dict_t *peer_data, int32_t *status,
|
||||
diff --git a/xlators/mgmt/glusterd/src/glusterd.h b/xlators/mgmt/glusterd/src/glusterd.h
|
||||
index 2ea8560..f96bca3 100644
|
||||
--- a/xlators/mgmt/glusterd/src/glusterd.h
|
||||
+++ b/xlators/mgmt/glusterd/src/glusterd.h
|
||||
@@ -240,6 +240,11 @@ typedef struct glusterd_add_dict_args {
|
||||
int end;
|
||||
} glusterd_add_dict_args_t;
|
||||
|
||||
+typedef struct glusterd_friend_synctask_args {
|
||||
+ char *dict_buf;
|
||||
+ u_int dictlen;
|
||||
+} glusterd_friend_synctask_args_t;
|
||||
+
|
||||
typedef enum gf_brick_status {
|
||||
GF_BRICK_STOPPED,
|
||||
GF_BRICK_STARTED,
|
||||
--
|
||||
1.8.3.1
|
||||
|
38
0150-libglusterfs-define-macros-needed-for-cloudsync.patch
Normal file
38
0150-libglusterfs-define-macros-needed-for-cloudsync.patch
Normal file
@ -0,0 +1,38 @@
|
||||
From 4c410d99792808b0c8deb601d50c66df19f73ca7 Mon Sep 17 00:00:00 2001
|
||||
From: Anuradha Talur <atalur@commvault.com>
|
||||
Date: Thu, 25 Oct 2018 17:23:10 -0400
|
||||
Subject: [PATCH 150/169] libglusterfs: define macros needed for cloudsync
|
||||
|
||||
backport of patch: https://review.gluster.org/#/c/glusterfs/+/21585/
|
||||
|
||||
> Change-Id: Iec5ce7f17fbf899f881a58cd20c4c967e3b71668
|
||||
> fixes: bz#1642168
|
||||
> Signed-off-by: Anuradha Talur <atalur@commvault.com>
|
||||
|
||||
Change-Id: I79e5d955559acdec7cbeb8f35c8482b3b6ff8b0f
|
||||
Signed-off-by: Susant Palai <spalai@redhat.com>
|
||||
Reviewed-on: https://code.engineering.redhat.com/gerrit/172189
|
||||
Tested-by: RHGS Build Bot <nigelb@redhat.com>
|
||||
Reviewed-by: Atin Mukherjee <amukherj@redhat.com>
|
||||
---
|
||||
libglusterfs/src/glusterfs/glusterfs.h | 4 ++++
|
||||
1 file changed, 4 insertions(+)
|
||||
|
||||
diff --git a/libglusterfs/src/glusterfs/glusterfs.h b/libglusterfs/src/glusterfs/glusterfs.h
|
||||
index fb727fc..516b497 100644
|
||||
--- a/libglusterfs/src/glusterfs/glusterfs.h
|
||||
+++ b/libglusterfs/src/glusterfs/glusterfs.h
|
||||
@@ -364,6 +364,10 @@ enum gf_internal_fop_indicator {
|
||||
} while (0)
|
||||
|
||||
#define GF_CS_OBJECT_SIZE "trusted.glusterfs.cs.object_size"
|
||||
+#define GF_CS_BLOCK_SIZE "trusted.glusterfs.cs.block_size"
|
||||
+#define GF_CS_NUM_BLOCKS "trusted.glusterfs.cs.num_blocks"
|
||||
+
|
||||
+#define GF_CS_XATTR_ARCHIVE_UUID "trusted.cloudsync.uuid"
|
||||
|
||||
#define GF_CS_OBJECT_UPLOAD_COMPLETE "trusted.glusterfs.csou.complete"
|
||||
#define GF_CS_OBJECT_REMOTE "trusted.glusterfs.cs.remote"
|
||||
--
|
||||
1.8.3.1
|
||||
|
156
0151-mgmt-glusterd-Make-changes-related-to-cloudsync-xlat.patch
Normal file
156
0151-mgmt-glusterd-Make-changes-related-to-cloudsync-xlat.patch
Normal file
@ -0,0 +1,156 @@
|
||||
From bffdcce7119f3ed68694df918e504cc241502835 Mon Sep 17 00:00:00 2001
|
||||
From: Anuradha Talur <atalur@commvault.com>
|
||||
Date: Mon, 19 Nov 2018 17:57:18 -0800
|
||||
Subject: [PATCH 151/169] mgmt/glusterd: Make changes related to cloudsync
|
||||
xlator
|
||||
|
||||
1) The placement of cloudsync xlator has been changed
|
||||
to make it shard xlator's child. If cloudsync has to
|
||||
work with shard in the graph, it needs to be child of shard.
|
||||
|
||||
backport of: https://review.gluster.org/#/c/glusterfs/+/21681/
|
||||
|
||||
> Change-Id: Ib55424fdcb7ce8edae9f19b8a6e3d3ba86c1f0c4
|
||||
> fixes: bz#1642168
|
||||
> Signed-off-by: Anuradha Talur <atalur@commvault.com>
|
||||
|
||||
Change-Id: I68fd43b2c559cc2d9f05e1ab19784b174233d690
|
||||
Signed-off-by: Susant Palai <spalai@redhat.com>
|
||||
Reviewed-on: https://code.engineering.redhat.com/gerrit/172190
|
||||
Tested-by: RHGS Build Bot <nigelb@redhat.com>
|
||||
Reviewed-by: Atin Mukherjee <amukherj@redhat.com>
|
||||
---
|
||||
tests/basic/glusterd/check-cloudsync-ancestry.t | 48 +++++++++++++++++++++++++
|
||||
tests/volume.rc | 21 +++++++++++
|
||||
xlators/mgmt/glusterd/src/glusterd-volgen.c | 24 ++++++-------
|
||||
3 files changed, 81 insertions(+), 12 deletions(-)
|
||||
create mode 100644 tests/basic/glusterd/check-cloudsync-ancestry.t
|
||||
|
||||
diff --git a/tests/basic/glusterd/check-cloudsync-ancestry.t b/tests/basic/glusterd/check-cloudsync-ancestry.t
|
||||
new file mode 100644
|
||||
index 0000000..ff6ffee
|
||||
--- /dev/null
|
||||
+++ b/tests/basic/glusterd/check-cloudsync-ancestry.t
|
||||
@@ -0,0 +1,48 @@
|
||||
+#!/bin/bash
|
||||
+
|
||||
+. $(dirname $0)/../../include.rc
|
||||
+. $(dirname $0)/../../volume.rc
|
||||
+
|
||||
+# When shard and cloudsync xlators enabled on a volume, shard xlator
|
||||
+# should be an ancestor of cloudsync. This testcase is to check this condition.
|
||||
+
|
||||
+cleanup;
|
||||
+TEST glusterd
|
||||
+TEST pidof glusterd
|
||||
+TEST $CLI volume create $V0 $H0:$B0/b1 $H0:$B0/b2 $H0:$B0/b3
|
||||
+
|
||||
+volfile=$(gluster system:: getwd)"/vols/$V0/trusted-$V0.tcp-fuse.vol"
|
||||
+
|
||||
+#Test that both shard and cloudsync are not loaded
|
||||
+EXPECT "N" volgen_volume_exists $volfile $V0-shard features shard
|
||||
+EXPECT "N" volgen_volume_exists $volfile $V0-cloudsync features cloudsync
|
||||
+
|
||||
+#Enable shard and cloudsync in that order and check if volfile is correct
|
||||
+TEST $CLI volume set $V0 shard on
|
||||
+TEST $CLI volume set $V0 cloudsync on
|
||||
+
|
||||
+#Test that both shard and cloudsync are loaded
|
||||
+EXPECT "Y" volgen_volume_exists $volfile $V0-shard features shard
|
||||
+EXPECT "Y" volgen_volume_exists $volfile $V0-cloudsync features cloudsync
|
||||
+
|
||||
+EXPECT "Y" volgen_check_ancestry $volfile features shard features cloudsync
|
||||
+
|
||||
+#Disable shard and cloudsync
|
||||
+TEST $CLI volume set $V0 shard off
|
||||
+TEST $CLI volume set $V0 cloudsync off
|
||||
+
|
||||
+#Test that both shard and cloudsync are not loaded
|
||||
+EXPECT "N" volgen_volume_exists $volfile $V0-shard features shard
|
||||
+EXPECT "N" volgen_volume_exists $volfile $V0-cloudsync features cloudsync
|
||||
+
|
||||
+#Enable cloudsync and shard in that order and check if volfile is correct
|
||||
+TEST $CLI volume set $V0 cloudsync on
|
||||
+TEST $CLI volume set $V0 shard on
|
||||
+
|
||||
+#Test that both shard and cloudsync are loaded
|
||||
+EXPECT "Y" volgen_volume_exists $volfile $V0-shard features shard
|
||||
+EXPECT "Y" volgen_volume_exists $volfile $V0-cloudsync features cloudsync
|
||||
+
|
||||
+EXPECT "Y" volgen_check_ancestry $volfile features shard features cloudsync
|
||||
+
|
||||
+cleanup;
|
||||
diff --git a/tests/volume.rc b/tests/volume.rc
|
||||
index b326098..a0ea3b8 100644
|
||||
--- a/tests/volume.rc
|
||||
+++ b/tests/volume.rc
|
||||
@@ -891,3 +891,24 @@ function check_changelog_op {
|
||||
|
||||
$PYTHON $(dirname $0)/../../utils/changelogparser.py ${clog_path}/CHANGELOG | grep "$op" | wc -l
|
||||
}
|
||||
+
|
||||
+function volgen_check_ancestry {
|
||||
+ #Returns Y if ancestor_xl is an ancestor of $child_xl according to the volfile
|
||||
+ local volfile="$1"
|
||||
+
|
||||
+ local child_xl_type="$2"
|
||||
+ local child_xl="$3"
|
||||
+
|
||||
+ local ancestor_xl_type="$4"
|
||||
+ local ancestor_xl="$5"
|
||||
+
|
||||
+ child_linenum=$(awk '/type $child_xl_type\/$child_xl/ {print FNR}' $volfile)
|
||||
+ ancestor_linenum=$(awk '/type $ancestor_xl_type\/$ancestor_xl/ {print FNR}' $volfile)
|
||||
+
|
||||
+ if [ $child_linenum -lt $ancestor_linenum ];
|
||||
+ then
|
||||
+ echo "Y"
|
||||
+ else
|
||||
+ echo "N"
|
||||
+ fi
|
||||
+}
|
||||
diff --git a/xlators/mgmt/glusterd/src/glusterd-volgen.c b/xlators/mgmt/glusterd/src/glusterd-volgen.c
|
||||
index 77aa705..8b58d40 100644
|
||||
--- a/xlators/mgmt/glusterd/src/glusterd-volgen.c
|
||||
+++ b/xlators/mgmt/glusterd/src/glusterd-volgen.c
|
||||
@@ -4360,6 +4360,18 @@ client_graph_builder(volgen_graph_t *graph, glusterd_volinfo_t *volinfo,
|
||||
"tcp", set_dict);
|
||||
}
|
||||
|
||||
+ ret = dict_get_str_boolean(set_dict, "features.cloudsync", _gf_false);
|
||||
+ if (ret == -1)
|
||||
+ goto out;
|
||||
+
|
||||
+ if (ret) {
|
||||
+ xl = volgen_graph_add(graph, "features/cloudsync", volname);
|
||||
+ if (!xl) {
|
||||
+ ret = -1;
|
||||
+ goto out;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
ret = dict_get_str_boolean(set_dict, "features.shard", _gf_false);
|
||||
if (ret == -1)
|
||||
goto out;
|
||||
@@ -4567,18 +4579,6 @@ client_graph_builder(volgen_graph_t *graph, glusterd_volinfo_t *volinfo,
|
||||
if (ret)
|
||||
return -1;
|
||||
|
||||
- ret = dict_get_str_boolean(set_dict, "features.cloudsync", _gf_false);
|
||||
- if (ret == -1)
|
||||
- goto out;
|
||||
-
|
||||
- if (ret) {
|
||||
- xl = volgen_graph_add(graph, "features/cloudsync", volname);
|
||||
- if (!xl) {
|
||||
- ret = -1;
|
||||
- goto out;
|
||||
- }
|
||||
- }
|
||||
-
|
||||
/* if the client is part of 'gfproxyd' server, then we need to keep the
|
||||
volume name as 'gfproxyd-<volname>', for better portmapper options */
|
||||
subvol = volname;
|
||||
--
|
||||
1.8.3.1
|
||||
|
403
0152-storage-posix-changes-with-respect-to-cloudsync.patch
Normal file
403
0152-storage-posix-changes-with-respect-to-cloudsync.patch
Normal file
@ -0,0 +1,403 @@
|
||||
From 10e9f850017d58fcd813ccce253784280326f1d0 Mon Sep 17 00:00:00 2001
|
||||
From: Anuradha Talur <atalur@commvault.com>
|
||||
Date: Tue, 20 Nov 2018 13:15:26 -0800
|
||||
Subject: [PATCH 152/169] storage/posix: changes with respect to cloudsync
|
||||
|
||||
Main changes include logic to update iatt buf
|
||||
with file size from extended attributes in posix
|
||||
rather than having this logic in cloudsync xlator.
|
||||
|
||||
backport of:https://review.gluster.org/#/c/glusterfs/+/21694/
|
||||
|
||||
> Change-Id: I44f5f8df7a01e496372557fe2f4eff368dbdaa33
|
||||
> fixes: bz#1642168
|
||||
> Signed-off-by: Anuradha Talur <atalur@commvault.com>
|
||||
|
||||
Change-Id: I34880d856fb3add4ce88d64021d08d95405fc1c1
|
||||
Signed-off-by: Susant Palai <spalai@redhat.com>
|
||||
Reviewed-on: https://code.engineering.redhat.com/gerrit/172191
|
||||
Tested-by: RHGS Build Bot <nigelb@redhat.com>
|
||||
Reviewed-by: Atin Mukherjee <amukherj@redhat.com>
|
||||
---
|
||||
xlators/storage/posix/src/posix-entry-ops.c | 1 +
|
||||
xlators/storage/posix/src/posix-helpers.c | 50 +++++++++
|
||||
xlators/storage/posix/src/posix-inode-fd-ops.c | 139 ++++++++++++++++++++++---
|
||||
xlators/storage/posix/src/posix.h | 2 +
|
||||
4 files changed, 177 insertions(+), 15 deletions(-)
|
||||
|
||||
diff --git a/xlators/storage/posix/src/posix-entry-ops.c b/xlators/storage/posix/src/posix-entry-ops.c
|
||||
index fbd83c4..b24a052 100644
|
||||
--- a/xlators/storage/posix/src/posix-entry-ops.c
|
||||
+++ b/xlators/storage/posix/src/posix-entry-ops.c
|
||||
@@ -272,6 +272,7 @@ posix_lookup(call_frame_t *frame, xlator_t *this, loc_t *loc, dict_t *xdata)
|
||||
}
|
||||
}
|
||||
|
||||
+ posix_update_iatt_buf(&buf, -1, real_path, xdata);
|
||||
if (priv->update_pgfid_nlinks) {
|
||||
if (!gf_uuid_is_null(loc->pargfid) && !IA_ISDIR(buf.ia_type)) {
|
||||
MAKE_PGFID_XATTR_KEY(pgfid_xattr_key, PGFID_XATTR_KEY_PREFIX,
|
||||
diff --git a/xlators/storage/posix/src/posix-helpers.c b/xlators/storage/posix/src/posix-helpers.c
|
||||
index 37e33a9..d0fd45a 100644
|
||||
--- a/xlators/storage/posix/src/posix-helpers.c
|
||||
+++ b/xlators/storage/posix/src/posix-helpers.c
|
||||
@@ -3453,3 +3453,53 @@ posix_check_dev_file(xlator_t *this, inode_t *inode, char *fop, int *op_errno)
|
||||
out:
|
||||
return ret;
|
||||
}
|
||||
+
|
||||
+void
|
||||
+posix_update_iatt_buf(struct iatt *buf, int fd, char *loc, dict_t *xattr_req)
|
||||
+{
|
||||
+ int ret = 0;
|
||||
+ char val[4096] = {
|
||||
+ 0,
|
||||
+ };
|
||||
+
|
||||
+ if (!xattr_req)
|
||||
+ return;
|
||||
+
|
||||
+ if (!(dict_getn(xattr_req, GF_CS_OBJECT_STATUS,
|
||||
+ strlen(GF_CS_OBJECT_STATUS))))
|
||||
+ return;
|
||||
+
|
||||
+ if (fd != -1) {
|
||||
+ ret = sys_fgetxattr(fd, GF_CS_OBJECT_SIZE, &val, sizeof(val));
|
||||
+ if (ret > 0) {
|
||||
+ buf->ia_size = atoll(val);
|
||||
+ } else {
|
||||
+ /* Safe to assume that the other 2 xattrs are also not set*/
|
||||
+ return;
|
||||
+ }
|
||||
+ ret = sys_fgetxattr(fd, GF_CS_BLOCK_SIZE, &val, sizeof(val));
|
||||
+ if (ret > 0) {
|
||||
+ buf->ia_blksize = atoll(val);
|
||||
+ }
|
||||
+ ret = sys_fgetxattr(fd, GF_CS_NUM_BLOCKS, &val, sizeof(val));
|
||||
+ if (ret > 0) {
|
||||
+ buf->ia_blocks = atoll(val);
|
||||
+ }
|
||||
+ } else {
|
||||
+ ret = sys_lgetxattr(loc, GF_CS_OBJECT_SIZE, &val, sizeof(val));
|
||||
+ if (ret > 0) {
|
||||
+ buf->ia_size = atoll(val);
|
||||
+ } else {
|
||||
+ /* Safe to assume that the other 2 xattrs are also not set*/
|
||||
+ return;
|
||||
+ }
|
||||
+ ret = sys_lgetxattr(loc, GF_CS_BLOCK_SIZE, &val, sizeof(val));
|
||||
+ if (ret > 0) {
|
||||
+ buf->ia_blksize = atoll(val);
|
||||
+ }
|
||||
+ ret = sys_lgetxattr(loc, GF_CS_NUM_BLOCKS, &val, sizeof(val));
|
||||
+ if (ret > 0) {
|
||||
+ buf->ia_blocks = atoll(val);
|
||||
+ }
|
||||
+ }
|
||||
+}
|
||||
diff --git a/xlators/storage/posix/src/posix-inode-fd-ops.c b/xlators/storage/posix/src/posix-inode-fd-ops.c
|
||||
index 7dbbd3d..065fced 100644
|
||||
--- a/xlators/storage/posix/src/posix-inode-fd-ops.c
|
||||
+++ b/xlators/storage/posix/src/posix-inode-fd-ops.c
|
||||
@@ -108,6 +108,63 @@ extern char *marker_xattrs[];
|
||||
static char *disallow_removexattrs[] = {GF_XATTR_VOL_ID_KEY, GFID_XATTR_KEY,
|
||||
NULL};
|
||||
|
||||
+void
|
||||
+posix_cs_build_xattr_rsp(xlator_t *this, dict_t **rsp, dict_t *req, int fd,
|
||||
+ char *loc)
|
||||
+{
|
||||
+ int ret = 0;
|
||||
+ uuid_t uuid;
|
||||
+
|
||||
+ if (!(dict_getn(req, GF_CS_OBJECT_STATUS, strlen(GF_CS_OBJECT_STATUS))))
|
||||
+ return;
|
||||
+
|
||||
+ if (!(*rsp)) {
|
||||
+ *rsp = dict_new();
|
||||
+ if (!(*rsp)) {
|
||||
+ return;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ if (fd != -1) {
|
||||
+ if (dict_getn(req, GF_CS_XATTR_ARCHIVE_UUID,
|
||||
+ strlen(GF_CS_XATTR_ARCHIVE_UUID))) {
|
||||
+ ret = sys_fgetxattr(fd, GF_CS_XATTR_ARCHIVE_UUID, uuid, 16);
|
||||
+ if (ret > 0) {
|
||||
+ ret = dict_set_gfuuid(*rsp, GF_CS_XATTR_ARCHIVE_UUID, uuid,
|
||||
+ true);
|
||||
+ if (ret) {
|
||||
+ gf_msg(this->name, GF_LOG_WARNING, 0, P_MSG_DICT_SET_FAILED,
|
||||
+ "%s: Failed to set "
|
||||
+ "dictionary value for %s for fd %d",
|
||||
+ uuid_utoa(uuid), GF_CS_XATTR_ARCHIVE_UUID, fd);
|
||||
+ }
|
||||
+ } else {
|
||||
+ gf_msg_debug(this->name, 0, "getxattr failed on %s for fd %d",
|
||||
+ GF_CS_XATTR_ARCHIVE_UUID, fd);
|
||||
+ }
|
||||
+ }
|
||||
+ } else {
|
||||
+ if (dict_getn(req, GF_CS_XATTR_ARCHIVE_UUID,
|
||||
+ strlen(GF_CS_XATTR_ARCHIVE_UUID))) {
|
||||
+ ret = sys_lgetxattr(loc, GF_CS_XATTR_ARCHIVE_UUID, uuid, 16);
|
||||
+ if (ret > 0) {
|
||||
+ ret = dict_set_gfuuid(*rsp, GF_CS_XATTR_ARCHIVE_UUID, uuid,
|
||||
+ true);
|
||||
+ if (ret) {
|
||||
+ gf_msg(this->name, GF_LOG_WARNING, 0, P_MSG_DICT_SET_FAILED,
|
||||
+ "%s: Failed to set "
|
||||
+ "dictionary value for %s for loc %s",
|
||||
+ uuid_utoa(uuid), GF_CS_XATTR_ARCHIVE_UUID, loc);
|
||||
+ }
|
||||
+ } else {
|
||||
+ gf_msg_debug(this->name, 0, "getxattr failed on %s for %s",
|
||||
+ GF_CS_XATTR_ARCHIVE_UUID, loc);
|
||||
+ }
|
||||
+ }
|
||||
+ }
|
||||
+ return;
|
||||
+}
|
||||
+
|
||||
int32_t
|
||||
posix_stat(call_frame_t *frame, xlator_t *this, loc_t *loc, dict_t *xdata)
|
||||
{
|
||||
@@ -150,8 +207,11 @@ posix_stat(call_frame_t *frame, xlator_t *this, loc_t *loc, dict_t *xdata)
|
||||
|
||||
posix_cs_maintenance(this, NULL, loc, NULL, &buf, real_path, xdata,
|
||||
&xattr_rsp, _gf_true);
|
||||
+
|
||||
+ posix_cs_build_xattr_rsp(this, &xattr_rsp, xdata, -1, real_path);
|
||||
}
|
||||
|
||||
+ posix_update_iatt_buf(&buf, -1, real_path, xdata);
|
||||
op_ret = 0;
|
||||
|
||||
out:
|
||||
@@ -422,6 +482,8 @@ posix_setattr(call_frame_t *frame, xlator_t *this, loc_t *loc,
|
||||
if (xdata)
|
||||
xattr_rsp = posix_xattr_fill(this, real_path, loc, NULL, -1, xdata,
|
||||
&statpost);
|
||||
+ posix_update_iatt_buf(&statpre, -1, real_path, xdata);
|
||||
+ posix_update_iatt_buf(&statpost, -1, real_path, xdata);
|
||||
op_ret = 0;
|
||||
|
||||
out:
|
||||
@@ -898,6 +960,7 @@ posix_do_zerofill(call_frame_t *frame, xlator_t *this, fd_t *fd, off_t offset,
|
||||
}
|
||||
}
|
||||
|
||||
+ posix_update_iatt_buf(statpre, pfd->fd, NULL, xdata);
|
||||
/* See if we can use FALLOC_FL_ZERO_RANGE to perform the zero fill.
|
||||
* If it fails, fall back to _posix_do_zerofill() and an optional fsync.
|
||||
*/
|
||||
@@ -1366,6 +1429,7 @@ posix_truncate(call_frame_t *frame, xlator_t *this, loc_t *loc, off_t offset,
|
||||
}
|
||||
}
|
||||
|
||||
+ posix_update_iatt_buf(&prebuf, -1, real_path, xdata);
|
||||
op_ret = sys_truncate(real_path, offset);
|
||||
if (op_ret == -1) {
|
||||
op_errno = errno;
|
||||
@@ -1405,6 +1469,10 @@ posix_open(call_frame_t *frame, xlator_t *this, loc_t *loc, int32_t flags,
|
||||
int32_t _fd = -1;
|
||||
struct posix_fd *pfd = NULL;
|
||||
struct posix_private *priv = NULL;
|
||||
+ struct iatt preop = {
|
||||
+ 0,
|
||||
+ };
|
||||
+ dict_t *rsp_xdata = NULL;
|
||||
struct iatt stbuf = {
|
||||
0,
|
||||
};
|
||||
@@ -1471,6 +1539,18 @@ posix_open(call_frame_t *frame, xlator_t *this, loc_t *loc, int32_t flags,
|
||||
pfd->flags = flags;
|
||||
pfd->fd = _fd;
|
||||
|
||||
+ if (xdata) {
|
||||
+ op_ret = posix_fdstat(this, fd->inode, pfd->fd, &preop);
|
||||
+ if (op_ret == -1) {
|
||||
+ gf_msg(this->name, GF_LOG_ERROR, errno, P_MSG_FSTAT_FAILED,
|
||||
+ "pre-operation fstat failed on fd=%p", fd);
|
||||
+ goto out;
|
||||
+ }
|
||||
+
|
||||
+ posix_cs_maintenance(this, fd, NULL, &pfd->fd, &preop, NULL, xdata,
|
||||
+ &rsp_xdata, _gf_true);
|
||||
+ }
|
||||
+
|
||||
op_ret = fd_ctx_set(fd, this, (uint64_t)(long)pfd);
|
||||
if (op_ret)
|
||||
gf_msg(this->name, GF_LOG_WARNING, 0, P_MSG_FD_PATH_SETTING_FAILED,
|
||||
@@ -1488,7 +1568,7 @@ out:
|
||||
|
||||
SET_TO_OLD_FS_ID();
|
||||
|
||||
- STACK_UNWIND_STRICT(open, frame, op_ret, op_errno, fd, NULL);
|
||||
+ STACK_UNWIND_STRICT(open, frame, op_ret, op_errno, fd, rsp_xdata);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -1573,6 +1653,7 @@ posix_readv(call_frame_t *frame, xlator_t *this, fd_t *fd, size_t size,
|
||||
}
|
||||
}
|
||||
|
||||
+ posix_update_iatt_buf(&preop, _fd, NULL, xdata);
|
||||
op_ret = sys_pread(_fd, iobuf->ptr, size, offset);
|
||||
if (op_ret == -1) {
|
||||
op_errno = errno;
|
||||
@@ -1878,6 +1959,7 @@ posix_writev(call_frame_t *frame, xlator_t *this, fd_t *fd,
|
||||
}
|
||||
}
|
||||
|
||||
+ posix_update_iatt_buf(&preop, _fd, NULL, xdata);
|
||||
if (locked && write_append) {
|
||||
if (preop.ia_size == offset || (fd->flags & O_APPEND))
|
||||
is_append = 1;
|
||||
@@ -2531,10 +2613,8 @@ posix_setxattr(call_frame_t *frame, xlator_t *this, loc_t *loc, dict_t *dict,
|
||||
0,
|
||||
};
|
||||
data_t *tdata = NULL;
|
||||
- char stime[4096];
|
||||
- char sxattr[4096];
|
||||
+ char *cs_var = NULL;
|
||||
gf_cs_obj_state state = -1;
|
||||
- char remotepath[4096] = {0};
|
||||
int i = 0;
|
||||
int len;
|
||||
|
||||
@@ -2588,10 +2668,11 @@ posix_setxattr(call_frame_t *frame, xlator_t *this, loc_t *loc, dict_t *dict,
|
||||
goto unlock;
|
||||
}
|
||||
|
||||
- sprintf(stime, "%" PRId64, tmp_stbuf.ia_mtime);
|
||||
+ cs_var = alloca(4096);
|
||||
+ sprintf(cs_var, "%" PRId64, tmp_stbuf.ia_mtime);
|
||||
|
||||
/*TODO: may be should consider nano-second also */
|
||||
- if (strncmp(stime, tdata->data, tdata->len) != 0) {
|
||||
+ if (strncmp(cs_var, tdata->data, tdata->len) > 0) {
|
||||
gf_msg(this->name, GF_LOG_ERROR, 0, 0,
|
||||
"mtime "
|
||||
"passed is different from seen by file now."
|
||||
@@ -2601,31 +2682,54 @@ posix_setxattr(call_frame_t *frame, xlator_t *this, loc_t *loc, dict_t *dict,
|
||||
goto unlock;
|
||||
}
|
||||
|
||||
- len = sprintf(sxattr, "%" PRIu64, tmp_stbuf.ia_size);
|
||||
+ len = sprintf(cs_var, "%" PRIu64, tmp_stbuf.ia_size);
|
||||
|
||||
- ret = sys_lsetxattr(real_path, GF_CS_OBJECT_SIZE, sxattr, len,
|
||||
+ ret = sys_lsetxattr(real_path, GF_CS_OBJECT_SIZE, cs_var, len,
|
||||
flags);
|
||||
if (ret) {
|
||||
+ op_errno = errno;
|
||||
gf_msg(this->name, GF_LOG_ERROR, 0, 0,
|
||||
"setxattr failed. key %s err %d", GF_CS_OBJECT_SIZE,
|
||||
ret);
|
||||
+ goto unlock;
|
||||
+ }
|
||||
+
|
||||
+ len = sprintf(cs_var, "%" PRIu64, tmp_stbuf.ia_blocks);
|
||||
+
|
||||
+ ret = sys_lsetxattr(real_path, GF_CS_NUM_BLOCKS, cs_var, len,
|
||||
+ flags);
|
||||
+ if (ret) {
|
||||
op_errno = errno;
|
||||
+ gf_msg(this->name, GF_LOG_ERROR, 0, 0,
|
||||
+ "setxattr failed. key %s err %d", GF_CS_NUM_BLOCKS, ret);
|
||||
goto unlock;
|
||||
}
|
||||
|
||||
+ len = sprintf(cs_var, "%" PRIu32, tmp_stbuf.ia_blksize);
|
||||
+
|
||||
+ ret = sys_lsetxattr(real_path, GF_CS_BLOCK_SIZE, cs_var, len,
|
||||
+ flags);
|
||||
+ if (ret) {
|
||||
+ op_errno = errno;
|
||||
+ gf_msg(this->name, GF_LOG_ERROR, 0, 0,
|
||||
+ "setxattr failed. key %s err %d", GF_CS_BLOCK_SIZE, ret);
|
||||
+ goto unlock;
|
||||
+ }
|
||||
+
|
||||
+ memset(cs_var, 0, 4096);
|
||||
if (loc->path[0] == '/') {
|
||||
for (i = 1; i < strlen(loc->path); i++) {
|
||||
- remotepath[i - 1] = loc->path[i];
|
||||
+ cs_var[i - 1] = loc->path[i];
|
||||
}
|
||||
|
||||
- remotepath[i] = '\0';
|
||||
- gf_msg_debug(this->name, GF_LOG_ERROR, "remotepath %s",
|
||||
- remotepath);
|
||||
+ cs_var[i] = '\0';
|
||||
+ gf_msg_debug(this->name, GF_LOG_ERROR, "remotepath %s", cs_var);
|
||||
}
|
||||
|
||||
- ret = sys_lsetxattr(real_path, GF_CS_OBJECT_REMOTE, remotepath,
|
||||
- strlen(loc->path), flags);
|
||||
+ ret = sys_lsetxattr(real_path, GF_CS_OBJECT_REMOTE, cs_var,
|
||||
+ strlen(cs_var), flags);
|
||||
if (ret) {
|
||||
+ op_errno = errno;
|
||||
gf_log("POSIX", GF_LOG_ERROR,
|
||||
"setxattr failed - %s"
|
||||
" %d",
|
||||
@@ -2635,13 +2739,14 @@ posix_setxattr(call_frame_t *frame, xlator_t *this, loc_t *loc, dict_t *dict,
|
||||
|
||||
ret = sys_truncate(real_path, 0);
|
||||
if (ret) {
|
||||
+ op_errno = errno;
|
||||
gf_log("POSIX", GF_LOG_ERROR,
|
||||
"truncate failed - %s"
|
||||
" %d",
|
||||
GF_CS_OBJECT_SIZE, ret);
|
||||
- op_errno = errno;
|
||||
ret = sys_lremovexattr(real_path, GF_CS_OBJECT_REMOTE);
|
||||
if (ret) {
|
||||
+ op_errno = errno;
|
||||
gf_log("POSIX", GF_LOG_ERROR,
|
||||
"removexattr "
|
||||
"failed post processing- %s"
|
||||
@@ -2659,6 +2764,7 @@ posix_setxattr(call_frame_t *frame, xlator_t *this, loc_t *loc, dict_t *dict,
|
||||
}
|
||||
unlock:
|
||||
UNLOCK(&loc->inode->lock);
|
||||
+ op_ret = ret;
|
||||
goto out;
|
||||
}
|
||||
|
||||
@@ -4927,6 +5033,7 @@ posix_ftruncate(call_frame_t *frame, xlator_t *this, fd_t *fd, off_t offset,
|
||||
}
|
||||
}
|
||||
|
||||
+ posix_update_iatt_buf(&preop, _fd, NULL, xdata);
|
||||
op_ret = sys_ftruncate(_fd, offset);
|
||||
|
||||
if (op_ret == -1) {
|
||||
@@ -5008,8 +5115,10 @@ posix_fstat(call_frame_t *frame, xlator_t *this, fd_t *fd, dict_t *xdata)
|
||||
gf_msg(this->name, GF_LOG_ERROR, 0, 0,
|
||||
"file state check failed, fd %p", fd);
|
||||
}
|
||||
+ posix_cs_build_xattr_rsp(this, &xattr_rsp, xdata, _fd, NULL);
|
||||
}
|
||||
|
||||
+ posix_update_iatt_buf(&buf, _fd, NULL, xdata);
|
||||
op_ret = 0;
|
||||
|
||||
out:
|
||||
diff --git a/xlators/storage/posix/src/posix.h b/xlators/storage/posix/src/posix.h
|
||||
index d5ba08c..1da4d01 100644
|
||||
--- a/xlators/storage/posix/src/posix.h
|
||||
+++ b/xlators/storage/posix/src/posix.h
|
||||
@@ -664,4 +664,6 @@ posix_check_dev_file(xlator_t *this, inode_t *inode, char *fop, int *op_errno);
|
||||
int
|
||||
posix_spawn_ctx_janitor_thread(xlator_t *this);
|
||||
|
||||
+void
|
||||
+posix_update_iatt_buf(struct iatt *buf, int fd, char *loc, dict_t *xdata);
|
||||
#endif /* _POSIX_H */
|
||||
--
|
||||
1.8.3.1
|
||||
|
1077
0153-features-cloudsync-Added-some-new-functions.patch
Normal file
1077
0153-features-cloudsync-Added-some-new-functions.patch
Normal file
File diff suppressed because it is too large
Load Diff
1394
0154-cloudsync-cvlt-Cloudsync-plugin-for-commvault-store.patch
Normal file
1394
0154-cloudsync-cvlt-Cloudsync-plugin-for-commvault-store.patch
Normal file
File diff suppressed because it is too large
Load Diff
114
0155-cloudsync-Make-readdirp-return-stat-info-of-all-the-.patch
Normal file
114
0155-cloudsync-Make-readdirp-return-stat-info-of-all-the-.patch
Normal file
@ -0,0 +1,114 @@
|
||||
From 693fcf327eace37fe698953b90050d67fc840ac6 Mon Sep 17 00:00:00 2001
|
||||
From: Anuradha Talur <atalur@commvault.com>
|
||||
Date: Wed, 24 Apr 2019 12:06:23 -0700
|
||||
Subject: [PATCH 155/169] cloudsync: Make readdirp return stat info of all the
|
||||
dirents
|
||||
|
||||
This change got missed while the initial changes were sent.
|
||||
Should have been a part of :
|
||||
https://review.gluster.org/#/c/glusterfs/+/21757/
|
||||
|
||||
Gist of the change:
|
||||
Function that fills in stat info for dirents is
|
||||
invoked in readdirp in posix when cloudsync populates xdata
|
||||
request with GF_CS_OBJECT_STATUS.
|
||||
|
||||
backport of:https://review.gluster.org/#/c/glusterfs/+/22616/
|
||||
|
||||
> Change-Id: Ide0c4e80afb74cd2120f74ba934ed40123152d69
|
||||
> updates: bz#1642168
|
||||
> Signed-off-by: Anuradha Talur <atalur@commvault.com>
|
||||
|
||||
Change-Id: I77de3f9d8ae01a0280a9d1753f94d74b5e5ce2fd
|
||||
Signed-off-by: Susant Palai <spalai@redhat.com>
|
||||
Reviewed-on: https://code.engineering.redhat.com/gerrit/172193
|
||||
Tested-by: RHGS Build Bot <nigelb@redhat.com>
|
||||
Reviewed-by: Atin Mukherjee <amukherj@redhat.com>
|
||||
---
|
||||
xlators/features/cloudsync/src/cloudsync-fops-c.py | 2 +-
|
||||
xlators/features/cloudsync/src/cloudsync.c | 35 ++++++++++++++++++++++
|
||||
xlators/storage/posix/src/posix-inode-fd-ops.c | 2 ++
|
||||
3 files changed, 38 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/xlators/features/cloudsync/src/cloudsync-fops-c.py b/xlators/features/cloudsync/src/cloudsync-fops-c.py
|
||||
index a7a2201..8878b70 100755
|
||||
--- a/xlators/features/cloudsync/src/cloudsync-fops-c.py
|
||||
+++ b/xlators/features/cloudsync/src/cloudsync-fops-c.py
|
||||
@@ -285,7 +285,7 @@ loc_stat_op_fop_template = ['lookup', 'stat', 'discover', 'access', 'setattr',
|
||||
|
||||
# These fops need a separate implementation
|
||||
special_fops = ['statfs', 'setxattr', 'unlink', 'getxattr',
|
||||
- 'truncate', 'fstat', 'readv']
|
||||
+ 'truncate', 'fstat', 'readv', 'readdirp']
|
||||
|
||||
def gen_defaults():
|
||||
for name in ops:
|
||||
diff --git a/xlators/features/cloudsync/src/cloudsync.c b/xlators/features/cloudsync/src/cloudsync.c
|
||||
index 8026b05..26e512c 100644
|
||||
--- a/xlators/features/cloudsync/src/cloudsync.c
|
||||
+++ b/xlators/features/cloudsync/src/cloudsync.c
|
||||
@@ -280,6 +280,40 @@ out:
|
||||
}
|
||||
|
||||
int32_t
|
||||
+cs_readdirp(call_frame_t *frame, xlator_t *this, fd_t *fd, size_t size,
|
||||
+ off_t off, dict_t *xdata)
|
||||
+{
|
||||
+ int ret = 0;
|
||||
+ int op_errno = ENOMEM;
|
||||
+
|
||||
+ if (!xdata) {
|
||||
+ xdata = dict_new();
|
||||
+ if (!xdata) {
|
||||
+ gf_msg(this->name, GF_LOG_ERROR, 0, ENOMEM,
|
||||
+ "failed to create "
|
||||
+ "dict");
|
||||
+ goto err;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ ret = dict_set_uint32(xdata, GF_CS_OBJECT_STATUS, 1);
|
||||
+ if (ret) {
|
||||
+ gf_msg(this->name, GF_LOG_ERROR, 0, 0,
|
||||
+ "dict_set failed key:"
|
||||
+ " %s",
|
||||
+ GF_CS_OBJECT_STATUS);
|
||||
+ goto err;
|
||||
+ }
|
||||
+
|
||||
+ STACK_WIND(frame, default_readdirp_cbk, FIRST_CHILD(this),
|
||||
+ FIRST_CHILD(this)->fops->readdirp, fd, size, off, xdata);
|
||||
+ return 0;
|
||||
+err:
|
||||
+ STACK_UNWIND_STRICT(readdirp, frame, -1, op_errno, NULL, NULL);
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+int32_t
|
||||
cs_truncate_cbk(call_frame_t *frame, void *cookie, xlator_t *this,
|
||||
int32_t op_ret, int32_t op_errno, struct iatt *prebuf,
|
||||
struct iatt *postbuf, dict_t *xdata)
|
||||
@@ -2026,6 +2060,7 @@ cs_notify(xlator_t *this, int event, void *data, ...)
|
||||
|
||||
struct xlator_fops cs_fops = {
|
||||
.stat = cs_stat,
|
||||
+ .readdirp = cs_readdirp,
|
||||
.truncate = cs_truncate,
|
||||
.seek = cs_seek,
|
||||
.statfs = cs_statfs,
|
||||
diff --git a/xlators/storage/posix/src/posix-inode-fd-ops.c b/xlators/storage/posix/src/posix-inode-fd-ops.c
|
||||
index 065fced..2c19ce1 100644
|
||||
--- a/xlators/storage/posix/src/posix-inode-fd-ops.c
|
||||
+++ b/xlators/storage/posix/src/posix-inode-fd-ops.c
|
||||
@@ -5472,6 +5472,8 @@ posix_readdirp_fill(xlator_t *this, fd_t *fd, gf_dirent_t *entries,
|
||||
continue;
|
||||
}
|
||||
|
||||
+ posix_update_iatt_buf(&stbuf, -1, hpath, dict);
|
||||
+
|
||||
if (!inode)
|
||||
inode = inode_find(itable, stbuf.ia_gfid);
|
||||
|
||||
--
|
||||
1.8.3.1
|
||||
|
94
0156-cloudsync-Fix-bug-in-cloudsync-fops-c.py.patch
Normal file
94
0156-cloudsync-Fix-bug-in-cloudsync-fops-c.py.patch
Normal file
@ -0,0 +1,94 @@
|
||||
From d8c98e9785e652692d928a2efbbb571703f728b0 Mon Sep 17 00:00:00 2001
|
||||
From: Anuradha Talur <atalur@commvault.com>
|
||||
Date: Wed, 24 Apr 2019 12:35:08 -0700
|
||||
Subject: [PATCH 156/169] cloudsync: Fix bug in cloudsync-fops-c.py
|
||||
|
||||
In some of the fops generated by generator.py, xdata request
|
||||
was not being wound to the child xlator correctly.
|
||||
|
||||
This was happening because when though the logic in
|
||||
cloudsync-fops-c.py was correct, generator.py was generating
|
||||
a resultant code that omits this logic.
|
||||
|
||||
Made changes in cloudsync-fops-c.py so that correct code is
|
||||
produced.
|
||||
|
||||
backport of: https://review.gluster.org/#/c/glusterfs/+/22617/
|
||||
|
||||
> Change-Id: I6f25bdb36ede06fd03be32c04087a75639d79150
|
||||
> updates: bz#1642168
|
||||
> Signed-off-by: Anuradha Talur <atalur@commvault.com>
|
||||
|
||||
Change-Id: I87cc71e98c2c6cec78a6e84850fc8d82f8dd4dfd
|
||||
Signed-off-by: Susant Palai <spalai@redhat.com>
|
||||
Reviewed-on: https://code.engineering.redhat.com/gerrit/172195
|
||||
Tested-by: RHGS Build Bot <nigelb@redhat.com>
|
||||
Reviewed-by: Atin Mukherjee <amukherj@redhat.com>
|
||||
---
|
||||
xlators/features/cloudsync/src/cloudsync-fops-c.py | 24 +++++++++++++++++++---
|
||||
1 file changed, 21 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/xlators/features/cloudsync/src/cloudsync-fops-c.py b/xlators/features/cloudsync/src/cloudsync-fops-c.py
|
||||
index 8878b70..c444ea6 100755
|
||||
--- a/xlators/features/cloudsync/src/cloudsync-fops-c.py
|
||||
+++ b/xlators/features/cloudsync/src/cloudsync-fops-c.py
|
||||
@@ -39,7 +39,15 @@ cs_@NAME@ (call_frame_t *frame, xlator_t *this,
|
||||
else
|
||||
state = GF_CS_LOCAL;
|
||||
|
||||
- local->xattr_req = xdata ? dict_ref (xdata) : (xdata = dict_new ());
|
||||
+ xdata = xdata ? dict_ref (xdata) : dict_new ();
|
||||
+
|
||||
+ if (!xdata) {
|
||||
+ gf_msg (this->name, GF_LOG_ERROR, 0, 0, "insufficient memory");
|
||||
+ op_errno = ENOMEM;
|
||||
+ goto err;
|
||||
+ }
|
||||
+
|
||||
+ local->xattr_req = xdata;
|
||||
|
||||
ret = dict_set_uint32 (local->xattr_req, GF_CS_OBJECT_STATUS, 1);
|
||||
if (ret) {
|
||||
@@ -187,19 +195,29 @@ int32_t
|
||||
cs_@NAME@ (call_frame_t *frame, xlator_t *this,
|
||||
@LONG_ARGS@)
|
||||
{
|
||||
+ int op_errno = EINVAL;
|
||||
cs_local_t *local = NULL;
|
||||
int ret = 0;
|
||||
|
||||
local = cs_local_init (this, frame, loc, NULL, GF_FOP_@UPNAME@);
|
||||
if (!local) {
|
||||
gf_msg (this->name, GF_LOG_ERROR, 0, 0, "local is NULL");
|
||||
+ op_errno = ENOMEM;
|
||||
goto err;
|
||||
}
|
||||
|
||||
if (loc->inode->ia_type == IA_IFDIR)
|
||||
goto wind;
|
||||
|
||||
- local->xattr_req = xdata ? dict_ref (xdata) : dict_new ();
|
||||
+ xdata = xdata ? dict_ref (xdata) : dict_new ();
|
||||
+
|
||||
+ if (!xdata) {
|
||||
+ gf_msg (this->name, GF_LOG_ERROR, 0, 0, "insufficient memory");
|
||||
+ op_errno = ENOMEM;
|
||||
+ goto err;
|
||||
+ }
|
||||
+
|
||||
+ local->xattr_req = xdata;
|
||||
|
||||
ret = dict_set_uint32 (local->xattr_req, GF_CS_OBJECT_STATUS, 1);
|
||||
if (ret) {
|
||||
@@ -215,7 +233,7 @@ wind:
|
||||
|
||||
return 0;
|
||||
err:
|
||||
- CS_STACK_UNWIND (@NAME@, frame, -1, errno, @CBK_ERROR_ARGS@);
|
||||
+ CS_STACK_UNWIND (@NAME@, frame, -1, op_errno, @CBK_ERROR_ARGS@);
|
||||
|
||||
return 0;
|
||||
}
|
||||
--
|
||||
1.8.3.1
|
||||
|
@ -0,0 +1,68 @@
|
||||
From 4a72ac20f728aa5c3141359ff89f1b61d4cd210a Mon Sep 17 00:00:00 2001
|
||||
From: Mohammed Rafi KC <rkavunga@redhat.com>
|
||||
Date: Fri, 17 May 2019 23:03:35 +0530
|
||||
Subject: [PATCH 157/169] afr/frame: Destroy frame after
|
||||
afr_selfheal_entry_granular
|
||||
|
||||
In function "afr_selfheal_entry_granular", after completing the
|
||||
heal we are not destroying the frame. This will lead to crash.
|
||||
when we execute statedump operation, where it tried to access
|
||||
xlator object. If this xlator object is freed as part of the
|
||||
graph destroy this will lead to an invalid memory access
|
||||
|
||||
Upstream patch:https://review.gluster.org/22743
|
||||
|
||||
>Change-Id: I0a5e78e704ef257c3ac0087eab2c310e78fbe36d
|
||||
>fixes: bz#1708926
|
||||
>Signed-off-by: Mohammed Rafi KC <rkavunga@redhat.com>
|
||||
|
||||
Change-Id: I326354008e6d98376c8333d270f2f80036ad07f0
|
||||
BUG: 1716626
|
||||
Signed-off-by: Mohammed Rafi KC <rkavunga@redhat.com>
|
||||
Reviewed-on: https://code.engineering.redhat.com/gerrit/172282
|
||||
Reviewed-by: Atin Mukherjee <amukherj@redhat.com>
|
||||
Tested-by: RHGS Build Bot <nigelb@redhat.com>
|
||||
---
|
||||
xlators/cluster/afr/src/afr-self-heal-entry.c | 11 ++++++++---
|
||||
1 file changed, 8 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/xlators/cluster/afr/src/afr-self-heal-entry.c b/xlators/cluster/afr/src/afr-self-heal-entry.c
|
||||
index fc09b4c..a6890fa 100644
|
||||
--- a/xlators/cluster/afr/src/afr-self-heal-entry.c
|
||||
+++ b/xlators/cluster/afr/src/afr-self-heal-entry.c
|
||||
@@ -832,6 +832,8 @@ afr_selfheal_entry_granular(call_frame_t *frame, xlator_t *this, fd_t *fd,
|
||||
subvol = priv->children[subvol_idx];
|
||||
|
||||
args.frame = afr_copy_frame(frame);
|
||||
+ if (!args.frame)
|
||||
+ goto out;
|
||||
args.xl = this;
|
||||
/* args.heal_fd represents the fd associated with the original directory
|
||||
* on which entry heal is being attempted.
|
||||
@@ -850,9 +852,10 @@ afr_selfheal_entry_granular(call_frame_t *frame, xlator_t *this, fd_t *fd,
|
||||
* do not treat heal as failure.
|
||||
*/
|
||||
if (is_src)
|
||||
- return -errno;
|
||||
+ ret = -errno;
|
||||
else
|
||||
- return 0;
|
||||
+ ret = 0;
|
||||
+ goto out;
|
||||
}
|
||||
|
||||
ret = syncop_dir_scan(subvol, &loc, GF_CLIENT_PID_SELF_HEALD, &args,
|
||||
@@ -862,7 +865,9 @@ afr_selfheal_entry_granular(call_frame_t *frame, xlator_t *this, fd_t *fd,
|
||||
|
||||
if (args.mismatch == _gf_true)
|
||||
ret = -1;
|
||||
-
|
||||
+out:
|
||||
+ if (args.frame)
|
||||
+ AFR_STACK_DESTROY(args.frame);
|
||||
return ret;
|
||||
}
|
||||
|
||||
--
|
||||
1.8.3.1
|
||||
|
162
0158-glusterfsd-cleanup-Protect-graph-object-under-a-lock.patch
Normal file
162
0158-glusterfsd-cleanup-Protect-graph-object-under-a-lock.patch
Normal file
@ -0,0 +1,162 @@
|
||||
From 11b64d494c52004002f900888694d20ef8af6df6 Mon Sep 17 00:00:00 2001
|
||||
From: Mohammed Rafi KC <rkavunga@redhat.com>
|
||||
Date: Sat, 11 May 2019 22:40:22 +0530
|
||||
Subject: [PATCH 158/169] glusterfsd/cleanup: Protect graph object under a lock
|
||||
|
||||
While processing a cleanup_and_exit function, we are
|
||||
accessing a graph object. But this has not been protected
|
||||
under a lock. Because a parallel cleanup of a graph is quite
|
||||
possible which might lead to an invalid memory access
|
||||
|
||||
Upstream patch:https://review.gluster.org/#/c/glusterfs/+/22709/
|
||||
|
||||
>Change-Id: Id05ca70d5b57e172b0401d07b6a1f5386c044e79
|
||||
>fixes: bz#1708926
|
||||
>Signed-off-by: Mohammed Rafi KC <rkavunga@redhat.com>
|
||||
|
||||
Change-Id: I55ab0525c79baa99a3bd929ee979c5519be5ab21
|
||||
BUG: 1716626
|
||||
Signed-off-by: Mohammed Rafi KC <rkavunga@redhat.com>
|
||||
Reviewed-on: https://code.engineering.redhat.com/gerrit/172283
|
||||
Reviewed-by: Atin Mukherjee <amukherj@redhat.com>
|
||||
Tested-by: RHGS Build Bot <nigelb@redhat.com>
|
||||
---
|
||||
libglusterfs/src/graph.c | 58 +++++++++++++++----------
|
||||
libglusterfs/src/statedump.c | 16 +++++--
|
||||
tests/bugs/glusterd/optimized-basic-testcases.t | 4 +-
|
||||
3 files changed, 50 insertions(+), 28 deletions(-)
|
||||
|
||||
diff --git a/libglusterfs/src/graph.c b/libglusterfs/src/graph.c
|
||||
index 4c8b02d..18fb2d9 100644
|
||||
--- a/libglusterfs/src/graph.c
|
||||
+++ b/libglusterfs/src/graph.c
|
||||
@@ -1392,8 +1392,12 @@ glusterfs_graph_cleanup(void *arg)
|
||||
}
|
||||
pthread_mutex_unlock(&ctx->notify_lock);
|
||||
|
||||
- glusterfs_graph_fini(graph);
|
||||
- glusterfs_graph_destroy(graph);
|
||||
+ pthread_mutex_lock(&ctx->cleanup_lock);
|
||||
+ {
|
||||
+ glusterfs_graph_fini(graph);
|
||||
+ glusterfs_graph_destroy(graph);
|
||||
+ }
|
||||
+ pthread_mutex_unlock(&ctx->cleanup_lock);
|
||||
out:
|
||||
return NULL;
|
||||
}
|
||||
@@ -1468,31 +1472,37 @@ glusterfs_process_svc_detach(glusterfs_ctx_t *ctx, gf_volfile_t *volfile_obj)
|
||||
|
||||
if (!ctx || !ctx->active || !volfile_obj)
|
||||
goto out;
|
||||
- parent_graph = ctx->active;
|
||||
- graph = volfile_obj->graph;
|
||||
- if (!graph)
|
||||
- goto out;
|
||||
- if (graph->first)
|
||||
- xl = graph->first;
|
||||
|
||||
- last_xl = graph->last_xl;
|
||||
- if (last_xl)
|
||||
- last_xl->next = NULL;
|
||||
- if (!xl || xl->cleanup_starting)
|
||||
- goto out;
|
||||
+ pthread_mutex_lock(&ctx->cleanup_lock);
|
||||
+ {
|
||||
+ parent_graph = ctx->active;
|
||||
+ graph = volfile_obj->graph;
|
||||
+ if (!graph)
|
||||
+ goto unlock;
|
||||
+ if (graph->first)
|
||||
+ xl = graph->first;
|
||||
+
|
||||
+ last_xl = graph->last_xl;
|
||||
+ if (last_xl)
|
||||
+ last_xl->next = NULL;
|
||||
+ if (!xl || xl->cleanup_starting)
|
||||
+ goto unlock;
|
||||
|
||||
- xl->cleanup_starting = 1;
|
||||
- gf_msg("mgmt", GF_LOG_INFO, 0, LG_MSG_GRAPH_DETACH_STARTED,
|
||||
- "detaching child %s", volfile_obj->vol_id);
|
||||
+ xl->cleanup_starting = 1;
|
||||
+ gf_msg("mgmt", GF_LOG_INFO, 0, LG_MSG_GRAPH_DETACH_STARTED,
|
||||
+ "detaching child %s", volfile_obj->vol_id);
|
||||
|
||||
- list_del_init(&volfile_obj->volfile_list);
|
||||
- glusterfs_mux_xlator_unlink(parent_graph->top, xl);
|
||||
- parent_graph->last_xl = glusterfs_get_last_xlator(parent_graph);
|
||||
- parent_graph->xl_count -= graph->xl_count;
|
||||
- parent_graph->leaf_count -= graph->leaf_count;
|
||||
- default_notify(xl, GF_EVENT_PARENT_DOWN, xl);
|
||||
- parent_graph->id++;
|
||||
- ret = 0;
|
||||
+ list_del_init(&volfile_obj->volfile_list);
|
||||
+ glusterfs_mux_xlator_unlink(parent_graph->top, xl);
|
||||
+ parent_graph->last_xl = glusterfs_get_last_xlator(parent_graph);
|
||||
+ parent_graph->xl_count -= graph->xl_count;
|
||||
+ parent_graph->leaf_count -= graph->leaf_count;
|
||||
+ default_notify(xl, GF_EVENT_PARENT_DOWN, xl);
|
||||
+ parent_graph->id++;
|
||||
+ ret = 0;
|
||||
+ }
|
||||
+unlock:
|
||||
+ pthread_mutex_unlock(&ctx->cleanup_lock);
|
||||
out:
|
||||
if (!ret) {
|
||||
list_del_init(&volfile_obj->volfile_list);
|
||||
diff --git a/libglusterfs/src/statedump.c b/libglusterfs/src/statedump.c
|
||||
index 0cf80c0..0d58f8f 100644
|
||||
--- a/libglusterfs/src/statedump.c
|
||||
+++ b/libglusterfs/src/statedump.c
|
||||
@@ -805,11 +805,17 @@ gf_proc_dump_info(int signum, glusterfs_ctx_t *ctx)
|
||||
int brick_count = 0;
|
||||
int len = 0;
|
||||
|
||||
- gf_proc_dump_lock();
|
||||
-
|
||||
if (!ctx)
|
||||
goto out;
|
||||
|
||||
+ /*
|
||||
+ * Multiplexed daemons can change the active graph when attach/detach
|
||||
+ * is called. So this has to be protected with the cleanup lock.
|
||||
+ */
|
||||
+ if (mgmt_is_multiplexed_daemon(ctx->cmd_args.process_name))
|
||||
+ pthread_mutex_lock(&ctx->cleanup_lock);
|
||||
+ gf_proc_dump_lock();
|
||||
+
|
||||
if (!mgmt_is_multiplexed_daemon(ctx->cmd_args.process_name) &&
|
||||
(ctx && ctx->active)) {
|
||||
top = ctx->active->first;
|
||||
@@ -923,7 +929,11 @@ gf_proc_dump_info(int signum, glusterfs_ctx_t *ctx)
|
||||
out:
|
||||
GF_FREE(dump_options.dump_path);
|
||||
dump_options.dump_path = NULL;
|
||||
- gf_proc_dump_unlock();
|
||||
+ if (ctx) {
|
||||
+ gf_proc_dump_unlock();
|
||||
+ if (mgmt_is_multiplexed_daemon(ctx->cmd_args.process_name))
|
||||
+ pthread_mutex_unlock(&ctx->cleanup_lock);
|
||||
+ }
|
||||
|
||||
return;
|
||||
}
|
||||
diff --git a/tests/bugs/glusterd/optimized-basic-testcases.t b/tests/bugs/glusterd/optimized-basic-testcases.t
|
||||
index d700b5e..110f1b9 100644
|
||||
--- a/tests/bugs/glusterd/optimized-basic-testcases.t
|
||||
+++ b/tests/bugs/glusterd/optimized-basic-testcases.t
|
||||
@@ -289,7 +289,9 @@ mkdir -p /xyz/var/lib/glusterd/abc
|
||||
TEST $CLI volume create "test" $H0:/xyz/var/lib/glusterd/abc
|
||||
EXPECT 'Created' volinfo_field "test" 'Status';
|
||||
|
||||
-EXPECT "1" generate_statedump_and_check_for_glusterd_info
|
||||
+#While taking a statedump, there is a TRY_LOCK on call_frame, which might may cause
|
||||
+#failure. So Adding a EXPECT_WITHIN
|
||||
+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "^1$" generate_statedump_and_check_for_glusterd_info
|
||||
|
||||
cleanup_statedump `pidof glusterd`
|
||||
cleanup
|
||||
--
|
||||
1.8.3.1
|
||||
|
66
0159-glusterd-add-an-op-version-check.patch
Normal file
66
0159-glusterd-add-an-op-version-check.patch
Normal file
@ -0,0 +1,66 @@
|
||||
From bd087c3d2766b81b25ea7bbe425b55023fd12545 Mon Sep 17 00:00:00 2001
|
||||
From: Sanju Rakonde <srakonde@redhat.com>
|
||||
Date: Wed, 15 May 2019 07:35:45 +0530
|
||||
Subject: [PATCH 159/169] glusterd: add an op-version check
|
||||
|
||||
Problem: "gluster v status" is hung in heterogenous cluster
|
||||
when issued from a non-upgraded node.
|
||||
|
||||
Cause: commit 34e010d64 fixes the txn-opinfo mem leak
|
||||
in op-sm framework by not setting the txn-opinfo if some
|
||||
conditions are true. When vol status is issued from a
|
||||
non-upgraded node, command is hanging in its upgraded peer
|
||||
as the upgraded node setting the txn-opinfo based on new
|
||||
conditions where as non-upgraded nodes are following diff
|
||||
conditions.
|
||||
|
||||
Fix: Add an op-version check, so that all the nodes follow
|
||||
same set of conditions to set txn-opinfo.
|
||||
|
||||
upstream patch: https://review.gluster.org/#/c/glusterfs/+/22730/
|
||||
|
||||
BUG: 1707246
|
||||
|
||||
> fixes: bz#1710159
|
||||
> Change-Id: Ie1f353212c5931ddd1b728d2e6949dfe6225c4ab
|
||||
> Signed-off-by: Sanju Rakonde <srakonde@redhat.com>
|
||||
|
||||
Change-Id: Ie1f353212c5931ddd1b728d2e6949dfe6225c4ab
|
||||
Signed-off-by: Sanju Rakonde <srakonde@redhat.com>
|
||||
Reviewed-on: https://code.engineering.redhat.com/gerrit/172307
|
||||
Tested-by: RHGS Build Bot <nigelb@redhat.com>
|
||||
Reviewed-by: Sunil Kumar Heggodu Gopala Acharya <sheggodu@redhat.com>
|
||||
---
|
||||
xlators/mgmt/glusterd/src/glusterd-op-sm.c | 6 +++++-
|
||||
1 file changed, 5 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/xlators/mgmt/glusterd/src/glusterd-op-sm.c b/xlators/mgmt/glusterd/src/glusterd-op-sm.c
|
||||
index 94a5e1f..d0c1a2c 100644
|
||||
--- a/xlators/mgmt/glusterd/src/glusterd-op-sm.c
|
||||
+++ b/xlators/mgmt/glusterd/src/glusterd-op-sm.c
|
||||
@@ -8158,9 +8158,12 @@ glusterd_op_sm()
|
||||
glusterd_op_sm_event_type_t event_type = GD_OP_EVENT_NONE;
|
||||
xlator_t *this = NULL;
|
||||
glusterd_op_info_t txn_op_info;
|
||||
+ glusterd_conf_t *priv = NULL;
|
||||
|
||||
this = THIS;
|
||||
GF_ASSERT(this);
|
||||
+ priv = this->private;
|
||||
+ GF_ASSERT(priv);
|
||||
|
||||
ret = synclock_trylock(&gd_op_sm_lock);
|
||||
if (ret) {
|
||||
@@ -8238,7 +8241,8 @@ glusterd_op_sm()
|
||||
"Unable to clear "
|
||||
"transaction's opinfo");
|
||||
} else {
|
||||
- if (!(event_type == GD_OP_EVENT_STAGE_OP &&
|
||||
+ if ((priv->op_version < GD_OP_VERSION_6_0) ||
|
||||
+ !(event_type == GD_OP_EVENT_STAGE_OP &&
|
||||
opinfo.state.state == GD_OP_STATE_STAGED &&
|
||||
opinfo.skip_locking)) {
|
||||
ret = glusterd_set_txn_opinfo(&event->txn_id, &opinfo);
|
||||
--
|
||||
1.8.3.1
|
||||
|
41
0160-geo-rep-Geo-rep-help-text-issue.patch
Normal file
41
0160-geo-rep-Geo-rep-help-text-issue.patch
Normal file
@ -0,0 +1,41 @@
|
||||
From 77df6b8930fd4acf3d0c38220fa4317ee97d530f Mon Sep 17 00:00:00 2001
|
||||
From: Shwetha K Acharya <sacharya@redhat.com>
|
||||
Date: Thu, 9 May 2019 10:43:01 +0530
|
||||
Subject: [PATCH 160/169] geo-rep: Geo-rep help text issue
|
||||
|
||||
Modified Geo-rep help text for better sanity.
|
||||
|
||||
>fixes: bz#1652887
|
||||
>Change-Id: I40ef7ef709eaecf0125ab4b4a7517e2c5d1ef4a0
|
||||
>Signed-off-by: Shwetha K Acharya <sacharya@redhat.com>
|
||||
|
||||
backport of https://review.gluster.org/#/c/glusterfs/+/22689/
|
||||
|
||||
BUG: 1480907
|
||||
Change-Id: I40ef7ef709eaecf0125ab4b4a7517e2c5d1ef4a0
|
||||
Signed-off-by: Shwetha K Acharya <sacharya@redhat.com>
|
||||
Reviewed-on: https://code.engineering.redhat.com/gerrit/172316
|
||||
Tested-by: RHGS Build Bot <nigelb@redhat.com>
|
||||
Reviewed-by: Sunil Kumar Heggodu Gopala Acharya <sheggodu@redhat.com>
|
||||
---
|
||||
cli/src/cli-cmd-volume.c | 4 ++--
|
||||
1 file changed, 2 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/cli/src/cli-cmd-volume.c b/cli/src/cli-cmd-volume.c
|
||||
index 3432dbe..564aef7 100644
|
||||
--- a/cli/src/cli-cmd-volume.c
|
||||
+++ b/cli/src/cli-cmd-volume.c
|
||||
@@ -3422,8 +3422,8 @@ struct cli_cmd volume_cmds[] = {
|
||||
"reset all the reconfigured options"},
|
||||
|
||||
#if (SYNCDAEMON_COMPILE)
|
||||
- {"volume " GEOREP " [<VOLNAME>] [<SLAVE-URL>] {\\\n create [[ssh-port n] "
|
||||
- "[[no-verify] | [push-pem]]] [force] \\\n"
|
||||
+ {"volume " GEOREP " [<MASTER-VOLNAME>] [<SLAVE-IP>]::[<SLAVE-VOLNAME>] {"
|
||||
+ "\\\n create [[ssh-port n] [[no-verify] \\\n | [push-pem]]] [force] \\\n"
|
||||
" | start [force] \\\n | stop [force] \\\n | pause [force] \\\n | resume "
|
||||
"[force] \\\n"
|
||||
" | config [[[\\!]<option>] [<value>]] \\\n | status "
|
||||
--
|
||||
1.8.3.1
|
||||
|
289
0161-geo-rep-Fix-rename-with-existing-destination-with-sa.patch
Normal file
289
0161-geo-rep-Fix-rename-with-existing-destination-with-sa.patch
Normal file
@ -0,0 +1,289 @@
|
||||
From 69ac1fd2da7a57f2f0854412863911959bf71fde Mon Sep 17 00:00:00 2001
|
||||
From: Sunny Kumar <sunkumar@redhat.com>
|
||||
Date: Tue, 2 Apr 2019 12:38:09 +0530
|
||||
Subject: [PATCH 161/169] geo-rep: Fix rename with existing destination with
|
||||
same gfid
|
||||
|
||||
Problem:
|
||||
Geo-rep fails to sync the rename properly if destination exists.
|
||||
It results in source to be remained on slave causing more number of
|
||||
files on slave. Also heavy rename workload like logrotate caused
|
||||
lot of ESTALE errors
|
||||
|
||||
Cause:
|
||||
Geo-rep fails to sync rename if destination exists if creation
|
||||
of source file also falls into single batch of changelogs being
|
||||
processed. This is because, after fixing problematic gfids verifying
|
||||
from master, while re-processing original entries, CREATE also was
|
||||
re-processed causing more files on slave and rename to be failed.
|
||||
|
||||
Solution:
|
||||
Entries need to be removed from retrial list after fixing
|
||||
problematic gfids on slave so that it's not re-created again on slave.
|
||||
Also treat ESTALE as EEXIST so that the error is properly handled
|
||||
verifying the op on master volume.
|
||||
|
||||
Backport of:
|
||||
> Patch: https://review.gluster.org/22519
|
||||
> Change-Id: I50cf289e06b997adddff0552bf2466d9201dd1f9
|
||||
> BUG: 1694820
|
||||
> Signed-off-by: Kotresh HR <khiremat@redhat.com>
|
||||
> Signed-off-by: Sunny Kumar <sunkumar@redhat.com>
|
||||
|
||||
Change-Id: I50cf289e06b997adddff0552bf2466d9201dd1f9
|
||||
fixes: bz#1708121
|
||||
Signed-off-by: Kotresh HR <khiremat@redhat.com>
|
||||
Signed-off-by: Sunny Kumar <sunkumar@redhat.com>
|
||||
Reviewed-on: https://code.engineering.redhat.com/gerrit/172393
|
||||
Tested-by: RHGS Build Bot <nigelb@redhat.com>
|
||||
Reviewed-by: Atin Mukherjee <amukherj@redhat.com>
|
||||
---
|
||||
geo-replication/syncdaemon/master.py | 41 +++++++++++++++++++++--
|
||||
geo-replication/syncdaemon/resource.py | 10 ++++--
|
||||
tests/00-geo-rep/georep-basic-dr-rsync-arbiter.t | 5 +++
|
||||
tests/00-geo-rep/georep-basic-dr-rsync.t | 5 +++
|
||||
tests/00-geo-rep/georep-basic-dr-tarssh-arbiter.t | 5 +++
|
||||
tests/00-geo-rep/georep-basic-dr-tarssh.t | 5 +++
|
||||
tests/geo-rep.rc | 36 ++++++++++++++++++++
|
||||
7 files changed, 102 insertions(+), 5 deletions(-)
|
||||
|
||||
diff --git a/geo-replication/syncdaemon/master.py b/geo-replication/syncdaemon/master.py
|
||||
index 3da7610..42c86d7 100644
|
||||
--- a/geo-replication/syncdaemon/master.py
|
||||
+++ b/geo-replication/syncdaemon/master.py
|
||||
@@ -65,6 +65,9 @@ def _volinfo_hook_relax_foreign(self):
|
||||
def edct(op, **ed):
|
||||
dct = {}
|
||||
dct['op'] = op
|
||||
+ # This is used in automatic gfid conflict resolution.
|
||||
+ # When marked True, it's skipped during re-processing.
|
||||
+ dct['skip_entry'] = False
|
||||
for k in ed:
|
||||
if k == 'stat':
|
||||
st = ed[k]
|
||||
@@ -792,6 +795,7 @@ class GMasterChangelogMixin(GMasterCommon):
|
||||
pfx = gauxpfx()
|
||||
fix_entry_ops = []
|
||||
failures1 = []
|
||||
+ remove_gfids = set()
|
||||
for failure in failures:
|
||||
if failure[2]['name_mismatch']:
|
||||
pbname = failure[2]['slave_entry']
|
||||
@@ -822,6 +826,18 @@ class GMasterChangelogMixin(GMasterCommon):
|
||||
edct('UNLINK',
|
||||
gfid=failure[2]['slave_gfid'],
|
||||
entry=pbname))
|
||||
+ remove_gfids.add(slave_gfid)
|
||||
+ if op in ['RENAME']:
|
||||
+ # If renamed gfid doesn't exists on master, remove
|
||||
+ # rename entry and unlink src on slave
|
||||
+ st = lstat(os.path.join(pfx, failure[0]['gfid']))
|
||||
+ if isinstance(st, int) and st == ENOENT:
|
||||
+ logging.debug("Unlink source %s" % repr(failure))
|
||||
+ remove_gfids.add(failure[0]['gfid'])
|
||||
+ fix_entry_ops.append(
|
||||
+ edct('UNLINK',
|
||||
+ gfid=failure[0]['gfid'],
|
||||
+ entry=failure[0]['entry']))
|
||||
# Takes care of scenarios of hardlinks/renames on master
|
||||
elif not isinstance(st, int):
|
||||
if matching_disk_gfid(slave_gfid, pbname):
|
||||
@@ -831,7 +847,12 @@ class GMasterChangelogMixin(GMasterCommon):
|
||||
' Safe to ignore, take out entry',
|
||||
retry_count=retry_count,
|
||||
entry=repr(failure)))
|
||||
- entries.remove(failure[0])
|
||||
+ remove_gfids.add(failure[0]['gfid'])
|
||||
+ if op == 'RENAME':
|
||||
+ fix_entry_ops.append(
|
||||
+ edct('UNLINK',
|
||||
+ gfid=failure[0]['gfid'],
|
||||
+ entry=failure[0]['entry']))
|
||||
# The file exists on master but with different name.
|
||||
# Probably renamed and got missed during xsync crawl.
|
||||
elif failure[2]['slave_isdir']:
|
||||
@@ -856,7 +877,10 @@ class GMasterChangelogMixin(GMasterCommon):
|
||||
'take out entry',
|
||||
retry_count=retry_count,
|
||||
entry=repr(failure)))
|
||||
- entries.remove(failure[0])
|
||||
+ try:
|
||||
+ entries.remove(failure[0])
|
||||
+ except ValueError:
|
||||
+ pass
|
||||
else:
|
||||
rename_dict = edct('RENAME', gfid=slave_gfid,
|
||||
entry=src_entry,
|
||||
@@ -896,7 +920,10 @@ class GMasterChangelogMixin(GMasterCommon):
|
||||
'ignore, take out entry',
|
||||
retry_count=retry_count,
|
||||
entry=repr(failure)))
|
||||
- entries.remove(failure[0])
|
||||
+ try:
|
||||
+ entries.remove(failure[0])
|
||||
+ except ValueError:
|
||||
+ pass
|
||||
else:
|
||||
logging.info(lf('Fixing ENOENT error in slave. Create '
|
||||
'parent directory on slave.',
|
||||
@@ -913,6 +940,14 @@ class GMasterChangelogMixin(GMasterCommon):
|
||||
edct('MKDIR', gfid=pargfid, entry=dir_entry,
|
||||
mode=st.st_mode, uid=st.st_uid, gid=st.st_gid))
|
||||
|
||||
+ logging.debug("remove_gfids: %s" % repr(remove_gfids))
|
||||
+ if remove_gfids:
|
||||
+ for e in entries:
|
||||
+ if e['op'] in ['MKDIR', 'MKNOD', 'CREATE', 'RENAME'] \
|
||||
+ and e['gfid'] in remove_gfids:
|
||||
+ logging.debug("Removed entry op from retrial list: entry: %s" % repr(e))
|
||||
+ e['skip_entry'] = True
|
||||
+
|
||||
if fix_entry_ops:
|
||||
# Process deletions of entries whose gfids are mismatched
|
||||
failures1 = self.slave.server.entry_ops(fix_entry_ops)
|
||||
diff --git a/geo-replication/syncdaemon/resource.py b/geo-replication/syncdaemon/resource.py
|
||||
index c290d86..f54ccd9 100644
|
||||
--- a/geo-replication/syncdaemon/resource.py
|
||||
+++ b/geo-replication/syncdaemon/resource.py
|
||||
@@ -426,7 +426,7 @@ class Server(object):
|
||||
e['stat']['uid'] = uid
|
||||
e['stat']['gid'] = gid
|
||||
|
||||
- if cmd_ret == EEXIST:
|
||||
+ if cmd_ret in [EEXIST, ESTALE]:
|
||||
if dst:
|
||||
en = e['entry1']
|
||||
else:
|
||||
@@ -510,6 +510,12 @@ class Server(object):
|
||||
entry = e['entry']
|
||||
uid = 0
|
||||
gid = 0
|
||||
+
|
||||
+ # Skip entry processing if it's marked true during gfid
|
||||
+ # conflict resolution
|
||||
+ if e['skip_entry']:
|
||||
+ continue
|
||||
+
|
||||
if e.get("stat", {}):
|
||||
# Copy UID/GID value and then reset to zero. Copied UID/GID
|
||||
# will be used to run chown once entry is created.
|
||||
@@ -688,7 +694,7 @@ class Server(object):
|
||||
if blob:
|
||||
cmd_ret = errno_wrap(Xattr.lsetxattr,
|
||||
[pg, 'glusterfs.gfid.newfile', blob],
|
||||
- [EEXIST, ENOENT],
|
||||
+ [EEXIST, ENOENT, ESTALE],
|
||||
[ESTALE, EINVAL, EBUSY])
|
||||
collect_failure(e, cmd_ret, uid, gid)
|
||||
|
||||
diff --git a/tests/00-geo-rep/georep-basic-dr-rsync-arbiter.t b/tests/00-geo-rep/georep-basic-dr-rsync-arbiter.t
|
||||
index 67ac167..1a55ed2 100644
|
||||
--- a/tests/00-geo-rep/georep-basic-dr-rsync-arbiter.t
|
||||
+++ b/tests/00-geo-rep/georep-basic-dr-rsync-arbiter.t
|
||||
@@ -203,6 +203,11 @@ EXPECT_WITHIN $GEO_REP_TIMEOUT 0 verify_rsnapshot_data ${slave_mnt}
|
||||
TEST gluster volume geo-rep $master $slave config rsync-options "--whole-file"
|
||||
TEST "echo sampledata > $master_mnt/rsync_option_test_file"
|
||||
|
||||
+#rename with existing destination case BUG:1694820
|
||||
+TEST create_rename_with_existing_destination ${master_mnt}
|
||||
+#verify rename with existing destination case BUG:1694820
|
||||
+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 verify_rename_with_existing_destination ${slave_mnt}
|
||||
+
|
||||
#Verify arequal for whole volume
|
||||
EXPECT_WITHIN $GEO_REP_TIMEOUT 0 arequal_checksum ${master_mnt} ${slave_mnt}
|
||||
|
||||
diff --git a/tests/00-geo-rep/georep-basic-dr-rsync.t b/tests/00-geo-rep/georep-basic-dr-rsync.t
|
||||
index 8b64370..d0c0fc9 100644
|
||||
--- a/tests/00-geo-rep/georep-basic-dr-rsync.t
|
||||
+++ b/tests/00-geo-rep/georep-basic-dr-rsync.t
|
||||
@@ -204,6 +204,11 @@ EXPECT_WITHIN $GEO_REP_TIMEOUT 0 verify_rsnapshot_data ${slave_mnt}
|
||||
TEST gluster volume geo-rep $master $slave config rsync-options "--whole-file"
|
||||
TEST "echo sampledata > $master_mnt/rsync_option_test_file"
|
||||
|
||||
+#rename with existing destination case BUG:1694820
|
||||
+TEST create_rename_with_existing_destination ${master_mnt}
|
||||
+#verify rename with existing destination case BUG:1694820
|
||||
+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 verify_rename_with_existing_destination ${slave_mnt}
|
||||
+
|
||||
#Verify arequal for whole volume
|
||||
EXPECT_WITHIN $GEO_REP_TIMEOUT 0 arequal_checksum ${master_mnt} ${slave_mnt}
|
||||
|
||||
diff --git a/tests/00-geo-rep/georep-basic-dr-tarssh-arbiter.t b/tests/00-geo-rep/georep-basic-dr-tarssh-arbiter.t
|
||||
index 1726d0b..cb530ad 100644
|
||||
--- a/tests/00-geo-rep/georep-basic-dr-tarssh-arbiter.t
|
||||
+++ b/tests/00-geo-rep/georep-basic-dr-tarssh-arbiter.t
|
||||
@@ -202,6 +202,11 @@ EXPECT_WITHIN $GEO_REP_TIMEOUT 0 verify_symlink_rename_mkdir_data ${slave_mnt}/s
|
||||
#rsnapshot usecase
|
||||
EXPECT_WITHIN $GEO_REP_TIMEOUT 0 verify_rsnapshot_data ${slave_mnt}
|
||||
|
||||
+#rename with existing destination case BUG:1694820
|
||||
+TEST create_rename_with_existing_destination ${master_mnt}
|
||||
+#verify rename with existing destination case BUG:1694820
|
||||
+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 verify_rename_with_existing_destination ${slave_mnt}
|
||||
+
|
||||
#Verify arequal for whole volume
|
||||
EXPECT_WITHIN $GEO_REP_TIMEOUT 0 arequal_checksum ${master_mnt} ${slave_mnt}
|
||||
|
||||
diff --git a/tests/00-geo-rep/georep-basic-dr-tarssh.t b/tests/00-geo-rep/georep-basic-dr-tarssh.t
|
||||
index c5d16ac..9e2f613 100644
|
||||
--- a/tests/00-geo-rep/georep-basic-dr-tarssh.t
|
||||
+++ b/tests/00-geo-rep/georep-basic-dr-tarssh.t
|
||||
@@ -202,6 +202,11 @@ EXPECT_WITHIN $GEO_REP_TIMEOUT 0 verify_hardlink_rename_data ${slave_mnt}
|
||||
#rsnapshot usecase
|
||||
EXPECT_WITHIN $GEO_REP_TIMEOUT 0 verify_rsnapshot_data ${slave_mnt}
|
||||
|
||||
+#rename with existing destination case BUG:1694820
|
||||
+TEST create_rename_with_existing_destination ${master_mnt}
|
||||
+#verify rename with existing destination case BUG:1694820
|
||||
+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 verify_rename_with_existing_destination ${slave_mnt}
|
||||
+
|
||||
#Verify arequal for whole volume
|
||||
EXPECT_WITHIN $GEO_REP_TIMEOUT 0 arequal_checksum ${master_mnt} ${slave_mnt}
|
||||
|
||||
diff --git a/tests/geo-rep.rc b/tests/geo-rep.rc
|
||||
index d723129..e357ba8 100644
|
||||
--- a/tests/geo-rep.rc
|
||||
+++ b/tests/geo-rep.rc
|
||||
@@ -403,3 +403,39 @@ function check_slave_read_only()
|
||||
gluster volume info $1 | grep 'features.read-only: on'
|
||||
echo $?
|
||||
}
|
||||
+
|
||||
+function create_rename_with_existing_destination()
|
||||
+{
|
||||
+ dir=$1/rename_with_existing_destination
|
||||
+ mkdir $dir
|
||||
+ for i in {1..5}
|
||||
+ do
|
||||
+ echo "Data_set$i" > $dir/data_set$i
|
||||
+ mv $dir/data_set$i $dir/data_set -f
|
||||
+ done
|
||||
+}
|
||||
+
|
||||
+function verify_rename_with_existing_destination()
|
||||
+{
|
||||
+ dir=$1/rename_with_existing_destination
|
||||
+
|
||||
+ if [ ! -d $dir ]; then
|
||||
+ echo 1
|
||||
+ elif [ ! -f $dir/data_set ]; then
|
||||
+ echo 2
|
||||
+ elif [ -f $dir/data_set1 ]; then
|
||||
+ echo 3
|
||||
+ elif [ -f $dir/data_set2 ]; then
|
||||
+ echo 4
|
||||
+ elif [ -f $dir/data_set3 ]; then
|
||||
+ echo 5
|
||||
+ elif [ -f $dir/data_set4 ]; then
|
||||
+ echo 6
|
||||
+ elif [ -f $dir/data_set5 ]; then
|
||||
+ echo 7
|
||||
+ elif test "XData_set5" != "X$(cat $dir/data_set)"; then
|
||||
+ echo 8
|
||||
+ else
|
||||
+ echo 0
|
||||
+ fi
|
||||
+}
|
||||
--
|
||||
1.8.3.1
|
||||
|
210
0162-geo-rep-Fix-sync-method-config.patch
Normal file
210
0162-geo-rep-Fix-sync-method-config.patch
Normal file
@ -0,0 +1,210 @@
|
||||
From d148248aa3f0dfe7356a13d6fd029f0c6b3746cf Mon Sep 17 00:00:00 2001
|
||||
From: Kotresh HR <khiremat@redhat.com>
|
||||
Date: Wed, 8 May 2019 10:56:31 +0530
|
||||
Subject: [PATCH 162/169] geo-rep: Fix sync-method config
|
||||
|
||||
Problem:
|
||||
When 'use_tarssh' is set to true, it exits with successful
|
||||
message but the default 'rsync' was used as sync-engine.
|
||||
The new config 'sync-method' is not allowed to set from cli.
|
||||
|
||||
Analysis and Fix:
|
||||
The 'use_tarssh' config is deprecated with new
|
||||
config framework and 'sync-method' is the new
|
||||
config to choose sync-method i.e. tarssh or rsync.
|
||||
This patch fixes the 'sync-method' config. The allowed
|
||||
values are tarssh and rsync.
|
||||
|
||||
Backport of:
|
||||
> Patch: https://review.gluster.org/22683
|
||||
> Change-Id: I0edb0319cad0455b29e49f2f08a64ce324735e84
|
||||
> BUG: 1707686
|
||||
> Signed-off-by: Kotresh HR <khiremat@redhat.com>
|
||||
|
||||
Change-Id: I0edb0319cad0455b29e49f2f08a64ce324735e84
|
||||
fixes: bz#1708067
|
||||
Signed-off-by: Kotresh HR <khiremat@redhat.com>
|
||||
Reviewed-on: https://code.engineering.redhat.com/gerrit/172394
|
||||
Tested-by: RHGS Build Bot <nigelb@redhat.com>
|
||||
Reviewed-by: Sunny Kumar <sunkumar@redhat.com>
|
||||
Reviewed-by: Atin Mukherjee <amukherj@redhat.com>
|
||||
---
|
||||
geo-replication/gsyncd.conf.in | 9 +++++----
|
||||
geo-replication/syncdaemon/resource.py | 7 ++++---
|
||||
tests/00-geo-rep/georep-basic-dr-rsync-arbiter.t | 4 ++--
|
||||
tests/00-geo-rep/georep-basic-dr-rsync.t | 4 ++--
|
||||
tests/00-geo-rep/georep-basic-dr-tarssh-arbiter.t | 6 +++---
|
||||
tests/00-geo-rep/georep-basic-dr-tarssh.t | 6 +++---
|
||||
tests/geo-rep.rc | 3 ++-
|
||||
7 files changed, 21 insertions(+), 18 deletions(-)
|
||||
|
||||
diff --git a/geo-replication/gsyncd.conf.in b/geo-replication/gsyncd.conf.in
|
||||
index 6160c7c..c2e4f0d 100644
|
||||
--- a/geo-replication/gsyncd.conf.in
|
||||
+++ b/geo-replication/gsyncd.conf.in
|
||||
@@ -128,10 +128,11 @@ value=
|
||||
value=5
|
||||
type=int
|
||||
|
||||
-[use-tarssh]
|
||||
-value=false
|
||||
-type=bool
|
||||
-help=Use sync-mode as tarssh
|
||||
+[sync-method]
|
||||
+value=rsync
|
||||
+help=Sync method for data sync. Available methods are tar over ssh and rsync. Default is rsync.
|
||||
+validation=choice
|
||||
+allowed_values=tarssh,rsync
|
||||
|
||||
[remote-gsyncd]
|
||||
value =
|
||||
diff --git a/geo-replication/syncdaemon/resource.py b/geo-replication/syncdaemon/resource.py
|
||||
index f54ccd9..522279b 100644
|
||||
--- a/geo-replication/syncdaemon/resource.py
|
||||
+++ b/geo-replication/syncdaemon/resource.py
|
||||
@@ -1512,7 +1512,7 @@ class SSH(object):
|
||||
|
||||
return po
|
||||
|
||||
- def tarssh(self, files, slaveurl, log_err=False):
|
||||
+ def tarssh(self, files, log_err=False):
|
||||
"""invoke tar+ssh
|
||||
-z (compress) can be use if needed, but omitting it now
|
||||
as it results in weird error (tar+ssh errors out (errcode: 2)
|
||||
@@ -1520,10 +1520,11 @@ class SSH(object):
|
||||
if not files:
|
||||
raise GsyncdError("no files to sync")
|
||||
logging.debug("files: " + ", ".join(files))
|
||||
- (host, rdir) = slaveurl.split(':')
|
||||
+ (host, rdir) = self.slaveurl.split(':')
|
||||
+
|
||||
tar_cmd = ["tar"] + \
|
||||
["--sparse", "-cf", "-", "--files-from", "-"]
|
||||
- ssh_cmd = gconf.get("ssh-command-tar").split() + \
|
||||
+ ssh_cmd = gconf.get("ssh-command").split() + \
|
||||
gconf.get("ssh-options-tar").split() + \
|
||||
["-p", str(gconf.get("ssh-port"))] + \
|
||||
[host, "tar"] + \
|
||||
diff --git a/tests/00-geo-rep/georep-basic-dr-rsync-arbiter.t b/tests/00-geo-rep/georep-basic-dr-rsync-arbiter.t
|
||||
index 1a55ed2..8b90347 100644
|
||||
--- a/tests/00-geo-rep/georep-basic-dr-rsync-arbiter.t
|
||||
+++ b/tests/00-geo-rep/georep-basic-dr-rsync-arbiter.t
|
||||
@@ -159,7 +159,7 @@ EXPECT_WITHIN $GEO_REP_TIMEOUT 0 chown_file_ok ${slave_mnt}/changelog_chown_f1
|
||||
|
||||
#logrotate
|
||||
EXPECT_WITHIN $GEO_REP_TIMEOUT 0 directory_ok ${slave_mnt}/logrotate
|
||||
-EXPECT_WITHIN $GEO_REP_TIMEOUT 0 arequal_checksum ${master_mnt}/logrotate ${slave_mnt}/logrotate
|
||||
+EXPECT_WITHIN $GEO_REP_TIMEOUT "x0" arequal_checksum ${master_mnt}/logrotate ${slave_mnt}/logrotate
|
||||
|
||||
#CREATE+RENAME
|
||||
EXPECT_WITHIN $GEO_REP_TIMEOUT 0 create_rename_ok ${slave_mnt}/create_rename_test_file
|
||||
@@ -209,7 +209,7 @@ TEST create_rename_with_existing_destination ${master_mnt}
|
||||
EXPECT_WITHIN $GEO_REP_TIMEOUT 0 verify_rename_with_existing_destination ${slave_mnt}
|
||||
|
||||
#Verify arequal for whole volume
|
||||
-EXPECT_WITHIN $GEO_REP_TIMEOUT 0 arequal_checksum ${master_mnt} ${slave_mnt}
|
||||
+EXPECT_WITHIN $GEO_REP_TIMEOUT "x0" arequal_checksum ${master_mnt} ${slave_mnt}
|
||||
|
||||
#Stop Geo-rep
|
||||
TEST $GEOREP_CLI $master $slave stop
|
||||
diff --git a/tests/00-geo-rep/georep-basic-dr-rsync.t b/tests/00-geo-rep/georep-basic-dr-rsync.t
|
||||
index d0c0fc9..428e9ed 100644
|
||||
--- a/tests/00-geo-rep/georep-basic-dr-rsync.t
|
||||
+++ b/tests/00-geo-rep/georep-basic-dr-rsync.t
|
||||
@@ -160,7 +160,7 @@ EXPECT_WITHIN $GEO_REP_TIMEOUT 0 chown_file_ok ${slave_mnt}/changelog_chown_f1
|
||||
|
||||
#logrotate
|
||||
EXPECT_WITHIN $GEO_REP_TIMEOUT 0 directory_ok ${slave_mnt}/logrotate
|
||||
-EXPECT_WITHIN $GEO_REP_TIMEOUT 0 arequal_checksum ${master_mnt}/logrotate ${slave_mnt}/logrotate
|
||||
+EXPECT_WITHIN $GEO_REP_TIMEOUT "x0" arequal_checksum ${master_mnt}/logrotate ${slave_mnt}/logrotate
|
||||
|
||||
#CREATE+RENAME
|
||||
EXPECT_WITHIN $GEO_REP_TIMEOUT 0 create_rename_ok ${slave_mnt}/create_rename_test_file
|
||||
@@ -210,7 +210,7 @@ TEST create_rename_with_existing_destination ${master_mnt}
|
||||
EXPECT_WITHIN $GEO_REP_TIMEOUT 0 verify_rename_with_existing_destination ${slave_mnt}
|
||||
|
||||
#Verify arequal for whole volume
|
||||
-EXPECT_WITHIN $GEO_REP_TIMEOUT 0 arequal_checksum ${master_mnt} ${slave_mnt}
|
||||
+EXPECT_WITHIN $GEO_REP_TIMEOUT "x0" arequal_checksum ${master_mnt} ${slave_mnt}
|
||||
|
||||
#Stop Geo-rep
|
||||
TEST $GEOREP_CLI $master $slave stop
|
||||
diff --git a/tests/00-geo-rep/georep-basic-dr-tarssh-arbiter.t b/tests/00-geo-rep/georep-basic-dr-tarssh-arbiter.t
|
||||
index cb530ad..8fed929 100644
|
||||
--- a/tests/00-geo-rep/georep-basic-dr-tarssh-arbiter.t
|
||||
+++ b/tests/00-geo-rep/georep-basic-dr-tarssh-arbiter.t
|
||||
@@ -81,7 +81,7 @@ TEST $GEOREP_CLI $master $slave config use_meta_volume true
|
||||
TEST $CLI volume set $GMV0 changelog.rollover-time 3
|
||||
|
||||
#Config tarssh as sync-engine
|
||||
-TEST $GEOREP_CLI $master $slave config use_tarssh true
|
||||
+TEST $GEOREP_CLI $master $slave config sync-method tarssh
|
||||
|
||||
#Wait for common secret pem file to be created
|
||||
EXPECT_WITHIN $GEO_REP_TIMEOUT 0 check_common_secret_file
|
||||
@@ -162,7 +162,7 @@ EXPECT_WITHIN $GEO_REP_TIMEOUT 0 chown_file_ok ${slave_mnt}/changelog_chown_f1
|
||||
|
||||
#logrotate
|
||||
EXPECT_WITHIN $GEO_REP_TIMEOUT 0 directory_ok ${slave_mnt}/logrotate
|
||||
-EXPECT_WITHIN $GEO_REP_TIMEOUT 0 arequal_checksum ${master_mnt}/logrotate ${slave_mnt}/logrotate
|
||||
+EXPECT_WITHIN $GEO_REP_TIMEOUT "x0" arequal_checksum ${master_mnt}/logrotate ${slave_mnt}/logrotate
|
||||
|
||||
#CREATE+RENAME
|
||||
EXPECT_WITHIN $GEO_REP_TIMEOUT 0 create_rename_ok ${slave_mnt}/create_rename_test_file
|
||||
@@ -208,7 +208,7 @@ TEST create_rename_with_existing_destination ${master_mnt}
|
||||
EXPECT_WITHIN $GEO_REP_TIMEOUT 0 verify_rename_with_existing_destination ${slave_mnt}
|
||||
|
||||
#Verify arequal for whole volume
|
||||
-EXPECT_WITHIN $GEO_REP_TIMEOUT 0 arequal_checksum ${master_mnt} ${slave_mnt}
|
||||
+EXPECT_WITHIN $GEO_REP_TIMEOUT "x0" arequal_checksum ${master_mnt} ${slave_mnt}
|
||||
|
||||
#Stop Geo-rep
|
||||
TEST $GEOREP_CLI $master $slave stop
|
||||
diff --git a/tests/00-geo-rep/georep-basic-dr-tarssh.t b/tests/00-geo-rep/georep-basic-dr-tarssh.t
|
||||
index 9e2f613..feb2de7 100644
|
||||
--- a/tests/00-geo-rep/georep-basic-dr-tarssh.t
|
||||
+++ b/tests/00-geo-rep/georep-basic-dr-tarssh.t
|
||||
@@ -81,7 +81,7 @@ TEST $GEOREP_CLI $master $slave config use_meta_volume true
|
||||
TEST $CLI volume set $GMV0 changelog.rollover-time 3
|
||||
|
||||
#Config tarssh as sync-engine
|
||||
-TEST $GEOREP_CLI $master $slave config use_tarssh true
|
||||
+TEST $GEOREP_CLI $master $slave config sync-method tarssh
|
||||
|
||||
#Wait for common secret pem file to be created
|
||||
EXPECT_WITHIN $GEO_REP_TIMEOUT 0 check_common_secret_file
|
||||
@@ -162,7 +162,7 @@ EXPECT_WITHIN $GEO_REP_TIMEOUT 0 chown_file_ok ${slave_mnt}/changelog_chown_f1
|
||||
|
||||
#logrotate
|
||||
EXPECT_WITHIN $GEO_REP_TIMEOUT 0 directory_ok ${slave_mnt}/logrotate
|
||||
-EXPECT_WITHIN $GEO_REP_TIMEOUT 0 arequal_checksum ${master_mnt}/logrotate ${slave_mnt}/logrotate
|
||||
+EXPECT_WITHIN $GEO_REP_TIMEOUT "x0" arequal_checksum ${master_mnt}/logrotate ${slave_mnt}/logrotate
|
||||
|
||||
#CREATE+RENAME
|
||||
EXPECT_WITHIN $GEO_REP_TIMEOUT 0 create_rename_ok ${slave_mnt}/create_rename_test_file
|
||||
@@ -208,7 +208,7 @@ TEST create_rename_with_existing_destination ${master_mnt}
|
||||
EXPECT_WITHIN $GEO_REP_TIMEOUT 0 verify_rename_with_existing_destination ${slave_mnt}
|
||||
|
||||
#Verify arequal for whole volume
|
||||
-EXPECT_WITHIN $GEO_REP_TIMEOUT 0 arequal_checksum ${master_mnt} ${slave_mnt}
|
||||
+EXPECT_WITHIN $GEO_REP_TIMEOUT "x0" arequal_checksum ${master_mnt} ${slave_mnt}
|
||||
|
||||
#Stop Geo-rep
|
||||
TEST $GEOREP_CLI $master $slave stop
|
||||
diff --git a/tests/geo-rep.rc b/tests/geo-rep.rc
|
||||
index e357ba8..2035b9f 100644
|
||||
--- a/tests/geo-rep.rc
|
||||
+++ b/tests/geo-rep.rc
|
||||
@@ -168,7 +168,8 @@ function arequal_checksum()
|
||||
{
|
||||
master=$1
|
||||
slave=$2
|
||||
- diff <(arequal-checksum -p $master) <(arequal-checksum -p $slave) | wc -l
|
||||
+ ret=$(diff <(arequal-checksum -p $master) <(arequal-checksum -p $slave) | wc -l)
|
||||
+ echo x$ret
|
||||
}
|
||||
|
||||
function symlink_ok()
|
||||
--
|
||||
1.8.3.1
|
||||
|
255
0163-geo-rep-Fix-sync-hang-with-tarssh.patch
Normal file
255
0163-geo-rep-Fix-sync-hang-with-tarssh.patch
Normal file
@ -0,0 +1,255 @@
|
||||
From 29ec87484b1ee3ad6417c37726db8aa9296f3a83 Mon Sep 17 00:00:00 2001
|
||||
From: Kotresh HR <khiremat@redhat.com>
|
||||
Date: Wed, 8 May 2019 11:26:06 +0530
|
||||
Subject: [PATCH 163/169] geo-rep: Fix sync hang with tarssh
|
||||
|
||||
Problem:
|
||||
Geo-rep sync hangs when tarssh is used as sync
|
||||
engine at heavy workload.
|
||||
|
||||
Analysis and Root cause:
|
||||
It's found out that the tar process was hung.
|
||||
When debugged further, it's found out that stderr
|
||||
buffer of tar process on master was full i.e., 64k.
|
||||
When the buffer was copied to a file from /proc/pid/fd/2,
|
||||
the hang is resolved.
|
||||
|
||||
This can happen when files picked by tar process
|
||||
to sync doesn't exist on master anymore. If this count
|
||||
increases around 1k, the stderr buffer is filled up.
|
||||
|
||||
Fix:
|
||||
The tar process is executed using Popen with stderr as PIPE.
|
||||
The final execution is something like below.
|
||||
|
||||
tar | ssh <args> root@slave tar --overwrite -xf - -C <path>
|
||||
|
||||
It was waiting on ssh process first using communicate() and then tar.
|
||||
Note that communicate() reads stdout and stderr. So when stderr of tar
|
||||
process is filled up, there is no one to read until untar via ssh is
|
||||
completed. This can't happen and leads to deadlock.
|
||||
Hence we should be waiting on both process parallely, so that stderr is
|
||||
read on both processes.
|
||||
|
||||
Backport of:
|
||||
> Patch: https://review.gluster.org/22684
|
||||
> Change-Id: I609c7cc5c07e210c504771115b4d551a2e891adf
|
||||
> BUG: 1707728
|
||||
> Signed-off-by: Kotresh HR <khiremat@redhat.com>
|
||||
|
||||
Change-Id: I609c7cc5c07e210c504771115b4d551a2e891adf
|
||||
fixes: bz#1708116
|
||||
Signed-off-by: Kotresh HR <khiremat@redhat.com>
|
||||
Reviewed-on: https://code.engineering.redhat.com/gerrit/172395
|
||||
Tested-by: RHGS Build Bot <nigelb@redhat.com>
|
||||
Reviewed-by: Atin Mukherjee <amukherj@redhat.com>
|
||||
---
|
||||
geo-replication/syncdaemon/resource.py | 22 ++++--
|
||||
tests/00-geo-rep/georep-stderr-hang.t | 128 +++++++++++++++++++++++++++++++++
|
||||
tests/geo-rep.rc | 17 +++++
|
||||
3 files changed, 163 insertions(+), 4 deletions(-)
|
||||
create mode 100644 tests/00-geo-rep/georep-stderr-hang.t
|
||||
|
||||
diff --git a/geo-replication/syncdaemon/resource.py b/geo-replication/syncdaemon/resource.py
|
||||
index 522279b..b16db60 100644
|
||||
--- a/geo-replication/syncdaemon/resource.py
|
||||
+++ b/geo-replication/syncdaemon/resource.py
|
||||
@@ -1540,15 +1540,29 @@ class SSH(object):
|
||||
|
||||
p0.stdin.close()
|
||||
p0.stdout.close() # Allow p0 to receive a SIGPIPE if p1 exits.
|
||||
- # wait for tar to terminate, collecting any errors, further
|
||||
- # waiting for transfer to complete
|
||||
- _, stderr1 = p1.communicate()
|
||||
|
||||
# stdin and stdout of p0 is already closed, Reset to None and
|
||||
# wait for child process to complete
|
||||
p0.stdin = None
|
||||
p0.stdout = None
|
||||
- p0.communicate()
|
||||
+
|
||||
+ def wait_for_tar(p0):
|
||||
+ _, stderr = p0.communicate()
|
||||
+ if log_err:
|
||||
+ for errline in stderr.strip().split("\n")[:-1]:
|
||||
+ if "No such file or directory" not in errline:
|
||||
+ logging.error(lf("SYNC Error",
|
||||
+ sync_engine="Tarssh",
|
||||
+ error=errline))
|
||||
+
|
||||
+ t = syncdutils.Thread(target=wait_for_tar, args=(p0, ))
|
||||
+ # wait for tar to terminate, collecting any errors, further
|
||||
+ # waiting for transfer to complete
|
||||
+ t.start()
|
||||
+
|
||||
+ # wait for ssh process
|
||||
+ _, stderr1 = p1.communicate()
|
||||
+ t.join()
|
||||
|
||||
if log_err:
|
||||
for errline in stderr1.strip().split("\n")[:-1]:
|
||||
diff --git a/tests/00-geo-rep/georep-stderr-hang.t b/tests/00-geo-rep/georep-stderr-hang.t
|
||||
new file mode 100644
|
||||
index 0000000..496f0e6
|
||||
--- /dev/null
|
||||
+++ b/tests/00-geo-rep/georep-stderr-hang.t
|
||||
@@ -0,0 +1,128 @@
|
||||
+#!/bin/bash
|
||||
+
|
||||
+. $(dirname $0)/../include.rc
|
||||
+. $(dirname $0)/../volume.rc
|
||||
+. $(dirname $0)/../geo-rep.rc
|
||||
+. $(dirname $0)/../env.rc
|
||||
+
|
||||
+SCRIPT_TIMEOUT=500
|
||||
+
|
||||
+AREQUAL_PATH=$(dirname $0)/../utils
|
||||
+test "`uname -s`" != "Linux" && {
|
||||
+ CFLAGS="$CFLAGS -lintl";
|
||||
+}
|
||||
+build_tester $AREQUAL_PATH/arequal-checksum.c $CFLAGS
|
||||
+
|
||||
+### Basic Tests with Distribute Replicate volumes
|
||||
+
|
||||
+##Cleanup and start glusterd
|
||||
+cleanup;
|
||||
+TEST glusterd;
|
||||
+TEST pidof glusterd
|
||||
+
|
||||
+
|
||||
+##Variables
|
||||
+GEOREP_CLI="$CLI volume geo-replication"
|
||||
+master=$GMV0
|
||||
+SH0="127.0.0.1"
|
||||
+slave=${SH0}::${GSV0}
|
||||
+num_active=2
|
||||
+num_passive=2
|
||||
+master_mnt=$M0
|
||||
+slave_mnt=$M1
|
||||
+
|
||||
+############################################################
|
||||
+#SETUP VOLUMES AND GEO-REPLICATION
|
||||
+############################################################
|
||||
+
|
||||
+##create_and_start_master_volume
|
||||
+TEST $CLI volume create $GMV0 $H0:$B0/${GMV0}1;
|
||||
+TEST $CLI volume start $GMV0
|
||||
+
|
||||
+##create_and_start_slave_volume
|
||||
+TEST $CLI volume create $GSV0 $H0:$B0/${GSV0}1;
|
||||
+TEST $CLI volume start $GSV0
|
||||
+TEST $CLI volume set $GSV0 performance.stat-prefetch off
|
||||
+TEST $CLI volume set $GSV0 performance.quick-read off
|
||||
+TEST $CLI volume set $GSV0 performance.readdir-ahead off
|
||||
+TEST $CLI volume set $GSV0 performance.read-ahead off
|
||||
+
|
||||
+##Mount master
|
||||
+TEST glusterfs -s $H0 --volfile-id $GMV0 $M0
|
||||
+
|
||||
+##Mount slave
|
||||
+TEST glusterfs -s $H0 --volfile-id $GSV0 $M1
|
||||
+
|
||||
+############################################################
|
||||
+#BASIC GEO-REPLICATION TESTS
|
||||
+############################################################
|
||||
+
|
||||
+TEST create_georep_session $master $slave
|
||||
+EXPECT_WITHIN $GEO_REP_TIMEOUT 1 check_status_num_rows "Created"
|
||||
+
|
||||
+#Config gluster-command-dir
|
||||
+TEST $GEOREP_CLI $master $slave config gluster-command-dir ${GLUSTER_CMD_DIR}
|
||||
+
|
||||
+#Config gluster-command-dir
|
||||
+TEST $GEOREP_CLI $master $slave config slave-gluster-command-dir ${GLUSTER_CMD_DIR}
|
||||
+
|
||||
+#Set changelog roll-over time to 45 secs
|
||||
+TEST $CLI volume set $GMV0 changelog.rollover-time 45
|
||||
+
|
||||
+#Wait for common secret pem file to be created
|
||||
+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 check_common_secret_file
|
||||
+
|
||||
+#Verify the keys are distributed
|
||||
+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 check_keys_distributed
|
||||
+
|
||||
+#Set sync-jobs to 1
|
||||
+TEST $GEOREP_CLI $master $slave config sync-jobs 1
|
||||
+
|
||||
+#Start_georep
|
||||
+TEST $GEOREP_CLI $master $slave start
|
||||
+
|
||||
+touch $M0
|
||||
+EXPECT_WITHIN $GEO_REP_TIMEOUT 1 check_status_num_rows "Active"
|
||||
+EXPECT_WITHIN $GEO_REP_TIMEOUT 1 check_status_num_rows "Changelog Crawl"
|
||||
+
|
||||
+#Check History Crawl.
|
||||
+TEST $GEOREP_CLI $master $slave stop
|
||||
+TEST create_data_hang "rsync_hang"
|
||||
+TEST create_data "history_rsync"
|
||||
+TEST $GEOREP_CLI $master $slave start
|
||||
+EXPECT_WITHIN $GEO_REP_TIMEOUT 1 check_status_num_rows "Active"
|
||||
+
|
||||
+#Verify arequal for whole volume
|
||||
+EXPECT_WITHIN $GEO_REP_TIMEOUT "x0" arequal_checksum ${master_mnt} ${slave_mnt}
|
||||
+
|
||||
+#Stop Geo-rep
|
||||
+TEST $GEOREP_CLI $master $slave stop
|
||||
+
|
||||
+#Config tarssh as sync-engine
|
||||
+TEST $GEOREP_CLI $master $slave config sync-method tarssh
|
||||
+
|
||||
+#Create tarssh hang data
|
||||
+TEST create_data_hang "tarssh_hang"
|
||||
+TEST create_data "history_tar"
|
||||
+
|
||||
+TEST $GEOREP_CLI $master $slave start
|
||||
+EXPECT_WITHIN $GEO_REP_TIMEOUT 1 check_status_num_rows "Active"
|
||||
+
|
||||
+#Verify arequal for whole volume
|
||||
+EXPECT_WITHIN $GEO_REP_TIMEOUT "x0" arequal_checksum ${master_mnt} ${slave_mnt}
|
||||
+
|
||||
+#Stop Geo-rep
|
||||
+TEST $GEOREP_CLI $master $slave stop
|
||||
+
|
||||
+#Delete Geo-rep
|
||||
+TEST $GEOREP_CLI $master $slave delete
|
||||
+
|
||||
+#Cleanup are-equal binary
|
||||
+TEST rm $AREQUAL_PATH/arequal-checksum
|
||||
+
|
||||
+#Cleanup authorized keys
|
||||
+sed -i '/^command=.*SSH_ORIGINAL_COMMAND#.*/d' ~/.ssh/authorized_keys
|
||||
+sed -i '/^command=.*gsyncd.*/d' ~/.ssh/authorized_keys
|
||||
+
|
||||
+cleanup;
|
||||
+#G_TESTDEF_TEST_STATUS_NETBSD7=BAD_TEST,BUG=000000
|
||||
diff --git a/tests/geo-rep.rc b/tests/geo-rep.rc
|
||||
index 2035b9f..e4f014e 100644
|
||||
--- a/tests/geo-rep.rc
|
||||
+++ b/tests/geo-rep.rc
|
||||
@@ -101,6 +101,23 @@ function create_data()
|
||||
chown 1000:1000 ${master_mnt}/${prefix}_chown_f1_ಸಂತಸ
|
||||
}
|
||||
|
||||
+function create_data_hang()
|
||||
+{
|
||||
+ prefix=$1
|
||||
+ mkdir ${master_mnt}/${prefix}
|
||||
+ cd ${master_mnt}/${prefix}
|
||||
+ # ~1k files is required with 1 sync-job and hang happens if
|
||||
+ # stderr buffer of tar/ssh executed with Popen is full (i.e., 64k).
|
||||
+ # 64k is hit when ~800 files were not found while syncing data
|
||||
+ # from master. So around 1k files is required to hit the condition.
|
||||
+ for i in {1..1000}
|
||||
+ do
|
||||
+ echo "test data" > file$i
|
||||
+ mv -f file$i file
|
||||
+ done
|
||||
+ cd -
|
||||
+}
|
||||
+
|
||||
function chown_file_ok()
|
||||
{
|
||||
local file_owner=$(stat --format "%u:%g" "$1")
|
||||
--
|
||||
1.8.3.1
|
||||
|
165
0164-cluster-ec-Fix-handling-of-heal-info-cases-without-l.patch
Normal file
165
0164-cluster-ec-Fix-handling-of-heal-info-cases-without-l.patch
Normal file
@ -0,0 +1,165 @@
|
||||
From c2b1c50f06cc59b47c9c834617dff2aed7177a78 Mon Sep 17 00:00:00 2001
|
||||
From: Ashish Pandey <aspandey@redhat.com>
|
||||
Date: Mon, 18 Mar 2019 12:54:54 +0530
|
||||
Subject: [PATCH 164/169] cluster/ec: Fix handling of heal info cases without
|
||||
locks
|
||||
|
||||
When we use heal info command, it takes lot of time as in
|
||||
some cases it takes lock on entries to find out if the
|
||||
entry actually needs heal or not.
|
||||
|
||||
There are some cases where we can avoid these locks and
|
||||
can conclude if the entry needs heal or not.
|
||||
|
||||
1 - We do a lookup (without lock) on an entry, which we found in
|
||||
.glusterfs/indices/xattrop, and find that lock count is
|
||||
zero. Now if the file contains dirty bit set on all or any
|
||||
brick, we can say that this entry needs heal.
|
||||
|
||||
2 - If the lock count is one and dirty is greater than 1,
|
||||
then it also means that some fop had left the dirty bit set
|
||||
which made the dirty count of current fop (which has taken lock)
|
||||
more than one. At this point also we can definitely say that
|
||||
this entry needs heal.
|
||||
|
||||
This patch is modifying code to take into consideration above two
|
||||
points.
|
||||
It is also changing code to not to call ec_heal_inspect if ec_heal_do
|
||||
was called from client side heal. Client side heal triggeres heal
|
||||
only when it is sure that it requires heal.
|
||||
|
||||
[We have changed the code to not to call heal for lookup]
|
||||
|
||||
Upstream patch -
|
||||
https://review.gluster.org/#/c/glusterfs/+/22372/
|
||||
|
||||
Fixes: bz#1716385
|
||||
Change-Id: I7f09f0ecd12f65a353297aefd57026fd2bebdf9c
|
||||
Signed-off-by: Ashish Pandey <aspandey@redhat.com>
|
||||
Reviewed-on: https://code.engineering.redhat.com/gerrit/172579
|
||||
Reviewed-by: Atin Mukherjee <amukherj@redhat.com>
|
||||
Tested-by: RHGS Build Bot <nigelb@redhat.com>
|
||||
---
|
||||
xlators/cluster/ec/src/ec-heal.c | 42 ++++++++++++++++------------------------
|
||||
1 file changed, 17 insertions(+), 25 deletions(-)
|
||||
|
||||
diff --git a/xlators/cluster/ec/src/ec-heal.c b/xlators/cluster/ec/src/ec-heal.c
|
||||
index 3aa04fb..2fa1f11 100644
|
||||
--- a/xlators/cluster/ec/src/ec-heal.c
|
||||
+++ b/xlators/cluster/ec/src/ec-heal.c
|
||||
@@ -2541,13 +2541,15 @@ ec_heal_do(xlator_t *this, void *data, loc_t *loc, int32_t partial)
|
||||
|
||||
/* Mount triggers heal only when it detects that it must need heal, shd
|
||||
* triggers heals periodically which need not be thorough*/
|
||||
- ec_heal_inspect(frame, ec, loc->inode, up_subvols, _gf_false,
|
||||
- !ec->shd.iamshd, &need_heal);
|
||||
+ if (ec->shd.iamshd) {
|
||||
+ ec_heal_inspect(frame, ec, loc->inode, up_subvols, _gf_false, _gf_false,
|
||||
+ &need_heal);
|
||||
|
||||
- if (need_heal == EC_HEAL_NONEED) {
|
||||
- gf_msg(ec->xl->name, GF_LOG_DEBUG, 0, EC_MSG_HEAL_FAIL,
|
||||
- "Heal is not required for : %s ", uuid_utoa(loc->gfid));
|
||||
- goto out;
|
||||
+ if (need_heal == EC_HEAL_NONEED) {
|
||||
+ gf_msg(ec->xl->name, GF_LOG_DEBUG, 0, EC_MSG_HEAL_FAIL,
|
||||
+ "Heal is not required for : %s ", uuid_utoa(loc->gfid));
|
||||
+ goto out;
|
||||
+ }
|
||||
}
|
||||
sources = alloca0(ec->nodes);
|
||||
healed_sinks = alloca0(ec->nodes);
|
||||
@@ -2902,7 +2904,7 @@ out:
|
||||
static int32_t
|
||||
_need_heal_calculate(ec_t *ec, uint64_t *dirty, unsigned char *sources,
|
||||
gf_boolean_t self_locked, int32_t lock_count,
|
||||
- ec_heal_need_t *need_heal)
|
||||
+ ec_heal_need_t *need_heal, uint64_t *versions)
|
||||
{
|
||||
int i = 0;
|
||||
int source_count = 0;
|
||||
@@ -2912,7 +2914,7 @@ _need_heal_calculate(ec_t *ec, uint64_t *dirty, unsigned char *sources,
|
||||
*need_heal = EC_HEAL_NONEED;
|
||||
if (self_locked || lock_count == 0) {
|
||||
for (i = 0; i < ec->nodes; i++) {
|
||||
- if (dirty[i]) {
|
||||
+ if (dirty[i] || (versions[i] != versions[0])) {
|
||||
*need_heal = EC_HEAL_MUST;
|
||||
goto out;
|
||||
}
|
||||
@@ -2928,6 +2930,9 @@ _need_heal_calculate(ec_t *ec, uint64_t *dirty, unsigned char *sources,
|
||||
*need_heal = EC_HEAL_MUST;
|
||||
goto out;
|
||||
}
|
||||
+ if (dirty[i] != dirty[0] || (versions[i] != versions[0])) {
|
||||
+ *need_heal = EC_HEAL_MAYBE;
|
||||
+ }
|
||||
}
|
||||
}
|
||||
} else {
|
||||
@@ -2948,7 +2953,6 @@ ec_need_metadata_heal(ec_t *ec, inode_t *inode, default_args_cbk_t *replies,
|
||||
unsigned char *healed_sinks = NULL;
|
||||
uint64_t *meta_versions = NULL;
|
||||
int ret = 0;
|
||||
- int i = 0;
|
||||
|
||||
sources = alloca0(ec->nodes);
|
||||
healed_sinks = alloca0(ec->nodes);
|
||||
@@ -2961,15 +2965,7 @@ ec_need_metadata_heal(ec_t *ec, inode_t *inode, default_args_cbk_t *replies,
|
||||
}
|
||||
|
||||
ret = _need_heal_calculate(ec, dirty, sources, self_locked, lock_count,
|
||||
- need_heal);
|
||||
- if (ret == ec->nodes && *need_heal == EC_HEAL_NONEED) {
|
||||
- for (i = 1; i < ec->nodes; i++) {
|
||||
- if (meta_versions[i] != meta_versions[0]) {
|
||||
- *need_heal = EC_HEAL_MUST;
|
||||
- goto out;
|
||||
- }
|
||||
- }
|
||||
- }
|
||||
+ need_heal, meta_versions);
|
||||
out:
|
||||
return ret;
|
||||
}
|
||||
@@ -3005,7 +3001,7 @@ ec_need_data_heal(ec_t *ec, inode_t *inode, default_args_cbk_t *replies,
|
||||
}
|
||||
|
||||
ret = _need_heal_calculate(ec, dirty, sources, self_locked, lock_count,
|
||||
- need_heal);
|
||||
+ need_heal, data_versions);
|
||||
out:
|
||||
return ret;
|
||||
}
|
||||
@@ -3033,7 +3029,7 @@ ec_need_entry_heal(ec_t *ec, inode_t *inode, default_args_cbk_t *replies,
|
||||
}
|
||||
|
||||
ret = _need_heal_calculate(ec, dirty, sources, self_locked, lock_count,
|
||||
- need_heal);
|
||||
+ need_heal, data_versions);
|
||||
out:
|
||||
return ret;
|
||||
}
|
||||
@@ -3131,10 +3127,6 @@ ec_heal_inspect(call_frame_t *frame, ec_t *ec, inode_t *inode,
|
||||
need_heal:
|
||||
ret = ec_need_heal(ec, inode, replies, lock_count, self_locked, thorough,
|
||||
need_heal);
|
||||
-
|
||||
- if (!self_locked && *need_heal == EC_HEAL_MUST) {
|
||||
- *need_heal = EC_HEAL_MAYBE;
|
||||
- }
|
||||
out:
|
||||
cluster_replies_wipe(replies, ec->nodes);
|
||||
loc_wipe(&loc);
|
||||
@@ -3220,7 +3212,7 @@ ec_get_heal_info(xlator_t *this, loc_t *entry_loc, dict_t **dict_rsp)
|
||||
|
||||
ret = ec_heal_inspect(frame, ec, loc.inode, up_subvols, _gf_false,
|
||||
_gf_false, &need_heal);
|
||||
- if (ret == ec->nodes && need_heal == EC_HEAL_NONEED) {
|
||||
+ if (ret == ec->nodes && need_heal != EC_HEAL_MAYBE) {
|
||||
goto set_heal;
|
||||
}
|
||||
need_heal = EC_HEAL_NONEED;
|
||||
--
|
||||
1.8.3.1
|
||||
|
442
0165-tests-shd-Add-test-coverage-for-shd-mux.patch
Normal file
442
0165-tests-shd-Add-test-coverage-for-shd-mux.patch
Normal file
@ -0,0 +1,442 @@
|
||||
From b7f832288d2d2e57231d90765afc049ad7cb2f9d Mon Sep 17 00:00:00 2001
|
||||
From: Mohammed Rafi KC <rkavunga@redhat.com>
|
||||
Date: Thu, 9 May 2019 14:07:48 +0530
|
||||
Subject: [PATCH 165/169] tests/shd: Add test coverage for shd mux
|
||||
|
||||
This patch add more test cases for shd mux test cases
|
||||
The test case includes
|
||||
1) Createing multiple volumes to check the attach and detach
|
||||
of self heal daemon requests.
|
||||
2) Make sure the healing happens in all sceanarios
|
||||
3) After a volume detach make sure the threads of the detached
|
||||
volume is all cleaned.
|
||||
4) Repeat all the above tests for ec volume
|
||||
5) Node Reboot case
|
||||
6) glusterd restart cases
|
||||
7) Add-brick/remove brick
|
||||
8) Convert a distributed volume to disperse volume
|
||||
9) Convert a replicated volume to distributed volume
|
||||
|
||||
Backport of: https://review.gluster.org/#/c/glusterfs/+/22697/
|
||||
|
||||
>Change-Id: I7c317ef9d23a45ffd831157e4890d7c83a8fce7b
|
||||
>fixes: bz#1708929
|
||||
>Signed-off-by: Mohammed Rafi KC <rkavunga@redhat.com>
|
||||
|
||||
Change-Id: Ie732ead9413bd32b8c262303468a0720538334fb
|
||||
BUG: 1704562
|
||||
Signed-off-by: Mohammed Rafi KC <rkavunga@redhat.com>
|
||||
Reviewed-on: https://code.engineering.redhat.com/gerrit/172634
|
||||
Tested-by: RHGS Build Bot <nigelb@redhat.com>
|
||||
Reviewed-by: Atin Mukherjee <amukherj@redhat.com>
|
||||
---
|
||||
tests/basic/glusterd-restart-shd-mux.t | 96 +++++++++++++++++++++
|
||||
tests/basic/shd-mux.t | 149 +++++++++++++++++++++++++++++++++
|
||||
tests/basic/volume-scale-shd-mux.t | 112 +++++++++++++++++++++++++
|
||||
tests/volume.rc | 15 ++++
|
||||
4 files changed, 372 insertions(+)
|
||||
create mode 100644 tests/basic/glusterd-restart-shd-mux.t
|
||||
create mode 100644 tests/basic/shd-mux.t
|
||||
create mode 100644 tests/basic/volume-scale-shd-mux.t
|
||||
|
||||
diff --git a/tests/basic/glusterd-restart-shd-mux.t b/tests/basic/glusterd-restart-shd-mux.t
|
||||
new file mode 100644
|
||||
index 0000000..a50af9d
|
||||
--- /dev/null
|
||||
+++ b/tests/basic/glusterd-restart-shd-mux.t
|
||||
@@ -0,0 +1,96 @@
|
||||
+#!/bin/bash
|
||||
+
|
||||
+. $(dirname $0)/../include.rc
|
||||
+. $(dirname $0)/../volume.rc
|
||||
+
|
||||
+cleanup;
|
||||
+
|
||||
+TESTS_EXPECTED_IN_LOOP=20
|
||||
+
|
||||
+TEST glusterd
|
||||
+TEST pidof glusterd
|
||||
+TEST $CLI volume create $V0 replica 3 $H0:$B0/${V0}{0,1,2,3,4,5}
|
||||
+TEST $CLI volume set $V0 cluster.background-self-heal-count 0
|
||||
+TEST $CLI volume set $V0 cluster.eager-lock off
|
||||
+TEST $CLI volume set $V0 performance.flush-behind off
|
||||
+TEST $CLI volume start $V0
|
||||
+
|
||||
+for i in $(seq 1 3); do
|
||||
+ TEST $CLI volume create ${V0}_afr$i replica 3 $H0:$B0/${V0}_afr${i}{0,1,2,3,4,5}
|
||||
+ TEST $CLI volume start ${V0}_afr$i
|
||||
+ TEST $CLI volume create ${V0}_ec$i disperse 6 redundancy 2 $H0:$B0/${V0}_ec${i}{0,1,2,3,4,5}
|
||||
+ TEST $CLI volume start ${V0}_ec$i
|
||||
+done
|
||||
+
|
||||
+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "^1$" shd_count
|
||||
+
|
||||
+#Stop the glusterd
|
||||
+TEST pkill glusterd
|
||||
+#Only stopping glusterd, so there will be one shd
|
||||
+EXPECT_WITHIN $PROCESS_DOWN_TIMEOUT "^1$" shd_count
|
||||
+TEST glusterd
|
||||
+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "^1$" shd_count
|
||||
+#Check the thread count become to number of volumes*number of ec subvolume (3*6=18)
|
||||
+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "^18$" number_healer_threads_shd $V0 "__ec_shd_healer_wait"
|
||||
+#Check the thread count become to number of volumes*number of afr subvolume (4*6=24)
|
||||
+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "^24$" number_healer_threads_shd $V0 "__afr_shd_healer_wait"
|
||||
+
|
||||
+shd_pid=$(get_shd_mux_pid $V0)
|
||||
+for i in $(seq 1 3); do
|
||||
+ afr_path="/var/run/gluster/shd/${V0}_afr$i/${V0}_afr$i-shd.pid"
|
||||
+ EXPECT_WITHIN $PROCESS_UP_TIMEOUT "^${shd_pid}$" cat $afr_path
|
||||
+ ec_path="/var/run/gluster/shd/${V0}_ec$i/${V0}_ec${i}-shd.pid"
|
||||
+ EXPECT_WITHIN $PROCESS_UP_TIMEOUT "^${shd_pid}$" cat $ec_path
|
||||
+done
|
||||
+
|
||||
+#Reboot a node scenario
|
||||
+TEST pkill gluster
|
||||
+#Only stopped glusterd, so there will be one shd
|
||||
+EXPECT_WITHIN $PROCESS_DOWN_TIMEOUT "^0$" shd_count
|
||||
+
|
||||
+TEST glusterd
|
||||
+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "^1$" shd_count
|
||||
+
|
||||
+#Check the thread count become to number of volumes*number of ec subvolume (3*6=18)
|
||||
+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "^18$" number_healer_threads_shd $V0 "__ec_shd_healer_wait"
|
||||
+#Check the thread count become to number of volumes*number of afr subvolume (4*6=24)
|
||||
+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "^24$" number_healer_threads_shd $V0 "__afr_shd_healer_wait"
|
||||
+
|
||||
+shd_pid=$(get_shd_mux_pid $V0)
|
||||
+for i in $(seq 1 3); do
|
||||
+ afr_path="/var/run/gluster/shd/${V0}_afr$i/${V0}_afr$i-shd.pid"
|
||||
+ EXPECT_WITHIN $PROCESS_UP_TIMEOUT "^${shd_pid}$" cat $afr_path
|
||||
+ ec_path="/var/run/gluster/shd/${V0}_ec$i/${V0}_ec${i}-shd.pid"
|
||||
+ EXPECT_WITHIN $PROCESS_UP_TIMEOUT "^${shd_pid}$" cat $ec_path
|
||||
+done
|
||||
+
|
||||
+for i in $(seq 1 3); do
|
||||
+ TEST $CLI volume stop ${V0}_afr$i
|
||||
+ TEST $CLI volume stop ${V0}_ec$i
|
||||
+done
|
||||
+
|
||||
+EXPECT_WITHIN $PROCESS_DOWN_TIMEOUT "^6$" number_healer_threads_shd $V0 "__afr_shd_healer_wait"
|
||||
+
|
||||
+TEST $GFS --volfile-id=/$V0 --volfile-server=$H0 $M0
|
||||
+
|
||||
+TEST kill_brick $V0 $H0 $B0/${V0}0
|
||||
+TEST kill_brick $V0 $H0 $B0/${V0}3
|
||||
+
|
||||
+TEST touch $M0/foo{1..100}
|
||||
+
|
||||
+EXPECT_WITHIN $HEAL_TIMEOUT "^204$" get_pending_heal_count $V0
|
||||
+
|
||||
+TEST $CLI volume start ${V0} force
|
||||
+
|
||||
+EXPECT_WITHIN $HEAL_TIMEOUT "^0$" get_pending_heal_count $V0
|
||||
+
|
||||
+TEST rm -rf $M0/*
|
||||
+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0
|
||||
+
|
||||
+
|
||||
+TEST $CLI volume stop ${V0}
|
||||
+TEST $CLI volume delete ${V0}
|
||||
+
|
||||
+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "^0$" shd_count
|
||||
+
|
||||
+cleanup
|
||||
diff --git a/tests/basic/shd-mux.t b/tests/basic/shd-mux.t
|
||||
new file mode 100644
|
||||
index 0000000..e42a34a
|
||||
--- /dev/null
|
||||
+++ b/tests/basic/shd-mux.t
|
||||
@@ -0,0 +1,149 @@
|
||||
+#!/bin/bash
|
||||
+
|
||||
+. $(dirname $0)/../include.rc
|
||||
+. $(dirname $0)/../volume.rc
|
||||
+
|
||||
+cleanup;
|
||||
+
|
||||
+TESTS_EXPECTED_IN_LOOP=16
|
||||
+
|
||||
+TEST glusterd
|
||||
+TEST pidof glusterd
|
||||
+TEST $CLI volume create $V0 replica 3 $H0:$B0/${V0}{0,1,2,3,4,5}
|
||||
+TEST $CLI volume set $V0 cluster.background-self-heal-count 0
|
||||
+TEST $CLI volume set $V0 cluster.eager-lock off
|
||||
+TEST $CLI volume set $V0 performance.flush-behind off
|
||||
+TEST $CLI volume start $V0
|
||||
+TEST $GFS --volfile-id=/$V0 --volfile-server=$H0 $M0
|
||||
+
|
||||
+shd_pid=$(get_shd_mux_pid $V0)
|
||||
+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "^6$" number_healer_threads_shd $V0 "__afr_shd_healer_wait"
|
||||
+
|
||||
+#Create a one more volume
|
||||
+TEST $CLI volume create ${V0}_1 replica 3 $H0:$B0/${V0}_1{0,1,2,3,4,5}
|
||||
+TEST $CLI volume start ${V0}_1
|
||||
+
|
||||
+#Check whether the shd has multiplexed or not
|
||||
+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "^1$" shd_count
|
||||
+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "^${shd_pid}$" get_shd_mux_pid ${V0}_1
|
||||
+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "^${shd_pid}$" get_shd_mux_pid ${V0}
|
||||
+
|
||||
+TEST $CLI volume set ${V0}_1 cluster.background-self-heal-count 0
|
||||
+TEST $CLI volume set ${V0}_1 cluster.eager-lock off
|
||||
+TEST $CLI volume set ${V0}_1 performance.flush-behind off
|
||||
+TEST $GFS --volfile-id=/${V0}_1 --volfile-server=$H0 $M1
|
||||
+
|
||||
+TEST kill_brick $V0 $H0 $B0/${V0}0
|
||||
+TEST kill_brick $V0 $H0 $B0/${V0}4
|
||||
+TEST kill_brick ${V0}_1 $H0 $B0/${V0}_10
|
||||
+TEST kill_brick ${V0}_1 $H0 $B0/${V0}_14
|
||||
+
|
||||
+TEST touch $M0/foo{1..100}
|
||||
+TEST touch $M1/foo{1..100}
|
||||
+
|
||||
+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "^204$" get_pending_heal_count $V0
|
||||
+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "^204$" get_pending_heal_count ${V0}_1
|
||||
+
|
||||
+TEST $CLI volume start ${V0} force
|
||||
+TEST $CLI volume start ${V0}_1 force
|
||||
+
|
||||
+EXPECT_WITHIN $HEAL_TIMEOUT "^0$" get_pending_heal_count $V0
|
||||
+EXPECT_WITHIN $HEAL_TIMEOUT "^0$" get_pending_heal_count ${V0}_1
|
||||
+
|
||||
+TEST rm -rf $M0/*
|
||||
+TEST rm -rf $M1/*
|
||||
+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M1
|
||||
+
|
||||
+#Stop the volume
|
||||
+TEST $CLI volume stop ${V0}_1
|
||||
+TEST $CLI volume delete ${V0}_1
|
||||
+
|
||||
+#Check the stop succeeded and detached the volume with out restarting it
|
||||
+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "^1$" shd_count
|
||||
+
|
||||
+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "^${shd_pid}$" get_shd_mux_pid $V0
|
||||
+
|
||||
+#Check the thread count become to earlier number after stopping
|
||||
+EXPECT_WITHIN $PROCESS_DOWN_TIMEOUT "^6$" number_healer_threads_shd $V0 "__afr_shd_healer_wait"
|
||||
+
|
||||
+
|
||||
+#Now create a ec volume and check mux works
|
||||
+TEST $CLI volume create ${V0}_2 disperse 6 redundancy 2 $H0:$B0/${V0}_2{0,1,2,3,4,5}
|
||||
+TEST $CLI volume start ${V0}_2
|
||||
+
|
||||
+#Check whether the shd has multiplexed or not
|
||||
+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "^1$" shd_count
|
||||
+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "^${shd_pid}$" get_shd_mux_pid ${V0}_2
|
||||
+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "^${shd_pid}$" get_shd_mux_pid ${V0}
|
||||
+
|
||||
+TEST $CLI volume set ${V0}_2 cluster.background-self-heal-count 0
|
||||
+TEST $CLI volume set ${V0}_2 cluster.eager-lock off
|
||||
+TEST $CLI volume set ${V0}_2 performance.flush-behind off
|
||||
+TEST $GFS --volfile-id=/${V0}_2 --volfile-server=$H0 $M1
|
||||
+
|
||||
+TEST kill_brick $V0 $H0 $B0/${V0}0
|
||||
+TEST kill_brick $V0 $H0 $B0/${V0}4
|
||||
+TEST kill_brick ${V0}_2 $H0 $B0/${V0}_20
|
||||
+TEST kill_brick ${V0}_2 $H0 $B0/${V0}_22
|
||||
+
|
||||
+TEST touch $M0/foo{1..100}
|
||||
+TEST touch $M1/foo{1..100}
|
||||
+
|
||||
+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "^204$" get_pending_heal_count $V0
|
||||
+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "^404$" get_pending_heal_count ${V0}_2
|
||||
+
|
||||
+TEST $CLI volume start ${V0} force
|
||||
+TEST $CLI volume start ${V0}_2 force
|
||||
+
|
||||
+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "^6$" number_healer_threads_shd $V0 "__ec_shd_healer_wait"
|
||||
+
|
||||
+EXPECT_WITHIN $HEAL_TIMEOUT "^0$" get_pending_heal_count $V0
|
||||
+EXPECT_WITHIN $HEAL_TIMEOUT "^0$" get_pending_heal_count ${V0}_2
|
||||
+
|
||||
+TEST rm -rf $M0/*
|
||||
+TEST rm -rf $M1/*
|
||||
+
|
||||
+
|
||||
+#Stop the volume
|
||||
+TEST $CLI volume stop ${V0}_2
|
||||
+TEST $CLI volume delete ${V0}_2
|
||||
+
|
||||
+#Check the stop succeeded and detached the volume with out restarting it
|
||||
+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "^1$" shd_count
|
||||
+
|
||||
+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "^${shd_pid}$" get_shd_mux_pid $V0
|
||||
+
|
||||
+#Check the thread count become to zero for ec related threads
|
||||
+EXPECT_WITHIN $PROCESS_DOWN_TIMEOUT "^0$" number_healer_threads_shd $V0 "__ec_shd_healer_wait"
|
||||
+#Check the thread count become to earlier number after stopping
|
||||
+EXPECT_WITHIN $PROCESS_DOWN_TIMEOUT "^6$" number_healer_threads_shd $V0 "__afr_shd_healer_wait"
|
||||
+
|
||||
+for i in $(seq 1 3); do
|
||||
+ TEST $CLI volume create ${V0}_afr$i replica 3 $H0:$B0/${V0}_afr${i}{0,1,2,3,4,5}
|
||||
+ TEST $CLI volume start ${V0}_afr$i
|
||||
+ TEST $CLI volume create ${V0}_ec$i disperse 6 redundancy 2 $H0:$B0/${V0}_ec${i}{0,1,2,3,4,5}
|
||||
+ TEST $CLI volume start ${V0}_ec$i
|
||||
+done
|
||||
+
|
||||
+#Check the thread count become to number of volumes*number of ec subvolume (3*6=18)
|
||||
+EXPECT_WITHIN $PROCESS_DOWN_TIMEOUT "^18$" number_healer_threads_shd $V0 "__ec_shd_healer_wait"
|
||||
+#Check the thread count become to number of volumes*number of afr subvolume (4*6=24)
|
||||
+EXPECT_WITHIN $PROCESS_DOWN_TIMEOUT "^24$" number_healer_threads_shd $V0 "__afr_shd_healer_wait"
|
||||
+#Delete the volumes
|
||||
+for i in $(seq 1 3); do
|
||||
+ TEST $CLI volume stop ${V0}_afr$i
|
||||
+ TEST $CLI volume stop ${V0}_ec$i
|
||||
+ TEST $CLI volume delete ${V0}_afr$i
|
||||
+ TEST $CLI volume delete ${V0}_ec$i
|
||||
+done
|
||||
+
|
||||
+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "^${shd_pid}$" get_shd_mux_pid $V0
|
||||
+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "^1$" shd_count
|
||||
+
|
||||
+EXPECT_WITHIN $PROCESS_DOWN_TIMEOUT "^6$" number_healer_threads_shd $V0 "__afr_shd_healer_wait"
|
||||
+
|
||||
+TEST $CLI volume stop ${V0}
|
||||
+TEST $CLI volume delete ${V0}
|
||||
+EXPECT_WITHIN $PROCESS_DOWN_TIMEOUT "^0$" shd_count
|
||||
+
|
||||
+cleanup
|
||||
diff --git a/tests/basic/volume-scale-shd-mux.t b/tests/basic/volume-scale-shd-mux.t
|
||||
new file mode 100644
|
||||
index 0000000..dd9cf83
|
||||
--- /dev/null
|
||||
+++ b/tests/basic/volume-scale-shd-mux.t
|
||||
@@ -0,0 +1,112 @@
|
||||
+#!/bin/bash
|
||||
+
|
||||
+. $(dirname $0)/../include.rc
|
||||
+. $(dirname $0)/../volume.rc
|
||||
+
|
||||
+cleanup;
|
||||
+
|
||||
+TESTS_EXPECTED_IN_LOOP=6
|
||||
+
|
||||
+TEST glusterd
|
||||
+TEST pidof glusterd
|
||||
+TEST $CLI volume create $V0 replica 3 $H0:$B0/${V0}{0,1,2,3,4,5}
|
||||
+TEST $CLI volume set $V0 cluster.background-self-heal-count 0
|
||||
+TEST $CLI volume set $V0 cluster.eager-lock off
|
||||
+TEST $CLI volume set $V0 performance.flush-behind off
|
||||
+TEST $CLI volume start $V0
|
||||
+
|
||||
+for i in $(seq 1 2); do
|
||||
+ TEST $CLI volume create ${V0}_afr$i replica 3 $H0:$B0/${V0}_afr${i}{0,1,2,3,4,5}
|
||||
+ TEST $CLI volume start ${V0}_afr$i
|
||||
+ TEST $CLI volume create ${V0}_ec$i disperse 6 redundancy 2 $H0:$B0/${V0}_ec${i}{0,1,2,3,4,5}
|
||||
+ TEST $CLI volume start ${V0}_ec$i
|
||||
+done
|
||||
+
|
||||
+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "^1$" shd_count
|
||||
+
|
||||
+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "^1$" shd_count
|
||||
+#Check the thread count become to number of volumes*number of ec subvolume (2*6=12)
|
||||
+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "^12$" number_healer_threads_shd $V0 "__ec_shd_healer_wait"
|
||||
+#Check the thread count become to number of volumes*number of afr subvolume (3*6=18)
|
||||
+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "^18$" number_healer_threads_shd $V0 "__afr_shd_healer_wait"
|
||||
+
|
||||
+TEST $CLI volume add-brick $V0 replica 3 $H0:$B0/${V0}{6,7,8};
|
||||
+#Check the thread count become to number of volumes*number of afr subvolume plus 3 additional threads from newly added bricks (3*6+3=21)
|
||||
+
|
||||
+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "^1$" shd_count
|
||||
+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "^21$" number_healer_threads_shd $V0 "__afr_shd_healer_wait"
|
||||
+
|
||||
+#Remove the brick and check the detach is successful
|
||||
+$CLI volume remove-brick $V0 $H0:$B0/${V0}{6,7,8} force
|
||||
+
|
||||
+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "^18$" number_healer_threads_shd $V0 "__afr_shd_healer_wait"
|
||||
+
|
||||
+TEST $CLI volume add-brick ${V0}_ec1 $H0:$B0/${V0}_ec1_add{0,1,2,3,4,5};
|
||||
+#Check the thread count become to number of volumes*number of ec subvolume plus 2 additional threads from newly added bricks (2*6+6=18)
|
||||
+
|
||||
+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "^1$" shd_count
|
||||
+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "^18$" number_healer_threads_shd $V0 "__ec_shd_healer_wait"
|
||||
+
|
||||
+#Remove the brick and check the detach is successful
|
||||
+$CLI volume remove-brick ${V0}_ec1 $H0:$B0/${V0}_ec1_add{0,1,2,3,4,5} force
|
||||
+
|
||||
+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "^12$" number_healer_threads_shd $V0 "__ec_shd_healer_wait"
|
||||
+
|
||||
+
|
||||
+for i in $(seq 1 2); do
|
||||
+ TEST $CLI volume stop ${V0}_afr$i
|
||||
+ TEST $CLI volume stop ${V0}_ec$i
|
||||
+done
|
||||
+
|
||||
+EXPECT_WITHIN $PROCESS_DOWN_TIMEOUT "^6$" number_healer_threads_shd $V0 "__afr_shd_healer_wait"
|
||||
+
|
||||
+TEST $GFS --volfile-id=/$V0 --volfile-server=$H0 $M0
|
||||
+
|
||||
+TEST kill_brick $V0 $H0 $B0/${V0}0
|
||||
+TEST kill_brick $V0 $H0 $B0/${V0}4
|
||||
+
|
||||
+TEST touch $M0/foo{1..100}
|
||||
+
|
||||
+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "^204$" get_pending_heal_count $V0
|
||||
+
|
||||
+TEST $CLI volume start ${V0} force
|
||||
+
|
||||
+EXPECT_WITHIN $HEAL_TIMEOUT "^0$" get_pending_heal_count $V0
|
||||
+
|
||||
+TEST rm -rf $M0/*
|
||||
+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0
|
||||
+shd_pid=$(get_shd_mux_pid $V0)
|
||||
+TEST $CLI volume create ${V0}_distribute1 $H0:$B0/${V0}_distribute10
|
||||
+TEST $CLI volume start ${V0}_distribute1
|
||||
+
|
||||
+#Creating a non-replicate/non-ec volume should not have any effect in shd
|
||||
+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "^6$" number_healer_threads_shd $V0 "__afr_shd_healer_wait"
|
||||
+EXPECT "^${shd_pid}$" get_shd_mux_pid $V0
|
||||
+
|
||||
+TEST mkdir $B0/add/
|
||||
+#Now convert the distributed volume to replicate
|
||||
+TEST $CLI volume add-brick ${V0}_distribute1 replica 3 $H0:$B0/add/{2..3}
|
||||
+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "^9$" number_healer_threads_shd $V0 "__afr_shd_healer_wait"
|
||||
+
|
||||
+#scale down the volume
|
||||
+TEST $CLI volume remove-brick ${V0}_distribute1 replica 1 $H0:$B0/add/{2..3} force
|
||||
+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "^6$" number_healer_threads_shd $V0 "__afr_shd_healer_wait"
|
||||
+
|
||||
+TEST $CLI volume stop ${V0}
|
||||
+TEST $CLI volume delete ${V0}
|
||||
+EXPECT_WITHIN $PROCESS_DOWN_TIMEOUT "^0$" shd_count
|
||||
+
|
||||
+TEST rm -rf $B0/add/
|
||||
+TEST mkdir $B0/add/
|
||||
+#Now convert the distributed volume back to replicate and make sure that a new shd is spawned
|
||||
+TEST $CLI volume add-brick ${V0}_distribute1 replica 3 $H0:$B0/add/{2..3};
|
||||
+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "^1$" shd_count
|
||||
+EXPECT_WITHIN $HEAL_TIMEOUT "^3$" number_healer_threads_shd ${V0}_distribute1 "__afr_shd_healer_wait"
|
||||
+
|
||||
+#Now convert the replica volume to distribute again and make sure the shd is now stopped
|
||||
+TEST $CLI volume remove-brick ${V0}_distribute1 replica 1 $H0:$B0/add/{2..3} force
|
||||
+TEST rm -rf $B0/add/
|
||||
+
|
||||
+EXPECT_WITHIN $PROCESS_DOWN_TIMEOUT "^0$" shd_count
|
||||
+
|
||||
+cleanup
|
||||
diff --git a/tests/volume.rc b/tests/volume.rc
|
||||
index a0ea3b8..bb400cc 100644
|
||||
--- a/tests/volume.rc
|
||||
+++ b/tests/volume.rc
|
||||
@@ -912,3 +912,18 @@ function volgen_check_ancestry {
|
||||
echo "N"
|
||||
fi
|
||||
}
|
||||
+
|
||||
+function get_shd_mux_pid {
|
||||
+ local volume=$1
|
||||
+ pid=`$CLI volume status $volume shd | awk '/Self-heal/{print $8}'`
|
||||
+ echo $pid
|
||||
+}
|
||||
+
|
||||
+function shd_count {
|
||||
+ ps aux | grep "glustershd" | grep -v grep | wc -l
|
||||
+}
|
||||
+
|
||||
+function number_healer_threads_shd {
|
||||
+ local pid=$(get_shd_mux_pid $1)
|
||||
+ pstack $pid | grep $2 | wc -l
|
||||
+}
|
||||
--
|
||||
1.8.3.1
|
||||
|
@ -0,0 +1,92 @@
|
||||
From 79fff98f9ca5f815cf0227312b9a997d555dad29 Mon Sep 17 00:00:00 2001
|
||||
From: Mohammed Rafi KC <rkavunga@redhat.com>
|
||||
Date: Wed, 22 May 2019 13:32:23 +0530
|
||||
Subject: [PATCH 166/169] glusterd/svc: glusterd_svcs_stop should call
|
||||
individual wrapper function
|
||||
|
||||
glusterd_svcs_stop should call individual wrapper function to stop a
|
||||
daemon rather than calling glusterd_svc_stop. For example for shd,
|
||||
it should call glusterd_shdsvc_stop instead of calling basic API
|
||||
function to stop. Because the individual functions for each daemon
|
||||
could be doing some specific operation in their wrapper function.
|
||||
|
||||
Upstream patch: https://review.gluster.org/#/c/glusterfs/+/22761/
|
||||
|
||||
>Change-Id: Ie6d40590251ad470ef3901d1141ab7b22c3498f5
|
||||
>fixes: bz#1712741
|
||||
>Signed-off-by: Mohammed Rafi KC <rkavunga@redhat.com>
|
||||
|
||||
Change-Id: I6df03e53f08c337d5d9b0e855a0b77894a2aacc9
|
||||
BUG: 1716865
|
||||
Signed-off-by: Mohammed Rafi KC <rkavunga@redhat.com>
|
||||
Reviewed-on: https://code.engineering.redhat.com/gerrit/172288
|
||||
Tested-by: RHGS Build Bot <nigelb@redhat.com>
|
||||
Reviewed-by: Atin Mukherjee <amukherj@redhat.com>
|
||||
---
|
||||
xlators/mgmt/glusterd/src/glusterd-shd-svc.c | 12 ++++++++++--
|
||||
xlators/mgmt/glusterd/src/glusterd-svc-helper.c | 10 +++++-----
|
||||
2 files changed, 15 insertions(+), 7 deletions(-)
|
||||
|
||||
diff --git a/xlators/mgmt/glusterd/src/glusterd-shd-svc.c b/xlators/mgmt/glusterd/src/glusterd-shd-svc.c
|
||||
index 75f9a07..981cc87 100644
|
||||
--- a/xlators/mgmt/glusterd/src/glusterd-shd-svc.c
|
||||
+++ b/xlators/mgmt/glusterd/src/glusterd-shd-svc.c
|
||||
@@ -656,10 +656,18 @@ glusterd_shdsvc_stop(glusterd_svc_t *svc, int sig)
|
||||
int pid = -1;
|
||||
|
||||
conf = THIS->private;
|
||||
+ GF_VALIDATE_OR_GOTO("glusterd", conf, out);
|
||||
GF_VALIDATE_OR_GOTO("glusterd", svc, out);
|
||||
svc_proc = svc->svc_proc;
|
||||
- GF_VALIDATE_OR_GOTO("glusterd", svc_proc, out);
|
||||
- GF_VALIDATE_OR_GOTO("glusterd", conf, out);
|
||||
+ if (!svc_proc) {
|
||||
+ /*
|
||||
+ * This can happen when stop was called on a volume that is not shd
|
||||
+ * compatible.
|
||||
+ */
|
||||
+ gf_msg_debug("glusterd", 0, "svc_proc is null, ie shd already stopped");
|
||||
+ ret = 0;
|
||||
+ goto out;
|
||||
+ }
|
||||
|
||||
/* Get volinfo->shd from svc object */
|
||||
shd = cds_list_entry(svc, glusterd_shdsvc_t, svc);
|
||||
diff --git a/xlators/mgmt/glusterd/src/glusterd-svc-helper.c b/xlators/mgmt/glusterd/src/glusterd-svc-helper.c
|
||||
index f7be394..6a3ca52 100644
|
||||
--- a/xlators/mgmt/glusterd/src/glusterd-svc-helper.c
|
||||
+++ b/xlators/mgmt/glusterd/src/glusterd-svc-helper.c
|
||||
@@ -86,25 +86,25 @@ glusterd_svcs_stop(glusterd_volinfo_t *volinfo)
|
||||
priv = this->private;
|
||||
GF_ASSERT(priv);
|
||||
|
||||
- ret = glusterd_svc_stop(&(priv->nfs_svc), SIGKILL);
|
||||
+ ret = priv->nfs_svc.stop(&(priv->nfs_svc), SIGKILL);
|
||||
if (ret)
|
||||
goto out;
|
||||
|
||||
- ret = glusterd_svc_stop(&(priv->quotad_svc), SIGTERM);
|
||||
+ ret = priv->quotad_svc.stop(&(priv->quotad_svc), SIGTERM);
|
||||
if (ret)
|
||||
goto out;
|
||||
|
||||
if (volinfo) {
|
||||
- ret = glusterd_svc_stop(&(volinfo->shd.svc), PROC_START_NO_WAIT);
|
||||
+ ret = volinfo->shd.svc.stop(&(volinfo->shd.svc), SIGTERM);
|
||||
if (ret)
|
||||
goto out;
|
||||
}
|
||||
|
||||
- ret = glusterd_svc_stop(&(priv->bitd_svc), SIGTERM);
|
||||
+ ret = priv->bitd_svc.stop(&(priv->bitd_svc), SIGTERM);
|
||||
if (ret)
|
||||
goto out;
|
||||
|
||||
- ret = glusterd_svc_stop(&(priv->scrub_svc), SIGTERM);
|
||||
+ ret = priv->scrub_svc.stop(&(priv->scrub_svc), SIGTERM);
|
||||
out:
|
||||
return ret;
|
||||
}
|
||||
--
|
||||
1.8.3.1
|
||||
|
@ -0,0 +1,64 @@
|
||||
From 321080e55f0ae97115a9542ba5de8494e7610860 Mon Sep 17 00:00:00 2001
|
||||
From: Mohammed Rafi KC <rkavunga@redhat.com>
|
||||
Date: Tue, 14 May 2019 23:12:44 +0530
|
||||
Subject: [PATCH 167/169] glusterd/shd: Optimize the glustershd manager to send
|
||||
reconfigure
|
||||
|
||||
Traditionally all svc manager will execute process stop and then
|
||||
followed by start each time when they called. But that is not
|
||||
required by shd, because the attach request implemented in the shd
|
||||
multiplex has the intelligence to check whether a detach is required
|
||||
prior to attaching the graph. So there is no need to send an explicit
|
||||
detach request if we are sure that the next call is an attach request
|
||||
|
||||
Upstream patch: https://review.gluster.org/#/c/glusterfs/+/22729/
|
||||
>Change-Id: I9157c8dcaffdac038f73286bcf5646a3f1d3d8ec
|
||||
>fixes: bz#1710054
|
||||
>Signed-off-by: Mohammed Rafi KC <rkavunga@redhat.com>
|
||||
|
||||
Change-Id: I56aaaf3b4d28215307e160c1ba0e09bb74c30fbe
|
||||
BUG: 1716865
|
||||
Signed-off-by: Mohammed Rafi KC <rkavunga@redhat.com>
|
||||
Reviewed-on: https://code.engineering.redhat.com/gerrit/172289
|
||||
Tested-by: RHGS Build Bot <nigelb@redhat.com>
|
||||
Reviewed-by: Atin Mukherjee <amukherj@redhat.com>
|
||||
---
|
||||
libglusterfs/src/graph.c | 1 -
|
||||
xlators/mgmt/glusterd/src/glusterd-shd-svc.c | 9 +++++----
|
||||
2 files changed, 5 insertions(+), 5 deletions(-)
|
||||
|
||||
diff --git a/libglusterfs/src/graph.c b/libglusterfs/src/graph.c
|
||||
index 18fb2d9..27d9335 100644
|
||||
--- a/libglusterfs/src/graph.c
|
||||
+++ b/libglusterfs/src/graph.c
|
||||
@@ -1497,7 +1497,6 @@ glusterfs_process_svc_detach(glusterfs_ctx_t *ctx, gf_volfile_t *volfile_obj)
|
||||
parent_graph->last_xl = glusterfs_get_last_xlator(parent_graph);
|
||||
parent_graph->xl_count -= graph->xl_count;
|
||||
parent_graph->leaf_count -= graph->leaf_count;
|
||||
- default_notify(xl, GF_EVENT_PARENT_DOWN, xl);
|
||||
parent_graph->id++;
|
||||
ret = 0;
|
||||
}
|
||||
diff --git a/xlators/mgmt/glusterd/src/glusterd-shd-svc.c b/xlators/mgmt/glusterd/src/glusterd-shd-svc.c
|
||||
index 981cc87..d81d760 100644
|
||||
--- a/xlators/mgmt/glusterd/src/glusterd-shd-svc.c
|
||||
+++ b/xlators/mgmt/glusterd/src/glusterd-shd-svc.c
|
||||
@@ -311,10 +311,11 @@ glusterd_shdsvc_manager(glusterd_svc_t *svc, void *data, int flags)
|
||||
*/
|
||||
ret = svc->stop(svc, SIGTERM);
|
||||
} else if (volinfo) {
|
||||
- ret = svc->stop(svc, SIGTERM);
|
||||
- if (ret)
|
||||
- goto out;
|
||||
-
|
||||
+ if (volinfo->status != GLUSTERD_STATUS_STARTED) {
|
||||
+ ret = svc->stop(svc, SIGTERM);
|
||||
+ if (ret)
|
||||
+ goto out;
|
||||
+ }
|
||||
if (volinfo->status == GLUSTERD_STATUS_STARTED) {
|
||||
ret = svc->start(svc, flags);
|
||||
if (ret)
|
||||
--
|
||||
1.8.3.1
|
||||
|
46
0168-cluster-dht-Fix-directory-perms-during-selfheal.patch
Normal file
46
0168-cluster-dht-Fix-directory-perms-during-selfheal.patch
Normal file
@ -0,0 +1,46 @@
|
||||
From 6198461bce7d264b71fe91e981aa3af3a19a8abe Mon Sep 17 00:00:00 2001
|
||||
From: N Balachandran <nbalacha@redhat.com>
|
||||
Date: Tue, 4 Jun 2019 14:51:44 +0530
|
||||
Subject: [PATCH 168/169] cluster/dht: Fix directory perms during selfheal
|
||||
|
||||
Fixed a bug in the revalidate code path that wiped out
|
||||
directory permissions if no mds subvol was found.
|
||||
|
||||
upstream: https://review.gluster.org/#/c/glusterfs/+/22813/
|
||||
|
||||
> Change-Id: I8b4239ffee7001493c59d4032a2d3062586ea115
|
||||
> fixes: bz#1716830
|
||||
> Signed-off-by: N Balachandran <nbalacha@redhat.com>
|
||||
|
||||
BUG: 1716821
|
||||
Change-Id: I6d84d381d07a27d1ef9113a2104a62ceaf2110e3
|
||||
Signed-off-by: N Balachandran <nbalacha@redhat.com>
|
||||
Reviewed-on: https://code.engineering.redhat.com/gerrit/172622
|
||||
Tested-by: RHGS Build Bot <nigelb@redhat.com>
|
||||
Reviewed-by: Mohit Agrawal <moagrawa@redhat.com>
|
||||
---
|
||||
xlators/cluster/dht/src/dht-common.c | 8 +++++---
|
||||
1 file changed, 5 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/xlators/cluster/dht/src/dht-common.c b/xlators/cluster/dht/src/dht-common.c
|
||||
index 183872f..e1edb38 100644
|
||||
--- a/xlators/cluster/dht/src/dht-common.c
|
||||
+++ b/xlators/cluster/dht/src/dht-common.c
|
||||
@@ -1739,9 +1739,11 @@ unlock:
|
||||
|
||||
if (dht_needs_selfheal(frame, this)) {
|
||||
if (!__is_root_gfid(local->loc.inode->gfid)) {
|
||||
- local->stbuf.ia_gid = local->mds_stbuf.ia_gid;
|
||||
- local->stbuf.ia_uid = local->mds_stbuf.ia_uid;
|
||||
- local->stbuf.ia_prot = local->mds_stbuf.ia_prot;
|
||||
+ if (local->mds_subvol) {
|
||||
+ local->stbuf.ia_gid = local->mds_stbuf.ia_gid;
|
||||
+ local->stbuf.ia_uid = local->mds_stbuf.ia_uid;
|
||||
+ local->stbuf.ia_prot = local->mds_stbuf.ia_prot;
|
||||
+ }
|
||||
} else {
|
||||
local->stbuf.ia_gid = local->prebuf.ia_gid;
|
||||
local->stbuf.ia_uid = local->prebuf.ia_uid;
|
||||
--
|
||||
1.8.3.1
|
||||
|
62
0169-Build-Fix-spec-to-enable-rhel8-client-build.patch
Normal file
62
0169-Build-Fix-spec-to-enable-rhel8-client-build.patch
Normal file
@ -0,0 +1,62 @@
|
||||
From 2e6241a800c98ba95b3420255d8089e0271b46eb Mon Sep 17 00:00:00 2001
|
||||
From: Sunil Kumar Acharya <sheggodu@redhat.com>
|
||||
Date: Thu, 6 Jun 2019 16:18:26 +0530
|
||||
Subject: [PATCH 169/169] Build: Fix spec to enable rhel8 client build
|
||||
|
||||
Updated the spec file with required changes to enable RHGS RHEL8
|
||||
client build. As Ganesha scripts are not python3 compatible, we
|
||||
will not be generating RHGS RHEL8 server build until the required
|
||||
changes are backported from upstream.
|
||||
|
||||
Label : DOWNSTREAM ONLY
|
||||
|
||||
BUG: 1717927
|
||||
Change-Id: I2a8d37d24405a8b2d5533ebf7b85327485f810d7
|
||||
Signed-off-by: Sunil Kumar Acharya <sheggodu@redhat.com>
|
||||
Reviewed-on: https://code.engineering.redhat.com/gerrit/172668
|
||||
Tested-by: RHGS Build Bot <nigelb@redhat.com>
|
||||
Reviewed-by: Atin Mukherjee <amukherj@redhat.com>
|
||||
---
|
||||
glusterfs.spec.in | 10 ++++------
|
||||
1 file changed, 4 insertions(+), 6 deletions(-)
|
||||
|
||||
diff --git a/glusterfs.spec.in b/glusterfs.spec.in
|
||||
index 85e75f2..9c7d7a7 100644
|
||||
--- a/glusterfs.spec.in
|
||||
+++ b/glusterfs.spec.in
|
||||
@@ -91,7 +91,7 @@
|
||||
|
||||
# disable server components forcefully as rhel <= 6
|
||||
%if ( 0%{?rhel} )
|
||||
-%if (!(( "%{?dist}" == ".el6rhs" ) || ( "%{?dist}" == ".el7rhs" ) || ( "%{?dist}" == ".el7rhgs" )))
|
||||
+%if (!(( "%{?dist}" == ".el6rhs" ) || ( "%{?dist}" == ".el7rhs" ) || ( "%{?dist}" == ".el7rhgs" ) || ( "%{?dist}" == ".el8rhgs" )))
|
||||
%global _without_server --without-server
|
||||
%endif
|
||||
%endif
|
||||
@@ -270,7 +270,7 @@ BuildRequires: python%{_pythonver}-devel
|
||||
%if ( 0%{?rhel} && 0%{?rhel} < 8 )
|
||||
BuildRequires: python-ctypes
|
||||
%endif
|
||||
-%if ( 0%{?_with_ipv6default:1} ) || ( 0%{!?_without_libtirpc:1} )
|
||||
+%if ( 0%{?_with_ipv6default:1} ) || ( 0%{!?_without_libtirpc:1} ) || ( 0%{?rhel} && ( 0%{?rhel} >= 8 ) )
|
||||
BuildRequires: libtirpc-devel
|
||||
%endif
|
||||
%if ( 0%{?fedora} && 0%{?fedora} > 27 ) || ( 0%{?rhel} && 0%{?rhel} > 7 )
|
||||
@@ -722,12 +722,10 @@ GlusterFS Events
|
||||
|
||||
%prep
|
||||
%setup -q -n %{name}-%{version}%{?prereltag}
|
||||
-%if ( ! %{_usepython3} )
|
||||
echo "fixing python shebangs..."
|
||||
-for f in api events extras geo-replication libglusterfs tools xlators; do
|
||||
-find $f -type f -exec sed -i 's|/usr/bin/python3|/usr/bin/python2|' {} \;
|
||||
+for i in `find . -type f -exec bash -c "if file {} | grep 'Python script, ASCII text executable' >/dev/null; then echo {}; fi" ';'`; do
|
||||
+ sed -i -e 's|^#!/usr/bin/python.*|#!%{__python3}|' -e 's|^#!/usr/bin/env python.*|#!%{__python3}|' $i
|
||||
done
|
||||
-%endif
|
||||
|
||||
%build
|
||||
|
||||
--
|
||||
1.8.3.1
|
||||
|
@ -91,7 +91,7 @@
|
||||
|
||||
# disable server components forcefully as rhel <= 6
|
||||
%if ( 0%{?rhel} )
|
||||
%if (!(( "%{?dist}" == ".el6rhs" ) || ( "%{?dist}" == ".el7rhs" ) || ( "%{?dist}" == ".el7rhgs" )))
|
||||
%if (!(( "%{?dist}" == ".el6rhs" ) || ( "%{?dist}" == ".el7rhs" ) || ( "%{?dist}" == ".el7rhgs" ) || ( "%{?dist}" == ".el8rhgs" )))
|
||||
%global _without_server --without-server
|
||||
%endif
|
||||
%endif
|
||||
@ -231,7 +231,7 @@ Release: 0.1%{?prereltag:.%{prereltag}}%{?dist}
|
||||
%else
|
||||
Name: glusterfs
|
||||
Version: 6.0
|
||||
Release: 3%{?dist}
|
||||
Release: 4%{?dist}
|
||||
ExcludeArch: i686
|
||||
%endif
|
||||
License: GPLv2 or LGPLv3+
|
||||
@ -271,7 +271,7 @@ BuildRequires: python%{_pythonver}-devel
|
||||
%if ( 0%{?rhel} && 0%{?rhel} < 8 )
|
||||
BuildRequires: python-ctypes
|
||||
%endif
|
||||
%if ( 0%{?_with_ipv6default:1} ) || ( 0%{!?_without_libtirpc:1} )
|
||||
%if ( 0%{?_with_ipv6default:1} ) || ( 0%{!?_without_libtirpc:1} ) || ( 0%{?rhel} && ( 0%{?rhel} >= 8 ) )
|
||||
BuildRequires: libtirpc-devel
|
||||
%endif
|
||||
%if ( 0%{?fedora} && 0%{?fedora} > 27 ) || ( 0%{?rhel} && 0%{?rhel} > 7 )
|
||||
@ -447,6 +447,34 @@ Patch0138: 0138-glusterd-Add-gluster-volume-stop-operation-to-gluste.patch
|
||||
Patch0139: 0139-ec-shd-Cleanup-self-heal-daemon-resources-during-ec-.patch
|
||||
Patch0140: 0140-cluster-ec-Reopen-shouldn-t-happen-with-O_TRUNC.patch
|
||||
Patch0141: 0141-socket-ssl-fix-crl-handling.patch
|
||||
Patch0142: 0142-lock-check-null-value-of-dict-to-avoid-log-flooding.patch
|
||||
Patch0143: 0143-packaging-Change-the-dependency-on-nfs-ganesha-to-2..patch
|
||||
Patch0144: 0144-cluster-ec-honor-contention-notifications-for-partia.patch
|
||||
Patch0145: 0145-core-Capture-process-memory-usage-at-the-time-of-cal.patch
|
||||
Patch0146: 0146-dht-Custom-xattrs-are-not-healed-in-case-of-add-bric.patch
|
||||
Patch0147: 0147-glusterd-bulkvoldict-thread-is-not-handling-all-volu.patch
|
||||
Patch0148: 0148-cluster-dht-Lookup-all-files-when-processing-directo.patch
|
||||
Patch0149: 0149-glusterd-Optimize-code-to-copy-dictionary-in-handsha.patch
|
||||
Patch0150: 0150-libglusterfs-define-macros-needed-for-cloudsync.patch
|
||||
Patch0151: 0151-mgmt-glusterd-Make-changes-related-to-cloudsync-xlat.patch
|
||||
Patch0152: 0152-storage-posix-changes-with-respect-to-cloudsync.patch
|
||||
Patch0153: 0153-features-cloudsync-Added-some-new-functions.patch
|
||||
Patch0154: 0154-cloudsync-cvlt-Cloudsync-plugin-for-commvault-store.patch
|
||||
Patch0155: 0155-cloudsync-Make-readdirp-return-stat-info-of-all-the-.patch
|
||||
Patch0156: 0156-cloudsync-Fix-bug-in-cloudsync-fops-c.py.patch
|
||||
Patch0157: 0157-afr-frame-Destroy-frame-after-afr_selfheal_entry_gra.patch
|
||||
Patch0158: 0158-glusterfsd-cleanup-Protect-graph-object-under-a-lock.patch
|
||||
Patch0159: 0159-glusterd-add-an-op-version-check.patch
|
||||
Patch0160: 0160-geo-rep-Geo-rep-help-text-issue.patch
|
||||
Patch0161: 0161-geo-rep-Fix-rename-with-existing-destination-with-sa.patch
|
||||
Patch0162: 0162-geo-rep-Fix-sync-method-config.patch
|
||||
Patch0163: 0163-geo-rep-Fix-sync-hang-with-tarssh.patch
|
||||
Patch0164: 0164-cluster-ec-Fix-handling-of-heal-info-cases-without-l.patch
|
||||
Patch0165: 0165-tests-shd-Add-test-coverage-for-shd-mux.patch
|
||||
Patch0166: 0166-glusterd-svc-glusterd_svcs_stop-should-call-individu.patch
|
||||
Patch0167: 0167-glusterd-shd-Optimize-the-glustershd-manager-to-send.patch
|
||||
Patch0168: 0168-cluster-dht-Fix-directory-perms-during-selfheal.patch
|
||||
Patch0169: 0169-Build-Fix-spec-to-enable-rhel8-client-build.patch
|
||||
|
||||
%description
|
||||
GlusterFS is a distributed file-system capable of scaling to several
|
||||
@ -603,7 +631,7 @@ Summary: NFS-Ganesha configuration
|
||||
Group: Applications/File
|
||||
|
||||
Requires: %{name}-server%{?_isa} = %{version}-%{release}
|
||||
Requires: nfs-ganesha-gluster >= 2.4.1
|
||||
Requires: nfs-ganesha-gluster >= 2.7.3
|
||||
Requires: pcs, dbus
|
||||
%if ( 0%{?rhel} && 0%{?rhel} == 6 )
|
||||
Requires: cman, pacemaker, corosync
|
||||
@ -938,12 +966,10 @@ do
|
||||
|
||||
done
|
||||
|
||||
%if ( ! %{_usepython3} )
|
||||
echo "fixing python shebangs..."
|
||||
for f in api events extras geo-replication libglusterfs tools xlators; do
|
||||
find $f -type f -exec sed -i 's|/usr/bin/python3|/usr/bin/python2|' {} \;
|
||||
for i in `find . -type f -exec bash -c "if file {} | grep 'Python script, ASCII text executable' >/dev/null; then echo {}; fi" ';'`; do
|
||||
sed -i -e 's|^#!/usr/bin/python.*|#!%{__python3}|' -e 's|^#!/usr/bin/env python.*|#!%{__python3}|' $i
|
||||
done
|
||||
%endif
|
||||
|
||||
%build
|
||||
|
||||
@ -1415,6 +1441,7 @@ exit 0
|
||||
%files cloudsync-plugins
|
||||
%dir %{_libdir}/glusterfs/%{version}%{?prereltag}/cloudsync-plugins
|
||||
%{_libdir}/glusterfs/%{version}%{?prereltag}/cloudsync-plugins/cloudsyncs3.so
|
||||
%{_libdir}/glusterfs/%{version}%{?prereltag}/cloudsync-plugins/cloudsynccvlt.so
|
||||
|
||||
%files devel
|
||||
%dir %{_includedir}/glusterfs
|
||||
@ -2149,6 +2176,11 @@ fi
|
||||
%endif
|
||||
|
||||
%changelog
|
||||
* Fri Jun 07 2019 Rinku Kothiya <rkothiya@redhat.com> - 6.0-4
|
||||
- fixes bugs bz#1480907 bz#1702298 bz#1703455 bz#1704181 bz#1704562
|
||||
bz#1707246 bz#1708067 bz#1708116 bz#1708121 bz#1709087 bz#1711249 bz#1711296
|
||||
bz#1714078 bz#1714124 bz#1716385 bz#1716626 bz#1716821 bz#1716865 bz#1717927
|
||||
|
||||
* Tue May 14 2019 Rinku Kothiya <rkothiya@redhat.com> - 6.0-3
|
||||
- fixes bugs bz#1583585 bz#1671862 bz#1702686 bz#1703434 bz#1703753
|
||||
bz#1703897 bz#1704562 bz#1704769 bz#1704851 bz#1706683 bz#1706776 bz#1706893
|
||||
|
Loading…
Reference in New Issue
Block a user