From 08c555680d4aa0ec800ce617fdb119e83f9cd1f8 Mon Sep 17 00:00:00 2001 From: Krutika Dhananjay Date: Wed, 4 Sep 2013 16:07:08 +0530 Subject: glusterd: add quota conf to probe payload also fix FILE* leak in cli Original-author: Krishnan Parthasarathi Change-Id: Icb9b58ef065ce1a150d98b4c26bbcddeeb390e44 Signed-off-by: Krutika Dhananjay --- xlators/mgmt/glusterd/src/glusterd-utils.c | 140 +++++++++++++++++++++++++++++ 1 file changed, 140 insertions(+) (limited to 'xlators/mgmt/glusterd/src/glusterd-utils.c') diff --git a/xlators/mgmt/glusterd/src/glusterd-utils.c b/xlators/mgmt/glusterd/src/glusterd-utils.c index bb6bcf83..000a6b10 100644 --- a/xlators/mgmt/glusterd/src/glusterd-utils.c +++ b/xlators/mgmt/glusterd/src/glusterd-utils.c @@ -1929,6 +1929,62 @@ out: return ret; } +int +glusterd_vol_add_quota_conf_to_dict (glusterd_volinfo_t *volinfo, dict_t* load, + int vol_idx) +{ + FILE *fp = NULL; + char *gfid_str = NULL; + char buf[256] = {0}; + char key[PATH_MAX] = {0}; + int gfid_idx = 0; + int ret = -1; + + ret = glusterd_store_create_quota_conf_sh_on_absence (volinfo); + if (ret) + goto out; + + fp = fopen (volinfo->quota_conf_shandle->path, "r"); + if (!fp) { + ret = -1; + goto out; + } + + gfid_idx = 0; + while (fscanf (fp, "%s", buf) != EOF) { + + gfid_str = gf_strdup (buf); + if (!gfid_str) { + ret = -1; + goto out; + } + + snprintf (key, sizeof(key)-1, "volume%d.gfid%d", vol_idx, + gfid_idx); + key[sizeof(key)-1] = '\0'; + ret = dict_set_dynstr (load, key, gfid_str); + if (ret) { + goto out; + } + + gfid_str = NULL; + gfid_idx++; + } + + snprintf (key, sizeof(key)-1, "volume%d.gfid-count", vol_idx); + key[sizeof(key)-1] = '\0'; + ret = dict_set_int32 (load, key, gfid_idx); + if (ret) + goto out; + + ret = 0; +out: + if (fp) + fclose (fp); + GF_FREE (gfid_str); + return ret; +} + int32_t glusterd_build_volume_dict (dict_t **vols) { @@ -1951,6 +2007,11 @@ glusterd_build_volume_dict (dict_t **vols) ret = glusterd_add_volume_to_dict (volinfo, dict, count); if (ret) goto out; + if (!glusterd_is_volume_quota_enabled (volinfo)) + continue; + ret = glusterd_vol_add_quota_conf_to_dict (volinfo, dict, count); + if (ret) + goto out; } @@ -2492,6 +2553,80 @@ out: return ret; } +static int +glusterd_import_quota_conf (dict_t *vols, int vol_idx, + glusterd_volinfo_t *new_volinfo) +{ + int gfid_idx = 0; + int gfid_count = 0; + int ret = -1; + int fd = -1; + FILE *tmp_fp = NULL; + char key[PATH_MAX] = {0}; + char *gfid_str = NULL; + + if (!glusterd_is_volume_quota_enabled (new_volinfo)) + return 0; + + ret = glusterd_store_create_quota_conf_sh_on_absence (new_volinfo); + if (ret) + goto out; + + fd = gf_store_mkstemp (new_volinfo->quota_conf_shandle); + if (fd < 0) { + ret = -1; + goto out; + } + tmp_fp = fdopen (fd, "r+"); + if (!tmp_fp) { + ret = -1; + goto out; + } + + snprintf (key, sizeof (key)-1, "volume%d.gfid-count", vol_idx); + key[sizeof(key)-1] = '\0'; + ret = dict_get_int32 (vols, key, &gfid_count); + if (ret) + goto out; + + gfid_idx = 0; + for (gfid_idx = 0; gfid_idx < gfid_count; gfid_idx++) { + + snprintf (key, sizeof (key)-1, "volume%d.gfid%d", + vol_idx, gfid_idx); + key[sizeof(key)-1] = '\0'; + ret = dict_get_str (vols, key, &gfid_str); + if (ret) + goto out; + + ret = fprintf (tmp_fp, "%s\n", gfid_str); + if (ret < 0) { + goto out; + } + + } + + ret = gf_store_rename_tmppath (new_volinfo->quota_conf_shandle); + +out: + if (tmp_fp) { + fclose (tmp_fp); + + } else if (fd >= 0) { + close (fd); + + } + + if (ret && (fd > 0)) { + gf_store_unlink_tmppath (new_volinfo->quota_conf_shandle); + (void) gf_store_handle_destroy + (new_volinfo->quota_conf_shandle); + new_volinfo->quota_conf_shandle = NULL; + } + + return ret; +} + int32_t glusterd_import_volinfo (dict_t *vols, int count, glusterd_volinfo_t **volinfo) @@ -2737,6 +2872,7 @@ glusterd_import_volinfo (dict_t *vols, int count, ret = glusterd_import_bricks (vols, count, new_volinfo); if (ret) goto out; + *volinfo = new_volinfo; out: if (msg[0]) @@ -2908,6 +3044,10 @@ glusterd_import_friend_volume (dict_t *vols, size_t count) if (ret) goto out; + ret = glusterd_import_quota_conf (vols, count, new_volinfo); + if (ret) + goto out; + list_add_tail (&new_volinfo->vol_list, &priv->volumes); out: gf_log ("", GF_LOG_DEBUG, "Returning with ret: %d", ret); -- cgit