Mercurial > public > mercurial-scm > hg
comparison mercurial/vfs.py @ 35426:60f2a215faa7
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
author | Wojciech Lis <wlis@fb.com> |
---|---|
date | Mon, 11 Dec 2017 16:51:13 -0800 |
parents | 75979c8d4572 |
children | 390f860228ba |
comparison
equal
deleted
inserted
replaced
35424:702e6d2642e7 | 35426:60f2a215faa7 |
---|---|
275 | 275 |
276 When this context manager is active, ``backgroundclose`` can be passed | 276 When this context manager is active, ``backgroundclose`` can be passed |
277 to ``__call__``/``open`` to result in the file possibly being closed | 277 to ``__call__``/``open`` to result in the file possibly being closed |
278 asynchronously, on a background thread. | 278 asynchronously, on a background thread. |
279 """ | 279 """ |
280 # This is an arbitrary restriction and could be changed if we ever | 280 # Sharing backgroundfilecloser between threads is complex and using |
281 # have a use case. | 281 # multiple instances puts us at risk of running out of file descriptors |
282 # only allow to use backgroundfilecloser when in main thread. | |
283 if not isinstance(threading.currentThread(), threading._MainThread): | |
284 yield | |
285 return | |
282 vfs = getattr(self, 'vfs', self) | 286 vfs = getattr(self, 'vfs', self) |
283 if getattr(vfs, '_backgroundfilecloser', None): | 287 if getattr(vfs, '_backgroundfilecloser', None): |
284 raise error.Abort( | 288 raise error.Abort( |
285 _('can only have 1 active background file closer')) | 289 _('can only have 1 active background file closer')) |
286 | 290 |
411 if mode in ('r', 'rb'): | 415 if mode in ('r', 'rb'): |
412 raise error.Abort(_('implementation error: mode %s is not' | 416 raise error.Abort(_('implementation error: mode %s is not' |
413 ' valid for checkambig=True') % mode) | 417 ' valid for checkambig=True') % mode) |
414 fp = checkambigatclosing(fp) | 418 fp = checkambigatclosing(fp) |
415 | 419 |
416 if backgroundclose: | 420 if (backgroundclose and |
421 isinstance(threading.currentThread(), threading._MainThread)): | |
417 if not self._backgroundfilecloser: | 422 if not self._backgroundfilecloser: |
418 raise error.Abort(_('backgroundclose can only be used when a ' | 423 raise error.Abort(_('backgroundclose can only be used when a ' |
419 'backgroundclosing context manager is active') | 424 'backgroundclosing context manager is active') |
420 ) | 425 ) |
421 | 426 |