diff --git a/celery_once/backends/file.py b/celery_once/backends/file.py index 3b9ed6a..3f96cfe 100644 --- a/celery_once/backends/file.py +++ b/celery_once/backends/file.py @@ -73,4 +73,11 @@ def clear_lock(self, key): Remove the lock file. """ lock_path = self._get_lock_path(key) - os.remove(lock_path) + try: + os.remove(lock_path) + except OSError as exc: + if exc.errno == errno.ENOENT: + # Lock file already deleted + pass + else: + raise exc diff --git a/tests/unit/backends/test_file.py b/tests/unit/backends/test_file.py index 89895cd..3c1126c 100644 --- a/tests/unit/backends/test_file.py +++ b/tests/unit/backends/test_file.py @@ -131,3 +131,14 @@ def test_file_clear_lock(backend, mocker): assert remove_mock.call_count == 1 assert remove_mock.call_args[0] == (expected_lock_path,) assert ret is None + + +def test_file_clear_lock_already_removed(backend, mocker): + key = 'test.task.key' + mocker.patch('celery_once.backends.file.os.remove', + side_effect=OSError(errno.ENOENT, 'error')) + expected_lock_path = os.path.join(TEST_LOCATION, + key_to_lock_name(key)) + ret = backend.clear_lock(key) + + assert ret is None