summaryrefslogtreecommitdiffstats
path: root/libglusterfs/src/graph.c
diff options
context:
space:
mode:
Diffstat (limited to 'libglusterfs/src/graph.c')
-rw-r--r--libglusterfs/src/graph.c129
1 files changed, 121 insertions, 8 deletions
diff --git a/libglusterfs/src/graph.c b/libglusterfs/src/graph.c
index 11d2a0adf1e..738cd9688db 100644
--- a/libglusterfs/src/graph.c
+++ b/libglusterfs/src/graph.c
@@ -832,8 +832,70 @@ out:
* return -1(or -ve) =======> Some Internal Error occurred during the operation
*/
int
-glusterfs_volfile_reconfigure (int oldvollen, FILE *newvolfile_fp,
- glusterfs_ctx_t *ctx, const char *oldvolfile)
+glusterfs_volfile_reconfigure (FILE *newvolfile_fp, glusterfs_ctx_t *ctx)
+{
+ glusterfs_graph_t *oldvolfile_graph = NULL;
+ glusterfs_graph_t *newvolfile_graph = NULL;
+
+ int ret = -1;
+
+ if (!ctx) {
+ gf_msg ("glusterfsd-mgmt", GF_LOG_ERROR, 0, LG_MSG_CTX_NULL,
+ "ctx is NULL");
+ goto out;
+ }
+
+ oldvolfile_graph = ctx->active;
+ if (!oldvolfile_graph) {
+ ret = 1;
+ goto out;
+ }
+
+ newvolfile_graph = glusterfs_graph_construct (newvolfile_fp);
+
+ if (!newvolfile_graph) {
+ goto out;
+ }
+
+ glusterfs_graph_prepare (newvolfile_graph, ctx,
+ ctx->cmd_args.volume_name);
+
+ if (!is_graph_topology_equal (oldvolfile_graph,
+ newvolfile_graph)) {
+
+ ret = 1;
+ gf_msg_debug ("glusterfsd-mgmt", 0, "Graph topology not "
+ "equal(should call INIT)");
+ goto out;
+ }
+
+ gf_msg_debug ("glusterfsd-mgmt", 0, "Only options have changed in the"
+ " new graph");
+
+ ret = glusterfs_graph_reconfigure (oldvolfile_graph,
+ newvolfile_graph);
+ if (ret) {
+ gf_msg_debug ("glusterfsd-mgmt", 0, "Could not reconfigure "
+ "new options in old graph");
+ goto out;
+ }
+
+ ret = 0;
+out:
+
+ if (newvolfile_graph)
+ glusterfs_graph_destroy (newvolfile_graph);
+
+ return ret;
+}
+
+/* This function need to remove. This added to support gfapi volfile
+ * reconfigure.
+ */
+
+int
+gf_volfile_reconfigure (int oldvollen, FILE *newvolfile_fp,
+ glusterfs_ctx_t *ctx, const char *oldvolfile)
{
glusterfs_graph_t *oldvolfile_graph = NULL;
glusterfs_graph_t *newvolfile_graph = NULL;
@@ -855,9 +917,9 @@ glusterfs_volfile_reconfigure (int oldvollen, FILE *newvolfile_fp,
if (!ctx) {
gf_msg ("glusterfsd-mgmt", GF_LOG_ERROR, 0, LG_MSG_CTX_NULL,
- "ctx is NULL");
- goto out;
- }
+ "ctx is NULL");
+ goto out;
+ }
oldvolfile_graph = ctx->active;
if (!oldvolfile_graph) {
@@ -908,7 +970,7 @@ glusterfs_volfile_reconfigure (int oldvollen, FILE *newvolfile_fp,
goto out;
}
- glusterfs_graph_prepare (newvolfile_graph, ctx,
+ glusterfs_graph_prepare (newvolfile_graph, ctx,
ctx->cmd_args.volume_name);
if (!is_graph_topology_equal (oldvolfile_graph,
@@ -952,7 +1014,6 @@ out:
return ret;
}
-
int
glusterfs_graph_reconfigure (glusterfs_graph_t *oldgraph,
glusterfs_graph_t *newgraph)
@@ -1056,19 +1117,56 @@ glusterfs_graph_attach (glusterfs_graph_t *orig_graph, char *path,
FILE *fp;
glusterfs_graph_t *graph;
xlator_t *xl;
- char *volfile_id;
+ char *volfile_id = NULL;
+ char *volfile_content = NULL;
+ struct stat stbuf = {0,};
+ size_t file_len = -1;
+ gf_volfile_t *volfile_obj = NULL;
+ int ret = -1;
+ char sha256_hash[SHA256_DIGEST_LENGTH] = {0, };
if (!orig_graph) {
return -EINVAL;
}
+ ret = sys_stat (path, &stbuf);
+ if (ret < 0) {
+ gf_log (THIS->name, GF_LOG_ERROR, "Unable to stat %s (%s)",
+ path, strerror (errno));
+ return -EINVAL;
+ }
+
+ file_len = stbuf.st_size;
+ if (file_len) {
+ volfile_content = GF_CALLOC (file_len+1, sizeof (char),
+ gf_common_mt_char);
+ if (!volfile_content) {
+ return -ENOMEM;
+ }
+ }
+
fp = fopen (path, "r");
if (!fp) {
gf_log (THIS->name, GF_LOG_WARNING,
"oops, %s disappeared on us", path);
+ GF_FREE (volfile_content);
return -EIO;
}
+ ret = fread (volfile_content, sizeof (char), file_len, fp);
+ if (ret == file_len) {
+ glusterfs_compute_sha256 ((const unsigned char *) volfile_content,
+ file_len, sha256_hash);
+ } else {
+ gf_log (THIS->name, GF_LOG_ERROR,
+ "read failed on path %s. File size=%"GF_PRI_SIZET
+ "read size=%d", path, file_len, ret);
+ GF_FREE (volfile_content);
+ return -EIO;
+ }
+
+ GF_FREE (volfile_content);
+
graph = glusterfs_graph_construct (fp);
fclose(fp);
if (!graph) {
@@ -1117,5 +1215,20 @@ glusterfs_graph_attach (glusterfs_graph_t *orig_graph, char *path,
return -EIO;
}
+ if (!volfile_obj) {
+ volfile_obj = GF_CALLOC (1, sizeof (gf_volfile_t),
+ gf_common_volfile_t);
+ if (!volfile_obj) {
+ return -EIO;
+ }
+ }
+
+ INIT_LIST_HEAD (&volfile_obj->volfile_list);
+ snprintf (volfile_obj->vol_id, sizeof (volfile_obj->vol_id),
+ "%s", xl->volfile_id);
+ strncpy (volfile_obj->volfile_checksum, sha256_hash,
+ sizeof (volfile_obj->volfile_checksum));
+ list_add (&volfile_obj->volfile_list, &this->ctx->volfile_list);
+
return 0;
}