workers: don't use backgroundfilecloser in threads
This disables background file closing when in not in main thread
Test Plan:
Ran pull, update, sparse commands and watched the closer threads created and destroyed in procexp.exe
ran test on CentOS. No tests broken compared to the base
Differential Revision: https://phab.mercurial-scm.org/D1457
--- a/mercurial/vfs.py Fri Dec 15 08:47:28 2017 -0800
+++ b/mercurial/vfs.py Mon Dec 11 16:51:13 2017 -0800
@@ -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')