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.c60
1 files changed, 56 insertions, 4 deletions
diff --git a/libglusterfs/src/graph.c b/libglusterfs/src/graph.c
index f6db5557a33..b427740f10f 100644
--- a/libglusterfs/src/graph.c
+++ b/libglusterfs/src/graph.c
@@ -328,6 +328,19 @@ glusterfs_graph_init (glusterfs_graph_t *graph)
return 0;
}
+int
+glusterfs_graph_deactivate (glusterfs_graph_t *graph)
+{
+ xlator_t *top = NULL;
+
+ if (graph == NULL)
+ goto out;
+
+ top = graph->top;
+ xlator_tree_fini (top);
+ out:
+ return 0;
+}
static int
_log_if_unknown_option (dict_t *dict, char *key, data_t *value, void *data)
@@ -763,14 +776,53 @@ glusterfs_graph_reconfigure (glusterfs_graph_t *oldgraph,
}
int
-glusterfs_graph_destroy (glusterfs_graph_t *graph)
+glusterfs_graph_destroy_residual (glusterfs_graph_t *graph)
{
- GF_VALIDATE_OR_GOTO ("graph", graph, out);
+ int ret = -1;
- xlator_tree_free (graph->first);
+ if (graph == NULL)
+ return ret;
+
+ ret = xlator_tree_free_memacct (graph->first);
list_del_init (&graph->list);
GF_FREE (graph);
+
+ return ret;
+}
+
+/* This function destroys all the xlator members except for the
+ * xlator strcuture and its mem accounting field.
+ *
+ * If otherwise, it would destroy the master xlator object as well
+ * its mem accounting, which would mean after calling glusterfs_graph_destroy()
+ * there cannot be any reference to GF_FREE() from the master xlator, this is
+ * not possible because of the following dependencies:
+ * - glusterfs_ctx_t will have mem pools allocated by the master xlators
+ * - xlator objects will have references to those mem pools(g: dict)
+ *
+ * Ordering the freeing in any of the order will also not solve the dependency:
+ * - Freeing xlator objects(including memory accounting) before mem pools
+ * destruction will mean not use GF_FREE while destroying mem pools.
+ * - Freeing mem pools and then destroying xlator objects would lead to crashes
+ * when xlator tries to unref dict or other mem pool objects.
+ *
+ * Hence the way chosen out of this interdependency is to split xlator object
+ * free into two stages:
+ * - Free all the xlator members excpet for its mem accounting structure
+ * - Free all the mem accouting structures of xlator along with the xlator
+ * object itself.
+ */
+int
+glusterfs_graph_destroy (glusterfs_graph_t *graph)
+{
+ int ret = 0;
+
+ GF_VALIDATE_OR_GOTO ("graph", graph, out);
+
+ ret = xlator_tree_free_members (graph->first);
+
+ ret = glusterfs_graph_destroy_residual (graph);
out:
- return 0;
+ return ret;
}