diff options
-rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-snapshot-utils.c | 185 | ||||
-rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-snapshot-utils.h | 7 | ||||
-rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-snapshot.c | 20 | ||||
-rw-r--r-- | xlators/mgmt/glusterd/src/glusterd.h | 1 |
4 files changed, 213 insertions, 0 deletions
diff --git a/xlators/mgmt/glusterd/src/glusterd-snapshot-utils.c b/xlators/mgmt/glusterd/src/glusterd-snapshot-utils.c index 13cc1a7785a..ccb9e7c17bc 100644 --- a/xlators/mgmt/glusterd/src/glusterd-snapshot-utils.c +++ b/xlators/mgmt/glusterd/src/glusterd-snapshot-utils.c @@ -3489,6 +3489,135 @@ out: } +/* * + * Here there are two possibilities, either destination is snaphot or + * clone. In the case of snapshot nfs_ganesha export file will be copied + * to snapdir. If it is clone , then new export file will be created for + * the clone in the GANESHA_EXPORT_DIRECTORY, replacing occurences of + * volname with clonename + */ +int +glusterd_copy_nfs_ganesha_file (glusterd_volinfo_t *src_vol, + glusterd_volinfo_t *dest_vol) +{ + + int32_t ret = -1; + char snap_dir[PATH_MAX] = ""; + char src_path[PATH_MAX] = ""; + char dest_path[PATH_MAX] = ""; + char buffer[BUFSIZ] = ""; + char *find_ptr = NULL; + char *buff_ptr = NULL; + char *tmp_ptr = NULL; + xlator_t *this = NULL; + glusterd_conf_t *priv = NULL; + struct stat stbuf = {0,}; + FILE *src = NULL; + FILE *dest = NULL; + + + this = THIS; + GF_VALIDATE_OR_GOTO ("snapshot", this, out); + priv = this->private; + GF_VALIDATE_OR_GOTO (this->name, priv, out); + + GF_VALIDATE_OR_GOTO (this->name, src_vol, out); + GF_VALIDATE_OR_GOTO (this->name, dest_vol, out); + + if (src_vol->is_snap_volume) { + GLUSTERD_GET_SNAP_DIR (snap_dir, src_vol->snapshot, priv); + ret = snprintf (src_path, sizeof (src_path), + "%s/export.%s.conf", snap_dir, + src_vol->snapshot->snapname); + } else { + ret = snprintf (src_path, sizeof (src_path), + "%s/export.%s.conf", GANESHA_EXPORT_DIRECTORY, + src_vol->volname); + if (ret < 0) + goto out; + } + + ret = lstat (src_path, &stbuf); + if (ret) { + /* * + * If export file is not present, volume is not exported + * via ganesha. So it is not necessary to copy that during + * snapshot. + */ + if (errno == ENOENT) { + ret = 0; + gf_msg_debug (this->name, 0, "%s not found", src_path); + } else + gf_msg (this->name, GF_LOG_WARNING, errno, + GD_MSG_FILE_OP_FAILED, + "Stat on %s failed with %s", + src_path, strerror (errno)); + goto out; + } + + if (dest_vol->is_snap_volume) { + memset (snap_dir, 0 , PATH_MAX); + GLUSTERD_GET_SNAP_DIR (snap_dir, dest_vol->snapshot, priv); + ret = snprintf (dest_path, sizeof (dest_path), + "%s/export.%s.conf", snap_dir, + dest_vol->snapshot->snapname); + if (ret < 0) + goto out; + + ret = glusterd_copy_file (src_path, dest_path); + if (ret) { + gf_msg (this->name, GF_LOG_ERROR, ENOMEM, + GD_MSG_NO_MEMORY, "Failed to copy %s in %s", + src_path, dest_path); + goto out; + } + + } else { + ret = snprintf (dest_path, sizeof (dest_path), + "%s/export.%s.conf", GANESHA_EXPORT_DIRECTORY, + dest_vol->volname); + if (ret < 0) + goto out; + + src = fopen (src_path, "r"); + dest = fopen (dest_path, "w"); + + /* * + * if the source volume is snapshot, the export conf file + * consists of orginal volname + */ + if (src_vol->is_snap_volume) + find_ptr = gf_strdup (src_vol->parent_volname); + else + find_ptr = gf_strdup (src_vol->volname); + + if (!find_ptr) + goto out; + + /* Replacing volname with clonename */ + while (fgets(buffer, BUFSIZ, src)) { + buff_ptr = buffer; + while ((tmp_ptr = strstr(buff_ptr, find_ptr))) { + while (buff_ptr < tmp_ptr) + fputc((int)*buff_ptr++, dest); + fputs(dest_vol->volname, dest); + buff_ptr += strlen(find_ptr); + } + fputs(buff_ptr, dest); + memset (buffer, 0, BUFSIZ); + } + } +out: + if (src) + fclose (src); + if (dest) + fclose (dest); + if (find_ptr) + GF_FREE(find_ptr); + + return ret; +} + int32_t glusterd_restore_geo_rep_files (glusterd_volinfo_t *snap_vol) { @@ -3579,6 +3708,62 @@ out: return ret; } +int +glusterd_restore_nfs_ganesha_file (glusterd_volinfo_t *src_vol, + glusterd_snap_t *snap) +{ + + int32_t ret = -1; + char snap_dir[PATH_MAX] = ""; + char src_path[PATH_MAX] = ""; + char dest_path[PATH_MAX] = ""; + xlator_t *this = NULL; + glusterd_conf_t *priv = NULL; + struct stat stbuf = {0,}; + + this = THIS; + GF_VALIDATE_OR_GOTO ("snapshot", this, out); + priv = this->private; + GF_VALIDATE_OR_GOTO (this->name, priv, out); + + GF_VALIDATE_OR_GOTO (this->name, src_vol, out); + GF_VALIDATE_OR_GOTO (this->name, snap, out); + + GLUSTERD_GET_SNAP_DIR (snap_dir, snap, priv); + + ret = snprintf (src_path, sizeof (src_path), "%s/export.%s.conf", + snap_dir, snap->snapname); + if (ret < 0) + goto out; + + ret = lstat (src_path, &stbuf); + if (ret) { + if (errno == ENOENT) { + ret = 0; + gf_msg_debug (this->name, 0, "%s not found", src_path); + } else + gf_msg (this->name, GF_LOG_WARNING, errno, + GD_MSG_FILE_OP_FAILED, + "Stat on %s failed with %s", + src_path, strerror (errno)); + goto out; + } + + ret = snprintf (dest_path, sizeof (dest_path), "%s/export.%s.conf", + GANESHA_EXPORT_DIRECTORY, src_vol->volname); + if (ret < 0) + goto out; + + ret = glusterd_copy_file (src_path, dest_path); + if (ret) + gf_msg (this->name, GF_LOG_ERROR, ENOMEM, + GD_MSG_NO_MEMORY, "Failed to copy %s in %s", + src_path, dest_path); + +out: + return ret; + +} /* Snapd functions */ int glusterd_is_snapd_enabled (glusterd_volinfo_t *volinfo) diff --git a/xlators/mgmt/glusterd/src/glusterd-snapshot-utils.h b/xlators/mgmt/glusterd/src/glusterd-snapshot-utils.h index 63d39e868fb..c0e7e8e218d 100644 --- a/xlators/mgmt/glusterd/src/glusterd-snapshot-utils.h +++ b/xlators/mgmt/glusterd/src/glusterd-snapshot-utils.h @@ -99,12 +99,19 @@ glusterd_get_geo_rep_session (char *slave_key, char *origin_volname, int32_t glusterd_restore_geo_rep_files (glusterd_volinfo_t *snap_vol); +int +glusterd_restore_nfs_ganesha_file (glusterd_volinfo_t *src_vol, + glusterd_snap_t *snap); int32_t glusterd_copy_quota_files (glusterd_volinfo_t *src_vol, glusterd_volinfo_t *dest_vol, gf_boolean_t *conf_present); int +glusterd_copy_nfs_ganesha_file (glusterd_volinfo_t *src_vol, + glusterd_volinfo_t *dest_vol); + +int glusterd_snap_use_rsp_dict (dict_t *aggr, dict_t *rsp_dict); int diff --git a/xlators/mgmt/glusterd/src/glusterd-snapshot.c b/xlators/mgmt/glusterd/src/glusterd-snapshot.c index e75e5722138..272d497f418 100644 --- a/xlators/mgmt/glusterd/src/glusterd-snapshot.c +++ b/xlators/mgmt/glusterd/src/glusterd-snapshot.c @@ -5241,6 +5241,16 @@ glusterd_do_snap_vol (glusterd_volinfo_t *origin_vol, glusterd_snap_t *snap, origin_vol->volname); goto out; } + + + } + + ret = glusterd_copy_nfs_ganesha_file (origin_vol, snap_vol); + if (ret < 0) { + gf_msg (this->name, GF_LOG_ERROR, 0, + GD_MSG_VOL_OP_FAILED, "Failed to copy export " + "file for volume %s", origin_vol->volname); + goto out; } glusterd_auth_set_username (snap_vol, username); glusterd_auth_set_password (snap_vol, password); @@ -9629,6 +9639,16 @@ gd_restore_snap_volume (dict_t *dict, dict_t *rsp_dict, snap_vol->snapshot->snapname); } + ret = glusterd_restore_nfs_ganesha_file (orig_vol, snap); + if (ret) { + gf_msg (this->name, GF_LOG_WARNING, 0, + GD_MSG_SNAP_RESTORE_FAIL, + "Failed to restore " + "nfs-ganesha export file for snap %s", + snap_vol->snapshot->snapname); + goto out; + } + ret = glusterd_copy_quota_files (snap_vol, orig_vol, &conf_present); if (ret) { gf_msg (this->name, GF_LOG_ERROR, 0, diff --git a/xlators/mgmt/glusterd/src/glusterd.h b/xlators/mgmt/glusterd/src/glusterd.h index 7dbe96b6d83..2c0012c0399 100644 --- a/xlators/mgmt/glusterd/src/glusterd.h +++ b/xlators/mgmt/glusterd/src/glusterd.h @@ -51,6 +51,7 @@ #define GLUSTERD_SHARED_STORAGE_KEY "cluster.enable-shared-storage" #define GANESHA_HA_CONF CONFDIR "/ganesha-ha.conf" +#define GANESHA_EXPORT_DIRECTORY CONFDIR"/exports" #define GLUSTERD_SNAPS_MAX_HARD_LIMIT 256 #define GLUSTERD_SNAPS_DEF_SOFT_LIMIT_PERCENT 90 #define GLUSTERD_SNAPS_MAX_SOFT_LIMIT_PERCENT 100 |