From 8c1304b03542eefbbff82014827fc782c3c3584f Mon Sep 17 00:00:00 2001 From: Pranith Kumar K Date: Sat, 3 Aug 2013 08:27:27 +0530 Subject: performance/open-behind: Fix fd-leaks in unlink, rename Change-Id: Ia8d4bed7ccd316a83c397b53b9c1b1806024f83e BUG: 991622 Signed-off-by: Pranith Kumar K Reviewed-on: http://review.gluster.org/5493 Tested-by: Gluster Build System Reviewed-by: Anand Avati --- tests/bugs/bug-991622.t | 35 +++++++++++++++++++++++ xlators/performance/open-behind/src/open-behind.c | 4 +++ 2 files changed, 39 insertions(+) create mode 100644 tests/bugs/bug-991622.t diff --git a/tests/bugs/bug-991622.t b/tests/bugs/bug-991622.t new file mode 100644 index 000000000..5c3243465 --- /dev/null +++ b/tests/bugs/bug-991622.t @@ -0,0 +1,35 @@ +#!/bin/bash + +. $(dirname $0)/../include.rc +. $(dirname $0)/../volume.rc +. $(dirname $0)/../fileio.rc + +#This tests that no fd leaks are observed in unlink/rename in open-behind +function leaked_fds { + ls -l /proc/$(get_brick_pid $V0 $H0 $B0/$V0)/fd | grep deleted +} + +cleanup; +TEST glusterd +TEST pidof glusterd + +TEST $CLI volume create $V0 $H0:$B0/$V0 +TEST $CLI volume set $V0 open-behind on +TEST $CLI volume start $V0 +TEST glusterfs --entry-timeout=0 --attribute-timeout=0 -s $H0 --volfile-id=$V0 $M0 --direct-io-mode=enable + +TEST fd1=`fd_available` +TEST fd_open $fd1 'w' "$M0/testfile1" +TEST fd_write $fd1 "content" + +TEST fd2=`fd_available` +TEST fd_open $fd2 'w' "$M0/testfile2" +TEST fd_write $fd2 "content" + +TEST touch $M0/a +TEST rm $M0/testfile1 +TEST mv $M0/a $M0/testfile2 +TEST fd_close $fd1 +TEST fd_close $fd2 +TEST ! leaked_fds +cleanup; diff --git a/xlators/performance/open-behind/src/open-behind.c b/xlators/performance/open-behind/src/open-behind.c index 26b684e88..df4027509 100644 --- a/xlators/performance/open-behind/src/open-behind.c +++ b/xlators/performance/open-behind/src/open-behind.c @@ -734,6 +734,8 @@ ob_unlink (call_frame_t *frame, xlator_t *this, loc_t *loc, int xflags, fd = fd_lookup (loc->inode, 0); open_and_resume (this, fd, stub); + if (fd) + fd_unref (fd); return 0; err: @@ -758,6 +760,8 @@ ob_rename (call_frame_t *frame, xlator_t *this, loc_t *src, loc_t *dst, fd = fd_lookup (dst->inode, 0); open_and_resume (this, fd, stub); + if (fd) + fd_unref (fd); return 0; err: -- cgit