Prepare larger packet buffer for upload-pack protocol.
The original side-band support added to the upload-pack protocol used the default 1000-byte packet length. The pkt-line format allows up to 64k, so prepare the receiver for the maximum size, and have the uploader and downloader negotiate if larger packet length is allowed. Signed-off-by: Junio C Hamano <junkio@cox.net>
This commit is contained in:
parent
958c24b1b8
commit
d47f3db75c
@ -115,7 +115,7 @@ static pid_t setup_sideband(int sideband, const char *me, int fd[2], int xd[2])
|
|||||||
die("%s: unable to fork off sideband demultiplexer", me);
|
die("%s: unable to fork off sideband demultiplexer", me);
|
||||||
if (!side_pid) {
|
if (!side_pid) {
|
||||||
/* subprocess */
|
/* subprocess */
|
||||||
char buf[DEFAULT_PACKET_MAX];
|
char buf[LARGE_PACKET_MAX];
|
||||||
|
|
||||||
close(fd[0]);
|
close(fd[0]);
|
||||||
if (xd[0] != xd[1])
|
if (xd[0] != xd[1])
|
||||||
|
12
fetch-pack.c
12
fetch-pack.c
@ -166,10 +166,11 @@ static int find_common(int fd[2], unsigned char *result_sha1,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!fetching)
|
if (!fetching)
|
||||||
packet_write(fd[1], "want %s%s%s%s\n",
|
packet_write(fd[1], "want %s%s%s%s%s\n",
|
||||||
sha1_to_hex(remote),
|
sha1_to_hex(remote),
|
||||||
(multi_ack ? " multi_ack" : ""),
|
(multi_ack ? " multi_ack" : ""),
|
||||||
(use_sideband ? " side-band" : ""),
|
(use_sideband == 2 ? " side-band-64k" : ""),
|
||||||
|
(use_sideband == 1 ? " side-band" : ""),
|
||||||
(use_thin_pack ? " thin-pack" : ""));
|
(use_thin_pack ? " thin-pack" : ""));
|
||||||
else
|
else
|
||||||
packet_write(fd[1], "want %s\n", sha1_to_hex(remote));
|
packet_write(fd[1], "want %s\n", sha1_to_hex(remote));
|
||||||
@ -426,7 +427,12 @@ static int fetch_pack(int fd[2], int nr_match, char **match)
|
|||||||
fprintf(stderr, "Server supports multi_ack\n");
|
fprintf(stderr, "Server supports multi_ack\n");
|
||||||
multi_ack = 1;
|
multi_ack = 1;
|
||||||
}
|
}
|
||||||
if (server_supports("side-band")) {
|
if (server_supports("side-band-64k")) {
|
||||||
|
if (verbose)
|
||||||
|
fprintf(stderr, "Server supports side-band-64k\n");
|
||||||
|
use_sideband = 2;
|
||||||
|
}
|
||||||
|
else if (server_supports("side-band")) {
|
||||||
if (verbose)
|
if (verbose)
|
||||||
fprintf(stderr, "Server supports side-band\n");
|
fprintf(stderr, "Server supports side-band\n");
|
||||||
use_sideband = 1;
|
use_sideband = 1;
|
||||||
|
@ -5,6 +5,7 @@
|
|||||||
#define SIDEBAND_REMOTE_ERROR -1
|
#define SIDEBAND_REMOTE_ERROR -1
|
||||||
|
|
||||||
#define DEFAULT_PACKET_MAX 1000
|
#define DEFAULT_PACKET_MAX 1000
|
||||||
|
#define LARGE_PACKET_MAX 65520
|
||||||
|
|
||||||
int recv_sideband(const char *me, int in_stream, int out, int err, char *, int);
|
int recv_sideband(const char *me, int in_stream, int out, int err, char *, int);
|
||||||
ssize_t send_sideband(int fd, int band, const char *data, ssize_t sz, int packet_max);
|
ssize_t send_sideband(int fd, int band, const char *data, ssize_t sz, int packet_max);
|
||||||
|
@ -20,6 +20,9 @@ static int use_thin_pack;
|
|||||||
static struct object_array have_obj;
|
static struct object_array have_obj;
|
||||||
static struct object_array want_obj;
|
static struct object_array want_obj;
|
||||||
static unsigned int timeout;
|
static unsigned int timeout;
|
||||||
|
/* 0 for no sideband,
|
||||||
|
* otherwise maximum packet size (up to 65520 bytes).
|
||||||
|
*/
|
||||||
static int use_sideband;
|
static int use_sideband;
|
||||||
|
|
||||||
static void reset_timeout(void)
|
static void reset_timeout(void)
|
||||||
@ -37,8 +40,7 @@ static int strip(char *line, int len)
|
|||||||
static ssize_t send_client_data(int fd, const char *data, ssize_t sz)
|
static ssize_t send_client_data(int fd, const char *data, ssize_t sz)
|
||||||
{
|
{
|
||||||
if (use_sideband)
|
if (use_sideband)
|
||||||
return send_sideband(1, fd, data, sz, DEFAULT_PACKET_MAX);
|
return send_sideband(1, fd, data, sz, use_sideband);
|
||||||
|
|
||||||
if (fd == 3)
|
if (fd == 3)
|
||||||
/* emergency quit */
|
/* emergency quit */
|
||||||
fd = 2;
|
fd = 2;
|
||||||
@ -389,8 +391,10 @@ static void receive_needs(void)
|
|||||||
multi_ack = 1;
|
multi_ack = 1;
|
||||||
if (strstr(line+45, "thin-pack"))
|
if (strstr(line+45, "thin-pack"))
|
||||||
use_thin_pack = 1;
|
use_thin_pack = 1;
|
||||||
if (strstr(line+45, "side-band"))
|
if (strstr(line+45, "side-band-64k"))
|
||||||
use_sideband = 1;
|
use_sideband = LARGE_PACKET_MAX;
|
||||||
|
else if (strstr(line+45, "side-band"))
|
||||||
|
use_sideband = DEFAULT_PACKET_MAX;
|
||||||
|
|
||||||
/* We have sent all our refs already, and the other end
|
/* We have sent all our refs already, and the other end
|
||||||
* should have chosen out of them; otherwise they are
|
* should have chosen out of them; otherwise they are
|
||||||
@ -412,7 +416,7 @@ static void receive_needs(void)
|
|||||||
|
|
||||||
static int send_ref(const char *refname, const unsigned char *sha1)
|
static int send_ref(const char *refname, const unsigned char *sha1)
|
||||||
{
|
{
|
||||||
static const char *capabilities = "multi_ack thin-pack side-band";
|
static const char *capabilities = "multi_ack thin-pack side-band side-band-64k";
|
||||||
struct object *o = parse_object(sha1);
|
struct object *o = parse_object(sha1);
|
||||||
|
|
||||||
if (!o)
|
if (!o)
|
||||||
|
Loading…
Reference in New Issue
Block a user