summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--api/src/glfs.c4
-rw-r--r--glusterfsd/src/glusterfsd.c3
-rw-r--r--libglusterfs/src/dict.c6
-rw-r--r--libglusterfs/src/glusterfs/dict.h2
-rw-r--r--libglusterfs/src/graph.c2
-rw-r--r--libglusterfs/src/graph.y2
-rw-r--r--libglusterfs/src/libglusterfs.sym1
-rw-r--r--libglusterfs/src/xlator.c1
-rw-r--r--tests/bugs/core/bug-1650403.t112
-rw-r--r--xlators/mgmt/glusterd/src/glusterd-utils.c4
10 files changed, 117 insertions, 20 deletions
diff --git a/api/src/glfs.c b/api/src/glfs.c
index f9d0937f2b3..b741f6e8b46 100644
--- a/api/src/glfs.c
+++ b/api/src/glfs.c
@@ -197,7 +197,7 @@ create_master(struct glfs *fs)
master->ctx = fs->ctx;
master->private = fs;
- master->options = get_new_dict();
+ master->options = dict_new();
if (!master->options)
goto err;
@@ -1549,7 +1549,7 @@ GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_upcall_inode_get_oldpstat, 3.7.16);
struct glfs_object *
pub_glfs_upcall_lease_get_object(struct glfs_upcall_lease *arg)
{
- return arg->object;
+ return arg->object;
}
GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_upcall_lease_get_object, 4.1.6);
diff --git a/glusterfsd/src/glusterfsd.c b/glusterfsd/src/glusterfsd.c
index 42731660485..df5b9ed0b31 100644
--- a/glusterfsd/src/glusterfsd.c
+++ b/glusterfsd/src/glusterfsd.c
@@ -725,7 +725,7 @@ create_fuse_mount(glusterfs_ctx_t *ctx)
}
master->ctx = ctx;
- master->options = get_new_dict();
+ master->options = dict_new();
if (!master->options)
goto err;
@@ -2644,7 +2644,6 @@ out:
/* Take dict ref for every graph xlator to avoid dict leak
at the time of graph destroying
*/
- gluster_graph_take_reference(graph->first);
glusterfs_graph_fini(graph);
glusterfs_graph_destroy(graph);
}
diff --git a/libglusterfs/src/dict.c b/libglusterfs/src/dict.c
index 6d3ed4ba9b3..83647b0174a 100644
--- a/libglusterfs/src/dict.c
+++ b/libglusterfs/src/dict.c
@@ -110,12 +110,6 @@ get_new_dict_full(int size_hint)
}
dict_t *
-get_new_dict(void)
-{
- return get_new_dict_full(1);
-}
-
-dict_t *
dict_new(void)
{
dict_t *dict = get_new_dict_full(1);
diff --git a/libglusterfs/src/glusterfs/dict.h b/libglusterfs/src/glusterfs/dict.h
index 161362bb5cb..52b833fd559 100644
--- a/libglusterfs/src/glusterfs/dict.h
+++ b/libglusterfs/src/glusterfs/dict.h
@@ -270,8 +270,6 @@ int
dict_remove_foreach_fn(dict_t *d, char *k, data_t *v, void *tmp);
dict_t *
dict_copy(dict_t *this, dict_t *new);
-dict_t *
-get_new_dict(void);
int
dict_keys_join(void *value, int size, dict_t *dict,
int (*filter_fn)(char *key));
diff --git a/libglusterfs/src/graph.c b/libglusterfs/src/graph.c
index 6b50cdbfddf..2dad92a5c53 100644
--- a/libglusterfs/src/graph.c
+++ b/libglusterfs/src/graph.c
@@ -181,7 +181,7 @@ glusterfs_graph_insert(glusterfs_graph_t *graph, glusterfs_ctx_t *ctx,
ixl->ctx = ctx;
ixl->graph = graph;
- ixl->options = get_new_dict();
+ ixl->options = dict_new();
if (!ixl->options)
goto err;
diff --git a/libglusterfs/src/graph.y b/libglusterfs/src/graph.y
index 80ae526d79b..5b929856c5f 100644
--- a/libglusterfs/src/graph.y
+++ b/libglusterfs/src/graph.y
@@ -164,7 +164,7 @@ new_volume (char *name)
goto out;
}
- curr->options = get_new_dict ();
+ curr->options = dict_new ();
if (!curr->options) {
GF_FREE (curr->name);
diff --git a/libglusterfs/src/libglusterfs.sym b/libglusterfs/src/libglusterfs.sym
index 464493d6cfc..e03cc987c81 100644
--- a/libglusterfs/src/libglusterfs.sym
+++ b/libglusterfs/src/libglusterfs.sym
@@ -547,7 +547,6 @@ get_checksum_for_path
get_file_mtime
get_host_name
get_mem_size
-get_new_dict
get_path_name
get_struct_variable
get_vol_type
diff --git a/libglusterfs/src/xlator.c b/libglusterfs/src/xlator.c
index 3dc0c648177..bd568660863 100644
--- a/libglusterfs/src/xlator.c
+++ b/libglusterfs/src/xlator.c
@@ -895,7 +895,6 @@ xlator_mem_free(xlator_t *xl)
return 0;
if (xl->options) {
- dict_ref(xl->options);
dict_unref(xl->options);
xl->options = NULL;
}
diff --git a/tests/bugs/core/bug-1650403.t b/tests/bugs/core/bug-1650403.t
new file mode 100644
index 00000000000..dadf9ddcc4c
--- /dev/null
+++ b/tests/bugs/core/bug-1650403.t
@@ -0,0 +1,112 @@
+#!/bin/bash
+
+SCRIPT_TIMEOUT=500
+
+. $(dirname $0)/../../include.rc
+. $(dirname $0)/../../volume.rc
+. $(dirname $0)/../../traps.rc
+
+cleanup;
+
+NUM_VOLS=5
+MOUNT_BASE=$(dirname $M0)
+
+# GlusterD reports that bricks are started when in fact their attach requests
+# might still need to be retried. That's a bit of a hack, but there's no
+# feasible way to wait at that point (in attach_brick) and the rest of the
+# code is unprepared to deal with transient errors so the whole "brick start"
+# would fail. Meanwhile, glusterfsd can only handle attach requests at a
+# rather slow rate. After GlusterD tries to start a couple of hundred bricks,
+# glusterfsd can fall behind and we start getting mount failures. Arguably,
+# those are spurious because we will eventually catch up. We're just not
+# ready *yet*. More to the point, even if the errors aren't spurious that's
+# not what we're testing right now. Therefore, we give glusterfsd a bit more
+# breathing room for this test than we would otherwise.
+MOUNT_TIMEOUT=15
+
+get_brick_base () {
+ printf "%s/vol%02d" $B0 $1
+}
+
+get_mount_point () {
+ printf "%s/vol%02d" $MOUNT_BASE $1
+}
+
+function count_up_bricks {
+ vol=$1;
+ $CLI --xml volume status $vol | grep '<status>1' | wc -l
+}
+
+create_volume () {
+
+ local vol_name=$(printf "%s-vol%02d" $V0 $1)
+
+ local brick_base=$(get_brick_base $1)
+ local cmd="$CLI volume create $vol_name replica 3"
+ local b
+ for b in $(seq 0 5); do
+ local this_brick=${brick_base}/brick$b
+ mkdir -p $this_brick
+ cmd="$cmd $H0:$this_brick"
+ done
+ TEST $cmd
+ TEST $CLI volume start $vol_name
+ # check for 6 bricks and 1 shd daemon to be up and running
+ EXPECT_WITHIN 120 7 count_up_bricks $vol_name
+ local mount_point=$(get_mount_point $1)
+ mkdir -p $mount_point
+ TEST $GFS -s $H0 --volfile-id=$vol_name $mount_point
+}
+
+cleanup_func () {
+ local v
+ for v in $(seq 1 $NUM_VOLS); do
+ local mount_point=$(get_mount_point $v)
+ force_umount $mount_point
+ rm -rf $mount_point
+ local vol_name=$(printf "%s-vol%02d" $V0 $v)
+ $CLI volume stop $vol_name
+ $CLI volume delete $vol_name
+ rm -rf $(get_brick_base $1) &
+ done &> /dev/null
+ wait
+}
+push_trapfunc cleanup_func
+
+TEST glusterd
+TEST $CLI volume set all cluster.brick-multiplex on
+
+# Our infrastructure can't handle an arithmetic expression here. The formula
+# is (NUM_VOLS-1)*5 because it sees each TEST/EXPECT once but needs the other
+# NUM_VOLS-1 and there are 5 such statements in each iteration.
+TESTS_EXPECTED_IN_LOOP=24
+for i in $(seq 1 $NUM_VOLS); do
+ create_volume $i
+ TEST dd if=/dev/zero of=$(get_mount_point $i)/a_file bs=4k count=1
+ # Unmounting to reduce memory footprint on regression hosts
+ mnt_point=$(get_mount_point $i)
+ EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $mnt_point
+done
+
+glustershd_pid=$(cat $GLUSTERD_PIDFILEDIR/glustershd/glustershd.pid || echo -1);
+start=`pmap -x $glustershd_pid | grep total | awk -F " " '{print $4}'`
+echo "Memory consumption for glustershd process"
+for i in $(seq 1 50); do
+ pmap -x $glustershd_pid | grep total
+ for j in $(seq 1 $NUM_VOLS); do
+ vol_name=$(printf "%s-vol%02d" $V0 $j)
+ gluster v set $vol_name cluster.self-heal-daemon off > /dev/null
+ gluster v set $vol_name cluster.self-heal-daemon on > /dev/null
+ done
+done
+
+end=`pmap -x $glustershd_pid | grep total | awk -F " " '{print $4}'`
+diff=$((end-start))
+
+# If memory consumption is more than 10M it means some leak in reconfigure
+# code path
+
+TEST [ $diff -lt 10000 ]
+
+trap - EXIT
+cleanup
diff --git a/xlators/mgmt/glusterd/src/glusterd-utils.c b/xlators/mgmt/glusterd/src/glusterd-utils.c
index 81d559ee338..de675f22761 100644
--- a/xlators/mgmt/glusterd/src/glusterd-utils.c
+++ b/xlators/mgmt/glusterd/src/glusterd-utils.c
@@ -9340,15 +9340,11 @@ glusterd_check_topology_identical(const char *filename1, const char *filename2,
if (grph1 == NULL)
goto out;
- gluster_graph_take_reference(grph1->first);
-
/* create the graph for filename2 */
grph2 = glusterfs_graph_construct(fp2);
if (grph2 == NULL)
goto out;
- gluster_graph_take_reference(grph2->first);
-
/* compare the graph topology */
*identical = is_graph_topology_equal(grph1, grph2);
ret = 0; /* SUCCESS */