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:
Joey Hess 2025-05-22 12:56:31 -04:00
parent 47cf23785e
commit d7a28f21c9
No known key found for this signature in database
GPG key ID: DB12DB0FF05F8F38
4 changed files with 32 additions and 13 deletions

View file

@ -147,17 +147,10 @@ repairStaleLocks lockfiles = go =<< getsizes
<$> getFileSize lf
getsizes = liftIO $ catMaybes <$> mapM getsize lockfiles
go [] = return ()
go l = ifM (liftIO $ null <$> Lsof.query ("--" : map (fromOsPath . fst) l))
( do
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]
go l = whenM (liftIO $ null <$> Lsof.query ("--" : map (fromOsPath . fst) l)) $ do
debug ["Waiting for 60 seconds to check stale git lock file"]
liftIO $ threadDelaySeconds $ Seconds 60
l' <- getsizes
if l' == l
then liftIO $ mapM_ (removeWhenExistsWith removeFile . fst) l
else go l'

View file

@ -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
* Preferred content now supports "balanced=groupname:lackingcopies"

View file

@ -87,3 +87,5 @@ Please advise
[[!meta author=yoh]]
[[!tag projects/repronim]]
> [[fixed|done]] --[[Joey]]

View file

@ -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.
"""]]