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.c127
1 files changed, 113 insertions, 14 deletions
diff --git a/libglusterfs/src/graph.c b/libglusterfs/src/graph.c
index 04bb92c7c75..b090f8a3554 100644
--- a/libglusterfs/src/graph.c
+++ b/libglusterfs/src/graph.c
@@ -407,13 +407,11 @@ fill_uuid (char *uuid, int size)
int
-glusterfs_graph_settop (glusterfs_graph_t *graph, glusterfs_ctx_t *ctx)
+glusterfs_graph_settop (glusterfs_graph_t *graph, glusterfs_ctx_t *ctx,
+ char *volume_name)
{
- const char *volume_name = NULL;
xlator_t *trav = NULL;
- volume_name = ctx->cmd_args.volume_name;
-
if (!volume_name) {
graph->top = graph->first;
return 0;
@@ -454,7 +452,8 @@ glusterfs_graph_parent_up (glusterfs_graph_t *graph)
int
-glusterfs_graph_prepare (glusterfs_graph_t *graph, glusterfs_ctx_t *ctx)
+glusterfs_graph_prepare (glusterfs_graph_t *graph, glusterfs_ctx_t *ctx,
+ char *volume_name)
{
xlator_t *trav = NULL;
int ret = 0;
@@ -462,12 +461,20 @@ glusterfs_graph_prepare (glusterfs_graph_t *graph, glusterfs_ctx_t *ctx)
/* XXX: CHECKSUM */
/* XXX: attach to -n volname */
- ret = glusterfs_graph_settop (graph, ctx);
+ ret = glusterfs_graph_settop (graph, ctx, volume_name);
if (ret) {
+ char *slash = rindex (volume_name, '/');
+ if (slash) {
+ ret = glusterfs_graph_settop (graph, ctx, slash + 1);
+ if (!ret) {
+ goto ok;
+ }
+ }
gf_msg ("graph", GF_LOG_ERROR, 0, LG_MSG_GRAPH_ERROR,
"glusterfs graph settop failed");
return -1;
}
+ok:
/* XXX: WORM VOLUME */
ret = glusterfs_graph_worm (graph, ctx);
@@ -749,7 +756,7 @@ xlator_equal_rec (xlator_t *xl1, xlator_t *xl2)
}
/* type could have changed even if xlator names match,
- e.g cluster/distrubte and cluster/nufa share the same
+ e.g cluster/distribute and cluster/nufa share the same
xlator name
*/
if (strcmp (xl1->type, xl2->type)) {
@@ -764,13 +771,27 @@ out :
gf_boolean_t
is_graph_topology_equal (glusterfs_graph_t *graph1, glusterfs_graph_t *graph2)
{
- xlator_t *trav1 = NULL;
- xlator_t *trav2 = NULL;
- gf_boolean_t ret = _gf_true;
+ xlator_t *trav1 = NULL;
+ xlator_t *trav2 = NULL;
+ gf_boolean_t ret = _gf_true;
+ xlator_list_t *ltrav;
trav1 = graph1->first;
trav2 = graph2->first;
+ if (strcmp (trav2->type, "protocol/server") == 0) {
+ trav2 = trav2->children->xlator;
+ for (ltrav = trav1->children; ltrav; ltrav = ltrav->next) {
+ trav1 = ltrav->xlator;
+ if (strcmp (trav1->name, trav2->name) == 0) {
+ break;
+ }
+ }
+ if (!ltrav) {
+ return _gf_false;
+ }
+ }
+
ret = xlator_equal_rec (trav1, trav2);
if (ret) {
@@ -869,7 +890,8 @@ 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,
newvolfile_graph)) {
@@ -917,8 +939,9 @@ int
glusterfs_graph_reconfigure (glusterfs_graph_t *oldgraph,
glusterfs_graph_t *newgraph)
{
- xlator_t *old_xl = NULL;
- xlator_t *new_xl = NULL;
+ xlator_t *old_xl = NULL;
+ xlator_t *new_xl = NULL;
+ xlator_list_t *trav;
GF_ASSERT (oldgraph);
GF_ASSERT (newgraph);
@@ -933,7 +956,25 @@ glusterfs_graph_reconfigure (glusterfs_graph_t *oldgraph,
new_xl = new_xl->children->xlator;
}
- return xlator_tree_reconfigure (old_xl, new_xl);
+ if (strcmp (old_xl->type, "protocol/server") != 0) {
+ return xlator_tree_reconfigure (old_xl, new_xl);
+ }
+
+ /* Some options still need to be handled by the server translator. */
+ if (old_xl->reconfigure) {
+ old_xl->reconfigure (old_xl, new_xl->options);
+ }
+
+ (void) copy_opts_to_child (new_xl, FIRST_CHILD (new_xl), "*auth*");
+ new_xl = FIRST_CHILD (new_xl);
+
+ for (trav = old_xl->children; trav; trav = trav->next) {
+ if (strcmp (trav->xlator->name, new_xl->name) == 0) {
+ return xlator_tree_reconfigure (trav->xlator, new_xl);
+ }
+ }
+
+ return -1;
}
int
@@ -987,3 +1028,61 @@ glusterfs_graph_destroy (glusterfs_graph_t *graph)
out:
return ret;
}
+
+
+int
+glusterfs_graph_attach (glusterfs_graph_t *orig_graph, char *path)
+{
+ xlator_t *this = THIS;
+ FILE *fp;
+ glusterfs_graph_t *graph;
+ xlator_t *xl;
+ char *volfile_id;
+
+ fp = fopen (path, "r");
+ if (!fp) {
+ gf_log (THIS->name, GF_LOG_WARNING,
+ "oops, %s disappeared on us", path);
+ return -EIO;
+ }
+
+ graph = glusterfs_graph_construct (fp);
+ fclose(fp);
+ if (!graph) {
+ gf_log (this->name, GF_LOG_WARNING,
+ "could not create graph from %s", path);
+ return -EIO;
+ }
+
+ /*
+ * If there's a server translator on top, we want whatever's below
+ * that.
+ */
+ xl = graph->first;
+ if (strcmp(xl->type, "protocol/server") == 0) {
+ (void) copy_opts_to_child (xl, FIRST_CHILD (xl), "*auth*");
+ xl = FIRST_CHILD(xl);
+ }
+ graph->first = xl;
+
+
+ volfile_id = strstr (path, "/snaps/");
+ if (!volfile_id) {
+ volfile_id = rindex (path, '/');
+ if (volfile_id) {
+ ++volfile_id;
+ }
+ }
+ if (volfile_id) {
+ xl->volfile_id = gf_strdup (volfile_id);
+ /* There's a stray ".vol" at the end. */
+ xl->volfile_id[strlen(xl->volfile_id)-4] = '\0';
+ }
+
+ /* TBD: memory leaks everywhere */
+ glusterfs_graph_prepare (graph, this->ctx, xl->name);
+ glusterfs_graph_init (graph);
+ glusterfs_xlator_link (orig_graph->top, graph->top);
+
+ return 0;
+}