diff options
-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: |