From d7a28f21c9328474178d8e8964e81023f9c428c9 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Thu, 22 May 2025 12:56:31 -0400 Subject: [PATCH] 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 --- Assistant/Repair.hs | 19 ++++++------------- CHANGELOG | 7 +++++++ ...t_commit_anything__44___waiting__63__.mdwn | 2 ++ ..._73717884bf2129c55a894e7f1fff490c._comment | 17 +++++++++++++++++ 4 files changed, 32 insertions(+), 13 deletions(-) create mode 100644 doc/bugs/assistant_does_not_commit_anything__44___waiting__63__/comment_4_73717884bf2129c55a894e7f1fff490c._comment diff --git a/Assistant/Repair.hs b/Assistant/Repair.hs index c024f93e6f..1dd549d694 100644 --- a/Assistant/Repair.hs +++ b/Assistant/Repair.hs @@ -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' diff --git a/CHANGELOG b/CHANGELOG index 3cdecf1b1d..8f5771b5f7 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -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 Thu, 22 May 2025 12:43:38 -0400 + git-annex (10.20250520) upstream; urgency=medium * Preferred content now supports "balanced=groupname:lackingcopies" diff --git a/doc/bugs/assistant_does_not_commit_anything__44___waiting__63__.mdwn b/doc/bugs/assistant_does_not_commit_anything__44___waiting__63__.mdwn index dbf3f81227..aed7f2c8c1 100644 --- a/doc/bugs/assistant_does_not_commit_anything__44___waiting__63__.mdwn +++ b/doc/bugs/assistant_does_not_commit_anything__44___waiting__63__.mdwn @@ -87,3 +87,5 @@ Please advise [[!meta author=yoh]] [[!tag projects/repronim]] + +> [[fixed|done]] --[[Joey]] diff --git a/doc/bugs/assistant_does_not_commit_anything__44___waiting__63__/comment_4_73717884bf2129c55a894e7f1fff490c._comment b/doc/bugs/assistant_does_not_commit_anything__44___waiting__63__/comment_4_73717884bf2129c55a894e7f1fff490c._comment new file mode 100644 index 0000000000..a231d0de41 --- /dev/null +++ b/doc/bugs/assistant_does_not_commit_anything__44___waiting__63__/comment_4_73717884bf2129c55a894e7f1fff490c._comment @@ -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. +"""]]