diff options
| -rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-snapshot-utils.c | 10 | ||||
| -rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-snapshot.c | 98 | ||||
| -rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-store.c | 3 | ||||
| -rw-r--r-- | xlators/mgmt/glusterd/src/glusterd.h | 3 | 
4 files changed, 62 insertions, 52 deletions
diff --git a/xlators/mgmt/glusterd/src/glusterd-snapshot-utils.c b/xlators/mgmt/glusterd/src/glusterd-snapshot-utils.c index a535c2a898f..39f21678853 100644 --- a/xlators/mgmt/glusterd/src/glusterd-snapshot-utils.c +++ b/xlators/mgmt/glusterd/src/glusterd-snapshot-utils.c @@ -1033,7 +1033,8 @@ glusterd_perform_missed_op (glusterd_snap_t *snap, int32_t op)          switch (op) {          case GF_SNAP_OPTION_TYPE_DELETE: -                ret = glusterd_snap_remove (dict, snap, _gf_true, _gf_false); +                ret = glusterd_snap_remove (dict, snap, _gf_true, _gf_false, +                                            _gf_false);                  if (ret) {                          gf_msg (this->name, GF_LOG_ERROR, 0,                                  GD_MSG_SNAP_REMOVE_FAIL, @@ -1633,7 +1634,7 @@ glusterd_import_friend_snap (dict_t *peer_data, int32_t snap_count,                          "The snap(%s) is scheduled to be decommissioned "                          "Not accepting the snap.", peer_snap_name);                  glusterd_snap_remove (dict, snap, -                                      _gf_true, _gf_true); +                                      _gf_true, _gf_true, _gf_false);                  ret = 0;                  goto out;          } @@ -1711,7 +1712,7 @@ glusterd_import_friend_snap (dict_t *peer_data, int32_t snap_count,  out:          if (ret)                  glusterd_snap_remove (dict, snap, -                                      _gf_true, _gf_true); +                                      _gf_true, _gf_true, _gf_false);          if (dict)                  dict_unref (dict); @@ -1938,7 +1939,8 @@ remove_my_data:                  goto out;          } -        ret = glusterd_snap_remove (dict, snap, remove_lvm, _gf_false); +        ret = glusterd_snap_remove (dict, snap, remove_lvm, _gf_false, +                                    _gf_false);          if (ret) {                  gf_msg (this->name, GF_LOG_ERROR, 0,                          GD_MSG_SNAP_REMOVE_FAIL, diff --git a/xlators/mgmt/glusterd/src/glusterd-snapshot.c b/xlators/mgmt/glusterd/src/glusterd-snapshot.c index 19c1f439704..0760a06b9cb 100644 --- a/xlators/mgmt/glusterd/src/glusterd-snapshot.c +++ b/xlators/mgmt/glusterd/src/glusterd-snapshot.c @@ -3115,7 +3115,8 @@ int32_t  glusterd_snap_remove (dict_t *rsp_dict,                        glusterd_snap_t *snap,                        gf_boolean_t remove_lvm, -                      gf_boolean_t force) +                      gf_boolean_t force, +                      gf_boolean_t is_clone)  {          int                 ret       = -1;          int                 save_ret  =  0; @@ -3150,14 +3151,20 @@ glusterd_snap_remove (dict_t *rsp_dict,                  }          } -        ret = glusterd_store_delete_snap (snap); -        if (ret) { -                gf_msg(this->name, GF_LOG_WARNING, 0, -                       GD_MSG_SNAP_REMOVE_FAIL, "Failed to remove snap %s " -                       "from store", snap->snapname); -                save_ret = ret; -                if (!force) -                        goto out; +        /* A clone does not persist snap info in /var/lib/glusterd/snaps/ * +         * and hence there is no snap info to be deleted from there       * +         */ +        if (!is_clone) { +                ret = glusterd_store_delete_snap (snap); +                if (ret) { +                        gf_msg(this->name, GF_LOG_WARNING, 0, +                               GD_MSG_SNAP_REMOVE_FAIL, +                               "Failed to remove snap %s from store", +                               snap->snapname); +                        save_ret = ret; +                        if (!force) +                                goto out; +                }          }          ret = glusterd_snapobject_delete (snap); @@ -4558,7 +4565,8 @@ out:          if (ret) {                  if (snap)                          glusterd_snap_remove (rsp_dict, snap, -                                              _gf_true, _gf_true); +                                              _gf_true, _gf_true, +                                              _gf_false);                  snap = NULL;          } @@ -6135,7 +6143,8 @@ glusterd_snapshot_remove_commit (dict_t *dict, char **op_errstr,                  }          } -        ret = glusterd_snap_remove (rsp_dict, snap, _gf_true, _gf_false); +        ret = glusterd_snap_remove (rsp_dict, snap, _gf_true, _gf_false, +                                    _gf_false);          if (ret) {                  gf_msg (this->name, GF_LOG_ERROR, 0,                          GD_MSG_SNAP_REMOVE_FAIL, "Failed to remove snap %s", @@ -6207,7 +6216,8 @@ glusterd_do_snap_cleanup (dict_t *dict, char **op_errstr, dict_t *rsp_dict)                  goto out;          } -        ret = glusterd_snap_remove (rsp_dict, snap, _gf_true, _gf_true); +        ret = glusterd_snap_remove (rsp_dict, snap, _gf_true, _gf_true, +                                    _gf_false);          if (ret) {                  /* Ignore failure as this is a cleanup of half cooked                     snapshot */ @@ -6497,7 +6507,7 @@ out:          if (ret) {                  if (snap)                          glusterd_snap_remove (rsp_dict, snap, -                                              _gf_true, _gf_true); +                                              _gf_true, _gf_true, _gf_true);                  snap = NULL;          } @@ -6633,7 +6643,8 @@ out:         if (ret) {                 if (snap)                         glusterd_snap_remove (rsp_dict, snap, -                                             _gf_true, _gf_true); +                                             _gf_true, _gf_true, +                                             _gf_true);                 snap = NULL;         } @@ -6831,7 +6842,8 @@ out:          if (ret) {                  if (snap)                          glusterd_snap_remove (rsp_dict, snap, -                                              _gf_true, _gf_true); +                                              _gf_true, _gf_true, +                                              _gf_false);                  snap = NULL;          } @@ -7876,7 +7888,8 @@ glusterd_handle_snap_limit (dict_t *dict, dict_t *rsp_dict)                          }                          ret = glusterd_snap_remove (rsp_dict, snap, -                                                    _gf_true, _gf_true); +                                                    _gf_true, _gf_true, +                                                    _gf_false);                          if (ret)                                  gf_msg (this->name, GF_LOG_WARNING, 0,                                          GD_MSG_SNAP_REMOVE_FAIL, @@ -7912,27 +7925,6 @@ glusterd_snapshot_clone_postvalidate (dict_t *dict, int32_t op_ret,          priv = this->private;          GF_ASSERT (priv); -        if (op_ret) { -                ret = dict_get_int32 (dict, "cleanup", &cleanup); -                if (!ret && cleanup) { -                        ret = glusterd_do_snap_cleanup (dict, op_errstr, -                                                        rsp_dict); -                        if (ret) { -                                gf_msg (this->name, GF_LOG_WARNING, 0, -                                        GD_MSG_SNAP_CLEANUP_FAIL, "cleanup " -                                        "operation failed"); -                                goto out; -                        } -                } -                /* Irrespective of status of cleanup its better -                 * to return from this function. As the functions -                 * following this block is not required to be -                 * executed in case of failure scenario. -                 */ -                ret = 0; -                goto out; -        } -          ret = dict_get_str (dict, "clonename", &clonename);          if (ret) {                  gf_msg (this->name, GF_LOG_ERROR, 0, @@ -7949,16 +7941,29 @@ glusterd_snapshot_clone_postvalidate (dict_t *dict, int32_t op_ret,                  goto out;          } -        ret = glusterd_snapshot_update_snaps_post_validate (dict, -                                                            op_errstr, -                                                            rsp_dict); -        if (ret) { -                gf_msg (this->name, GF_LOG_ERROR, 0, -                        GD_MSG_SNAP_CREATION_FAIL, "Failed to " -                        "create snapshot"); +        if (snap_vol) +                snap = snap_vol->snapshot; + +        /* Fetch snap object from snap_vol and delete it all in case of * +         * a failure, or else, just delete the snap object as it is not * +         * needed in case of a clone                                    * +         */ +        if (op_ret) { +                ret = dict_get_int32 (dict, "cleanup", &cleanup); +                if (!ret && cleanup && snap) { +                        glusterd_snap_remove (rsp_dict, snap, +                                              _gf_true, _gf_true, +                                              _gf_true); +                } +                /* Irrespective of status of cleanup its better +                 * to return from this function. As the functions +                 * following this block is not required to be +                 * executed in case of failure scenario. +                 */ +                ret = 0;                  goto out;          } -        snap = snap_vol->snapshot; +          ret = glusterd_snapobject_delete (snap);          if (ret) {                  gf_msg (this->name, GF_LOG_WARNING, 0, @@ -8506,7 +8511,8 @@ glusterd_snapshot_restore_cleanup (dict_t *rsp_dict,                    volname);          /* Now delete the snap entry. */ -        ret = glusterd_snap_remove (rsp_dict, snap, _gf_false, _gf_true); +        ret = glusterd_snap_remove (rsp_dict, snap, _gf_false, _gf_true, +                                    _gf_false);          if (ret) {                  gf_msg (this->name, GF_LOG_WARNING, 0,                          GD_MSG_SNAP_REMOVE_FAIL, "Failed to delete " diff --git a/xlators/mgmt/glusterd/src/glusterd-store.c b/xlators/mgmt/glusterd/src/glusterd-store.c index 0b947287e97..28f3cf994ed 100644 --- a/xlators/mgmt/glusterd/src/glusterd-store.c +++ b/xlators/mgmt/glusterd/src/glusterd-store.c @@ -4200,7 +4200,8 @@ glusterd_snap_cleanup (xlator_t  *this)                          }                  } else if (snap->snap_status != GD_SNAP_STATUS_IN_USE) {                          ret = glusterd_snap_remove (dict, snap, -                                                    _gf_true, _gf_true); +                                                    _gf_true, _gf_true, +                                                    _gf_false);                          if (ret) {                                  gf_msg (this->name, GF_LOG_ERROR, 0,                                          GD_MSG_SNAP_REMOVE_FAIL, diff --git a/xlators/mgmt/glusterd/src/glusterd.h b/xlators/mgmt/glusterd/src/glusterd.h index b6836fbadf8..aabfb2bc0bf 100644 --- a/xlators/mgmt/glusterd/src/glusterd.h +++ b/xlators/mgmt/glusterd/src/glusterd.h @@ -1119,7 +1119,8 @@ glusterd_build_snap_device_path (char *device, char *snapname,  int32_t  glusterd_snap_remove (dict_t *rsp_dict, glusterd_snap_t *snap, -                      gf_boolean_t remove_lvm, gf_boolean_t force); +                      gf_boolean_t remove_lvm, gf_boolean_t force, +                      gf_boolean_t is_clone);  int32_t  glusterd_snapshot_cleanup (dict_t *dict, char **op_errstr, dict_t *rsp_dict);  | 
