提交 a43b68a1 编写于 作者: E Eric Wong 提交者: Junio C Hamano

daemon: enable SO_KEEPALIVE for all sockets

While --init-timeout and --timeout options exist and I've never
run git-daemon without them, some users may forget to set them
and encounter hung daemon processes when connections fail.
Enable socket-level timeouts so the kernel can send keepalive
probes as necessary to detect failed connections.
Signed-off-by: NEric Wong <e@80x24.org>
Signed-off-by: NJunio C Hamano <gitster@pobox.com>
上级 90f7b16b
...@@ -669,6 +669,15 @@ static void hostinfo_clear(struct hostinfo *hi) ...@@ -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) ...@@ -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 ...@@ -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 ...@@ -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)),
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册