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
|
||||
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'
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -87,3 +87,5 @@ Please advise
|
|||
|
||||
[[!meta author=yoh]]
|
||||
[[!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