mirror of
https://github.com/facebook/sapling.git
synced 2024-10-06 23:07:18 +03:00
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:
parent
33cf9ba8ad
commit
88239b04fb
@ -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
|
||||
|
||||
|
||||
|
@ -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]
|
||||
|
||||
|
@ -152,6 +152,9 @@ Test debuglocks command:
|
||||
$ hg debuglocks
|
||||
lock: free
|
||||
wlock: free
|
||||
undolog/lock: absent
|
||||
prefetchlock: free
|
||||
infinitepushbackup.lock: free
|
||||
|
||||
Test WdirUnsupported exception
|
||||
|
||||
|
@ -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 ..
|
||||
|
@ -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
|
||||
--------------------------------------------------
|
||||
|
Loading…
Reference in New Issue
Block a user