e7a346
From 216ac7a1bd22db08cc02d7b8688a3338e78c71cd Mon Sep 17 00:00:00 2001
e7a346
From: Sanju Rakonde <srakonde@redhat.com>
e7a346
Date: Tue, 11 Sep 2018 14:19:42 +0530
e7a346
Subject: [PATCH 423/444] glusterd: acquire lock to update volinfo structure
e7a346
e7a346
Problem: With commit cb0339f92, we are using a separate syntask
e7a346
for restart_bricks. There can be a situation where two threads
e7a346
are accessing the same volinfo structure at the same time and
e7a346
updating volinfo structure. This can lead volinfo to have
e7a346
inconsistent values and assertion failures because of unexpected
e7a346
values.
e7a346
e7a346
Solution: While updating the volinfo structure, acquire a
e7a346
store_volinfo_lock, and release the lock only when the thread
e7a346
completed its critical section part.
e7a346
e7a346
> Fixes: bz#1627610
e7a346
> Signed-off-by: Sanju Rakonde <srakonde@redhat.com>
e7a346
> Change-Id: I545e4e2368e3285d8f7aa28081ff4448abb72f5d
e7a346
e7a346
upstream patch: https://review.gluster.org/#/c/glusterfs/+/21150/
e7a346
e7a346
Change-Id: I545e4e2368e3285d8f7aa28081ff4448abb72f5d
e7a346
BUG: 1631418
e7a346
Signed-off-by: Sanju Rakonde <srakonde@redhat.com>
e7a346
Reviewed-on: https://code.engineering.redhat.com/gerrit/154885
e7a346
Tested-by: RHGS Build Bot <nigelb@redhat.com>
e7a346
Reviewed-by: Atin Mukherjee <amukherj@redhat.com>
e7a346
---
e7a346
 xlators/mgmt/glusterd/src/glusterd-store.c      | 67 +++++++++++++------------
e7a346
 xlators/mgmt/glusterd/src/glusterd-volume-ops.c |  2 +
e7a346
 xlators/mgmt/glusterd/src/glusterd.h            |  3 ++
e7a346
 3 files changed, 40 insertions(+), 32 deletions(-)
e7a346
e7a346
diff --git a/xlators/mgmt/glusterd/src/glusterd-store.c b/xlators/mgmt/glusterd/src/glusterd-store.c
e7a346
index 015f6c2..37542e7 100644
e7a346
--- a/xlators/mgmt/glusterd/src/glusterd-store.c
e7a346
+++ b/xlators/mgmt/glusterd/src/glusterd-store.c
e7a346
@@ -1796,46 +1796,49 @@ glusterd_store_volinfo (glusterd_volinfo_t *volinfo, glusterd_volinfo_ver_ac_t a
e7a346
 
e7a346
         GF_ASSERT (volinfo);
e7a346
 
e7a346
-        glusterd_perform_volinfo_version_action (volinfo, ac);
e7a346
-        ret = glusterd_store_create_volume_dir (volinfo);
e7a346
-        if (ret)
e7a346
-                goto out;
e7a346
-
e7a346
-        ret = glusterd_store_create_volume_run_dir (volinfo);
e7a346
-        if (ret)
e7a346
-                goto out;
e7a346
+        pthread_mutex_lock(&volinfo->store_volinfo_lock);
e7a346
+        {
e7a346
+                glusterd_perform_volinfo_version_action(volinfo, ac);
e7a346
+                ret = glusterd_store_create_volume_dir(volinfo);
e7a346
+                if (ret)
e7a346
+                        goto unlock;
e7a346
 
e7a346
-        ret = glusterd_store_create_vol_shandle_on_absence (volinfo);
e7a346
-        if (ret)
e7a346
-                goto out;
e7a346
+                ret = glusterd_store_create_volume_run_dir(volinfo);
e7a346
+                if (ret)
e7a346
+                        goto unlock;
e7a346
 
e7a346
-        ret = glusterd_store_create_nodestate_sh_on_absence (volinfo);
e7a346
-        if (ret)
e7a346
-                goto out;
e7a346
+                ret = glusterd_store_create_vol_shandle_on_absence(volinfo);
e7a346
+                if (ret)
e7a346
+                        goto unlock;
e7a346
 
e7a346
-        ret = glusterd_store_perform_volume_store (volinfo);
e7a346
-        if (ret)
e7a346
-                goto out;
e7a346
+                ret = glusterd_store_create_nodestate_sh_on_absence(volinfo);
e7a346
+                if (ret)
e7a346
+                        goto unlock;
e7a346
 
e7a346
-        ret = glusterd_store_volume_atomic_update (volinfo);
e7a346
-        if (ret) {
e7a346
-                glusterd_perform_volinfo_version_action (volinfo,
e7a346
-                                                         GLUSTERD_VOLINFO_VER_AC_DECREMENT);
e7a346
-                goto out;
e7a346
-        }
e7a346
+                ret = glusterd_store_perform_volume_store(volinfo);
e7a346
+                if (ret)
e7a346
+                        goto unlock;
e7a346
 
e7a346
-        ret = glusterd_store_perform_node_state_store (volinfo);
e7a346
-        if (ret)
e7a346
-                goto out;
e7a346
+                ret = glusterd_store_volume_atomic_update(volinfo);
e7a346
+                if (ret) {
e7a346
+                        glusterd_perform_volinfo_version_action(volinfo,
e7a346
+                                                                GLUSTERD_VOLINFO_VER_AC_DECREMENT);
e7a346
+                        goto unlock;
e7a346
+                }
e7a346
 
e7a346
-        /* checksum should be computed at the end */
e7a346
-        ret = glusterd_compute_cksum (volinfo, _gf_false);
e7a346
-        if (ret)
e7a346
-                goto out;
e7a346
+                ret = glusterd_store_perform_node_state_store(volinfo);
e7a346
+                if (ret)
e7a346
+                        goto unlock;
e7a346
 
e7a346
-out:
e7a346
+                /* checksum should be computed at the end */
e7a346
+                ret = glusterd_compute_cksum(volinfo, _gf_false);
e7a346
+                if (ret)
e7a346
+                        goto unlock;
e7a346
+        }
e7a346
+unlock:
e7a346
+        pthread_mutex_unlock(&volinfo->store_volinfo_lock);
e7a346
         if (ret)
e7a346
-                glusterd_store_volume_cleanup_tmp (volinfo);
e7a346
+                glusterd_store_volume_cleanup_tmp(volinfo);
e7a346
 
e7a346
         gf_msg_debug (THIS->name, 0, "Returning %d", ret);
e7a346
 
e7a346
diff --git a/xlators/mgmt/glusterd/src/glusterd-volume-ops.c b/xlators/mgmt/glusterd/src/glusterd-volume-ops.c
e7a346
index 87b7acc..b91a516 100644
e7a346
--- a/xlators/mgmt/glusterd/src/glusterd-volume-ops.c
e7a346
+++ b/xlators/mgmt/glusterd/src/glusterd-volume-ops.c
e7a346
@@ -2198,6 +2198,8 @@ glusterd_op_create_volume (dict_t *dict, char **op_errstr)
e7a346
                 goto out;
e7a346
         }
e7a346
 
e7a346
+        pthread_mutex_init(&volinfo->store_volinfo_lock, NULL);
e7a346
+
e7a346
         ret = dict_get_str (dict, "volname", &volname);
e7a346
 
e7a346
         if (ret) {
e7a346
diff --git a/xlators/mgmt/glusterd/src/glusterd.h b/xlators/mgmt/glusterd/src/glusterd.h
e7a346
index 8c70d48..edd41aa 100644
e7a346
--- a/xlators/mgmt/glusterd/src/glusterd.h
e7a346
+++ b/xlators/mgmt/glusterd/src/glusterd.h
e7a346
@@ -478,6 +478,9 @@ struct glusterd_volinfo_ {
e7a346
         gf_boolean_t              stage_deleted; /* volume has passed staging
e7a346
                                                   * for delete operation
e7a346
                                                   */
e7a346
+        pthread_mutex_t store_volinfo_lock; /* acquire lock for
e7a346
+                                             * updating the volinfo
e7a346
+                                             */
e7a346
 };
e7a346
 
e7a346
 typedef enum gd_snap_status_ {
e7a346
-- 
e7a346
1.8.3.1
e7a346