Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP

Loading…

Add interval and count to keep-alive #269

Closed
wants to merge 1 commit into from

4 participants

@fastest963

We should be able to specify the probe interval and the failure count for keep-alive's on sockets.

Corresponding node pull request: joyent/node#2239

@piscisaureus
Owner

We should be able to specify the probe interval and the failure count for keep-alive's on sockets.

Why is that needed?

@fastest963

It is needed because the default probe interval and failure counts set by the OS are too extreme and if you have an application that keeps a lot of sockets open (say a server that hosts a lot of clients over socket connections) you'd want to fine-tune the values to be very low.

@ibc

I agree. Depending on OS default values is not (always) good.

@txdv

documenting that if count = 0 or interval = 0 that it won't change would be good imo

@fastest963

If I make a new pull request pointing at master and add the documentation for count/interval being 0, can it be merged?

@fastest963

Updated with Windows support for interval, documentation added that @txdv suggested and targeted master.
#729

@fastest963 fastest963 closed this
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Commits on Dec 8, 2011
  1. @fastest963
This page is out of date. Refresh to see the latest.
View
4 include/uv.h
@@ -483,9 +483,11 @@ UV_EXTERN int uv_tcp_nodelay(uv_tcp_t* handle, int enable);
/* Enable/disable TCP keep-alive.
*
* `ms` is the initial delay in seconds, ignored when `enable` is zero.
+ * interval is the keep-alive probe interval after the initial delay. Doesn't work in Windows
+ * count is the number of keep-alives that fail before thinking the socket is dead. Doesn't work in Windows
*/
UV_EXTERN int uv_tcp_keepalive(uv_tcp_t* handle, int enable,
- unsigned int delay);
+ unsigned int delay, unsigned int interval, unsigned int count);
/*
* This setting applies to Windows only.
View
2  src/unix/internal.h
@@ -132,7 +132,7 @@ int uv__connect(uv_connect_t* req, uv_stream_t* stream, struct sockaddr* addr,
/* tcp */
int uv_tcp_listen(uv_tcp_t* tcp, int backlog, uv_connection_cb cb);
int uv__tcp_nodelay(uv_tcp_t* handle, int enable);
-int uv__tcp_keepalive(uv_tcp_t* handle, int enable, unsigned int delay);
+int uv__tcp_keepalive(uv_tcp_t* handle, int enable, unsigned int delay, unsigned int interval, unsigned int count);
/* pipe */
int uv_pipe_listen(uv_pipe_t* handle, int backlog, uv_connection_cb cb);
View
2  src/unix/stream.c
@@ -102,7 +102,7 @@ int uv__stream_open(uv_stream_t* stream, int fd, int flags) {
/* TODO Use delay the user passed in. */
if ((stream->flags & UV_TCP_KEEPALIVE) &&
- uv__tcp_keepalive((uv_tcp_t*)stream, 1, 60)) {
+ uv__tcp_keepalive((uv_tcp_t*)stream, 1, 60, 60, 8)) {
return -1;
}
}
View
29 src/unix/tcp.c
@@ -255,7 +255,8 @@ int uv__tcp_nodelay(uv_tcp_t* handle, int enable) {
}
-int uv__tcp_keepalive(uv_tcp_t* handle, int enable, unsigned int delay) {
+int uv__tcp_keepalive(uv_tcp_t* handle, int enable, unsigned int delay,
+ unsigned int interval, unsigned int count) {
if (setsockopt(handle->fd,
SOL_SOCKET,
SO_KEEPALIVE,
@@ -287,6 +288,28 @@ int uv__tcp_keepalive(uv_tcp_t* handle, int enable, unsigned int delay) {
}
#endif
+#ifdef TCP_KEEPINTVL
+ if (enable && interval && setsockopt(handle->fd,
+ IPPROTO_TCP,
+ TCP_KEEPINTVL,
+ &interval,
+ sizeof interval) == -1) {
+ uv__set_sys_error(handle->loop, errno);
+ return -1;
+ }
+#endif
+
+#ifdef TCP_KEEPCNT
+ if (enable && count && setsockopt(handle->fd,
+ IPPROTO_TCP,
+ TCP_KEEPCNT,
+ &count,
+ sizeof count) == -1) {
+ uv__set_sys_error(handle->loop, errno);
+ return -1;
+ }
+#endif
+
return 0;
}
@@ -304,8 +327,8 @@ int uv_tcp_nodelay(uv_tcp_t* handle, int enable) {
}
-int uv_tcp_keepalive(uv_tcp_t* handle, int enable, unsigned int delay) {
- if (handle->fd != -1 && uv__tcp_keepalive(handle, enable, delay))
+int uv_tcp_keepalive(uv_tcp_t* handle, int enable, unsigned int delay, unsigned int interval, unsigned int count) {
+ if (handle->fd != -1 && uv__tcp_keepalive(handle, enable, delay, interval, count))
return -1;
if (enable)
View
14 src/win/tcp.c
@@ -59,7 +59,8 @@ static int uv__tcp_nodelay(uv_tcp_t* handle, SOCKET socket, int enable) {
}
-static int uv__tcp_keepalive(uv_tcp_t* handle, SOCKET socket, int enable, unsigned int delay) {
+static int uv__tcp_keepalive(uv_tcp_t* handle, SOCKET socket, int enable, unsigned int delay,
+ unsigned int interval, unsigned int count) {
if (setsockopt(socket,
SOL_SOCKET,
SO_KEEPALIVE,
@@ -78,6 +79,11 @@ static int uv__tcp_keepalive(uv_tcp_t* handle, SOCKET socket, int enable, unsign
return -1;
}
+ /*
+ * interval and count cannot be applied without registry
+ * changes and system reboot
+ */
+
return 0;
}
@@ -132,7 +138,7 @@ static int uv_tcp_set_socket(uv_loop_t* loop, uv_tcp_t* handle,
/* TODO: Use stored delay. */
if ((handle->flags & UV_HANDLE_TCP_KEEPALIVE) &&
- uv__tcp_keepalive(handle, socket, 1, 60)) {
+ uv__tcp_keepalive(handle, socket, 1, 60, 60, 8)) {
return -1;
}
@@ -1058,9 +1064,9 @@ int uv_tcp_nodelay(uv_tcp_t* handle, int enable) {
}
-int uv_tcp_keepalive(uv_tcp_t* handle, int enable, unsigned int delay) {
+int uv_tcp_keepalive(uv_tcp_t* handle, int enable, unsigned int delay, unsigned int interval, unsigned int count) {
if (handle->socket != INVALID_SOCKET &&
- uv__tcp_keepalive(handle, handle->socket, enable, delay)) {
+ uv__tcp_keepalive(handle, handle->socket, enable, delay, interval, count)) {
return -1;
}
View
2  test/test-tcp-flags.c
@@ -39,7 +39,7 @@ TEST_IMPL(tcp_flags) {
r = uv_tcp_nodelay(&handle, 1);
ASSERT(r == 0);
- r = uv_tcp_keepalive(&handle, 1, 60);
+ r = uv_tcp_keepalive(&handle, 1, 60, 60, 8);
ASSERT(r == 0);
uv_close((uv_handle_t*)&handle, NULL);
Something went wrong with that request. Please try again.