Merge branch 'ew/daemon-socket-keepalive'
When "git daemon" is run without --[init-]timeout specified, a connection from a client that silently goes offline can hang around for a long time, wasting resources. The socket-level KEEPALIVE has been enabled to allow the OS to notice such failed connections. * ew/daemon-socket-keepalive: daemon: enable SO_KEEPALIVE for all sockets
This commit is contained in:
commit
349e0c1adc
14
daemon.c
14
daemon.c
@ -669,6 +669,15 @@ static void hostinfo_clear(struct hostinfo *hi)
|
|||||||
strbuf_release(&hi->tcp_port);
|
strbuf_release(&hi->tcp_port);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void set_keep_alive(int sockfd)
|
||||||
|
{
|
||||||
|
int ka = 1;
|
||||||
|
|
||||||
|
if (setsockopt(sockfd, SOL_SOCKET, SO_KEEPALIVE, &ka, sizeof(ka)) < 0)
|
||||||
|
logerror("unable to set SO_KEEPALIVE on socket: %s",
|
||||||
|
strerror(errno));
|
||||||
|
}
|
||||||
|
|
||||||
static int execute(void)
|
static int execute(void)
|
||||||
{
|
{
|
||||||
char *line = packet_buffer;
|
char *line = packet_buffer;
|
||||||
@ -681,6 +690,7 @@ static int execute(void)
|
|||||||
if (addr)
|
if (addr)
|
||||||
loginfo("Connection from %s:%s", addr, port);
|
loginfo("Connection from %s:%s", addr, port);
|
||||||
|
|
||||||
|
set_keep_alive(0);
|
||||||
alarm(init_timeout ? init_timeout : timeout);
|
alarm(init_timeout ? init_timeout : timeout);
|
||||||
pktlen = packet_read(0, NULL, NULL, packet_buffer, sizeof(packet_buffer), 0);
|
pktlen = packet_read(0, NULL, NULL, packet_buffer, sizeof(packet_buffer), 0);
|
||||||
alarm(0);
|
alarm(0);
|
||||||
@ -951,6 +961,8 @@ static int setup_named_sock(char *listen_addr, int listen_port, struct socketlis
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
set_keep_alive(sockfd);
|
||||||
|
|
||||||
if (bind(sockfd, ai->ai_addr, ai->ai_addrlen) < 0) {
|
if (bind(sockfd, ai->ai_addr, ai->ai_addrlen) < 0) {
|
||||||
logerror("Could not bind to %s: %s",
|
logerror("Could not bind to %s: %s",
|
||||||
ip2str(ai->ai_family, ai->ai_addr, ai->ai_addrlen),
|
ip2str(ai->ai_family, ai->ai_addr, ai->ai_addrlen),
|
||||||
@ -1010,6 +1022,8 @@ static int setup_named_sock(char *listen_addr, int listen_port, struct socketlis
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
set_keep_alive(sockfd);
|
||||||
|
|
||||||
if ( bind(sockfd, (struct sockaddr *)&sin, sizeof sin) < 0 ) {
|
if ( bind(sockfd, (struct sockaddr *)&sin, sizeof sin) < 0 ) {
|
||||||
logerror("Could not bind to %s: %s",
|
logerror("Could not bind to %s: %s",
|
||||||
ip2str(AF_INET, (struct sockaddr *)&sin, sizeof(sin)),
|
ip2str(AF_INET, (struct sockaddr *)&sin, sizeof(sin)),
|
||||||
|
Loading…
Reference in New Issue
Block a user