From 6c848529cb26e6e4a5dc9576283207ab72187974 Mon Sep 17 00:00:00 2001 From: Vijay Bellur Date: Sat, 16 Feb 2013 20:10:24 +0530 Subject: libglusterfs: Fix memory leaks in fd_lk_insert_and_merge Change-Id: I666664895fdd7c7199797796819e652557a7ac99 BUG: 834465 Signed-off-by: Vijay Bellur Reviewed-on: http://review.gluster.org/4525 Tested-by: Gluster Build System Reviewed-by: Anand Avati --- tests/bugs/bug-834465.c | 61 +++++++++++++++++++++++++++++++++++++++++++++++++ tests/bugs/bug-834465.t | 60 ++++++++++++++++++++++++++++++++++++++++++++++++ tests/volume.rc | 13 ++++++++++- 3 files changed, 133 insertions(+), 1 deletion(-) create mode 100644 tests/bugs/bug-834465.c create mode 100755 tests/bugs/bug-834465.t (limited to 'tests') diff --git a/tests/bugs/bug-834465.c b/tests/bugs/bug-834465.c new file mode 100644 index 00000000..61d3deac --- /dev/null +++ b/tests/bugs/bug-834465.c @@ -0,0 +1,61 @@ +#include +#include +#include +#include +#include +#include +#include + +int +main (int argc, char *argv[]) +{ + int fd = -1; + char *filename = NULL; + struct flock lock = {0, }; + int i = 0; + int ret = -1; + + if (argc != 2) { + fprintf (stderr, "Usage: %s ", argv[0]); + goto out; + } + + filename = argv[1]; + + fd = open (filename, O_RDWR | O_CREAT, 0); + if (fd < 0) { + fprintf (stderr, "open (%s) failed (%s)\n", filename, + strerror (errno)); + goto out; + } + + lock.l_type = F_WRLCK; + lock.l_whence = SEEK_SET; + lock.l_start = 1; + lock.l_len = 1; + + while (i < 100) { + lock.l_type = F_WRLCK; + ret = fcntl (fd, F_SETLK, &lock); + if (ret < 0) { + fprintf (stderr, "fcntl setlk failed (%s)\n", + strerror (errno)); + goto out; + } + + lock.l_type = F_UNLCK; + ret = fcntl (fd, F_SETLK, &lock); + if (ret < 0) { + fprintf (stderr, "fcntl setlk failed (%s)\n", + strerror (errno)); + goto out; + } + + i++; + } + + ret = 0; + +out: + return ret; +} diff --git a/tests/bugs/bug-834465.t b/tests/bugs/bug-834465.t new file mode 100755 index 00000000..d2e5f47a --- /dev/null +++ b/tests/bugs/bug-834465.t @@ -0,0 +1,60 @@ +#!/bin/bash + +. $(dirname $0)/../include.rc +. $(dirname $0)/../volume.rc + +cleanup; + +TEST glusterd +TEST pidof glusterd +TEST $CLI volume info; + +function volinfo_field() +{ + local vol=$1; + local field=$2; + + $CLI volume info $vol | grep "^$field: " | sed 's/.*: //'; +} + +TEST $CLI volume create $V0 $H0:$B0/brick1 $H0:$B0/brick2; +EXPECT 'Created' volinfo_field $V0 'Status'; + +TEST $CLI volume start $V0; +EXPECT 'Started' volinfo_field $V0 'Status'; + +MOUNTDIR=$M0; +TEST glusterfs --mem-accounting --volfile-server=$H0 --volfile-id=$V0 $MOUNTDIR; + +sdump1=$(generate_mount_statedump $V0); +nalloc1=0 +grep -A2 "fuse - usage-type 85" $sdump1 +if [ $? -eq '0' ] +then + nalloc1=`grep -A2 "fuse - usage-type 85" $sdump1 | grep num_allocs | cut -d '=' -f2` +fi + +function build_tester () +{ + local cfile=$1 + local fname=$(basename "$cfile") + local execname=$(basename $fname ".c") + gcc -g -o $(dirname $cfile)/$execname $cfile +} + +build_tester $(dirname $0)/bug-834465.c + +TEST $(dirname $0)/bug-834465 $M0/testfile + +sdump2=$(generate_mount_statedump $V0); +nalloc2=`grep -A2 "fuse - usage-type 85" $sdump2 | grep num_allocs | cut -d '=' -f2` + +TEST [ $nalloc1 -eq $nalloc2 ]; + +TEST rm -rf $MOUNTDIR/* +TEST rm -rf $(dirname $0)/bug-834465 +cleanup_mount_statedump $V0 + +TEST umount $MOUNTDIR -l + +cleanup; diff --git a/tests/volume.rc b/tests/volume.rc index fe4d8306..9debe2b9 100644 --- a/tests/volume.rc +++ b/tests/volume.rc @@ -39,11 +39,17 @@ function get_mount_process_pid { ps aux | grep glusterfs | grep -E "volfile-id[ =]/?$vol " | awk '{print $2}' | head -1 } +function cleanup_statedump { + pid=$1 + rm -f $statedumpdir/*$pid.dump.* + #.vimrc friendly comment */ +} + function generate_statedump { local fpath="" pid=$1 #remove old stale statedumps - rm -f $statedumpdir/*$pid.dump.* + cleanup_statedump $pid kill -USR1 $pid #Wait till the statedump is generated sleep 1 @@ -56,6 +62,11 @@ function generate_mount_statedump { generate_statedump $(get_mount_process_pid $vol) } +function cleanup_mount_statedump { + local vol=$1 + cleanup_statedump $(get_mount_process_pid $vol) +} + function _afr_child_up_status { local vol=$1 #brick_id is (brick-num in volume info - 1) -- cgit