Blob Blame History Raw
From 9ce584e1d525c44d8731f5cdeb547352c174bfaf Mon Sep 17 00:00:00 2001
From: Samikshan Bairagya <samikshan@gmail.com>
Date: Wed, 24 May 2017 17:38:39 +0530
Subject: [PATCH 473/473] glusterd: Eliminate race in brick compatibility
 checking stage

In https://review.gluster.org/17307/, while looking for compatible
bricks for multiplexing, it is checked if the brick pidfile exists
before checking if the corresponding brick process is running.

However checking if the brick process is running just after
checking if the pidfile exists isn't enough since there might be
race conditions where the pidfile has been created but hasn't
been updated with a pid value yet. This commit solves that by
making sure that we wait iteratively till the pid value is updated
as well.

> Reviewed-on: https://review.gluster.org/17375
> Smoke: Gluster Build System <jenkins@build.gluster.org>
> Reviewed-by: Atin Mukherjee <amukherj@redhat.com>
> NetBSD-regression: NetBSD Build System <jenkins@build.gluster.org>
> CentOS-regression: Gluster Build System <jenkins@build.gluster.org>

Change-Id: Ib7a158f95566486f7c1f84b6357c9b89e4c797ae
BUG: 1450889
Signed-off-by: Samikshan Bairagya <sbairagy@redhat.com>
Reviewed-on: https://code.engineering.redhat.com/gerrit/107204
Reviewed-by: Atin Mukherjee <amukherj@redhat.com>
---
 xlators/mgmt/glusterd/src/glusterd-utils.c | 7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)

diff --git a/xlators/mgmt/glusterd/src/glusterd-utils.c b/xlators/mgmt/glusterd/src/glusterd-utils.c
index f98f5fe..6e0a906 100644
--- a/xlators/mgmt/glusterd/src/glusterd-utils.c
+++ b/xlators/mgmt/glusterd/src/glusterd-utils.c
@@ -5214,13 +5214,16 @@ find_compat_brick_in_vol (glusterd_conf_t *conf,
                  * wait for the pidfile to be populated with a value before
                  * checking if the service is running */
                 while (retries > 0) {
-                        if (sys_access (pidfile2, F_OK) == 0)
+                        if (sys_access (pidfile2, F_OK) == 0 &&
+                            gf_is_service_running (pidfile2, &pid2)) {
                                 break;
+                        }
+
                         sleep (1);
                         retries--;
                 }
 
-                if (!gf_is_service_running (pidfile2, &pid2)) {
+                if (retries == 0) {
                         gf_log (this->name, GF_LOG_INFO,
                                 "cleaning up dead brick %s:%s",
                                 other_brick->hostname, other_brick->path);
-- 
1.8.3.1