Merge pull request #1864 from wwitzel3/fix-1859

Check if the project update for the project has been canceled.
This commit is contained in:
Wayne Witzel III
2018-05-18 15:08:04 -04:00
committed by GitHub
2 changed files with 24 additions and 13 deletions

View File

@@ -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

View File

@@ -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)