http-push: remove remote locks on exit signals
If locks are not cleaned up the repository is inaccessible for 10 minutes. Signed-off-by: Clemens Buchacher <drizzd@aon.at> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:

committed by
Junio C Hamano

parent
a129293938
commit
6a491a1765
22
http-push.c
22
http-push.c
@ -1349,6 +1349,24 @@ static int unlock_remote(struct remote_lock *lock)
|
|||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void remove_locks(void)
|
||||||
|
{
|
||||||
|
struct remote_lock *lock = remote->locks;
|
||||||
|
|
||||||
|
fprintf(stderr, "Removing remote locks...\n");
|
||||||
|
while (lock) {
|
||||||
|
unlock_remote(lock);
|
||||||
|
lock = lock->next;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void remove_locks_on_signal(int signo)
|
||||||
|
{
|
||||||
|
remove_locks();
|
||||||
|
signal(signo, SIG_DFL);
|
||||||
|
raise(signo);
|
||||||
|
}
|
||||||
|
|
||||||
static void remote_ls(const char *path, int flags,
|
static void remote_ls(const char *path, int flags,
|
||||||
void (*userFunc)(struct remote_ls_ctx *ls),
|
void (*userFunc)(struct remote_ls_ctx *ls),
|
||||||
void *userData);
|
void *userData);
|
||||||
@ -2256,6 +2274,10 @@ int main(int argc, char **argv)
|
|||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
signal(SIGINT, remove_locks_on_signal);
|
||||||
|
signal(SIGHUP, remove_locks_on_signal);
|
||||||
|
signal(SIGQUIT, remove_locks_on_signal);
|
||||||
|
|
||||||
/* Check whether the remote has server info files */
|
/* Check whether the remote has server info files */
|
||||||
remote->can_update_info_refs = 0;
|
remote->can_update_info_refs = 0;
|
||||||
remote->has_info_refs = remote_exists("info/refs");
|
remote->has_info_refs = remote_exists("info/refs");
|
||||||
|
Reference in New Issue
Block a user