debuglock: also report infinitepushbackup and prefetch locks

Summary:
To be able to investigate problems with dangling lock files "infinitepushbackup" and "prefetch".
   - "infinitepushbackup", file "infinitepushbackup.lock" in repo.sharedvfs
   - "prefetchlock", file "prefetchlock" in repo.svfs

Also some small fixes around.
  - Crate "undolog" directory if it doesn't exist.
  - `report` function was restructed. Now if lock checking method is not passed
    lock will be checked with `lockmod.lock`.

Reviewed By: markbt

Differential Revision: D14949807

fbshipit-source-id: 02143ff923145e67e88c5627cf3355a834823b6d
This commit is contained in:
Alexander Kindyakov 2019-04-29 04:31:28 -07:00 committed by Facebook Github Bot
parent 33cf9ba8ad
commit 88239b04fb
5 changed files with 48 additions and 14 deletions

View File

@ -1630,11 +1630,7 @@ def debuglocks(ui, repo, **opts):
Returns 0 if no locks are held.
"""
done = False
ull = None
if repo.localvfs.exists("undolog"):
ull = os.path.join("undolog", "lock")
if pycompat.iswindows:
if opts.get(r"force_lock"):
repo.svfs.unlink("lock")
@ -1643,7 +1639,7 @@ def debuglocks(ui, repo, **opts):
repo.localvfs.unlink("wlock")
done = True
if opts.get(r"force_undolog_lock"):
repo.localvfs.unlink(ull)
repo.localvfs.unlink("undolog/lock")
done = True
else:
if (
@ -1674,21 +1670,29 @@ def debuglocks(ui, repo, **opts):
release(*locks)
now = time.time()
held = 0
def report(vfs, name, method):
def report(vfs, name, method=None):
if method is None:
method = lambda: lockmod.lock(vfs, name, timeout=0, ui=ui)
# this causes stale locks to get reaped for more accurate reporting
malformed = object()
absent = object()
try:
l = method(False)
l = method()
except error.LockHeld:
l = None
except error.LockUnavailable:
l = absent
except error.MalformedLock:
l = malformed
if l == malformed:
ui.write(_("%-14s malformed\n") % (name + ":"))
return 1
elif l == absent:
ui.write(_("%-14s absent\n") % (name + ":"))
return 0
elif l:
l.release()
else:
@ -1712,12 +1716,16 @@ def debuglocks(ui, repo, **opts):
ui.write(("%-14s free\n") % (name + ":"))
return 0
held += report(repo.svfs, "lock", repo.lock)
held += report(repo.localvfs, "wlock", repo.wlock)
if ull is not None:
ullmtd = lambda _: lockmod.lock(repo.localvfs, ull, desc="undolog", timeout=0)
held += report(repo.localvfs, ull, ullmtd)
held = sum(
(
report(repo.svfs, "lock", lambda: repo.lock(wait=False)),
report(repo.localvfs, "wlock", lambda: repo.wlock(wait=False)),
report(repo.localvfs, "undolog/lock"),
report(repo.svfs, "prefetchlock"),
report(repo.sharedvfs, "infinitepushbackup.lock"),
),
0,
)
return held

View File

@ -848,6 +848,9 @@ Check abort from mandatory pushkey
pushkey: lock state after "phases"
lock: free
wlock: free
undolog/lock: absent
prefetchlock: free
infinitepushbackup.lock: free
abort: Clown phase push failed
[255]
$ hg -R main push ssh://user@dummy/other -r e7ec4e813ba6
@ -863,6 +866,9 @@ Check abort from mandatory pushkey
remote: pushkey: lock state after "phases"
remote: lock: free
remote: wlock: free
remote: undolog/lock: absent
remote: prefetchlock: free
remote: infinitepushbackup.lock: free
abort: Clown phase push failed
[255]
$ hg -R main push http://localhost:$HGPORT2/ -r e7ec4e813ba6
@ -878,6 +884,9 @@ Check abort from mandatory pushkey
remote: pushkey: lock state after "phases"
remote: lock: free
remote: wlock: free
remote: undolog/lock: absent
remote: prefetchlock: free
remote: infinitepushbackup.lock: free
abort: Clown phase push failed
[255]

View File

@ -152,6 +152,9 @@ Test debuglocks command:
$ hg debuglocks
lock: free
wlock: free
undolog/lock: absent
prefetchlock: free
infinitepushbackup.lock: free
Test WdirUnsupported exception

View File

@ -161,12 +161,16 @@ Having an undolog lock file
lock: free
wlock: free
undolog/lock: malformed
prefetchlock: free
infinitepushbackup.lock: free
[1]
$ hg debuglocks --force-undolog-lock
$ hg debuglocks
lock: free
wlock: free
undolog/lock: free
prefetchlock: free
infinitepushbackup.lock: free
#else
@ -185,6 +189,8 @@ Having an empty undolog lock file
lock: free
wlock: free
undolog/lock: free
prefetchlock: free
infinitepushbackup.lock: free
$ hg debuglocks --force-undolog-lock
abort: cannot force release lock on POSIX
[255]
@ -192,6 +198,8 @@ Having an empty undolog lock file
lock: free
wlock: free
undolog/lock: free
prefetchlock: free
infinitepushbackup.lock: free
#endif
$ cd ..

View File

@ -290,6 +290,9 @@ Test push hook locking
added 1 changesets with 1 changes to 1 files
lock: user *, process * (*s) (glob)
wlock: free
undolog/lock: absent
prefetchlock: free
infinitepushbackup.lock: free
$ hg --cwd 1 debugstrip tip -q
$ hg --cwd 2 debugstrip tip -q
@ -302,6 +305,9 @@ Test push hook locking
added 1 changesets with 1 changes to 1 files
lock: user *, process * (*s) (glob)
wlock: user *, process * (*s) (glob)
undolog/lock: absent
prefetchlock: free
infinitepushbackup.lock: free
Test bare push with multiple race checking options
--------------------------------------------------