Skip to content

Commit

Permalink
atomic write for sideband remote messages
Browse files Browse the repository at this point in the history
It has been a few times that I ended up with such a confusing display:

|remote: Generating pack...
|remote: Done counting 17 objects.
|remote: Result has 9 objects.
|remote: Deltifying 9 objects.
|remote:  100% (9/9) done
|remote: Unpacking 9 objects
|Total 9, written 9 (delta 8), reused 0 (delta 0)
| 100% (9/9) done

The confusion can be avoided in most cases by writing the remote message
in one go to prevent interleacing with local messages.  The buffer
declaration has been moved inside recv_sideband() to avoid extra string
copies.

Signed-off-by: Nicolas Pitre <nico@cam.org>
Signed-off-by: Junio C Hamano <junkio@cox.net>
  • Loading branch information
Nicolas Pitre authored and Junio C Hamano committed Oct 11, 2006
1 parent 0503f9c commit 9ac13ec
Show file tree
Hide file tree
Showing 4 changed files with 19 additions and 17 deletions.
2 changes: 1 addition & 1 deletion builtin-archive.c
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@ static int run_remote_archiver(const char *remote, int argc,
die("git-archive: expected a flush");

/* Now, start reading from fd[0] and spit it out to stdout */
rv = recv_sideband("archive", fd[0], 1, 2, buf, sizeof(buf));
rv = recv_sideband("archive", fd[0], 1, 2);
close(fd[0]);
rv |= finish_connect(pid);

Expand Down
4 changes: 1 addition & 3 deletions fetch-clone.c
Original file line number Diff line number Diff line change
Expand Up @@ -115,12 +115,10 @@ 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);
if (!side_pid) {
/* subprocess */
char buf[LARGE_PACKET_MAX];

close(fd[0]);
if (xd[0] != xd[1])
close(xd[1]);
if (recv_sideband(me, xd[0], fd[1], 2, buf, sizeof(buf)))
if (recv_sideband(me, xd[0], fd[1], 2))
exit(1);
exit(0);
}
Expand Down
28 changes: 16 additions & 12 deletions sideband.c
Original file line number Diff line number Diff line change
Expand Up @@ -11,36 +11,40 @@
* stream, aka "verbose"). A message over band #3 is a signal that
* the remote died unexpectedly. A flush() concludes the stream.
*/
int recv_sideband(const char *me, int in_stream, int out, int err, char *buf, int bufsz)
int recv_sideband(const char *me, int in_stream, int out, int err)
{
char buf[7 + LARGE_PACKET_MAX + 1];
strcpy(buf, "remote:");
while (1) {
int len = packet_read_line(in_stream, buf, bufsz);
int band, len;
len = packet_read_line(in_stream, buf+7, LARGE_PACKET_MAX);
if (len == 0)
break;
if (len < 1) {
len = sprintf(buf, "%s: protocol error: no band designator\n", me);
safe_write(err, buf, len);
return SIDEBAND_PROTOCOL_ERROR;
}
band = buf[7] & 0xff;
len--;
switch (buf[0] & 0xFF) {
switch (band) {
case 3:
safe_write(err, "remote: ", 8);
safe_write(err, buf+1, len);
safe_write(err, "\n", 1);
buf[7] = ' ';
buf[8+len] = '\n';
safe_write(err, buf, 8+len+1);
return SIDEBAND_REMOTE_ERROR;
case 2:
safe_write(err, "remote: ", 8);
safe_write(err, buf+1, len);
buf[7] = ' ';
safe_write(err, buf, 8+len);
continue;
case 1:
safe_write(out, buf+1, len);
safe_write(out, buf+8, len);
continue;
default:
len = sprintf(buf + 1,
len = sprintf(buf,
"%s: protocol error: bad band #%d\n",
me, buf[0] & 0xFF);
safe_write(err, buf+1, len);
me, band);
safe_write(err, buf, len);
return SIDEBAND_PROTOCOL_ERROR;
}
}
Expand Down
2 changes: 1 addition & 1 deletion sideband.h
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
#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);
ssize_t send_sideband(int fd, int band, const char *data, ssize_t sz, int packet_max);

#endif

0 comments on commit 9ac13ec

Please sign in to comment.