diff options
author | Aravinda VK <avishwan@redhat.com> | 2015-10-11 20:26:16 +0530 |
---|---|---|
committer | Venky Shankar <vshankar@redhat.com> | 2015-11-18 20:03:45 -0800 |
commit | 42def948ac8e5d24278cb000cc8f8906b83a8592 (patch) | |
tree | 4473f85a3d168ba8477e5685e5fbab103eee1e53 /geo-replication | |
parent | a52fd2cb7fa3aaff74461f58f32f4ff0b8e0904d (diff) |
geo-rep: Fix FD leak from Active Geo-rep worker
Active worker tries to acquire lock in each iteration. On every successfull
lock acqusition it was not closing previously opened lock fd.
To see the leak, get the PID of worker,
ps -ax | grep feedback-fd
watch ls /proc/$pid/fd
BUG: 1225566
Change-Id: Ic476c24c306e7ab372c5560fbb80ef39f4fb31af
Signed-off-by: Aravinda VK <avishwan@redhat.com>
Reviewed-on: http://review.gluster.org/12332
Tested-by: NetBSD Build System <jenkins@build.gluster.org>
Reviewed-by: Milind Changire <mchangir@redhat.com>
Reviewed-by: Saravanakumar Arumugam <sarumuga@redhat.com>
Reviewed-by: Venky Shankar <vshankar@redhat.com>
Diffstat (limited to 'geo-replication')
-rw-r--r-- | geo-replication/syncdaemon/gconf.py | 1 | ||||
-rw-r--r-- | geo-replication/syncdaemon/master.py | 15 |
2 files changed, 16 insertions, 0 deletions
diff --git a/geo-replication/syncdaemon/gconf.py b/geo-replication/syncdaemon/gconf.py index 39a70a650b3..97395b41b06 100644 --- a/geo-replication/syncdaemon/gconf.py +++ b/geo-replication/syncdaemon/gconf.py @@ -27,5 +27,6 @@ class GConf(object): to PASSIVE as well mainly for debugging""" active_earlier = False passive_earlier = False + mgmt_lock_fd = None gconf = GConf() diff --git a/geo-replication/syncdaemon/master.py b/geo-replication/syncdaemon/master.py index c49062da3d4..55226bdf94f 100644 --- a/geo-replication/syncdaemon/master.py +++ b/geo-replication/syncdaemon/master.py @@ -468,10 +468,25 @@ class GMasterCommon(object): raise try: fcntl.lockf(fd, fcntl.LOCK_EX | fcntl.LOCK_NB) + # Close the previously acquired lock so that + # fd will not leak. Reset fd to None + if gconf.mgmt_lock_fd: + os.close(gconf.mgmt_lock_fd) + gconf.mgmt_lock_fd = None + + # Save latest FD for future use + gconf.mgmt_lock_fd = fd except: ex = sys.exc_info()[1] if fd: os.close(fd) + + # When previously Active becomes Passive, Close the + # fd of previously acquired lock + if gconf.mgmt_lock_fd: + os.close(gconf.mgmt_lock_fd) + gconf.mgmt_lock_fd = None + if isinstance(ex, IOError) and ex.errno in (EACCES, EAGAIN): # cannot grab, it's taken if not gconf.passive_earlier: |