Patchwork D1457: workers: don't use backgroundfilecloser in threads

login
register
mail settings
Submitter phabricator
Date Dec. 15, 2017, 5:13 p.m.
Message ID <3a8c24a1246cd8f3ba7c61d838dc3c8d@localhost.localdomain>
Download mbox | patch
Permalink /patch/26315/
State Not Applicable
Headers show

Comments

phabricator - Dec. 15, 2017, 5:13 p.m.
This revision was automatically updated to reflect the committed changes.
Closed by commit rHG60f2a215faa7: workers: don&#039;t use backgroundfilecloser in threads (authored by wlis, committed by ).

REPOSITORY
  rHG Mercurial

CHANGES SINCE LAST UPDATE
  https://phab.mercurial-scm.org/D1457?vs=4386&id=4484

REVISION DETAIL
  https://phab.mercurial-scm.org/D1457

AFFECTED FILES
  mercurial/vfs.py

CHANGE DETAILS




To: wlis, #hg-reviewers, indygreg, krbullock
Cc: krbullock, durin42, indygreg, mercurial-devel

Patch

diff --git a/mercurial/vfs.py b/mercurial/vfs.py
--- a/mercurial/vfs.py
+++ b/mercurial/vfs.py
@@ -277,8 +277,12 @@ 
         to ``__call__``/``open`` to result in the file possibly being closed
         asynchronously, on a background thread.
         """
-        # This is an arbitrary restriction and could be changed if we ever
-        # have a use case.
+        # Sharing backgroundfilecloser between threads is complex and using
+        # multiple instances puts us at risk of running out of file descriptors
+        # only allow to use backgroundfilecloser when in main thread.
+        if not isinstance(threading.currentThread(), threading._MainThread):
+            yield
+            return
         vfs = getattr(self, 'vfs', self)
         if getattr(vfs, '_backgroundfilecloser', None):
             raise error.Abort(
@@ -413,7 +417,8 @@ 
                                     ' valid for checkambig=True') % mode)
             fp = checkambigatclosing(fp)
 
-        if backgroundclose:
+        if (backgroundclose and
+                isinstance(threading.currentThread(), threading._MainThread)):
             if not self._backgroundfilecloser:
                 raise error.Abort(_('backgroundclose can only be used when a '
                                   'backgroundclosing context manager is active')