git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH] http: enable keepalive on TCP sockets

From
EWEric Wong <normalperson@yhbt.net>
Date
Oct 12, 2013, 22:29 UTC
Message-ID
<20131012222939.GA24255@dcvr.yhbt.net>

This is a follow up to commit e47a8583a20256851e7fc882233e3bd5bf33dc6e (enable SO_KEEPALIVE for connected TCP sockets).

Sockets may never receive notification of some link errors, causing "git fetch" or similar processes to hang forever. Enabling keepalive messages allows hung processes to error out after a few minutes/hours depending on the keepalive settings of the system.

I noticed this problem with some non-interactive cronjobs getting hung when talking to HTTP servers.

Signed-off-by: Eric Wong <normalperson@yhbt.net>
---
 http.c | 22 ++++++++++++++++++++++
 1 file changed, 22 insertions(+)
diff --git a/http.c b/http.c
index f3e1439..5834c9b 100644
--- a/http.c
+++ b/http.c
@@ -260,6 +260,24 @@ static int has_cert_password(void)
 	return 1;
 }
 
+/* curl 7.25.0 has CURLOPT_TCP_KEEPALIVE, too, but we support older curl */
+static int sockopt_callback(void *client, curl_socket_t fd, curlsocktype type)
+{
+	int ka = 1;
+	int rc;
+	socklen_t len = (socklen_t)sizeof(ka);
+
+	if (type != CURLSOCKTYPE_IPCXN)
+		return 0;
+
+	rc = setsockopt(fd, SOL_SOCKET, SO_KEEPALIVE, (void *)&ka, len);
+	if (rc < 0)
+		warning("unable to set SO_KEEPALIVE on socket %s",
+			strerror(errno));
+
+	return 0; /* CURL_SOCKOPT_OK only exists since curl 7.21.5 */
+}
+
 static CURL *get_curl_handle(void)
 {
 	CURL *result = curl_easy_init();
@@ -332,6 +350,10 @@ static CURL *get_curl_handle(void)
 		curl_easy_setopt(result, CURLOPT_PROXYAUTH, CURLAUTH_ANY);
 	}
 
+#if LIBCURL_VERSION_NUM >= 0x071000
+	curl_easy_setopt(result, CURLOPT_SOCKOPTFUNCTION, sockopt_callback);
+#endif
+
 	return result;
 }
 
-- 
Eric Wong
Next: Daniel Stenberg
Message 1 of 9 in “http: enable keepalive on TCP sockets”
  1. http: enable keepalive on TCP socketsEric Wong, Oct 12, 2013
  2. Daniel StenbergOct 13, 2013
  3. Eric WongOct 14, 2013
  4. Jeff KingOct 14, 2013
  5. Eric WongOct 14, 2013
  6. http: use curl's tcp keepalive if availableJeff King, Oct 15, 2013
  7. Eric WongOct 15, 2013
  8. Jeff KingOct 15, 2013
  9. Eric WongOct 15, 2013

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.