From patchwork Fri Dec 1 00:01:40 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: D1457: workers: don't use backgroundfilecloser in threads From: phabricator X-Patchwork-Id: 25837 Message-Id: <89741abae10f2c848144387ce5292593@localhost.localdomain> To: mercurial-devel@mercurial-scm.org Date: Fri, 1 Dec 2017 00:01:40 +0000 wlis updated this revision to Diff 4022. wlis edited the summary of this revision. wlis retitled this revision from "workers: create backgroundcloser per thread" to "workers: don't use backgroundfilecloser in threads". REPOSITORY rHG Mercurial CHANGES SINCE LAST UPDATE https://phab.mercurial-scm.org/D1457?vs=3664&id=4022 REVISION DETAIL https://phab.mercurial-scm.org/D1457 AFFECTED FILES mercurial/vfs.py CHANGE DETAILS To: wlis, #hg-reviewers, indygreg Cc: indygreg, mercurial-devel 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')