summaryrefslogtreecommitdiffstats
path: root/xlators/cluster/dht/src/dht-rebalance.c
diff options
context:
space:
mode:
authorSusant Palai <spalai@redhat.com>2016-04-15 05:15:33 -0400
committerJeff Darcy <jdarcy@redhat.com>2016-04-26 12:02:27 -0700
commit034c986b9b665714aca09e5422bef24466604115 (patch)
treee31e83c64de36aaf246c5534c26145071c868e16 /xlators/cluster/dht/src/dht-rebalance.c
parent82b69e2554c5293bc3b15e737e246c4c517b2421 (diff)
dht/rebalance: Handle GF_DEFRAG_STOP
Backport of http://review.gluster.org/14004 Problem: On a rebal stop, the migrator threads don't intimate the crawler thread to wake up in case it is waiting on signal from migrator thread. BUG: 1330529 Change-Id: I9019a715c7b4673b8bb5a75d7d33a18add85ce33 Reviewed-by: N Balachandran <nbalacha@redhat.com> Signed-off-by: Susant Palai <spalai@redhat.com> Reviewed-on: http://review.gluster.org/14076 NetBSD-regression: NetBSD Build System <jenkins@build.gluster.org> CentOS-regression: Gluster Build System <jenkins@build.gluster.com> Reviewed-by: Jeff Darcy <jdarcy@redhat.com> Smoke: Gluster Build System <jenkins@build.gluster.com>
Diffstat (limited to 'xlators/cluster/dht/src/dht-rebalance.c')
-rw-r--r--xlators/cluster/dht/src/dht-rebalance.c17
1 files changed, 17 insertions, 0 deletions
diff --git a/xlators/cluster/dht/src/dht-rebalance.c b/xlators/cluster/dht/src/dht-rebalance.c
index de241352d00..f41aa224642 100644
--- a/xlators/cluster/dht/src/dht-rebalance.c
+++ b/xlators/cluster/dht/src/dht-rebalance.c
@@ -2074,6 +2074,10 @@ gf_defrag_task (void *opaque)
while (true) {
if (defrag->defrag_status != GF_DEFRAG_STATUS_STARTED) {
+ pthread_cond_broadcast (
+ &defrag->rebalance_crawler_alarm);
+ pthread_cond_broadcast (
+ &defrag->parallel_migration_cond);
goto out;
}
@@ -2137,6 +2141,13 @@ gf_defrag_task (void *opaque)
defrag->defrag_status =
GF_DEFRAG_STATUS_FAILED;
+
+ pthread_cond_broadcast (
+ &defrag->rebalance_crawler_alarm);
+
+ pthread_cond_broadcast (
+ &defrag->parallel_migration_cond);
+
goto out;
}
@@ -2195,10 +2206,16 @@ gf_defrag_get_entry (xlator_t *this, int i, struct dht_container **container,
xlator_t *hashed_subvol = NULL;
xlator_t *cached_subvol = NULL;
+ if (defrag->defrag_status != GF_DEFRAG_STATUS_STARTED) {
+ ret = -1;
+ goto out;
+ }
+
if (dir_dfmeta->offset_var[i].readdir_done == 1) {
ret = 0;
goto out;
}
+
if (dir_dfmeta->fetch_entries[i] == 1) {
ret = syncop_readdirp (conf->local_subvols[i], fd, 131072,
dir_dfmeta->offset_var[i].offset,