view tests/test-debugbuilddag.t @ 35428:71427ff1dff8

workers: handling exceptions in windows workers This adds handling of exceptions from worker threads and resurfaces them as if the function ran without workers. If any of the threads throws, the main thread kills all running threads giving them 5 sec to handle the interruption and raises the first exception received. We don't have to join threads if is_alive() is false Test Plan: Ran multiple updates/enable/disable sparse profile and things worked well Ran test on CentOS- all tests passing on @ passed here Added a forged exception into the worker code and got it properly resurfaced and the rest of workers killed: P58642088 PS C:\open\<repo>> ..\facebook-hg-rpms\build\hg\hg.exe --config extensions.fsmonitor=! sparse --enable-profile <profile> updating [==> ] 1300/39166 1m57sException in thread Thread-3: Traceback (most recent call last): File "C:\open\facebook-hg-rpms\build\hg\hg-python\lib\threading.py", line 801, in __bootstrap_inner self.run() File "C:\open\facebook-hg-rpms\build\hg\mercurial\worker.py", line 244, in run raise e Exception: Forged exception Exception in thread Thread-2: Traceback (most recent call last): File "C:\open\facebook-hg-rpms\build\hg\hg-python\lib\threading.py", line 801, in __bootstrap_inner self.run() File "C:\open\facebook-hg-rpms\build\hg\mercurial\worker.py", line 244, in run raise e Exception: Forged exception <...> Traceback (most recent call last): File "C:\open\facebook-hg-rpms\build\hg\hgexe.py", line 41, in <module> dispatch.run() File "C:\open\facebook-hg-rpms\build\hg\mercurial\dispatch.py", line 85, in run status = (dispatch(req) or 0) & 255 File "C:\open\facebook-hg-rpms\build\hg\mercurial\dispatch.py", line 173, in dispatch ret = _runcatch(req) File "C:\open\facebook-hg-rpms\build\hg\mercurial\dispatch.py", line 324, in _runcatch return _callcatch(ui, _runcatchfunc) File "C:\open\facebook-hg-rpms\build\hg\mercurial\dispatch.py", line 332, in _callcatch return scmutil.callcatch(ui, func) File "C:\open\facebook-hg-rpms\build\hg\mercurial\scmutil.py", line 154, in callcatch return func() File "C:\open\facebook-hg-rpms\build\hg\mercurial\dispatch.py", line 314, in _runcatchfunc return _dispatch(req) File "C:\open\facebook-hg-rpms\build\hg\mercurial\dispatch.py", line 951, in _dispatch cmdpats, cmdoptions) File "C:\open\facebook-hg-rpms\build\hg\hg-python\lib\site-packages\remotefilelog\__init__.py", line 415, in runcommand return orig(lui, repo, *args, **kwargs) File "C:\open\facebook-hg-rpms\build\hg\hg-python\lib\site-packages\hgext3rd\undo.py", line 118, in _runcommandwrapper result = orig(lui, repo, cmd, fullargs, *args) File "C:\open\facebook-hg-rpms\build\hg\hgext\journal.py", line 84, in runcommand return orig(lui, repo, cmd, fullargs, *args) File "C:\open\facebook-hg-rpms\build\hg\hg-python\lib\site-packages\hgext3rd\perftweaks.py", line 268, in _tracksparseprofiles res = runcommand(lui, repo, *args) File "C:\open\facebook-hg-rpms\build\hg\hg-python\lib\site-packages\hgext3rd\perftweaks.py", line 256, in _trackdirstatesizes res = runcommand(lui, repo, *args) File "C:\open\facebook-hg-rpms\build\hg\hg-python\lib\site-packages\hgext3rd\copytrace.py", line 144, in _runcommand return orig(lui, repo, cmd, fullargs, ui, *args, **kwargs) File "C:\open\facebook-hg-rpms\build\hg\hg-python\lib\site-packages\hgext3rd\fbamend\hiddenoverride.py", line 119, in runcommand result = orig(lui, repo, cmd, fullargs, *args) File "C:\open\facebook-hg-rpms\build\hg\mercurial\dispatch.py", line 712, in runcommand ret = _runcommand(ui, options, cmd, d) File "C:\open\facebook-hg-rpms\build\hg\mercurial\dispatch.py", line 959, in _runcommand return cmdfunc() File "C:\open\facebook-hg-rpms\build\hg\mercurial\dispatch.py", line 948, in <lambda> d = lambda: util.checksignature(func)(ui, *args, **strcmdopt) File "C:\open\facebook-hg-rpms\build\hg\mercurial\util.py", line 1183, in check return func(*args, **kwargs) File "C:\open\facebook-hg-rpms\build\hg\hg-python\lib\site-packages\hgext3rd\fbsparse.py", line 860, in sparse disableprofile=disableprofile, force=force) File "C:\open\facebook-hg-rpms\build\hg\hg-python\lib\site-packages\hgext3rd\fbsparse.py", line 949, in _config len, _refresh(ui, repo, oldstatus, oldsparsematch, force)) File "C:\open\facebook-hg-rpms\build\hg\hg-python\lib\site-packages\hgext3rd\fbsparse.py", line 1116, in _refresh mergemod.applyupdates(repo, typeactions, repo[None], repo['.'], False) File "C:\open\facebook-hg-rpms\build\hg\hg-python\lib\site-packages\remotefilelog\__init__.py", line 311, in applyupdates return orig(repo, actions, wctx, mctx, overwrite, labels=labels) File "C:\open\facebook-hg-rpms\build\hg\mercurial\merge.py", line 1464, in applyupdates for i, item in prog: File "C:\open\facebook-hg-rpms\build\hg\mercurial\worker.py", line 286, in _windowsworker raise t.exception Exception: Forged exception PS C:\open\ovrsource> Differential Revision: https://phab.mercurial-scm.org/D1459
author Wojciech Lis <wlis@fb.com>
date Mon, 20 Nov 2017 10:27:41 -0800
parents 95f490136e75
children 8d6109b49b31
line wrap: on
line source


plain

  $ hg init
  $ hg debugbuilddag '+2:f +3:p2 @temp <f+4 @default /p2 +2' \
  > --config extensions.progress= --config progress.assume-tty=1 \
  > --config progress.delay=0 --config progress.refresh=0 \
  > --config progress.format=topic,bar,number \
  > --config progress.width=60
  \r (no-eol) (esc)
  building [                                          ]  0/12\r (no-eol) (esc)
  building [                                          ]  0/12\r (no-eol) (esc)
  building [==>                                       ]  1/12\r (no-eol) (esc)
  building [==>                                       ]  1/12\r (no-eol) (esc)
  building [======>                                   ]  2/12\r (no-eol) (esc)
  building [=========>                                ]  3/12\r (no-eol) (esc)
  building [=============>                            ]  4/12\r (no-eol) (esc)
  building [=============>                            ]  4/12\r (no-eol) (esc)
  building [=============>                            ]  4/12\r (no-eol) (esc)
  building [================>                         ]  5/12\r (no-eol) (esc)
  building [====================>                     ]  6/12\r (no-eol) (esc)
  building [=======================>                  ]  7/12\r (no-eol) (esc)
  building [===========================>              ]  8/12\r (no-eol) (esc)
  building [===========================>              ]  8/12\r (no-eol) (esc)
  building [==============================>           ]  9/12\r (no-eol) (esc)
  building [==================================>       ] 10/12\r (no-eol) (esc)
  building [=====================================>    ] 11/12\r (no-eol) (esc)
                                                              \r (no-eol) (esc)

tags
  $ cat .hg/localtags
  66f7d451a68b85ed82ff5fcc254daf50c74144bd f
  bebd167eb94d257ace0e814aeb98e6972ed2970d p2
dag
  $ hg debugdag -t -b
  +2:f
  +3:p2
  @temp*f+3
  @default*/p2+2:tip
tip
  $ hg id
  000000000000
glog
  $ hg log -G --template '{rev}: {desc} [{branches}] @ {date}\n'
  o  11: r11 [] @ 11.00
  |
  o  10: r10 [] @ 10.00
  |
  o    9: r9 [] @ 9.00
  |\
  | o  8: r8 [temp] @ 8.00
  | |
  | o  7: r7 [temp] @ 7.00
  | |
  | o  6: r6 [temp] @ 6.00
  | |
  | o  5: r5 [temp] @ 5.00
  | |
  o |  4: r4 [] @ 4.00
  | |
  o |  3: r3 [] @ 3.00
  | |
  o |  2: r2 [] @ 2.00
  |/
  o  1: r1 [] @ 1.00
  |
  o  0: r0 [] @ 0.00
  

overwritten files, starting on a non-default branch

  $ rm -r .hg
  $ hg init
  $ hg debugbuilddag '@start.@default.:f +3:p2 @temp <f+4 @default /p2 +2' -q -o
tags
  $ cat .hg/localtags
  f778700ebd50fcf282b23a4446bd155da6453eb6 f
  bbccf169769006e2490efd2a02f11c3d38d462bd p2
dag
  $ hg debugdag -t -b
  @start+1
  @default+1:f
  +3:p2
  @temp*f+3
  @default*/p2+2:tip
tip
  $ hg id
  000000000000
glog
  $ hg log -G --template '{rev}: {desc} [{branches}] @ {date}\n'
  o  11: r11 [] @ 11.00
  |
  o  10: r10 [] @ 10.00
  |
  o    9: r9 [] @ 9.00
  |\
  | o  8: r8 [temp] @ 8.00
  | |
  | o  7: r7 [temp] @ 7.00
  | |
  | o  6: r6 [temp] @ 6.00
  | |
  | o  5: r5 [temp] @ 5.00
  | |
  o |  4: r4 [] @ 4.00
  | |
  o |  3: r3 [] @ 3.00
  | |
  o |  2: r2 [] @ 2.00
  |/
  o  1: r1 [] @ 1.00
  |
  o  0: r0 [start] @ 0.00
  
glog of
  $ hg log -G --template '{rev}: {desc} [{branches}]\n' of
  o  11: r11 []
  |
  o  10: r10 []
  |
  o    9: r9 []
  |\
  | o  8: r8 [temp]
  | |
  | o  7: r7 [temp]
  | |
  | o  6: r6 [temp]
  | |
  | o  5: r5 [temp]
  | |
  o |  4: r4 []
  | |
  o |  3: r3 []
  | |
  o |  2: r2 []
  |/
  o  1: r1 []
  |
  o  0: r0 [start]
  
tags
  $ hg tags -v
  tip                               11:9ffe238a67a2
  p2                                 4:bbccf1697690 local
  f                                  1:f778700ebd50 local
cat of
  $ hg cat of --rev tip
  r11


new and mergeable files

  $ rm -r .hg
  $ hg init
  $ hg debugbuilddag '+2:f +3:p2 @temp <f+4 @default /p2 +2' -q -mn
dag
  $ hg debugdag -t -b
  +2:f
  +3:p2
  @temp*f+3
  @default*/p2+2:tip
tip
  $ hg id
  000000000000
glog
  $ hg log -G --template '{rev}: {desc} [{branches}] @ {date}\n'
  o  11: r11 [] @ 11.00
  |
  o  10: r10 [] @ 10.00
  |
  o    9: r9 [] @ 9.00
  |\
  | o  8: r8 [temp] @ 8.00
  | |
  | o  7: r7 [temp] @ 7.00
  | |
  | o  6: r6 [temp] @ 6.00
  | |
  | o  5: r5 [temp] @ 5.00
  | |
  o |  4: r4 [] @ 4.00
  | |
  o |  3: r3 [] @ 3.00
  | |
  o |  2: r2 [] @ 2.00
  |/
  o  1: r1 [] @ 1.00
  |
  o  0: r0 [] @ 0.00
  
glog mf
  $ hg log -G --template '{rev}: {desc} [{branches}]\n' mf
  o  11: r11 []
  |
  o  10: r10 []
  |
  o    9: r9 []
  |\
  | o  8: r8 [temp]
  | |
  | o  7: r7 [temp]
  | |
  | o  6: r6 [temp]
  | |
  | o  5: r5 [temp]
  | |
  o |  4: r4 []
  | |
  o |  3: r3 []
  | |
  o |  2: r2 []
  |/
  o  1: r1 []
  |
  o  0: r0 []
  

man r4
  $ hg manifest -r4
  mf
  nf0
  nf1
  nf2
  nf3
  nf4
cat r4 mf
  $ hg cat -r4 mf
  0 r0
  1
  2 r1
  3
  4 r2
  5
  6 r3
  7
  8 r4
  9
  10
  11
  12
  13
  14
  15
  16
  17
  18
  19
  20
  21
  22
  23
man r8
  $ hg manifest -r8
  mf
  nf0
  nf1
  nf5
  nf6
  nf7
  nf8
cat r8 mf
  $ hg cat -r8 mf
  0 r0
  1
  2 r1
  3
  4
  5
  6
  7
  8
  9
  10 r5
  11
  12 r6
  13
  14 r7
  15
  16 r8
  17
  18
  19
  20
  21
  22
  23
man
  $ hg manifest --rev tip
  mf
  nf0
  nf1
  nf10
  nf11
  nf2
  nf3
  nf4
  nf5
  nf6
  nf7
  nf8
  nf9
cat mf
  $ hg cat mf --rev tip
  0 r0
  1
  2 r1
  3
  4 r2
  5
  6 r3
  7
  8 r4
  9
  10 r5
  11
  12 r6
  13
  14 r7
  15
  16 r8
  17
  18 r9
  19
  20 r10
  21
  22 r11
  23