##// END OF EJS Templates
progress: retry ferr.flush() and .write() on EINTR (issue5532)...
progress: retry ferr.flush() and .write() on EINTR (issue5532) See the inline comment how this could mitigate the issue. I couldn't reproduce the exact problem on my Linux machine, but there are at least two people who got EINTR in progress.py, and it seems file_write() of Python 2 is fundamentally broken [1]. Let's make something in on 4.2. [1]: https://hg.python.org/cpython/file/v2.7.13/Objects/fileobject.c#l1850

File last commit:

r32043:b844d0d3 default
r32049:ed42e00a default
Show More
test-worker.t
90 lines | 2.1 KiB | text/troff | Tads3Lexer
David Soria Parra
worker: flush ui buffers before running the worker...
r31696 Test UI worker interaction
$ cat > t.py <<EOF
> from __future__ import absolute_import, print_function
> from mercurial import (
> cmdutil,
Yuya Nishihara
dispatch: print traceback in scmutil.callcatch() if --traceback specified...
r32041 > error,
David Soria Parra
worker: flush ui buffers before running the worker...
r31696 > ui as uimod,
> worker,
> )
Yuya Nishihara
dispatch: print traceback in scmutil.callcatch() if --traceback specified...
r32041 > def abort(ui, args):
> if args[0] == 0:
> # by first worker for test stability
> raise error.Abort('known exception')
> return runme(ui, [])
Yuya Nishihara
worker: print traceback for uncaught exception unconditionally...
r32043 > def exc(ui, args):
> if args[0] == 0:
> # by first worker for test stability
> raise Exception('unknown exception')
> return runme(ui, [])
David Soria Parra
worker: flush ui buffers before running the worker...
r31696 > def runme(ui, args):
> for arg in args:
> ui.status('run\n')
> yield 1, arg
Yuya Nishihara
dispatch: print traceback in scmutil.callcatch() if --traceback specified...
r32041 > functable = {
> 'abort': abort,
Yuya Nishihara
worker: print traceback for uncaught exception unconditionally...
r32043 > 'exc': exc,
Yuya Nishihara
dispatch: print traceback in scmutil.callcatch() if --traceback specified...
r32041 > 'runme': runme,
> }
David Soria Parra
worker: flush ui buffers before running the worker...
r31696 > cmdtable = {}
> command = cmdutil.command(cmdtable)
Yuya Nishihara
dispatch: print traceback in scmutil.callcatch() if --traceback specified...
r32041 > @command('test', [], 'hg test [COST] [FUNC]')
> def t(ui, repo, cost=1.0, func='runme'):
David Soria Parra
worker: flush ui buffers before running the worker...
r31696 > cost = float(cost)
Yuya Nishihara
dispatch: print traceback in scmutil.callcatch() if --traceback specified...
r32041 > func = functable[func]
David Soria Parra
worker: flush ui buffers before running the worker...
r31696 > ui.status('start\n')
Yuya Nishihara
dispatch: print traceback in scmutil.callcatch() if --traceback specified...
r32041 > runs = worker.worker(ui, cost, func, (ui,), range(8))
David Soria Parra
worker: flush ui buffers before running the worker...
r31696 > for n, i in runs:
> pass
> ui.status('done\n')
> EOF
$ abspath=`pwd`/t.py
$ hg init
Run tests with worker enable by forcing a heigh cost
$ hg --config "extensions.t=$abspath" test 100000.0
start
run
run
run
run
run
run
run
run
done
Run tests without worker by forcing a low cost
$ hg --config "extensions.t=$abspath" test 0.0000001
start
run
run
run
run
run
run
run
run
done
Yuya Nishihara
dispatch: print traceback in scmutil.callcatch() if --traceback specified...
r32041
Known exception should be caught, but printed if --traceback is enabled
$ hg --config "extensions.t=$abspath" --config 'worker.numcpus=2' \
> test 100000.0 abort
start
abort: known exception
Yuya Nishihara
worker: propagate exit code to main process...
r32042 [255]
Yuya Nishihara
dispatch: print traceback in scmutil.callcatch() if --traceback specified...
r32041
$ hg --config "extensions.t=$abspath" --config 'worker.numcpus=2' \
> test 100000.0 abort --traceback 2>&1 | grep '^Traceback'
Traceback (most recent call last):
Yuya Nishihara
worker: propagate exit code to main process...
r32042 Traceback (most recent call last):
Yuya Nishihara
worker: print traceback for uncaught exception unconditionally...
r32043
Traceback must be printed for unknown exceptions
$ hg --config "extensions.t=$abspath" --config 'worker.numcpus=2' \
> test 100000.0 exc 2>&1 | grep '^Traceback'
Traceback (most recent call last):