From a6351ee1c823a295f592f4adf5876a6166d47afe Mon Sep 17 00:00:00 2001 From: Avra Sengupta Date: Thu, 30 Jan 2014 02:05:51 +0000 Subject: glusterd/snapshot: Running lvcreate --help to check if setactivationskip is supported To check if setactivationskip is supported or not, we run lvcreate --help and look for the setactivationskip flag, and accordingly issue lvcreate with or without the said flag. Change-Id: Ief349674ea3f7ceff6b7051b1a5104257e547ce2 Signed-off-by: Avra Sengupta Reviewed-on: http://review.gluster.org/6776 Reviewed-by: Rajesh Joseph Tested-by: Rajesh Joseph --- xlators/mgmt/glusterd/src/glusterd-snapshot.c | 67 ++++++++++++++++++++------- 1 file changed, 50 insertions(+), 17 deletions(-) (limited to 'xlators/mgmt/glusterd/src/glusterd-snapshot.c') diff --git a/xlators/mgmt/glusterd/src/glusterd-snapshot.c b/xlators/mgmt/glusterd/src/glusterd-snapshot.c index f8a84cb26..b33be0982 100644 --- a/xlators/mgmt/glusterd/src/glusterd-snapshot.c +++ b/xlators/mgmt/glusterd/src/glusterd-snapshot.c @@ -2798,15 +2798,18 @@ out: */ int glusterd_take_snapshot (glusterd_brickinfo_t *brickinfo, char *volname, - char *snapname, dict_t *dict, char **snap_device) + char *snapname, char **snap_device) { - int ret = -1; - xlator_t *this = NULL; - glusterd_conf_t *priv = NULL; - runner_t runner = {0,}; - char *device = NULL; - char msg[1024] = {0, }; - char *tmp = NULL; + char msg[NAME_MAX] = ""; + char buf[PATH_MAX] = ""; + char *tmp = NULL; + char *ptr = NULL; + char *device = NULL; + int ret = -1; + gf_boolean_t match = _gf_false; + glusterd_conf_t *priv = NULL; + runner_t runner = {0,}; + xlator_t *this = NULL; this = THIS; priv = this->private; @@ -2824,24 +2827,54 @@ glusterd_take_snapshot (glusterd_brickinfo_t *brickinfo, char *volname, goto out; } + /* Figuring out if setactivationskip flag is supported or not */ runinit (&runner); - snprintf (msg, sizeof (msg), "taking snapshot of the brick %s:%s", - brickinfo->hostname, brickinfo->path); - runner_add_args (&runner, "/sbin/lvcreate", "-s", device, - "--setactivationskip", "n", "--name", snapname, NULL); + snprintf (msg, sizeof (msg), "running lvcreate help"); + runner_add_args (&runner, "/sbin/lvcreate", "--help", NULL); runner_log (&runner, "", GF_LOG_DEBUG, msg); + runner_redir (&runner, STDOUT_FILENO, RUN_PIPE); + ret = runner_start (&runner); + if (ret) { + gf_log (this->name, GF_LOG_ERROR, + "Failed to run lvcreate help"); + runner_end (&runner); + goto out; + } - //let glusterd get blocked till snapshot is over - synclock_unlock (&priv->big_lock); - ret = runner_run (&runner); - synclock_lock (&priv->big_lock); + /* Looking for setactivationskip in lvcreate --help */ + do { + ptr = fgets(buf, sizeof(buf), + runner_chio (&runner, STDOUT_FILENO)); + if (ptr) { + if (strstr(buf, "setactivationskip")) { + match = _gf_true; + break; + } + } + } while (ptr != NULL); + runner_end (&runner); + /* Takng the actual snapshot */ + runinit (&runner); + snprintf (msg, sizeof (msg), "taking snapshot of the brick %s:%s", + brickinfo->hostname, brickinfo->path); + if (match == _gf_true) + runner_add_args (&runner, "/sbin/lvcreate", "-s", device, + "--setactivationskip", "n", "--name", + snapname, NULL); + else + runner_add_args (&runner, "/sbin/lvcreate", "-s", device, + "--name", snapname, NULL); + runner_log (&runner, "", GF_LOG_DEBUG, msg); + ret = runner_start (&runner); if (ret) { gf_log (this->name, GF_LOG_ERROR, "taking snapshot of the " "brick (%s:%s) of device %s failed", brickinfo->hostname, brickinfo->path, device); + runner_end (&runner); goto out; } + runner_end (&runner); gf_log (this->name, GF_LOG_INFO, "device: %s", device); if (device) { @@ -3125,7 +3158,7 @@ glusterd_do_snap (glusterd_volinfo_t *volinfo, char *snapname, dict_t *dict, ret = glusterd_take_snapshot (brickinfo, volinfo->volname, - snapname, dict, &device); + snapname, &device); /* Fail the snapshot even though snapshot on one of the bricks fails. At the end when we check whether the snapshot volume meets quorum or not, then the -- cgit