Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

tests sometimes fail to remove S.gpg-agent.browser (race condition?) #1382

Open
josch opened this issue Feb 12, 2019 · 0 comments
Open

tests sometimes fail to remove S.gpg-agent.browser (race condition?) #1382

josch opened this issue Feb 12, 2019 · 0 comments

Comments

@josch
Copy link
Contributor

josch commented Feb 12, 2019

Not a regression this time but indeed a problem that existed since 0.7 but which neither me nor the other Debian maintainer @jljusten was able to reproduce. So we don't know where exactly the problem comes from, but I was given ssh access to a machine where I was able to reproduce this error. I just cannot reproduce it on my own laptop. Another platform where the error consistently shows is the reproducible builds setup: https://people.debian.org/~sanvila/build-logs/alot/

The problem is, that on these platforms, the unit tests fail in the following way:

======================================================================
ERROR: tearDownModule (tests.commands.utils_tests)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/<<PKGBUILDDIR>>/tests/utilities.py", line 133, in wrapper
    self.do_cleanups()
  File "/<<PKGBUILDDIR>>/tests/utilities.py", line 121, in do_cleanups
    func(*args, **kwargs)
  File "/usr/lib/python3.7/shutil.py", line 491, in rmtree
    _rmtree_safe_fd(fd, path, onerror)
  File "/usr/lib/python3.7/shutil.py", line 449, in _rmtree_safe_fd
    onerror(os.unlink, fullname, sys.exc_info())
  File "/usr/lib/python3.7/shutil.py", line 447, in _rmtree_safe_fd
    os.unlink(entry.name, dir_fd=topfd)
FileNotFoundError: [Errno 2] No such file or directory: 'S.gpg-agent.browser'

======================================================================
ERROR: tearDownClass (tests.db.utils_test.TestMessageFromFile)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/<<PKGBUILDDIR>>/tests/utilities.py", line 30, in _tear_down_class_wrapper
    original()
  File "/<<PKGBUILDDIR>>/tests/utilities.py", line 30, in _tear_down_class_wrapper
    original()
  File "/<<PKGBUILDDIR>>/tests/utilities.py", line 30, in _tear_down_class_wrapper
    original()
  [Previous line repeated 16 more times]
  File "/<<PKGBUILDDIR>>/tests/utilities.py", line 32, in _tear_down_class_wrapper
    cls.doClassCleanups()
  File "/<<PKGBUILDDIR>>/tests/utilities.py", line 102, in doClassCleanups
    func(*args, **kwargs)
  File "/usr/lib/python3.7/shutil.py", line 491, in rmtree
    _rmtree_safe_fd(fd, path, onerror)
  File "/usr/lib/python3.7/shutil.py", line 449, in _rmtree_safe_fd
    onerror(os.unlink, fullname, sys.exc_info())
  File "/usr/lib/python3.7/shutil.py", line 447, in _rmtree_safe_fd
    os.unlink(entry.name, dir_fd=topfd)
FileNotFoundError: [Errno 2] No such file or directory: 'S.gpg-agent.browser'

Here is the Debian bug with more infos https://bugs.debian.org/906335 but still nobody knows to reliably reproduce this problem on any machine. Santiago Vila discovered that the issue we see here might in fact be a race condition similar to here hpk42/muacrypt/issues/3 where the fix is to run shutil.rmtree with ignore_errors=True so that it will ignore a previously deleted S.gpg-agent.browser. And indeed, with this patch:

--- a/tests/commands/utils_tests.py
+++ b/tests/commands/utils_tests.py
@@ -48,7 +48,7 @@ MOD_CLEAN.add_cleanup(DEVNULL.close)
 @MOD_CLEAN.wrap_setup
 def setUpModule():
     home = tempfile.mkdtemp()
-    MOD_CLEAN.add_cleanup(shutil.rmtree, home)
+    MOD_CLEAN.add_cleanup(shutil.rmtree, home, ignore_errors=True)
     mock_home = mock.patch.dict(os.environ, {'GNUPGHOME': home})
     mock_home.start()
     MOD_CLEAN.add_cleanup(mock_home.stop)
--- a/tests/db/utils_test.py
+++ b/tests/db/utils_test.py
@@ -353,7 +353,7 @@ class TestMessageFromFile(TestCaseClassC
     @classmethod
     def setUpClass(cls):
         home = tempfile.mkdtemp()
-        cls.addClassCleanup(shutil.rmtree, home)
+        cls.addClassCleanup(shutil.rmtree, home, ignore_errors=True)
         mock_home = mock.patch.dict(os.environ, {'GNUPGHOME': home})
         mock_home.start()
         cls.addClassCleanup(mock_home.stop)

everything seems to work fine on the affected machines.

Could you apply it or do you see a better way to solve this issue?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant