From b93f27e260870f7cc498825a59b0b6407c09bca7 Mon Sep 17 00:00:00 2001 From: James Cammarata Date: Thu, 3 Sep 2015 00:45:42 -0400 Subject: [PATCH] Move the lockfile back to tqm to make sure it stays unique --- lib/ansible/executor/task_queue_manager.py | 5 ++++- lib/ansible/playbook/play_context.py | 7 +++---- lib/ansible/plugins/connections/__init__.py | 14 +++++++------- 3 files changed, 14 insertions(+), 12 deletions(-) diff --git a/lib/ansible/executor/task_queue_manager.py b/lib/ansible/executor/task_queue_manager.py index 59f48142b1..2c47fc3975 100644 --- a/lib/ansible/executor/task_queue_manager.py +++ b/lib/ansible/executor/task_queue_manager.py @@ -23,6 +23,7 @@ import multiprocessing import os import socket import sys +import tempfile from ansible import constants as C from ansible.errors import AnsibleError @@ -86,6 +87,8 @@ class TaskQueueManager: except ValueError: fileno = None + self._connection_lockfile = tempfile.TemporaryFile() + self._workers = [] for i in range(self._options.forks): main_q = multiprocessing.Queue() @@ -176,7 +179,7 @@ class TaskQueueManager: new_play = play.copy() new_play.post_validate(templar) - play_context = PlayContext(new_play, self._options, self.passwords) + play_context = PlayContext(new_play, self._options, self.passwords, self._connection_lockfile.fileno()) for callback_plugin in self._callback_plugins: if hasattr(callback_plugin, 'set_play_context'): callback_plugin.set_play_context(play_context) diff --git a/lib/ansible/playbook/play_context.py b/lib/ansible/playbook/play_context.py index 5b56d2515b..9e3f1efb5f 100644 --- a/lib/ansible/playbook/play_context.py +++ b/lib/ansible/playbook/play_context.py @@ -24,7 +24,6 @@ __metaclass__ = type import pipes import random import re -import tempfile from ansible import constants as C from ansible.errors import AnsibleError @@ -190,7 +189,7 @@ class PlayContext(Base): _step = FieldAttribute(isa='bool', default=False) _diff = FieldAttribute(isa='bool', default=False) - def __init__(self, play=None, options=None, passwords=None): + def __init__(self, play=None, options=None, passwords=None, connection_lockfd=None): super(PlayContext, self).__init__() @@ -202,7 +201,7 @@ class PlayContext(Base): # A temporary file (opened pre-fork) used by connection # plugins for inter-process locking. - self.connection_lockf = tempfile.TemporaryFile() + self.connection_lockfd = connection_lockfd # set options before play to allow play to override them if options: @@ -329,7 +328,7 @@ class PlayContext(Base): def copy(self, exclude_block=False): new_me = super(PlayContext, self).copy() - new_me.connection_lockf = self.connection_lockf + new_me.connection_lockfd = self.connection_lockfd return new_me def make_become_cmd(self, cmd, executable=None): diff --git a/lib/ansible/plugins/connections/__init__.py b/lib/ansible/plugins/connections/__init__.py index 0e4b3466e5..5dfcf4c344 100644 --- a/lib/ansible/plugins/connections/__init__.py +++ b/lib/ansible/plugins/connections/__init__.py @@ -156,12 +156,12 @@ class ConnectionBase(with_metaclass(ABCMeta, object)): raise AnsibleError('Incorrect %s password' % self._play_context.become_method) def lock_connection(self): - f = self._play_context.connection_lockf - self._display.vvvv('CONNECTION: pid %d waiting for lock on %d' % (os.getpid(), f.fileno())) - fcntl.lockf(f.fileno(), fcntl.LOCK_EX) - self._display.vvvv('CONNECTION: pid %d acquired lock on %d' % (os.getpid(), f.fileno())) + f = self._play_context.connection_lockfd + self._display.vvvv('CONNECTION: pid %d waiting for lock on %d' % (os.getpid(), f)) + fcntl.lockf(f, fcntl.LOCK_EX) + self._display.vvvv('CONNECTION: pid %d acquired lock on %d' % (os.getpid(), f)) def unlock_connection(self): - f = self._play_context.connection_lockf - fcntl.lockf(f.fileno(), fcntl.LOCK_UN) - self._display.vvvv('CONNECTION: pid %d released lock on %d' % (os.getpid(), f.fileno())) + f = self._play_context.connection_lockfd + fcntl.lockf(f, fcntl.LOCK_UN) + self._display.vvvv('CONNECTION: pid %d released lock on %d' % (os.getpid(), f))