Merge branch 'jk/upload-pack-keepalive'

When running "fetch -q", a long silence while the sender side
computes the set of objects to send can be mistaken by proxies as
dropped connection.  The server side has been taught to send a small
empty messages to keep the connection alive.

* jk/upload-pack-keepalive:
  upload-pack: bump keepalive default to 5 seconds
  upload-pack: send keepalive packets during pack computation
This commit is contained in:
Junio C Hamano
2013-09-20 12:39:05 -07:00
2 changed files with 35 additions and 1 deletions

View File

@ -41,6 +41,7 @@ static struct object_array have_obj;
static struct object_array want_obj;
static struct object_array extra_edge_obj;
static unsigned int timeout;
static int keepalive = 5;
/* 0 for no sideband,
* otherwise maximum packet size (up to 65520 bytes).
*/
@ -134,6 +135,7 @@ static void create_pack_file(void)
while (1) {
struct pollfd pfd[2];
int pe, pu, pollsize;
int ret;
reset_timeout();
@ -156,7 +158,8 @@ static void create_pack_file(void)
if (!pollsize)
break;
if (poll(pfd, pollsize, -1) < 0) {
ret = poll(pfd, pollsize, 1000 * keepalive);
if (ret < 0) {
if (errno != EINTR) {
error("poll failed, resuming: %s",
strerror(errno));
@ -218,6 +221,21 @@ static void create_pack_file(void)
if (sz < 0)
goto fail;
}
/*
* We hit the keepalive timeout without saying anything; send
* an empty message on the data sideband just to let the other
* side know we're still working on it, but don't have any data
* yet.
*
* If we don't have a sideband channel, there's no room in the
* protocol to say anything, so those clients are just out of
* luck.
*/
if (!ret && use_sideband) {
static const char buf[] = "0005\1";
write_or_die(1, buf, 5);
}
}
if (finish_command(&pack_objects)) {
@ -722,6 +740,11 @@ static int upload_pack_config(const char *var, const char *value, void *unused)
{
if (!strcmp("uploadpack.allowtipsha1inwant", var))
allow_tip_sha1_in_want = git_config_bool(var, value);
else if (!strcmp("uploadpack.keepalive", var)) {
keepalive = git_config_int(var, value);
if (!keepalive)
keepalive = -1;
}
return parse_hide_refs_config(var, value, "uploadpack");
}