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.
|
Returns 0 if no locks are held.
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
done = False
|
done = False
|
||||||
ull = None
|
|
||||||
if repo.localvfs.exists("undolog"):
|
|
||||||
ull = os.path.join("undolog", "lock")
|
|
||||||
if pycompat.iswindows:
|
if pycompat.iswindows:
|
||||||
if opts.get(r"force_lock"):
|
if opts.get(r"force_lock"):
|
||||||
repo.svfs.unlink("lock")
|
repo.svfs.unlink("lock")
|
||||||
@ -1643,7 +1639,7 @@ def debuglocks(ui, repo, **opts):
|
|||||||
repo.localvfs.unlink("wlock")
|
repo.localvfs.unlink("wlock")
|
||||||
done = True
|
done = True
|
||||||
if opts.get(r"force_undolog_lock"):
|
if opts.get(r"force_undolog_lock"):
|
||||||
repo.localvfs.unlink(ull)
|
repo.localvfs.unlink("undolog/lock")
|
||||||
done = True
|
done = True
|
||||||
else:
|
else:
|
||||||
if (
|
if (
|
||||||
@ -1674,21 +1670,29 @@ def debuglocks(ui, repo, **opts):
|
|||||||
release(*locks)
|
release(*locks)
|
||||||
|
|
||||||
now = time.time()
|
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
|
# this causes stale locks to get reaped for more accurate reporting
|
||||||
malformed = object()
|
malformed = object()
|
||||||
|
absent = object()
|
||||||
try:
|
try:
|
||||||
l = method(False)
|
l = method()
|
||||||
except error.LockHeld:
|
except error.LockHeld:
|
||||||
l = None
|
l = None
|
||||||
|
except error.LockUnavailable:
|
||||||
|
l = absent
|
||||||
except error.MalformedLock:
|
except error.MalformedLock:
|
||||||
l = malformed
|
l = malformed
|
||||||
|
|
||||||
if l == malformed:
|
if l == malformed:
|
||||||
ui.write(_("%-14s malformed\n") % (name + ":"))
|
ui.write(_("%-14s malformed\n") % (name + ":"))
|
||||||
return 1
|
return 1
|
||||||
|
elif l == absent:
|
||||||
|
ui.write(_("%-14s absent\n") % (name + ":"))
|
||||||
|
return 0
|
||||||
elif l:
|
elif l:
|
||||||
l.release()
|
l.release()
|
||||||
else:
|
else:
|
||||||
@ -1712,12 +1716,16 @@ def debuglocks(ui, repo, **opts):
|
|||||||
ui.write(("%-14s free\n") % (name + ":"))
|
ui.write(("%-14s free\n") % (name + ":"))
|
||||||
return 0
|
return 0
|
||||||
|
|
||||||
held += report(repo.svfs, "lock", repo.lock)
|
held = sum(
|
||||||
held += report(repo.localvfs, "wlock", repo.wlock)
|
(
|
||||||
if ull is not None:
|
report(repo.svfs, "lock", lambda: repo.lock(wait=False)),
|
||||||
ullmtd = lambda _: lockmod.lock(repo.localvfs, ull, desc="undolog", timeout=0)
|
report(repo.localvfs, "wlock", lambda: repo.wlock(wait=False)),
|
||||||
held += report(repo.localvfs, ull, ullmtd)
|
report(repo.localvfs, "undolog/lock"),
|
||||||
|
report(repo.svfs, "prefetchlock"),
|
||||||
|
report(repo.sharedvfs, "infinitepushbackup.lock"),
|
||||||
|
),
|
||||||
|
0,
|
||||||
|
)
|
||||||
return held
|
return held
|
||||||
|
|
||||||
|
|
||||||
|
@ -848,6 +848,9 @@ Check abort from mandatory pushkey
|
|||||||
pushkey: lock state after "phases"
|
pushkey: lock state after "phases"
|
||||||
lock: free
|
lock: free
|
||||||
wlock: free
|
wlock: free
|
||||||
|
undolog/lock: absent
|
||||||
|
prefetchlock: free
|
||||||
|
infinitepushbackup.lock: free
|
||||||
abort: Clown phase push failed
|
abort: Clown phase push failed
|
||||||
[255]
|
[255]
|
||||||
$ hg -R main push ssh://user@dummy/other -r e7ec4e813ba6
|
$ 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: pushkey: lock state after "phases"
|
||||||
remote: lock: free
|
remote: lock: free
|
||||||
remote: wlock: free
|
remote: wlock: free
|
||||||
|
remote: undolog/lock: absent
|
||||||
|
remote: prefetchlock: free
|
||||||
|
remote: infinitepushbackup.lock: free
|
||||||
abort: Clown phase push failed
|
abort: Clown phase push failed
|
||||||
[255]
|
[255]
|
||||||
$ hg -R main push http://localhost:$HGPORT2/ -r e7ec4e813ba6
|
$ 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: pushkey: lock state after "phases"
|
||||||
remote: lock: free
|
remote: lock: free
|
||||||
remote: wlock: free
|
remote: wlock: free
|
||||||
|
remote: undolog/lock: absent
|
||||||
|
remote: prefetchlock: free
|
||||||
|
remote: infinitepushbackup.lock: free
|
||||||
abort: Clown phase push failed
|
abort: Clown phase push failed
|
||||||
[255]
|
[255]
|
||||||
|
|
||||||
|
@ -152,6 +152,9 @@ Test debuglocks command:
|
|||||||
$ hg debuglocks
|
$ hg debuglocks
|
||||||
lock: free
|
lock: free
|
||||||
wlock: free
|
wlock: free
|
||||||
|
undolog/lock: absent
|
||||||
|
prefetchlock: free
|
||||||
|
infinitepushbackup.lock: free
|
||||||
|
|
||||||
Test WdirUnsupported exception
|
Test WdirUnsupported exception
|
||||||
|
|
||||||
|
@ -161,12 +161,16 @@ Having an undolog lock file
|
|||||||
lock: free
|
lock: free
|
||||||
wlock: free
|
wlock: free
|
||||||
undolog/lock: malformed
|
undolog/lock: malformed
|
||||||
|
prefetchlock: free
|
||||||
|
infinitepushbackup.lock: free
|
||||||
[1]
|
[1]
|
||||||
$ hg debuglocks --force-undolog-lock
|
$ hg debuglocks --force-undolog-lock
|
||||||
$ hg debuglocks
|
$ hg debuglocks
|
||||||
lock: free
|
lock: free
|
||||||
wlock: free
|
wlock: free
|
||||||
undolog/lock: free
|
undolog/lock: free
|
||||||
|
prefetchlock: free
|
||||||
|
infinitepushbackup.lock: free
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
@ -185,6 +189,8 @@ Having an empty undolog lock file
|
|||||||
lock: free
|
lock: free
|
||||||
wlock: free
|
wlock: free
|
||||||
undolog/lock: free
|
undolog/lock: free
|
||||||
|
prefetchlock: free
|
||||||
|
infinitepushbackup.lock: free
|
||||||
$ hg debuglocks --force-undolog-lock
|
$ hg debuglocks --force-undolog-lock
|
||||||
abort: cannot force release lock on POSIX
|
abort: cannot force release lock on POSIX
|
||||||
[255]
|
[255]
|
||||||
@ -192,6 +198,8 @@ Having an empty undolog lock file
|
|||||||
lock: free
|
lock: free
|
||||||
wlock: free
|
wlock: free
|
||||||
undolog/lock: free
|
undolog/lock: free
|
||||||
|
prefetchlock: free
|
||||||
|
infinitepushbackup.lock: free
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
$ cd ..
|
$ cd ..
|
||||||
|
@ -290,6 +290,9 @@ Test push hook locking
|
|||||||
added 1 changesets with 1 changes to 1 files
|
added 1 changesets with 1 changes to 1 files
|
||||||
lock: user *, process * (*s) (glob)
|
lock: user *, process * (*s) (glob)
|
||||||
wlock: free
|
wlock: free
|
||||||
|
undolog/lock: absent
|
||||||
|
prefetchlock: free
|
||||||
|
infinitepushbackup.lock: free
|
||||||
|
|
||||||
$ hg --cwd 1 debugstrip tip -q
|
$ hg --cwd 1 debugstrip tip -q
|
||||||
$ hg --cwd 2 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
|
added 1 changesets with 1 changes to 1 files
|
||||||
lock: user *, process * (*s) (glob)
|
lock: user *, process * (*s) (glob)
|
||||||
wlock: 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
|
Test bare push with multiple race checking options
|
||||||
--------------------------------------------------
|
--------------------------------------------------
|
||||||
|
Loading…
Reference in New Issue
Block a user