* [PATCH] http-push: remove remote locks on exit signals
@ 2008-05-22 19:55 Clemens Buchacher
2008-05-23 21:40 ` Junio C Hamano
0 siblings, 1 reply; 9+ messages in thread
From: Clemens Buchacher @ 2008-05-22 19:55 UTC (permalink / raw)
To: git
If locks are not cleaned up the repository is inaccessible for 10 minutes.
Signed-off-by: Clemens Buchacher <drizzd@aon.at>
---
Hi,
To test this I created a large file, added it, commited, pushed, waited one
second and pressed Ctrl+C. If this method is acceptable for the regression
tests, or if you have a better idea, let me know. I will write up a script.
Regards,
Clemens
---
http-push.c | 20 ++++++++++++++++++++
1 files changed, 20 insertions(+), 0 deletions(-)
diff --git a/http-push.c b/http-push.c
index 5b23038..b1f5302 100644
--- a/http-push.c
+++ b/http-push.c
@@ -1349,6 +1349,24 @@ static int unlock_remote(struct remote_lock *lock)
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(SIGINT, SIG_DFL);
+ raise(signo);
+}
+
static void remote_ls(const char *path, int flags,
void (*userFunc)(struct remote_ls_ctx *ls),
void *userData);
@@ -2255,6 +2273,8 @@ int main(int argc, char **argv)
goto cleanup;
}
+ signal(SIGINT, remove_locks_on_signal);
+
/* Check whether the remote has server info files */
remote->can_update_info_refs = 0;
remote->has_info_refs = remote_exists("info/refs");
--
1.5.5.1.1.g95a6
^ permalink raw reply related [flat|nested] 9+ messages in thread* Re: [PATCH] http-push: remove remote locks on exit signals
2008-05-22 19:55 [PATCH] http-push: remove remote locks on exit signals Clemens Buchacher
@ 2008-05-23 21:40 ` Junio C Hamano
2008-05-23 22:17 ` Clemens Buchacher
0 siblings, 1 reply; 9+ messages in thread
From: Junio C Hamano @ 2008-05-23 21:40 UTC (permalink / raw)
To: Clemens Buchacher; +Cc: git
Clemens Buchacher <drizzd@aon.at> writes:
> diff --git a/http-push.c b/http-push.c
> index 5b23038..b1f5302 100644
> --- a/http-push.c
> +++ b/http-push.c
> @@ -1349,6 +1349,24 @@ static int unlock_remote(struct remote_lock *lock)
> 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(SIGINT, SIG_DFL);
> + raise(signo);
> +}
> +
If you caught signo, shouldn't you be resetting that signo not SIGINT?
> static void remote_ls(const char *path, int flags,
> void (*userFunc)(struct remote_ls_ctx *ls),
> void *userData);
> @@ -2255,6 +2273,8 @@ int main(int argc, char **argv)
> goto cleanup;
> }
>
> + signal(SIGINT, remove_locks_on_signal);
> +
and you may care more than just INT but perhaps HUP and others?
> /* Check whether the remote has server info files */
> remote->can_update_info_refs = 0;
> remote->has_info_refs = remote_exists("info/refs");
Having said that, I do not use http-push myself, so I'll wait for others
who do use it to comment on this; success reports are welcomed, reports on
bad side effects, if any, are even more appreciated.
^ permalink raw reply [flat|nested] 9+ messages in thread* Re: [PATCH] http-push: remove remote locks on exit signals
2008-05-23 21:40 ` Junio C Hamano
@ 2008-05-23 22:17 ` Clemens Buchacher
2008-05-25 18:26 ` [PATCH] Reset the signal being handled Clemens Buchacher
2008-05-25 18:27 ` [PATCH] http-push: remove remote locks on exit signals Clemens Buchacher
0 siblings, 2 replies; 9+ messages in thread
From: Clemens Buchacher @ 2008-05-23 22:17 UTC (permalink / raw)
To: Junio C Hamano; +Cc: git
Hi,
On Fri, May 23, 2008 at 02:40:41PM -0700, Junio C Hamano wrote:
> Clemens Buchacher <drizzd@aon.at> writes:
> > +static void remove_locks_on_signal(int signo)
> > +{
> > + remove_locks();
> > + signal(SIGINT, SIG_DFL);
> > + raise(signo);
> > +}
> > +
>
> If you caught signo, shouldn't you be resetting that signo not SIGINT?
True. I suppose we should fix that in remove_lock_file_on_signal() as well,
then? It does exactly the same thing.
> > static void remote_ls(const char *path, int flags,
> > void (*userFunc)(struct remote_ls_ctx *ls),
> > void *userData);
> > @@ -2255,6 +2273,8 @@ int main(int argc, char **argv)
> > goto cleanup;
> > }
> >
> > + signal(SIGINT, remove_locks_on_signal);
> > +
>
> and you may care more than just INT but perhaps HUP and others?
SIGINT was bothering me the most, because I often kill http-push by pressing
Ctrl+C. I also considered adding SIGQUIT, but decided against it because
normally I press Ctrl+\ only if I want the program to quit _right now_ and
Ctrl+C does not work. On the other hand, sending the signal twice will
terminate http-push either way.
I don't know in which situation SIGHUP would come into play.
Regards,
Clemens
^ permalink raw reply [flat|nested] 9+ messages in thread* [PATCH] Reset the signal being handled
2008-05-23 22:17 ` Clemens Buchacher
@ 2008-05-25 18:26 ` Clemens Buchacher
2008-05-26 9:34 ` Johannes Schindelin
2008-05-25 18:27 ` [PATCH] http-push: remove remote locks on exit signals Clemens Buchacher
1 sibling, 1 reply; 9+ messages in thread
From: Clemens Buchacher @ 2008-05-25 18:26 UTC (permalink / raw)
To: Junio C Hamano; +Cc: git
This did not cause any problems, because remove_lock_file_on_signal is
only registered for SIGINT.
Signed-off-by: Clemens Buchacher <drizzd@aon.at>
---
lockfile.c | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
diff --git a/lockfile.c b/lockfile.c
index 663f18f..b0118d0 100644
--- a/lockfile.c
+++ b/lockfile.c
@@ -24,7 +24,7 @@ static void remove_lock_file(void)
static void remove_lock_file_on_signal(int signo)
{
remove_lock_file();
- signal(SIGINT, SIG_DFL);
+ signal(signo, SIG_DFL);
raise(signo);
}
--
1.5.5.1
^ permalink raw reply related [flat|nested] 9+ messages in thread* Re: [PATCH] Reset the signal being handled
2008-05-25 18:26 ` [PATCH] Reset the signal being handled Clemens Buchacher
@ 2008-05-26 9:34 ` Johannes Schindelin
2008-05-26 19:35 ` [PATCH] lockfile: reset the correct signal Clemens Buchacher
0 siblings, 1 reply; 9+ messages in thread
From: Johannes Schindelin @ 2008-05-26 9:34 UTC (permalink / raw)
To: Clemens Buchacher; +Cc: Junio C Hamano, git
Hi,
On Sun, 25 May 2008, Clemens Buchacher wrote:
> This did not cause any problems, because remove_lock_file_on_signal is
> only registered for SIGINT.
Only from the patch did I understand that you actually meant:
lockfile: reset the correct signal
In the function remove_lock_file_on_signal(), the signal handler
for SIGINT was reset, ignoring the parameter signo.
This did not pose a problem yet, as remove_lock_file_on_signal()
was only registered as a SIGINT handler.
Hth,
Dscho
^ permalink raw reply [flat|nested] 9+ messages in thread
* [PATCH] lockfile: reset the correct signal
2008-05-26 9:34 ` Johannes Schindelin
@ 2008-05-26 19:35 ` Clemens Buchacher
2008-05-26 21:36 ` Johannes Schindelin
0 siblings, 1 reply; 9+ messages in thread
From: Clemens Buchacher @ 2008-05-26 19:35 UTC (permalink / raw)
To: Johannes Schindelin; +Cc: Junio C Hamano, git
In the function remove_lock_file_on_signal(), the signal handler
for SIGINT was reset, ignoring the parameter signo.
This did not pose a problem yet, as remove_lock_file_on_signal()
was only registered as a SIGINT handler.
Signed-off-by: Clemens Buchacher <drizzd@aon.at>
---
On Mon, May 26, 2008 at 10:34:11AM +0100, Johannes Schindelin wrote:
> Only from the patch did I understand that you actually meant:
Thank you for fixing that.
I also realized that using signals like that can cause races. Shouldn't we
use sigaction() instead of signal()?
Clemens
---
lockfile.c | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
diff --git a/lockfile.c b/lockfile.c
index 663f18f..b0118d0 100644
--- a/lockfile.c
+++ b/lockfile.c
@@ -24,7 +24,7 @@ static void remove_lock_file(void)
static void remove_lock_file_on_signal(int signo)
{
remove_lock_file();
- signal(SIGINT, SIG_DFL);
+ signal(signo, SIG_DFL);
raise(signo);
}
--
1.5.5.1
^ permalink raw reply related [flat|nested] 9+ messages in thread* Re: [PATCH] lockfile: reset the correct signal
2008-05-26 19:35 ` [PATCH] lockfile: reset the correct signal Clemens Buchacher
@ 2008-05-26 21:36 ` Johannes Schindelin
2008-05-27 7:49 ` Clemens Buchacher
0 siblings, 1 reply; 9+ messages in thread
From: Johannes Schindelin @ 2008-05-26 21:36 UTC (permalink / raw)
To: Clemens Buchacher; +Cc: Junio C Hamano, git
Hi,
On Mon, 26 May 2008, Clemens Buchacher wrote:
> In the function remove_lock_file_on_signal(), the signal handler
> for SIGINT was reset, ignoring the parameter signo.
>
> This did not pose a problem yet, as remove_lock_file_on_signal()
> was only registered as a SIGINT handler.
>
> Signed-off-by: Clemens Buchacher <drizzd@aon.at>
> ---
>
> On Mon, May 26, 2008 at 10:34:11AM +0100, Johannes Schindelin wrote:
> > Only from the patch did I understand that you actually meant:
>
> Thank you for fixing that.
Unfortunately, the original patch is already in git.git.
> I also realized that using signals like that can cause races. Shouldn't
> we use sigaction() instead of signal()?
Dunno. The man page suggests it, but we have plenty of cases where we use
signal(). And I think it might be less painful to implement a
compat-wrapper for the platforms which differ from Linux' interpretation
of signal().
Ciao,
Dscho
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH] lockfile: reset the correct signal
2008-05-26 21:36 ` Johannes Schindelin
@ 2008-05-27 7:49 ` Clemens Buchacher
0 siblings, 0 replies; 9+ messages in thread
From: Clemens Buchacher @ 2008-05-27 7:49 UTC (permalink / raw)
To: Johannes Schindelin; +Cc: Junio C Hamano, git
Hi,
On Mon, May 26, 2008 at 10:36:45PM +0100, Johannes Schindelin wrote:
> > On Mon, May 26, 2008 at 10:34:11AM +0100, Johannes Schindelin wrote:
> > > Only from the patch did I understand that you actually meant:
> >
> > Thank you for fixing that.
>
> Unfortunately, the original patch is already in git.git.
I will be more careful with my commit messages in the future.
> > I also realized that using signals like that can cause races. Shouldn't
> > we use sigaction() instead of signal()?
>
> Dunno. The man page suggests it, but we have plenty of cases where we use
> signal(). And I think it might be less painful to implement a
> compat-wrapper for the platforms which differ from Linux' interpretation
> of signal().
On the other hand, sigaction is used already in two places. What do you
think about replacing all those calls to signal/sigaction with something
like this?
void set_signal(int signo, void (*handler)(int), int sa_flags)
{
struct sigaction sa;
memset(&sa, 0, sizeof(sa));
sa.sa_handler = handler;
sa.sa_flags = sa_flags;
sigemptyset(&sa.sa_mask);
sigaction(signo, &sa, NULL);
}
The behavior won't change, except that handlers cannot be interrupted by
their own signal.
Clemens
^ permalink raw reply [flat|nested] 9+ messages in thread
* [PATCH] http-push: remove remote locks on exit signals
2008-05-23 22:17 ` Clemens Buchacher
2008-05-25 18:26 ` [PATCH] Reset the signal being handled Clemens Buchacher
@ 2008-05-25 18:27 ` Clemens Buchacher
1 sibling, 0 replies; 9+ messages in thread
From: Clemens Buchacher @ 2008-05-25 18:27 UTC (permalink / raw)
To: Junio C Hamano; +Cc: git
If locks are not cleaned up the repository is inaccessible for 10 minutes.
Signed-off-by: Clemens Buchacher <drizzd@aon.at>
---
http-push.c | 22 ++++++++++++++++++++++
1 files changed, 22 insertions(+), 0 deletions(-)
diff --git a/http-push.c b/http-push.c
index 5b23038..b44768e 100644
--- a/http-push.c
+++ b/http-push.c
@@ -1349,6 +1349,24 @@ static int unlock_remote(struct remote_lock *lock)
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,
void (*userFunc)(struct remote_ls_ctx *ls),
void *userData);
@@ -2255,6 +2273,10 @@ int main(int argc, char **argv)
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 */
remote->can_update_info_refs = 0;
remote->has_info_refs = remote_exists("info/refs");
--
1.5.5.1
^ permalink raw reply related [flat|nested] 9+ messages in thread
end of thread, other threads:[~2008-05-27 7:50 UTC | newest]
Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2008-05-22 19:55 [PATCH] http-push: remove remote locks on exit signals Clemens Buchacher
2008-05-23 21:40 ` Junio C Hamano
2008-05-23 22:17 ` Clemens Buchacher
2008-05-25 18:26 ` [PATCH] Reset the signal being handled Clemens Buchacher
2008-05-26 9:34 ` Johannes Schindelin
2008-05-26 19:35 ` [PATCH] lockfile: reset the correct signal Clemens Buchacher
2008-05-26 21:36 ` Johannes Schindelin
2008-05-27 7:49 ` Clemens Buchacher
2008-05-25 18:27 ` [PATCH] http-push: remove remote locks on exit signals Clemens Buchacher
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.