diff options
Diffstat (limited to 'xlators/mgmt/glusterd/src/glusterd-snapshot.c')
-rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-snapshot.c | 362 |
1 files changed, 10 insertions, 352 deletions
diff --git a/xlators/mgmt/glusterd/src/glusterd-snapshot.c b/xlators/mgmt/glusterd/src/glusterd-snapshot.c index 9552c9367..7434b7abd 100644 --- a/xlators/mgmt/glusterd/src/glusterd-snapshot.c +++ b/xlators/mgmt/glusterd/src/glusterd-snapshot.c @@ -46,8 +46,7 @@ char snap_mount_folder[PATH_MAX]; -/* This function will restore a snapshot for the entire - * volume or the entire CG (Consistency Group) +/* This function will restore a snapshot volumes * * @param dict dictionary containing snapshot restore request * @param op_errstr In case of any failure error message will be returned @@ -125,9 +124,8 @@ out: return ret; } -/* This function is called before actual restore is taken place. This - * function will validate whether the volume or CG is ready to be restored - * or not. +/* This function is called before actual restore is taken place. This function + * will validate whether the snapshot volumes are ready to be restored or not. * * @param dict dictionary containing snapshot restore request * @param op_errstr In case of any failure error message will be returned @@ -143,12 +141,12 @@ glusterd_snapshot_restore_prevalidate (dict_t *dict, char **op_errstr, int32_t i = 0; int32_t volcount = 0; gf_boolean_t snap_restored = _gf_false; + char key[PATH_MAX] = {0, }; char *volname = NULL; char *snapname = NULL; glusterd_volinfo_t *volinfo = NULL; glusterd_snap_t *snap = NULL; xlator_t *this = NULL; - char key[PATH_MAX] = {0, }; this = THIS; @@ -204,24 +202,21 @@ glusterd_snapshot_restore_prevalidate (dict_t *dict, char **op_errstr, } /* Snapshot restore will only work if the volume is stopped. - * If volume is running then snapshot restore will fail. In - * case of CG if any of the volume in the CG is running then - * snapshot restore for the entire CG will fail + * If volume is running then snapshot restore will fail. */ - for (i = 0; i < volcount; ++i) { - /* TODO: Start the index from 0 when Jarvis code is fixed */ - snprintf (key, sizeof (key), "volname%d", i+1); + for (i = 1; i <= volcount; ++i) { + snprintf (key, sizeof (key), "volname%d", i); ret = dict_get_str (dict, key, &volname); if (ret) { gf_log (this->name, GF_LOG_ERROR, "Failed to " - "get volume name"); + "get volume name"); goto out; } ret = glusterd_volinfo_find (volname, &volinfo); if (ret) { ret = gf_asprintf (op_errstr, "Volume (%s) not found", - volname); + volname); if (ret < 0) { goto out; } @@ -233,8 +228,7 @@ glusterd_snapshot_restore_prevalidate (dict_t *dict, char **op_errstr, if (glusterd_is_volume_started (volinfo)) { ret = gf_asprintf (op_errstr, "Volume (%s) has been " "started. Volume needs to be stopped before restoring " - "a snapshot.", - volname); + "a snapshot.", volname); if (ret < 0) { goto out; } @@ -242,7 +236,6 @@ glusterd_snapshot_restore_prevalidate (dict_t *dict, char **op_errstr, ret = -1; goto out; } - } ret = 0; @@ -792,31 +785,6 @@ glusterd_new_snap_object() }; -glusterd_snap_cg_t* -glusterd_new_snap_cg_object(int64_t volume_count) -{ - glusterd_snap_cg_t *cg = NULL; - glusterd_volinfo_t *volinfo = NULL; - - if (volume_count < 0) { - gf_log (THIS->name, GF_LOG_ERROR, "Volume count < 0"); - return NULL; - } - - cg = GF_CALLOC (1, (sizeof (*cg) + - (volume_count * sizeof (volinfo))), - gf_gld_mt_snap_cg_t); - - if (cg) { - LOCK_INIT (&cg->lock); - INIT_LIST_HEAD (&cg->cg_list); - cg->cg_status = GD_SNAP_STATUS_INIT; - cg->volume_count = volume_count; - } - - return cg; -} - /* Function glusterd_list_add_snapvol adds the volinfo object (snapshot volume) to the snapshot object list and to the parent volume list */ int32_t @@ -903,120 +871,6 @@ out: return snap; } -// Big lock should already acquired before this is called -int32_t -glusterd_add_snap_cg (glusterd_conf_t *conf, glusterd_snap_cg_t *cg) -{ - int ret = -1; - uint64_t count = -1; - glusterd_snap_cg_t *entry = NULL; - glusterd_snap_cg_t *last = NULL; - glusterd_snap_cg_t *tmp = NULL; - - GF_VALIDATE_OR_GOTO (THIS->name, conf, out); - GF_VALIDATE_OR_GOTO (THIS->name, cg, out); - - list_for_each_entry_safe (entry, tmp, &conf->snap_cg, cg_list) { - count++; - if (!strcmp (entry->cg_name, cg->cg_name) || - !uuid_compare (entry->cg_id, cg->cg_id)) { - gf_log (THIS->name, GF_LOG_ERROR, "Found duplicate " - "CG %s(%s)", entry->cg_name, - uuid_utoa(entry->cg_id)); - goto out; - } - last = entry; - } - list_add_tail (&cg->cg_list, &conf->snap_cg); - - gf_log (THIS->name, GF_LOG_DEBUG, "Added CG %s (%s) @ %"PRIu64, - cg->cg_name, uuid_utoa(cg->cg_id), count); - ret = 0; -out: - gf_log ("", GF_LOG_TRACE, "Returning %d", ret); - return ret; -} - -glusterd_snap_cg_t* -glusterd_find_snap_cg_by_name (glusterd_conf_t *conf, char *cg_name) -{ - glusterd_snap_cg_t *entry = NULL; - glusterd_snap_cg_t *dup = NULL; - glusterd_snap_cg_t *tmp = NULL; - - GF_VALIDATE_OR_GOTO (THIS->name, conf, out); - GF_VALIDATE_OR_GOTO (THIS->name, cg_name, out); - - list_for_each_entry_safe (entry, tmp, &conf->snap_cg, cg_list) { - if (!strcmp (entry->cg_name, cg_name)) { - gf_log (THIS->name, GF_LOG_DEBUG, "Found CG %s(%s)", - entry->cg_name, uuid_utoa(entry->cg_id)); - dup = entry; - break; - } - } -out: - return dup; -} - -glusterd_snap_cg_t* -glusterd_find_snap_cg_by_id (glusterd_conf_t *conf, uuid_t cg_id) -{ - glusterd_snap_cg_t *entry = NULL; - glusterd_snap_cg_t *dup = NULL; - glusterd_snap_cg_t *tmp = NULL; - - GF_VALIDATE_OR_GOTO (THIS->name, conf, out); - if (uuid_is_null (cg_id)) - goto out; - - list_for_each_entry_safe (entry, tmp, &conf->snap_cg, cg_list) { - if (!uuid_compare (entry->cg_id, cg_id)) { - gf_log (THIS->name, GF_LOG_DEBUG, "Found CG %s(%s)", - entry->cg_name, uuid_utoa(entry->cg_id)); - dup = entry; - break; - } - } -out: - return dup; -} - -glusterd_snap_cg_t* -glusterd_remove_snap_cg_by_name (glusterd_conf_t *conf, char *cg_name) -{ - glusterd_snap_cg_t *entry = NULL; - - GF_VALIDATE_OR_GOTO (THIS->name, conf, out); - GF_VALIDATE_OR_GOTO (THIS->name, cg_name, out); - - entry = glusterd_find_snap_cg_by_name(conf, cg_name); - if (entry) { - entry->cg_status = GD_SNAP_STATUS_DECOMMISSION; - list_del_init (&entry->cg_list); - } -out: - return entry; -} - -glusterd_snap_cg_t* -glusterd_remove_snap_cg_by_id (glusterd_conf_t *conf, uuid_t cg_id) -{ - glusterd_snap_cg_t *entry = NULL; - - GF_VALIDATE_OR_GOTO (THIS->name, conf, out); - if (uuid_is_null (cg_id)) - goto out; - - entry = glusterd_find_snap_cg_by_id (conf, cg_id); - if (entry) { - entry->cg_status = GD_SNAP_STATUS_DECOMMISSION; - list_del_init (&entry->cg_list); - } -out: - return entry; -} - int glusterd_do_lvm_snapshot_remove (glusterd_volinfo_t *snap_vol, glusterd_brickinfo_t *brickinfo, @@ -2056,142 +1910,6 @@ out: return ret; } -/* TODO: This function needs a revisit. - * - * As of now only one snap is supported per CG. This function will - * retrieve the snap name which bleongs to the CG and put it in the - * dictionary. - * - * @param dict dictionary containing snapshot restore request - * @param cg CG object. - * in this variable - * @return Negative value on Failure and 0 in success - */ -int -glusterd_get_cg_snap_name_lk (dict_t *dict, glusterd_snap_cg_t *cg) -{ - int ret = -1; - uint64_t snap_count = 0; - char *snapname = NULL; - glusterd_snap_t *snap = NULL; - xlator_t *this = NULL; - glusterd_volinfo_t *volinfo = NULL; - - this = THIS; - - GF_ASSERT (this); - GF_ASSERT (dict); - GF_ASSERT (cg); - /* CG should have at least one volume*/ - GF_ASSERT (cg->volume_count > 0); - - /* TODO: As of now only one snap is supported per CG When CG - * management module comes in then this restriction can be removed. - */ - - /* TODO: As of now, consistency group can be created out of some volumes, - even though the volumes already have snapshots taken. But the - future plan is to have consistency group where past or future - individual snapshots are not allowed. So this below check - of snap count of the first volume of the CG to 1, is in accordance - with that. - */ - volinfo = cg->volumes[0]; - snap_count = volinfo->snap_count; - if (1 != snap_count) { - gf_log (this->name, GF_LOG_ERROR, "More than one snap is " - "associated with the cg (%s)", cg->cg_name); - ret = -1; - goto out; - } - - //snap = glusterd_find_snap_by_index (volinfo, 0); - if (NULL == snap) { - gf_log (this->name, GF_LOG_ERROR, "Failed to get snap for " - "%s CG", cg->cg_name); - ret = -1; - goto out; - } - - snapname = gf_strdup (snap->snapname); - if (NULL == snapname) { - ret = -1; - goto out; - } - - ret = dict_set_dynstr (dict, "snapname", snapname); - if (ret) { - GF_FREE (snapname); - gf_log (this->name, GF_LOG_ERROR, "Failed to " - "set snap name"); - goto out; - } - -out: - return ret; -} - -/* This is a helper function will get all the volume names present in CG - * and write into dictionary. - * - * @param dict dictionary where volume names should be written - * @param cg CG object. - * in this variable - * @return Negative value on Failure and 0 in success - */ -int -glusterd_get_cg_volume_names_lk (dict_t *dict, glusterd_snap_cg_t *cg) -{ - int ret = -1; - int64_t i = 0; - char *volname = NULL; - xlator_t *this = NULL; - char key[PATH_MAX] = {0,}; - glusterd_volinfo_t *volinfo = NULL; - - this = THIS; - - GF_ASSERT (this); - GF_ASSERT (dict); - GF_ASSERT (cg); - - ret = dict_set_int64 (dict, "volcount", cg->volume_count); - if (ret) { - gf_log (this->name, GF_LOG_ERROR, "Failed to " - "set volume count"); - goto out; - } - - /* Set volume name of all the volumes present in CG in dict so that - * Jarvis can use this to acquire mgmt_v3 locks on all the volume - * present in the CG. - */ - for (i = 0; i < cg->volume_count; ++i) { - volinfo = cg->volumes[i]; - /* TODO: When Jarvis framework is fixed change the index - * to start from 0 instead of 1 - */ - snprintf (key, sizeof (key), "volname%ld", i+1); - volname = gf_strdup (volinfo->volname); - if (NULL == volname) { - ret = -1; - goto out; - } - - ret = dict_set_dynstr (dict, key, volname); - if (ret) { - gf_log (this->name, GF_LOG_ERROR, - "Failed to set volname"); - GF_FREE (volname); - volname = NULL; - goto out; - } - } - ret = 0; -out: - return ret; -} - /* This is a snapshot create handler function. This function will be * executed in the originator node. This function is responsible for * calling mgmt_v3 framework to do the actual snap creation on all the bricks @@ -2593,29 +2311,6 @@ out: return ret; } -int32_t -glusterd_cg_delete (glusterd_snap_cg_t *cg) -{ - int32_t ret = -1; - xlator_t *this = NULL; - - this = THIS; - GF_ASSERT (this); - - if (!cg) { - gf_log (this->name, GF_LOG_WARNING, "consistency group is " - "NULL"); - goto out; - } - - GF_FREE (cg->description); - GF_FREE (cg); - ret = 0; - -out: - return ret; -} - glusterd_snap_t* glusterd_create_snap_object (dict_t *dict) { @@ -3376,43 +3071,6 @@ out: return ret; } -char * -glusterd_get_snap_from_cg (glusterd_volinfo_t *volinfo, glusterd_snap_cg_t *cg) -{ - char *snap_name = NULL; - glusterd_snap_t *tmp_snap = NULL; - glusterd_snap_t *snap = NULL; - glusterd_conf_t *priv = NULL; - xlator_t *this = NULL; - - this = THIS; - priv = this->private; - GF_ASSERT (priv); - - if (!volinfo) { - gf_log (this->name, GF_LOG_WARNING, "volinfo NULL"); - goto out; - } - - if (!cg) { - gf_log (this->name, GF_LOG_WARNING, "consistency group NULL"); - goto out; - } - - list_for_each_entry (tmp_snap, &priv->snapshots, snap_list) { - if ((!uuid_is_null (tmp_snap->cg_id)) && - (uuid_compare (tmp_snap->cg_id, cg->cg_id) == 0)) { - snap = tmp_snap; - break; - } - } - - if (snap) - snap_name = gf_strdup (snap->snapname); -out: - return snap_name; -} - int glusterd_snapshot_status_prevalidate (dict_t *dict, char **op_errstr, dict_t *rsp_dict) |