update_manager: remove stale git lock files
Sometimes git will erroneously leave the lock file in place when a command fails. Check for locked git repo before initialization, waiting up to 60 seconds before forcefully removing the lock. Also check for a locked repo after a failed fetch or pull, removing it if it exists. Signed-off-by: Eric Callahan <arksine.code@gmail.com>
This commit is contained in:
parent
4b89de53f7
commit
cd4641f959
|
@ -857,6 +857,7 @@ class GitRepo:
|
||||||
f"Git Repo {self.alias}: path '{self.git_path}'"
|
f"Git Repo {self.alias}: path '{self.git_path}'"
|
||||||
" is not a valid git repo")
|
" is not a valid git repo")
|
||||||
return False
|
return False
|
||||||
|
await self._wait_for_lock_release()
|
||||||
try:
|
try:
|
||||||
resp = await self.cmd_helper.run_cmd_with_response(
|
resp = await self.cmd_helper.run_cmd_with_response(
|
||||||
f"{self.git_cmd} status -u no")
|
f"{self.git_cmd} status -u no")
|
||||||
|
@ -1074,10 +1075,37 @@ class GitRepo:
|
||||||
def is_current(self):
|
def is_current(self):
|
||||||
return self.current_commit == self.upstream_commit
|
return self.current_commit == self.upstream_commit
|
||||||
|
|
||||||
|
def _check_lock_file_exists(self, remove=False):
|
||||||
|
lock_path = os.path.join(self.git_path, ".git/index.lock")
|
||||||
|
if os.path.isfile(lock_path):
|
||||||
|
if remove:
|
||||||
|
logging.info(f"Git Repo {self.alias}: Git lock file found "
|
||||||
|
"after git process exited, removing")
|
||||||
|
try:
|
||||||
|
os.remove(lock_path)
|
||||||
|
except Exception:
|
||||||
|
pass
|
||||||
|
return True
|
||||||
|
return False
|
||||||
|
|
||||||
|
async def _wait_for_lock_release(self, timeout=60):
|
||||||
|
while timeout:
|
||||||
|
if self._check_lock_file_exists():
|
||||||
|
if not timeout % 10:
|
||||||
|
logging.info(f"Git Repo {self.alias}: Git lock file "
|
||||||
|
f"exists, {timeout} seconds remaining "
|
||||||
|
"before removal.")
|
||||||
|
await tornado.gen.sleep(1.)
|
||||||
|
timeout -= 1
|
||||||
|
else:
|
||||||
|
return
|
||||||
|
self._check_lock_file_exists(remove=True)
|
||||||
|
|
||||||
async def _do_fetch_pull(self, cmd, retries=5):
|
async def _do_fetch_pull(self, cmd, retries=5):
|
||||||
# Fetch and pull require special handling. If the request
|
# Fetch and pull require special handling. If the request
|
||||||
# gets delayed we do not want to terminate it while the command
|
# gets delayed we do not want to terminate it while the command
|
||||||
# is processing.
|
# is processing.
|
||||||
|
await self._wait_for_lock_release()
|
||||||
env = os.environ.copy()
|
env = os.environ.copy()
|
||||||
env.update(GIT_FETCH_ENV_VARS)
|
env.update(GIT_FETCH_ENV_VARS)
|
||||||
scmd = self.cmd_helper.build_shell_command(
|
scmd = self.cmd_helper.build_shell_command(
|
||||||
|
@ -1097,6 +1125,8 @@ class GitRepo:
|
||||||
if ret == 0:
|
if ret == 0:
|
||||||
return
|
return
|
||||||
retries -= 1
|
retries -= 1
|
||||||
|
await tornado.gen.sleep(.5)
|
||||||
|
self._check_lock_file_exists(remove=True)
|
||||||
raise self.server.error(f"Git Command '{cmd}' failed")
|
raise self.server.error(f"Git Command '{cmd}' failed")
|
||||||
|
|
||||||
def _handle_process_output(self, output):
|
def _handle_process_output(self, output):
|
||||||
|
|
Loading…
Reference in New Issue