diff options
author | Atin Mukherjee <amukherj@redhat.com> | 2019-07-15 11:26:55 +0530 |
---|---|---|
committer | Atin Mukherjee <amukherj@redhat.com> | 2019-08-25 08:18:54 +0000 |
commit | f0be15cd534b91f88c0239ae850f22c5f2b90c0f (patch) | |
tree | e70bbad0eeb3f5343c126bdb3045b5914bb046de /xlators/mgmt/glusterd/src/glusterd-utils.c | |
parent | 093c66a0af496301e5d28d55f4fe57362cb399d5 (diff) |
glusterd: stop stale bricks during handshaking in brick mux mode
This patch addresses two problems:
1. During friend handshaking, if a volume is imported due to change in
the version, the old bricks were not stopped which would lead to a
situation where bricks will run with old volfiles.
2. As part of attaching shd service in glusterd_attach_svc, there might
be a case that the volume for which we're attempting to attach a shd
service might become stale and in the process of deletion and hence in
every retrials (if the rpc connection isn't ready) check for the
existance of the volume and then only attempt the further attach
request.
Fixes: bz#1733425
Change-Id: I6bac6b871f7e31cb5bf277db979289dec196a03e
Signed-off-by: Atin Mukherjee <amukherj@redhat.com>
Signed-off-by: Mohammed Rafi KC <rkavunga@redhat.com>
Diffstat (limited to 'xlators/mgmt/glusterd/src/glusterd-utils.c')
-rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-utils.c | 34 |
1 files changed, 31 insertions, 3 deletions
diff --git a/xlators/mgmt/glusterd/src/glusterd-utils.c b/xlators/mgmt/glusterd/src/glusterd-utils.c index d91b672e47e..db17fe6d609 100644 --- a/xlators/mgmt/glusterd/src/glusterd-utils.c +++ b/xlators/mgmt/glusterd/src/glusterd-utils.c @@ -1654,6 +1654,33 @@ glusterd_volinfo_find(const char *volname, glusterd_volinfo_t **volinfo) return ret; } +gf_boolean_t +glusterd_volume_exists(const char *volname) +{ + glusterd_volinfo_t *tmp_volinfo = NULL; + gf_boolean_t volume_found = _gf_false; + xlator_t *this = NULL; + glusterd_conf_t *priv = NULL; + + GF_ASSERT(volname); + this = THIS; + GF_ASSERT(this); + + priv = this->private; + GF_ASSERT(priv); + + cds_list_for_each_entry(tmp_volinfo, &priv->volumes, vol_list) + { + if (!strcmp(tmp_volinfo->volname, volname)) { + gf_msg_debug(this->name, 0, "Volume %s found", volname); + volume_found = _gf_true; + break; + } + } + + return volume_found; +} + int32_t glusterd_service_stop(const char *service, char *pidfile, int sig, gf_boolean_t force_kill) @@ -4714,10 +4741,11 @@ glusterd_volinfo_stop_stale_bricks(glusterd_volinfo_t *new_volinfo, old_brickinfo->uuid, old_brickinfo->hostname, old_brickinfo->path, new_volinfo, &new_brickinfo); /* If the brick is stale, i.e it's not a part of the new volume - * or if it's part of the new volume and is pending a snap, - * then stop the brick process + * or if it's part of the new volume and is pending a snap or if it's + * brick multiplexing enabled, then stop the brick process */ - if (ret || (new_brickinfo->snap_status == -1)) { + if (ret || (new_brickinfo->snap_status == -1) || + is_brick_mx_enabled()) { /*TODO: may need to switch to 'atomic' flavour of * brick_stop, once we make peer rpc program also * synctask enabled*/ |