# HG changeset patch # User Wojciech Lis # Date 1513039873 28800 # Node ID 60f2a215faa79ec0043792a223f09673d2c8baef # Parent 702e6d2642e7b51ab8b217cc0842018a08f6e243 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 diff -r 702e6d2642e7 -r 60f2a215faa7 mercurial/vfs.py --- 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')