diff options
-rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-store.c | 65 | ||||
-rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-volume-ops.c | 2 | ||||
-rw-r--r-- | xlators/mgmt/glusterd/src/glusterd.h | 9 |
3 files changed, 42 insertions, 34 deletions
diff --git a/xlators/mgmt/glusterd/src/glusterd-store.c b/xlators/mgmt/glusterd/src/glusterd-store.c index 2300a548e5b..d3e4415cb45 100644 --- a/xlators/mgmt/glusterd/src/glusterd-store.c +++ b/xlators/mgmt/glusterd/src/glusterd-store.c @@ -1785,44 +1785,47 @@ glusterd_store_volinfo(glusterd_volinfo_t *volinfo, GF_ASSERT(volinfo); - glusterd_perform_volinfo_version_action(volinfo, ac); - ret = glusterd_store_create_volume_dir(volinfo); - if (ret) - goto out; - - ret = glusterd_store_create_volume_run_dir(volinfo); - if (ret) - goto out; + pthread_mutex_lock(&volinfo->store_volinfo_lock); + { + glusterd_perform_volinfo_version_action(volinfo, ac); + ret = glusterd_store_create_volume_dir(volinfo); + if (ret) + goto unlock; - ret = glusterd_store_create_vol_shandle_on_absence(volinfo); - if (ret) - goto out; + ret = glusterd_store_create_volume_run_dir(volinfo); + if (ret) + goto unlock; - ret = glusterd_store_create_nodestate_sh_on_absence(volinfo); - if (ret) - goto out; + ret = glusterd_store_create_vol_shandle_on_absence(volinfo); + if (ret) + goto unlock; - ret = glusterd_store_perform_volume_store(volinfo); - if (ret) - goto out; + ret = glusterd_store_create_nodestate_sh_on_absence(volinfo); + if (ret) + goto unlock; - ret = glusterd_store_volume_atomic_update(volinfo); - if (ret) { - glusterd_perform_volinfo_version_action( - volinfo, GLUSTERD_VOLINFO_VER_AC_DECREMENT); - goto out; - } + ret = glusterd_store_perform_volume_store(volinfo); + if (ret) + goto unlock; - ret = glusterd_store_perform_node_state_store(volinfo); - if (ret) - goto out; + ret = glusterd_store_volume_atomic_update(volinfo); + if (ret) { + glusterd_perform_volinfo_version_action( + volinfo, GLUSTERD_VOLINFO_VER_AC_DECREMENT); + goto unlock; + } - /* checksum should be computed at the end */ - ret = glusterd_compute_cksum(volinfo, _gf_false); - if (ret) - goto out; + ret = glusterd_store_perform_node_state_store(volinfo); + if (ret) + goto unlock; -out: + /* checksum should be computed at the end */ + ret = glusterd_compute_cksum(volinfo, _gf_false); + if (ret) + goto unlock; + } +unlock: + pthread_mutex_unlock(&volinfo->store_volinfo_lock); if (ret) glusterd_store_volume_cleanup_tmp(volinfo); diff --git a/xlators/mgmt/glusterd/src/glusterd-volume-ops.c b/xlators/mgmt/glusterd/src/glusterd-volume-ops.c index d4dd1dc11a8..a6561e101d5 100644 --- a/xlators/mgmt/glusterd/src/glusterd-volume-ops.c +++ b/xlators/mgmt/glusterd/src/glusterd-volume-ops.c @@ -2283,6 +2283,8 @@ glusterd_op_create_volume(dict_t *dict, char **op_errstr) goto out; } + pthread_mutex_init(&volinfo->store_volinfo_lock, NULL); + ret = dict_get_strn(dict, "volname", SLEN("volname"), &volname); if (ret) { diff --git a/xlators/mgmt/glusterd/src/glusterd.h b/xlators/mgmt/glusterd/src/glusterd.h index 19cdee392f6..412ba7415f0 100644 --- a/xlators/mgmt/glusterd/src/glusterd.h +++ b/xlators/mgmt/glusterd/src/glusterd.h @@ -494,9 +494,12 @@ struct glusterd_volinfo_ { glusterd_tierdsvc_t tierd; glusterd_gfproxydsvc_t gfproxyd; int32_t quota_xattr_version; - gf_boolean_t stage_deleted; /* volume has passed staging - * for delete operation - */ + gf_boolean_t stage_deleted; /* volume has passed staging + * for delete operation + */ + pthread_mutex_t store_volinfo_lock; /* acquire lock for + * updating the volinfo + */ }; typedef enum gd_snap_status_ { |