geo-rep: Fix the fd leak in worker/agent spawn

worker and agent uses pipe to communicate, if worker dies
for some reason agent should get EOF and terminate.

Each worker-agent spawning is done in thread, Due to race
if multiple workers in same node retain the pipe refs of
other workers. Hence agent will not get EOF even if
worker dies.

BUG: 1114003
Change-Id: I36b9709b9392299483606bd3ef1db764fa3f2bff
Signed-off-by: Aravinda VK <avishwan@redhat.com>
Reviewed-on: http://review.gluster.org/8194
Tested-by: Justin Clift <justin@gluster.org>
Reviewed-by: Venky Shankar <vshankar@redhat.com>
Tested-by: Venky Shankar <vshankar@redhat.com>
This commit is contained in:
Aravinda VK 2014-06-27 17:52:25 +05:30 committed by Venky Shankar
parent dd7c7b8a0f
commit 6a6bd44924

View File

@ -157,6 +157,9 @@ class Monitor(object):
return 1
conn_timeout = int(gconf.connection_timeout)
while ret in (0, 1):
# Spawn the worker and agent in lock to avoid fd leak
self.lock.acquire()
logging.info('-' * conn_timeout)
logging.info('starting gsyncd worker')
@ -188,10 +191,9 @@ class Monitor(object):
','.join([str(rw), str(ww),
str(ra), str(wa)]),
'--resource-remote', w[1]])
self.lock.acquire()
cpids.add(cpid)
agents.add(apid)
self.lock.release()
os.close(pw)
# close all RPC pipes in monitor
@ -199,6 +201,7 @@ class Monitor(object):
os.close(wa)
os.close(rw)
os.close(ww)
self.lock.release()
t0 = time.time()
so = select((pr,), (), (), conn_timeout)[0]