Re: [PATCH v3] receive-pack: check if client is alive before completing the push
- From
Junio C Hamano <gitster@pobox.com>
- Date
- Jan 28, 2022, 01:19 UTC
- Message-ID
- <xmqqy230y7vc.fsf@gitster.g>
- In-Reply-To
- <20220127215553.1386024-1-robin.jarry@6wind.com>
Robin Jarry <robin.jarry@6wind.com> writes:
Show 17 quoted lines
> Abort the push operation (i.e. do not migrate the objects from temporary > to permanent storage) if the client has disconnected while the > pre-receive hook was running. > > This reduces the risk of inconsistencies on network errors or if the > user hits ctrl-c while the pre-receive hook is running. > > Send a keepalive packet (empty) on sideband 2 (the one to report > progress). If the client has exited, receive-pack will be killed via > SIGPIPE and the push will be aborted. This only works when sideband* > capabilities are advertised by the client. > > Signed-off-by: Robin Jarry <robin.jarry@6wind.com> > --- > v2 -> v3: > I had missed Documentation/technical/pack-protocol.txt. Using > sideband 2 to send the keepalive packet works.
Yes, as long as sideband capability is supported (which is true everywhere these days), this would be good.
Simple and sensible.
Thanks.
Show 23 quoted lines
> builtin/receive-pack.c | 9 +++++++++
> 1 file changed, 9 insertions(+)
>
> diff --git a/builtin/receive-pack.c b/builtin/receive-pack.c
> index 9f4a0b816cf9..8b0d56897c9f 100644
> --- a/builtin/receive-pack.c
> +++ b/builtin/receive-pack.c
> @@ -1971,6 +1971,15 @@ static void execute_commands(struct command *commands,
> return;
> }
>
> + /*
> + * Send a keepalive packet on sideband 2 (progress info) to ensure that
> + * the client has not disconnected while pre-receive was running.
> + */
> + if (use_sideband) {
> + static const char buf[] = "0005\2";
> + write_or_die(1, buf, sizeof(buf) - 1);
> + }
> +
> /*
> * Now we'll start writing out refs, which means the objects need
> * to be in their final positions so that other processes can see them.