mirror of
https://github.com/ansible/awx.git
synced 2026-05-07 01:17:37 -02:30
Merge pull request #1864 from wwitzel3/fix-1859
Check if the project update for the project has been canceled.
This commit is contained in:
@@ -5,6 +5,7 @@
|
|||||||
from collections import OrderedDict, namedtuple
|
from collections import OrderedDict, namedtuple
|
||||||
import ConfigParser
|
import ConfigParser
|
||||||
import cStringIO
|
import cStringIO
|
||||||
|
import errno
|
||||||
import functools
|
import functools
|
||||||
import importlib
|
import importlib
|
||||||
import json
|
import json
|
||||||
@@ -1668,18 +1669,28 @@ class RunProjectUpdate(BaseTask):
|
|||||||
logger.error(six.text_type("I/O error({0}) while trying to open lock file [{1}]: {2}").format(e.errno, lock_path, e.strerror))
|
logger.error(six.text_type("I/O error({0}) while trying to open lock file [{1}]: {2}").format(e.errno, lock_path, e.strerror))
|
||||||
raise
|
raise
|
||||||
|
|
||||||
try:
|
start_time = time.time()
|
||||||
start_time = time.time()
|
while True:
|
||||||
fcntl.flock(self.lock_fd, fcntl.LOCK_EX)
|
try:
|
||||||
waiting_time = time.time() - start_time
|
instance.refresh_from_db(fields=['cancel_flag'])
|
||||||
if waiting_time > 1.0:
|
if instance.cancel_flag:
|
||||||
logger.info(six.text_type(
|
logger.info(six.text_type("ProjectUpdate({0}) was cancelled".format(instance.pk)))
|
||||||
'{} spent {} waiting to acquire lock for local source tree '
|
return
|
||||||
'for path {}.').format(instance.log_format, waiting_time, lock_path))
|
fcntl.flock(self.lock_fd, fcntl.LOCK_EX | fcntl.LOCK_NB)
|
||||||
except IOError as e:
|
break
|
||||||
os.close(self.lock_fd)
|
except IOError as e:
|
||||||
logger.error(six.text_type("I/O error({0}) while trying to aquire lock on file [{1}]: {2}").format(e.errno, lock_path, e.strerror))
|
if e.errno not in (errno.EAGAIN, errno.EACCES):
|
||||||
raise
|
os.close(self.lock_fd)
|
||||||
|
logger.error(six.text_type("I/O error({0}) while trying to aquire lock on file [{1}]: {2}").format(e.errno, lock_path, e.strerror))
|
||||||
|
raise
|
||||||
|
else:
|
||||||
|
time.sleep(1.0)
|
||||||
|
waiting_time = time.time() - start_time
|
||||||
|
|
||||||
|
if waiting_time > 1.0:
|
||||||
|
logger.info(six.text_type(
|
||||||
|
'{} spent {} waiting to acquire lock for local source tree '
|
||||||
|
'for path {}.').format(instance.log_format, waiting_time, lock_path))
|
||||||
|
|
||||||
def pre_run_hook(self, instance, **kwargs):
|
def pre_run_hook(self, instance, **kwargs):
|
||||||
# re-create root project folder if a natural disaster has destroyed it
|
# re-create root project folder if a natural disaster has destroyed it
|
||||||
|
|||||||
@@ -2171,6 +2171,7 @@ def test_aquire_lock_acquisition_fail_logged(fcntl_flock, logging_getLogger, os_
|
|||||||
|
|
||||||
instance = mock.Mock()
|
instance = mock.Mock()
|
||||||
instance.get_lock_file.return_value = 'this_file_does_not_exist'
|
instance.get_lock_file.return_value = 'this_file_does_not_exist'
|
||||||
|
instance.cancel_flag = False
|
||||||
|
|
||||||
os_open.return_value = 3
|
os_open.return_value = 3
|
||||||
|
|
||||||
@@ -2180,7 +2181,6 @@ def test_aquire_lock_acquisition_fail_logged(fcntl_flock, logging_getLogger, os_
|
|||||||
fcntl_flock.side_effect = err
|
fcntl_flock.side_effect = err
|
||||||
|
|
||||||
ProjectUpdate = tasks.RunProjectUpdate()
|
ProjectUpdate = tasks.RunProjectUpdate()
|
||||||
|
|
||||||
with pytest.raises(IOError, message='dummy message'):
|
with pytest.raises(IOError, message='dummy message'):
|
||||||
ProjectUpdate.acquire_lock(instance)
|
ProjectUpdate.acquire_lock(instance)
|
||||||
os_close.assert_called_with(3)
|
os_close.assert_called_with(3)
|
||||||
|
|||||||
Reference in New Issue
Block a user