assistant: Avoid startup hang on active *.lock file
Avoid hanging at startup when a process has a *.lock file open in the .git directory. The goal is to repair stale locks, not wait for all active locks to be closed. This was causing problems for a non-git process that has its own lock file in a subdir of .git/. If .git/index_lock is a non-stale lock, this does let the assistant start up regardless. Commits by the assistant will then fail, until the process locking the index finishes. This is not a problem, because the same behavior could already happen if the assistant is started and then another process locks the index. Sponsored-by: the NIH-funded NICEMAN (ReproNim TR&D3) project
This commit is contained in:
parent
47cf23785e
commit
d7a28f21c9
4 changed files with 32 additions and 13 deletions
|
@ -147,17 +147,10 @@ repairStaleLocks lockfiles = go =<< getsizes
|
||||||
<$> getFileSize lf
|
<$> getFileSize lf
|
||||||
getsizes = liftIO $ catMaybes <$> mapM getsize lockfiles
|
getsizes = liftIO $ catMaybes <$> mapM getsize lockfiles
|
||||||
go [] = return ()
|
go [] = return ()
|
||||||
go l = ifM (liftIO $ null <$> Lsof.query ("--" : map (fromOsPath . fst) l))
|
go l = whenM (liftIO $ null <$> Lsof.query ("--" : map (fromOsPath . fst) l)) $ do
|
||||||
( do
|
debug ["Waiting for 60 seconds to check stale git lock file"]
|
||||||
waitforit "to check stale git lock file"
|
|
||||||
l' <- getsizes
|
|
||||||
if l' == l
|
|
||||||
then liftIO $ mapM_ (removeWhenExistsWith removeFile . fst) l
|
|
||||||
else go l'
|
|
||||||
, do
|
|
||||||
waitforit "for git lock file writer"
|
|
||||||
go =<< getsizes
|
|
||||||
)
|
|
||||||
waitforit why = do
|
|
||||||
debug ["Waiting for 60 seconds", why]
|
|
||||||
liftIO $ threadDelaySeconds $ Seconds 60
|
liftIO $ threadDelaySeconds $ Seconds 60
|
||||||
|
l' <- getsizes
|
||||||
|
if l' == l
|
||||||
|
then liftIO $ mapM_ (removeWhenExistsWith removeFile . fst) l
|
||||||
|
else go l'
|
||||||
|
|
|
@ -1,3 +1,10 @@
|
||||||
|
git-annex (10.20250521) UNRELEASED; urgency=medium
|
||||||
|
|
||||||
|
* assistant: Avoid hanging at startup when a process has a *.lock file
|
||||||
|
open in the .git directory.
|
||||||
|
|
||||||
|
-- Joey Hess <id@joeyh.name> Thu, 22 May 2025 12:43:38 -0400
|
||||||
|
|
||||||
git-annex (10.20250520) upstream; urgency=medium
|
git-annex (10.20250520) upstream; urgency=medium
|
||||||
|
|
||||||
* Preferred content now supports "balanced=groupname:lackingcopies"
|
* Preferred content now supports "balanced=groupname:lackingcopies"
|
||||||
|
|
|
@ -87,3 +87,5 @@ Please advise
|
||||||
|
|
||||||
[[!meta author=yoh]]
|
[[!meta author=yoh]]
|
||||||
[[!tag projects/repronim]]
|
[[!tag projects/repronim]]
|
||||||
|
|
||||||
|
> [[fixed|done]] --[[Joey]]
|
||||||
|
|
|
@ -0,0 +1,17 @@
|
||||||
|
[[!comment format=mdwn
|
||||||
|
username="joey"
|
||||||
|
subject="""comment 4"""
|
||||||
|
date="2025-05-22T16:19:35Z"
|
||||||
|
content="""
|
||||||
|
It's treating `*.lock` as git lock files. Any other filename won't have the
|
||||||
|
problem.
|
||||||
|
|
||||||
|
[[!commit 635c9a1549f28992b6ae370f6e8687170c971525]] has a rationalle for
|
||||||
|
that, that git has other lock files than index.lock. It does seem to me to
|
||||||
|
be doubtful that any other stale git lock than index.lock would cause
|
||||||
|
significant trouble to the assistant.
|
||||||
|
|
||||||
|
But this code is supposed to deal with stale locks. This lock is not
|
||||||
|
stale; it has a process holding it open. So the assistant has no
|
||||||
|
reason to wait on it. I've removed the wait loop.
|
||||||
|
"""]]
|
Loading…
Add table
Add a link
Reference in a new issue