Description of problem: When the glusterfs fuse client gets an INTERRUPT message (ie. a process gets SIGINT while in a syscall to the filesystem), not all data allocated by the handler code is freed. Version-Release number of selected component (if applicable): >= 6.0 The issue appears with the introduction of the interrupt handling framework. How reproducible: Always Steps to Reproduce: 1. Compile the test helper of the tests/features/interrupt.t test, open_and_sleep.c: $ gcc -o open_and_sleep tests/features/open_and_sleep.c 2. Mount a glusterfs volume 3. Run the command used in tests/features/interrupt.t in a loop against some file in the mount: $ while :; do ./open_and_sleep <SOME-FILE> | { sleep 0.1; xargs -n1 kill -INT; } 3. Take statedumps at regular intervals and check gf_fuse_mt_iov_base memusage: # grep -A5 gf_fuse_mt_iov_base <STATEDUMP> Actual results: Values of size and num_alloc fields monotonously grow with time across statedumps. Expected results: Values of size and num_alloc fields stay low across statedumps.
Command in reproduction step 3. is incomplete. It should be: $ while :; do ./open_and_sleep <SOME-FILE> | { sleep 0.1; xargs -n1 kill -INT; }; done Improved version which also displays a counter: $ i=1; while :; do echo -en "\r$i "; ./open_and_sleep <SOME-FILE> | { sleep 0.1; xargs -n1 kill -INT; }; i=$(($i+1)); done
REVIEW: https://review.gluster.org/23016 (fuse: add missing GF_FREE to fuse_interrupt) posted (#1) for review on master by Csaba Henk
REVIEW: https://review.gluster.org/23016 (fuse: add missing GF_FREE to fuse_interrupt) merged (#4) on master by Amar Tumballi
REVIEW: https://review.gluster.org/23285 (fuse: add missing GF_FREE to fuse_interrupt) posted (#1) for review on release-7 by Csaba Henk
REVISION POSTED: https://review.gluster.org/23285 (fuse: add missing GF_FREE to fuse_interrupt) posted (#2) for review on release-7 by N Balachandran
(In reply to Csaba Henk from comment #1) > Command in reproduction step 3. is incomplete. It should be: > > $ while :; do ./open_and_sleep <SOME-FILE> | { sleep 0.1; xargs -n1 kill > -INT; }; done > > Improved version which also displays a counter: > > $ i=1; while :; do echo -en "\r$i "; ./open_and_sleep <SOME-FILE> | { > sleep 0.1; xargs -n1 kill -INT; }; i=$(($i+1)); done Use the below command to run the compiled open_and_sleep.c file in a loop i=1; while :; do echo -en "\r$i "; (./open_and_sleep <SOME-FILE> | { sleep 0.1; xargs -n1 kill -INT; }); i=$(($i+1)); done