[PATCH v3] receive-pack: check if client is alive before completing the push
- From
- Robin Jarry <robin.jarry@6wind.com>
- Date
- Jan 27, 2022, 21:55 UTC
- Message-ID
- <20220127215553.1386024-1-robin.jarry@6wind.com>
- In-Reply-To
- <CHGR6XNP6TV7.15VGVNQUJM9J6@diabtop>
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.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.
-- 2.35.0.4.gfdf4c72cdf3d