diff options
| author | Vijaikumar M <vmallika@redhat.com> | 2014-05-06 14:32:28 +0530 | 
|---|---|---|
| committer | Krishnan Parthasarathi <kparthas@redhat.com> | 2014-05-08 22:23:46 -0700 | 
| commit | 065b91b4993f1ab0abc8b1db4d5745a6b58545b0 (patch) | |
| tree | 4fc15626547c5be41071c21531534fa7557f64d0 | |
| parent | 4f8c7cc34dad6a963f70dfcf11e737fd44c31a42 (diff) | |
glusterd/snapshot: Add brick-count suffix for the LVM snapshot
When there are more than one brick created from the same LVM volume
group, there will be a conflict with the LVM snapshot name we use.
Solution is to add a brick-count suffix to the LVM snapshot name
Change-Id: I7258e69fe0b50e86b81c66ab1db523ab3c7cbae0
BUG: 1091934
Signed-off-by: Vijaikumar M <vmallika@redhat.com>
Reviewed-on: http://review.gluster.org/7581
Tested-by: Gluster Build System <jenkins@build.gluster.com>
Reviewed-by: Rajesh Joseph <rjoseph@redhat.com>
Reviewed-by: Krishnan Parthasarathi <kparthas@redhat.com>
Tested-by: Krishnan Parthasarathi <kparthas@redhat.com>
| -rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-handshake.c | 36 | ||||
| -rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-snapshot.c | 463 | ||||
| -rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-utils.c | 5 | ||||
| -rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-utils.h | 15 | ||||
| -rw-r--r-- | xlators/mgmt/glusterd/src/glusterd.h | 4 | 
5 files changed, 245 insertions, 278 deletions
diff --git a/xlators/mgmt/glusterd/src/glusterd-handshake.c b/xlators/mgmt/glusterd/src/glusterd-handshake.c index 1797778d150..2b89545c80d 100644 --- a/xlators/mgmt/glusterd/src/glusterd-handshake.c +++ b/xlators/mgmt/glusterd/src/glusterd-handshake.c @@ -398,8 +398,29 @@ glusterd_create_missed_snap (glusterd_missed_snap_info *missed_snapinfo,          }          /* Fetch the device path */ -        device = glusterd_take_lvm_snapshot (snap_vol, snap_opinfo->brick_path); +        device = glusterd_get_brick_mount_device (snap_opinfo->brick_path);          if (!device) { +                gf_log (this->name, GF_LOG_ERROR, "Getting device name for the" +                        "brick %s:%s failed", brickinfo->hostname, +                        snap_opinfo->brick_path); +                ret = -1; +                goto out; +        } + +        device = glusterd_build_snap_device_path (device, snap_vol->volname, +                                                  snap_opinfo->brick_num - 1); +        if (!device) { +                gf_log (this->name, GF_LOG_ERROR, "cannot copy the snapshot " +                        "device name (volname: %s, snapname: %s)", +                         snap_vol->volname, snap->snapname); +                ret = -1; +                goto out; +        } +        strncpy (brickinfo->device_path, device, +                 sizeof(brickinfo->device_path)); + +        ret = glusterd_take_lvm_snapshot (brickinfo, snap_opinfo->brick_path); +        if (ret) {                  gf_log (this->name, GF_LOG_ERROR,                          "Failed to take snapshot of %s",                          snap_opinfo->brick_path); @@ -407,9 +428,8 @@ glusterd_create_missed_snap (glusterd_missed_snap_info *missed_snapinfo,          }          /* Create and mount the snap brick */ -        ret = glusterd_snap_brick_create (device, snap_vol, -                                          snap_opinfo->brick_num, -                                          brickinfo->mount_dir); +        ret = glusterd_snap_brick_create (snap_vol, brickinfo, +                                          snap_opinfo->brick_num - 1);          if (ret) {                  gf_log (this->name, GF_LOG_ERROR, "Failed to "                          " create and mount the brick(%s) for the snap %s", @@ -417,11 +437,7 @@ glusterd_create_missed_snap (glusterd_missed_snap_info *missed_snapinfo,                          snap_vol->snapshot->snapname);                  goto out;          } - -        strncpy (brickinfo->device_path, device, -                 sizeof(brickinfo->device_path));          brickinfo->snap_status = 0; -          ret = glusterd_store_volinfo (snap_vol,                                        GLUSTERD_VOLINFO_VER_AC_NONE);          if (ret) { @@ -431,6 +447,7 @@ glusterd_create_missed_snap (glusterd_missed_snap_info *missed_snapinfo,                  goto out;          } +          ret = glusterd_brick_start (snap_vol, brickinfo, _gf_false);          if (ret) {                  gf_log (this->name, GF_LOG_WARNING, "starting the " @@ -440,6 +457,9 @@ glusterd_create_missed_snap (glusterd_missed_snap_info *missed_snapinfo,                  goto out;          }  out: +        if (device) +                GF_FREE (device); +          return ret;  } diff --git a/xlators/mgmt/glusterd/src/glusterd-snapshot.c b/xlators/mgmt/glusterd/src/glusterd-snapshot.c index ea1fe6a732a..e52809f3e80 100644 --- a/xlators/mgmt/glusterd/src/glusterd-snapshot.c +++ b/xlators/mgmt/glusterd/src/glusterd-snapshot.c @@ -64,6 +64,71 @@  char snap_mount_folder[PATH_MAX]; +/* This function is called to get the device path of the snap lvm. Usually +   if /dev/mapper/<group-name>-<lvm-name> is the device for the lvm, +   then the snap device will be /dev/<group-name>/<snapname>. +   This function takes care of building the path for the snap device. +*/ +char * +glusterd_build_snap_device_path (char *device, char *snapname, +                                 int32_t brickcount) +{ +        char        snap[PATH_MAX]      = ""; +        char        msg[1024]           = ""; +        char        volgroup[PATH_MAX]  = ""; +        char       *snap_device         = NULL; +        xlator_t   *this                = NULL; +        runner_t    runner              = {0,}; +        char       *ptr                 = NULL; +        int         ret                 = -1; + +        this = THIS; +        GF_ASSERT (this); +        if (!device) { +                gf_log (this->name, GF_LOG_ERROR, "device is NULL"); +                goto out; +        } +        if (!snapname) { +                gf_log (this->name, GF_LOG_ERROR, "snapname is NULL"); +                goto out; +        } + +        runinit (&runner); +        runner_add_args (&runner, "/sbin/lvs", "--noheadings", "-o", "vg_name", +                         device, NULL); +        runner_redir (&runner, STDOUT_FILENO, RUN_PIPE); +        snprintf (msg, sizeof (msg), "Get volume group for device %s", device); +        runner_log (&runner, this->name, GF_LOG_DEBUG, msg); +        ret = runner_start (&runner); +        if (ret == -1) { +                gf_log (this->name, GF_LOG_ERROR, "Failed to get volume group " +                        "for device %s", device); +                runner_end (&runner); +                goto out; +        } +        ptr = fgets(volgroup, sizeof(volgroup), +                    runner_chio (&runner, STDOUT_FILENO)); +        if (!ptr || !strlen(volgroup)) { +                gf_log (this->name, GF_LOG_ERROR, "Failed to get volume group " +                        "for snap %s", snapname); +                runner_end (&runner); +                ret = -1; +                goto out; +        } +        runner_end (&runner); + +        snprintf (snap, sizeof(snap), "/dev/%s/%s_%d", gf_trim(volgroup), +                  snapname, brickcount); +        snap_device = gf_strdup (snap); +        if (!snap_device) { +                gf_log (this->name, GF_LOG_WARNING, "Cannot copy the " +                        "snapshot device name for snapname: %s", snapname); +        } + +out: +        return snap_device; +} +  /* Look for disconnected peers, for missed snap creates or deletes */  static int32_t  glusterd_find_missed_snap (dict_t *rsp_dict, glusterd_volinfo_t *vol, @@ -1568,7 +1633,7 @@ glusterd_snapshot_create_prevalidate (dict_t *dict, char **op_errstr,                                  goto out;                          } -                        device = glusterd_get_brick_mount_details +                        device = glusterd_get_brick_mount_device                                                            (brickinfo->path);                          if (!device) {                                  snprintf (err_str, sizeof (err_str), @@ -1580,7 +1645,8 @@ glusterd_snapshot_create_prevalidate (dict_t *dict, char **op_errstr,                          }                          device = glusterd_build_snap_device_path (device, -                                                                  snap_volname); +                                                                  snap_volname, +                                                                  brick_count);                          if (!device) {                                  snprintf (err_str, sizeof (err_str),                                            "cannot copy the snapshot device " @@ -3463,84 +3529,19 @@ out:          return ret;  } -/* This function is called to get the device path of the snap lvm. Usually -   if /dev/mapper/<group-name>-<lvm-name> is the device for the lvm, -   then the snap device will be /dev/<group-name>/<snapname>. -   This function takes care of building the path for the snap device. -*/ -char * -glusterd_build_snap_device_path (char *device, char *snapname) -{ -        char        snap[PATH_MAX]      = ""; -        char        msg[1024]           = ""; -        char        volgroup[PATH_MAX]  = ""; -        char       *snap_device         = NULL; -        xlator_t   *this                = NULL; -        runner_t    runner              = {0,}; -        char       *ptr                 = NULL; -        int         ret                 = -1; - -        this = THIS; -        GF_ASSERT (this); -        if (!device) { -                gf_log (this->name, GF_LOG_ERROR, "device is NULL"); -                goto out; -        } -        if (!snapname) { -                gf_log (this->name, GF_LOG_ERROR, "snapname is NULL"); -                goto out; -        } - -        runinit (&runner); -        runner_add_args (&runner, "/sbin/lvs", "--noheadings", "-o", "vg_name", -                         device, NULL); -        runner_redir (&runner, STDOUT_FILENO, RUN_PIPE); -        snprintf (msg, sizeof (msg), "Get volume group for device %s", device); -        runner_log (&runner, this->name, GF_LOG_DEBUG, msg); -        ret = runner_start (&runner); -        if (ret == -1) { -                gf_log (this->name, GF_LOG_ERROR, "Failed to get volume group " -                        "for device %s", device); -                runner_end (&runner); -                goto out; -        } -        ptr = fgets(volgroup, sizeof(volgroup), -                    runner_chio (&runner, STDOUT_FILENO)); -        if (!ptr || !strlen(volgroup)) { -                gf_log (this->name, GF_LOG_ERROR, "Failed to get volume group " -                        "for snap %s", snapname); -                runner_end (&runner); -                ret = -1; -                goto out; -        } -        runner_end (&runner); - -        snprintf (snap, sizeof(snap), "/dev/%s/%s", gf_trim(volgroup), -                  snapname); -        snap_device = gf_strdup (snap); -        if (!snap_device) { -                gf_log (this->name, GF_LOG_WARNING, "Cannot copy the " -                        "snapshot device name for snapname: %s)", snapname); -        } - -out: -        return snap_device; -} -  /* This function actually calls the command (or the API) for taking the     snapshot of the backend brick filesystem. If this is successful,     then call the glusterd_snap_create function to create the snap object     for glusterd  */ -char * -glusterd_take_lvm_snapshot (glusterd_volinfo_t *snap_vol, -                            char *brick_path) +int32_t +glusterd_take_lvm_snapshot (glusterd_brickinfo_t *brickinfo, +                            char *origin_brick_path)  {          char             msg[NAME_MAX]    = "";          char             buf[PATH_MAX]    = ""; -        char            *snap_device      = NULL;          char            *ptr              = NULL; -        char            *device           = NULL; +        char            *origin_device    = NULL;          int              ret              = -1;          gf_boolean_t     match            = _gf_false;          runner_t         runner           = {0,}; @@ -3548,12 +3549,13 @@ glusterd_take_lvm_snapshot (glusterd_volinfo_t *snap_vol,          this = THIS;          GF_ASSERT (this); -        GF_ASSERT (brick_path); +        GF_ASSERT (brickinfo); +        GF_ASSERT (origin_brick_path); -        device = glusterd_get_brick_mount_details (brick_path); -        if (!device) { +        origin_device = glusterd_get_brick_mount_device (origin_brick_path); +        if (!origin_device) {                  gf_log (this->name, GF_LOG_ERROR, "getting device name for " -                        "the brick %s failed", brick_path); +                        "the brick %s failed", origin_brick_path);                  goto out;          } @@ -3587,69 +3589,53 @@ glusterd_take_lvm_snapshot (glusterd_volinfo_t *snap_vol,          /* Takng the actual snapshot */          runinit (&runner);          snprintf (msg, sizeof (msg), "taking snapshot of the brick %s", -                  brick_path); +                  origin_brick_path);          if (match == _gf_true) -                runner_add_args (&runner, LVM_CREATE, "-s", device, +                runner_add_args (&runner, LVM_CREATE, "-s", origin_device,                                   "--setactivationskip", "n", "--name", -                                 snap_vol->volname, NULL); +                                 brickinfo->device_path, NULL);          else -                runner_add_args (&runner, LVM_CREATE, "-s", device, -                                 "--name", snap_vol->volname, NULL); +                runner_add_args (&runner, LVM_CREATE, "-s", origin_device, +                                 "--name", brickinfo->device_path, NULL);          runner_log (&runner, this->name, GF_LOG_DEBUG, msg); -        ret = runner_start (&runner); +        ret = runner_run (&runner);          if (ret) {                  gf_log (this->name, GF_LOG_ERROR, "taking snapshot of the "                          "brick (%s) of device %s failed", -                        brick_path, device); -                runner_end (&runner); -                goto out; -        } -        runner_end (&runner); - -        snap_device = glusterd_build_snap_device_path (device, -                                                       snap_vol->volname); -        if (!snap_device) { -                gf_log (this->name, GF_LOG_WARNING, "Cannot copy the snapshot " -                        "device name for snap %s (volume id: %s)", -                        snap_vol->snapshot->snapname, snap_vol->volname); -                ret = -1; -                goto out; +                        origin_brick_path, origin_device);          }  out: -        return snap_device; +        return ret;  }  int32_t -glusterd_snap_brick_create (char *device, glusterd_volinfo_t *snap_volinfo, -                            int32_t brick_count, char *snap_brick_dir) +glusterd_snap_brick_create (glusterd_volinfo_t *snap_volinfo, +                            glusterd_brickinfo_t *brickinfo, +                            int32_t brick_count)  {          int32_t          ret                             = -1;          xlator_t        *this                            = NULL;          glusterd_conf_t *priv                            = NULL;          char             snap_brick_mount_path[PATH_MAX] = ""; -        char             snap_brick_path[PATH_MAX]       = "";          struct stat      statbuf                         = {0, };          this = THIS;          priv = this->private; -        GF_ASSERT (device);          GF_ASSERT (snap_volinfo); -        GF_ASSERT (snap_brick_dir); +        GF_ASSERT (brickinfo);          snprintf (snap_brick_mount_path, sizeof (snap_brick_mount_path),                    "%s/%s/brick%d",  snap_mount_folder, snap_volinfo->volname, -                  brick_count); - -        snprintf (snap_brick_path, sizeof (snap_brick_path), "%s%s", -                  snap_brick_mount_path, snap_brick_dir); +                  brick_count + 1);          ret = mkdir_p (snap_brick_mount_path, 0777, _gf_true);          if (ret) {                  gf_log (this->name, GF_LOG_ERROR, "creating the brick directory"                          " %s for the snapshot %s(device: %s) failed", -                        snap_brick_mount_path, snap_volinfo->volname, device); +                        snap_brick_mount_path, snap_volinfo->volname, +                        brickinfo->device_path);                  goto out;          }          /* mount the snap logical device on the directory inside @@ -3659,21 +3645,22 @@ glusterd_snap_brick_create (char *device, glusterd_volinfo_t *snap_volinfo,                          MS_MGC_VAL, "nouuid");             But for now, mounting using runner apis.          */ -        ret = glusterd_mount_lvm_snapshot (device, snap_brick_mount_path); +        ret = glusterd_mount_lvm_snapshot (brickinfo->device_path, +                                           snap_brick_mount_path);          if (ret) {                  gf_log (this->name, GF_LOG_ERROR,                          "Failed to mount lvm snapshot.");                  goto out;          } -        ret = stat (snap_brick_path, &statbuf); +        ret = stat (brickinfo->path, &statbuf);          if (ret) {                  gf_log (this->name, GF_LOG_WARNING, "stat of the brick %s" -                        "(brick mount: %s) failed (%s)", snap_brick_path, +                        "(brick mount: %s) failed (%s)", brickinfo->path,                          snap_brick_mount_path, strerror (errno));                  goto out;          } -        ret = sys_lsetxattr (snap_brick_path, +        ret = sys_lsetxattr (brickinfo->path,                               GF_XATTR_VOL_ID_KEY,                               snap_volinfo->volume_id, 16,                               XATTR_REPLACE); @@ -3681,7 +3668,7 @@ glusterd_snap_brick_create (char *device, glusterd_volinfo_t *snap_volinfo,                  gf_log (this->name, GF_LOG_ERROR, "Failed to set "                          "extended attribute %s on %s. Reason: "                          "%s, snap: %s", GF_XATTR_VOL_ID_KEY, -                        snap_brick_path, strerror (errno), +                        brickinfo->path, strerror (errno),                          snap_volinfo->volname);                  goto out;          } @@ -3702,16 +3689,16 @@ out:  }  static int32_t -glusterd_add_bricks_to_snap_volume (dict_t *dict, dict_t *rsp_dict, +glusterd_add_brick_to_snap_volume (dict_t *dict, dict_t *rsp_dict,                                      glusterd_volinfo_t  *snap_vol,                                      glusterd_brickinfo_t *original_brickinfo, -                                    glusterd_brickinfo_t *snap_brickinfo, -                                    char **snap_brick_dir, int64_t volcount, -                                    int32_t brick_count) +                                    int64_t volcount, int32_t brick_count)  {          char                    key[PATH_MAX]                   = ""; +        char                   *snap_brick_dir                  = NULL;          char                    snap_brick_path[PATH_MAX]       = "";          char                   *snap_device                     = NULL; +        glusterd_brickinfo_t   *snap_brickinfo                  = NULL;          gf_boolean_t            add_missed_snap                 = _gf_false;          int32_t                 ret                             = -1;          xlator_t               *this                            = NULL; @@ -3722,12 +3709,27 @@ glusterd_add_bricks_to_snap_volume (dict_t *dict, dict_t *rsp_dict,          GF_ASSERT (rsp_dict);          GF_ASSERT (snap_vol);          GF_ASSERT (original_brickinfo); -        GF_ASSERT (snap_brickinfo); -        GF_ASSERT (snap_brick_dir); + +        snprintf (key, sizeof(key), "vol%ld.origin_brickpath%d", +                  volcount, brick_count); +        ret = dict_set_dynstr_with_alloc (dict, key, original_brickinfo->path); +        if (ret) { +                gf_log (this->name, GF_LOG_ERROR, "Failed to set %s", key); +                goto out; +        } + +        ret = glusterd_brickinfo_new (&snap_brickinfo); +        if (ret) { +                gf_log (this->name, GF_LOG_ERROR, +                        "initializing the brick for the snap " +                        "volume failed (snapname: %s)", +                        snap_vol->snapshot->snapname); +                goto out; +        }          snprintf (key, sizeof(key) - 1, "vol%"PRId64".brickdir%d", volcount,                    brick_count); -        ret = dict_get_ptr (dict, key, (void **)snap_brick_dir); +        ret = dict_get_str (dict, key, &snap_brick_dir);          if (ret) {                  /* Using original brickinfo here because it will be a                   * pending snapshot and storing the original brickinfo @@ -3737,7 +3739,7 @@ glusterd_add_bricks_to_snap_volume (dict_t *dict, dict_t *rsp_dict,                          "snap mount path(%s). Adding to missed_snap_list", key);                  snap_brickinfo->snap_status = -1; -                *snap_brick_dir = original_brickinfo->mount_dir; +                snap_brick_dir = original_brickinfo->mount_dir;                  /* In origiator node add snaps missed                   * from different nodes to the dict @@ -3781,11 +3783,11 @@ glusterd_add_bricks_to_snap_volume (dict_t *dict, dict_t *rsp_dict,          snprintf (snap_brick_path, sizeof(snap_brick_path),                    "%s/%s/brick%d%s", snap_mount_folder,                    snap_vol->volname, brick_count+1, -                  *snap_brick_dir); +                  snap_brick_dir);          snprintf (key, sizeof(key), "vol%"PRId64".brick_snapdevice%d",                    volcount, brick_count); -        ret = dict_get_ptr (dict, key, (void **)&snap_device); +        ret = dict_get_str (dict, key, &snap_device);          if (ret) {                  /* If the device name is empty, so will be the brick path                   * Hence the missed snap has already been added above @@ -3812,59 +3814,71 @@ glusterd_add_bricks_to_snap_volume (dict_t *dict, dict_t *rsp_dict,          list_add_tail (&snap_brickinfo->brick_list, &snap_vol->bricks);  out: +        if (ret && snap_brickinfo) +                GF_FREE (snap_brickinfo); +          gf_log (this->name, GF_LOG_TRACE, "Returning %d", ret);          return ret;  }  static int32_t -glusterd_take_brick_snapshot (glusterd_volinfo_t *origin_vol, -                              glusterd_volinfo_t *snap_vol, dict_t *rsp_dict, -                              glusterd_brickinfo_t *original_brickinfo, -                              char *snap_brick_dir, int32_t brick_count) +glusterd_take_brick_snapshot (dict_t *dict, glusterd_volinfo_t *snap_vol, +                              glusterd_brickinfo_t *brickinfo, +                              int32_t volcount, int32_t brick_count)  { -        char                   *device                          = NULL; -        int32_t                 ret                             = -1; -        xlator_t               *this                            = NULL; +        char                   *origin_brick_path   = NULL; +        char                    key[PATH_MAX]       = ""; +        int32_t                 ret                 = -1; +        xlator_t               *this                = NULL;          this = THIS;          GF_ASSERT (this); -        GF_ASSERT (origin_vol); +        GF_ASSERT (dict);          GF_ASSERT (snap_vol); -        GF_ASSERT (rsp_dict); -        GF_ASSERT (original_brickinfo); -        GF_ASSERT (snap_brick_dir); - -        device = glusterd_take_lvm_snapshot (snap_vol, -                                             original_brickinfo->path); -        /* 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 -           the snapshot can either be treated as success, or -           in case of failure we can undo the changes and return -           failure to cli.  */ -        if (!device) { -                gf_log (this->name, GF_LOG_ERROR, -                        "Failed to take snapshot of %s:%s", -                        original_brickinfo->hostname, -                        original_brickinfo->path); +        GF_ASSERT (brickinfo); + +        if (strlen(brickinfo->device_path) == 0) { +                gf_log (this->name, GF_LOG_ERROR, "Device path is empty " +                        "brick %s:%s", brickinfo->hostname, brickinfo->path); +                ret = -1; +                goto out; +        } + +        snprintf (key, sizeof(key) - 1, "vol%d.origin_brickpath%d", volcount, +                  brick_count); +        ret = dict_get_str (dict, key, &origin_brick_path); +        if (ret) { +                gf_log (this->name, GF_LOG_WARNING, "Unable to fetch " +                        "brick path (%s)", key); +                goto out; +        } + +        ret = glusterd_take_lvm_snapshot (brickinfo, origin_brick_path); +        if (ret) { +                gf_log (this->name, GF_LOG_ERROR, "Failed to take snapshot of " +                        "brick %s:%s", brickinfo->hostname, origin_brick_path);                  goto out;          }          /* create the complete brick here */ -        ret = glusterd_snap_brick_create (device, snap_vol, -                                          brick_count + 1, snap_brick_dir); +        ret = glusterd_snap_brick_create (snap_vol, brickinfo, brick_count);          if (ret) {                  gf_log (this->name, GF_LOG_ERROR, "not able to"                          " create the brick for the snap %s"                          ", volume %s", snap_vol->snapshot->snapname, -                        origin_vol->volname); +                        snap_vol->volname);                  goto out;          } -out: -        if (device) -                GF_FREE (device); +         ret = glusterd_brick_start (snap_vol, brickinfo, _gf_false); +         if (ret) { +                 gf_log (this->name, GF_LOG_WARNING, "starting the " +                         "brick %s:%s for the snap %s (volume: %s) " +                         "failed", brickinfo->hostname, brickinfo->path, +                         snap_vol->snapshot->snapname, snap_vol->volname); +         } +out:          gf_log (this->name, GF_LOG_TRACE, "Returning %d", ret);          return ret;  } @@ -3874,7 +3888,6 @@ glusterd_do_snap_vol (glusterd_volinfo_t *origin_vol, glusterd_snap_t *snap,                        dict_t *dict, dict_t *rsp_dict, int64_t volcount)  {          char                    key[PATH_MAX]                   = ""; -        char                   *snap_brick_dir                  = NULL;          char                   *username                        = NULL;          char                   *password                        = NULL;          glusterd_brickinfo_t   *brickinfo                       = NULL; @@ -3883,7 +3896,6 @@ glusterd_do_snap_vol (glusterd_volinfo_t *origin_vol, glusterd_snap_t *snap,          uuid_t                 *snap_volid                      = NULL;          int32_t                 ret                             = -1;          int32_t                 brick_count                     = 0; -        glusterd_brickinfo_t   *snap_brickinfo                  = NULL;          xlator_t               *this                            = NULL;          int64_t                 brick_order                     = 0; @@ -3958,102 +3970,21 @@ glusterd_do_snap_vol (glusterd_volinfo_t *origin_vol, glusterd_snap_t *snap,          /* Adding snap brickinfos to the snap volinfo */          brick_count = 0; -        brick_order = 0;          list_for_each_entry (brickinfo, &origin_vol->bricks, brick_list) { -                snap_brickinfo = NULL; - -                ret = glusterd_brickinfo_new (&snap_brickinfo); -                if (ret) { -                        gf_log (this->name, GF_LOG_ERROR, -                                "initializing the brick for the snap " -                                "volume failed (snapname: %s)", snap->snapname); -                        goto out; -                } - -                ret = glusterd_add_bricks_to_snap_volume (dict, rsp_dict, -                                                          snap_vol, -                                                          brickinfo, -                                                          snap_brickinfo, -                                                          &snap_brick_dir, -                                                          volcount, -                                                          brick_count); +                ret = glusterd_add_brick_to_snap_volume (dict, rsp_dict, +                                                         snap_vol, brickinfo, +                                                         volcount, brick_count);                  if (ret) {                          gf_log (this->name, GF_LOG_ERROR,                                  "Failed to add the snap brick for "                                  "%s:%s to the snap volume",                                  brickinfo->hostname, brickinfo->path); -                        GF_FREE (snap_brickinfo); -                        goto out; -                } - -                snprintf (key, sizeof(key) - 1, -                          "snap-vol%"PRId64".brick%d.order", volcount, -                          brick_count); -                ret = dict_set_int64 (rsp_dict, key, brick_order); -                if (ret) { -                        gf_log (this->name, GF_LOG_ERROR, -                                "Failed to set %s", key);                          goto out;                  } -                /* Take snapshot of the brick */ -                if ((uuid_compare (brickinfo->uuid, MY_UUID)) || -                    (snap_brickinfo->snap_status == -1)) { -                        if (!uuid_compare (brickinfo->uuid, MY_UUID)) { -                                brick_count++; -                                snprintf (key, sizeof (key), "snap-vol%"PRId64 -                                          ".brick%"PRId64".status", volcount, -                                          brick_order); -                                ret = dict_set_int32 (rsp_dict, key, 0); -                                if (ret) { -                                        gf_log (this->name, GF_LOG_ERROR, -                                                "failed to add %s to dict", -                                                key); -                                        goto out; -                                } -                        } -                        brick_order++; -                        continue; -                } - -                ret = glusterd_take_brick_snapshot (origin_vol, snap_vol, -                                                    rsp_dict, brickinfo, -                                                    snap_brick_dir, -                                                    brick_order); - -                snprintf (key, sizeof (key), "snap-vol%"PRId64 -                          ".brick%"PRId64".status", volcount, brick_order); -                if (ret) { -                        gf_log (this->name, GF_LOG_ERROR, -                                "Failed to take snapshot for %s:%s", -                                brickinfo->hostname, brickinfo->path); -                        ret = dict_set_int32 (rsp_dict, key, 0); -                        if (ret) { -                                gf_log (this->name, GF_LOG_ERROR, "failed to " -                                        "add %s to dict", key); -                                goto out; -                        } -                } else { -                        ret = dict_set_int32 (rsp_dict, key, 1); -                        if (ret) { -                                gf_log (this->name, GF_LOG_ERROR, "failed to " -                                        "add %s to dict", key); -                                goto out; -                        } -                } - -                brick_order++;                  brick_count++;          } -        snprintf (key, sizeof (key), "snap-vol%"PRId64"_brickcount", -                  volcount); -        ret = dict_set_int64 (rsp_dict, key, brick_count); -        if (ret) { -                gf_log (this->name, GF_LOG_ERROR, "failed to " -                        "add %s to dict", key); -                goto out; -        }          ret = glusterd_store_volinfo (snap_vol,                                        GLUSTERD_VOLINFO_VER_AC_INCREMENT); @@ -4102,16 +4033,6 @@ glusterd_do_snap_vol (glusterd_volinfo_t *origin_vol, glusterd_snap_t *snap,                  goto out;          } -        /*Starting the snap volume without GF_CLI_FLAG_OP_FORCE option*/ -        ret = glusterd_start_volume (snap_vol, 0); - -        if (ret) { -                gf_log (this->name, GF_LOG_ERROR, -                        "Failed to activate snap volume %s of the snap %s", -                        snap_vol->volname, snap->snapname); -                goto out; -        } -  out:          if (ret) {                  if (snap_vol) @@ -4762,6 +4683,7 @@ glusterd_snapshot_create_commit (dict_t *dict, char **op_errstr,          int                     ret                     = -1;          int64_t                 i                       = 0;          int64_t                 volcount                = 0; +        int32_t                 brickcount              = 0;          char                    *snapname               = NULL;          char                    *volname                = NULL;          char                    *tmp_name               = NULL; @@ -4770,10 +4692,8 @@ glusterd_snapshot_create_commit (dict_t *dict, char **op_errstr,          glusterd_snap_t         *snap                   = NULL;          glusterd_volinfo_t      *origin_vol             = NULL;          glusterd_volinfo_t      *snap_vol               = NULL; -        glusterd_conf_t *priv   = NULL; -        int64_t                 brick_count             = 0; -        int64_t                 brick_order             = 0;          glusterd_brickinfo_t    *brickinfo              = NULL; +        glusterd_conf_t         *priv                   = NULL;          this = THIS;          GF_ASSERT(this); @@ -4849,13 +4769,40 @@ glusterd_snapshot_create_commit (dict_t *dict, char **op_errstr,                  }          } -        ret = dict_set_int64 (rsp_dict, "volcount", volcount); -        if (ret) { -                gf_log (this->name, GF_LOG_ERROR, "Failed to set volcount"); -                goto out; -        } +        volcount=0; +        list_for_each_entry (snap_vol, &snap->volumes, vol_list) { +                volcount++; +                brickcount = 0; +                list_for_each_entry (brickinfo, &snap_vol->bricks, brick_list) { +                        if ((uuid_compare (brickinfo->uuid, MY_UUID)) || +                            (brickinfo->snap_status == -1)) { +                                brickcount++; +                                continue; +                        } +                        ret = glusterd_take_brick_snapshot (dict, +                                                            snap_vol, +                                                            brickinfo, +                                                            volcount, +                                                            brickcount); +                        if (ret) { +                                gf_log (THIS->name, GF_LOG_ERROR, "Failed to " +                                        "take backend snapshot for brick " +                                        "%s:%s volume(%s)", brickinfo->hostname, +                                        brickinfo->path, snap_vol->volname); +                                        goto out; +                        } +                        brickcount++; +                } -        ret = 0; +                snap_vol->status = GLUSTERD_STATUS_STARTED; +                ret = glusterd_store_volinfo (snap_vol, +                                             GLUSTERD_VOLINFO_VER_AC_INCREMENT); +                if (ret) { +                        gf_log (this->name, GF_LOG_ERROR, "Failed to store " +                                 "snap volinfo %s", snap_vol->volname); +                        goto out; +                } +        }  out:          if (ret) { @@ -5033,7 +4980,7 @@ glusterd_get_brick_lvm_details (dict_t *rsp_dict,          priv = this->private;          GF_ASSERT (priv); -        device = glusterd_get_brick_mount_details (brickinfo->path); +        device = glusterd_get_brick_mount_device (brickinfo->path);          if (!device) {                  gf_log (this->name, GF_LOG_ERROR, "Getting device name for "                          "the brick %s:%s failed", brickinfo->hostname, diff --git a/xlators/mgmt/glusterd/src/glusterd-utils.c b/xlators/mgmt/glusterd/src/glusterd-utils.c index 117a3ab857c..dd4f84265db 100644 --- a/xlators/mgmt/glusterd/src/glusterd-utils.c +++ b/xlators/mgmt/glusterd/src/glusterd-utils.c @@ -6458,15 +6458,12 @@ glusterd_brick_start (glusterd_volinfo_t *volinfo,  {          int                                     ret   = -1;          xlator_t                                *this = NULL; -        glusterd_conf_t                         *conf = NULL;          if ((!brickinfo) || (!volinfo))                  goto out;          this = THIS;          GF_ASSERT (this); -        conf = this->private; -        GF_ASSERT (conf);          if (uuid_is_null (brickinfo->uuid)) {                  ret = glusterd_resolve_brick (brickinfo); @@ -7062,7 +7059,7 @@ glusterd_add_brick_mount_details (glusterd_brickinfo_t *brickinfo,  }  char* -glusterd_get_brick_mount_details (char *brick_path) +glusterd_get_brick_mount_device (char *brick_path)  {          int             ret                  = -1;          char           *mnt_pt               = NULL; diff --git a/xlators/mgmt/glusterd/src/glusterd-utils.h b/xlators/mgmt/glusterd/src/glusterd-utils.h index 05d5ce6eb50..14f6ce4d08a 100644 --- a/xlators/mgmt/glusterd/src/glusterd-utils.h +++ b/xlators/mgmt/glusterd/src/glusterd-utils.h @@ -693,7 +693,8 @@ int32_t  glusterd_compare_volume_name(struct list_head *, struct list_head *);  char* -glusterd_get_brick_mount_details (char *brick_path); +glusterd_get_brick_mount_device (char *brick_path); +  struct mntent *  glusterd_get_mnt_entry_info (char *mnt_pt, FILE *mtab); @@ -789,13 +790,9 @@ glusterd_get_brick_mount_dir (char *brickpath, char *hostname, char *mount_dir);  int32_t  glusterd_aggr_brick_mount_dirs (dict_t *aggr, dict_t *rsp_dict); -char * -glusterd_take_lvm_snapshot (glusterd_volinfo_t *snap_vol, -                            char *brick_path); -  int32_t -glusterd_snap_brick_create (char *device, glusterd_volinfo_t *snap_volinfo, -                            int32_t brick_count, char *snap_brick_dir); +glusterd_take_lvm_snapshot (glusterd_brickinfo_t *brickinfo, +                            char *origin_brick_path);  int32_t  glusterd_snap_quorum_check (dict_t *dict, gf_boolean_t snap_volume, @@ -816,4 +813,8 @@ glusterd_volume_quorum_calculate (glusterd_volinfo_t *volinfo, dict_t *dict,  int  glusterd_merge_brick_status (dict_t *dst, dict_t *src); +int32_t +glusterd_snap_brick_create (glusterd_volinfo_t *snap_volinfo, +                            glusterd_brickinfo_t *brickinfo, +                            int32_t brick_count);  #endif diff --git a/xlators/mgmt/glusterd/src/glusterd.h b/xlators/mgmt/glusterd/src/glusterd.h index 821c9fdd8b7..2304e75bc5b 100644 --- a/xlators/mgmt/glusterd/src/glusterd.h +++ b/xlators/mgmt/glusterd/src/glusterd.h @@ -995,7 +995,9 @@ int  glusterd_snapshot_postvalidate (dict_t *dict, int32_t op_ret, char **op_errstr,                                  dict_t *rsp_dict);  char * -glusterd_build_snap_device_path (char *device, char *snapname); +glusterd_build_snap_device_path (char *device, char *snapname, +                                 int32_t brick_count); +  int32_t  glusterd_snap_remove (dict_t *rsp_dict, glusterd_snap_t *snap,                        gf_boolean_t remove_lvm, gf_boolean_t force);  | 
