Re-indent code and reduce code being complied on Solaris for anetKeepAlive (#12914)
This is a follow-up PR for #12782, in which we introduced nested preprocessor directives for TCP keep-alive on Solaris and added redundant indentation for code. Besides, it could result in unreachable code due to the lack of `#else` on the latest Solaris 11.4 where `TCP_KEEPIDLE`, `TCP_KEEPINTVL`, and `TCP_KEEPCNT` are available. As a result, this PR does three main things: - To eliminate the redundant indention for C code in nested preprocessor directives - To add `#else` directives and move `TCP_KEEPALIVE_THRESHOLD` + `TCP_KEEPALIVE_ABORT_THRESHOLD` settings under it, avoid unreachable code and compiler warnings when `#if defined(TCP_KEEPIDLE) && defined(TCP_KEEPINTVL) && defined(TCP_KEEPCNT)` is met on Solaris 11.4 - To remove a few trailing whitespace in comments
This commit is contained in:
parent
c452e414a8
commit
50b8b99763
23
src/anet.c
23
src/anet.c
@ -145,7 +145,7 @@ int anetKeepAlive(char *err, int fd, int interval)
|
|||||||
int intvl;
|
int intvl;
|
||||||
int cnt;
|
int cnt;
|
||||||
|
|
||||||
/* There are platforms that are expected to support the full mechanism of TCP keep-alive,
|
/* There are platforms that are expected to support the full mechanism of TCP keep-alive,
|
||||||
* we want the compiler to emit warnings of unused variables if the preprocessor directives
|
* we want the compiler to emit warnings of unused variables if the preprocessor directives
|
||||||
* somehow fail, and other than those platforms, just omit these warnings if they happen.
|
* somehow fail, and other than those platforms, just omit these warnings if they happen.
|
||||||
*/
|
*/
|
||||||
@ -158,11 +158,12 @@ int anetKeepAlive(char *err, int fd, int interval)
|
|||||||
UNUSED(cnt);
|
UNUSED(cnt);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* The implementation of TCP keep-alive on Solaris/SmartOS is a bit unusual
|
|
||||||
* compared to other Unix-like systems.
|
|
||||||
* Thus, we need to specialize it on Solaris. */
|
|
||||||
#ifdef __sun
|
#ifdef __sun
|
||||||
/* There are two keep-alive mechanisms on Solaris:
|
/* The implementation of TCP keep-alive on Solaris/SmartOS is a bit unusual
|
||||||
|
* compared to other Unix-like systems.
|
||||||
|
* Thus, we need to specialize it on Solaris.
|
||||||
|
*
|
||||||
|
* There are two keep-alive mechanisms on Solaris:
|
||||||
* - By default, the first keep-alive probe is sent out after a TCP connection is idle for two hours.
|
* - By default, the first keep-alive probe is sent out after a TCP connection is idle for two hours.
|
||||||
* If the peer does not respond to the probe within eight minutes, the TCP connection is aborted.
|
* If the peer does not respond to the probe within eight minutes, the TCP connection is aborted.
|
||||||
* You can alter the interval for sending out the first probe using the socket option TCP_KEEPALIVE_THRESHOLD
|
* You can alter the interval for sending out the first probe using the socket option TCP_KEEPALIVE_THRESHOLD
|
||||||
@ -173,7 +174,7 @@ int anetKeepAlive(char *err, int fd, int interval)
|
|||||||
* The option value is an unsigned integer in milliseconds. The value zero indicates that TCP should never time out and
|
* The option value is an unsigned integer in milliseconds. The value zero indicates that TCP should never time out and
|
||||||
* abort the connection when probing. The system default is controlled by the TCP ndd parameter tcp_keepalive_abort_interval.
|
* abort the connection when probing. The system default is controlled by the TCP ndd parameter tcp_keepalive_abort_interval.
|
||||||
* The default is eight minutes.
|
* The default is eight minutes.
|
||||||
|
*
|
||||||
* - The second implementation is activated if socket option TCP_KEEPINTVL and/or TCP_KEEPCNT are set.
|
* - The second implementation is activated if socket option TCP_KEEPINTVL and/or TCP_KEEPCNT are set.
|
||||||
* The time between each consequent probes is set by TCP_KEEPINTVL in seconds.
|
* The time between each consequent probes is set by TCP_KEEPINTVL in seconds.
|
||||||
* The minimum value is ten seconds. The maximum is ten days, while the default is two hours.
|
* The minimum value is ten seconds. The maximum is ten days, while the default is two hours.
|
||||||
@ -186,24 +187,24 @@ int anetKeepAlive(char *err, int fd, int interval)
|
|||||||
|
|
||||||
/* `TCP_KEEPIDLE`, `TCP_KEEPINTVL`, and `TCP_KEEPCNT` were not available on Solaris
|
/* `TCP_KEEPIDLE`, `TCP_KEEPINTVL`, and `TCP_KEEPCNT` were not available on Solaris
|
||||||
* until version 11.4, but let's take a chance here. */
|
* until version 11.4, but let's take a chance here. */
|
||||||
#if defined(TCP_KEEPIDLE) && defined(TCP_KEEPINTVL) && defined(TCP_KEEPCNT)
|
#if defined(TCP_KEEPIDLE) && defined(TCP_KEEPINTVL) && defined(TCP_KEEPCNT)
|
||||||
if (setsockopt(fd, IPPROTO_TCP, TCP_KEEPIDLE, &idle, sizeof(idle))) {
|
if (setsockopt(fd, IPPROTO_TCP, TCP_KEEPIDLE, &idle, sizeof(idle))) {
|
||||||
anetSetError(err, "setsockopt TCP_KEEPIDLE: %s\n", strerror(errno));
|
anetSetError(err, "setsockopt TCP_KEEPIDLE: %s\n", strerror(errno));
|
||||||
return ANET_ERR;
|
return ANET_ERR;
|
||||||
}
|
}
|
||||||
|
|
||||||
intvl = idle/3;
|
intvl = idle/3;
|
||||||
if (setsockopt(fd, IPPROTO_TCP, TCP_KEEPINTVL, &intvl, sizeof(intvl))) {
|
if (setsockopt(fd, IPPROTO_TCP, TCP_KEEPINTVL, &intvl, sizeof(intvl))) {
|
||||||
anetSetError(err, "setsockopt TCP_KEEPINTVL: %s\n", strerror(errno));
|
anetSetError(err, "setsockopt TCP_KEEPINTVL: %s\n", strerror(errno));
|
||||||
return ANET_ERR;
|
return ANET_ERR;
|
||||||
}
|
}
|
||||||
|
|
||||||
cnt = 3;
|
cnt = 3;
|
||||||
if (setsockopt(fd, IPPROTO_TCP, TCP_KEEPCNT, &cnt, sizeof(cnt))) {
|
if (setsockopt(fd, IPPROTO_TCP, TCP_KEEPCNT, &cnt, sizeof(cnt))) {
|
||||||
anetSetError(err, "setsockopt TCP_KEEPCNT: %s\n", strerror(errno));
|
anetSetError(err, "setsockopt TCP_KEEPCNT: %s\n", strerror(errno));
|
||||||
return ANET_ERR;
|
return ANET_ERR;
|
||||||
}
|
}
|
||||||
return ANET_OK;
|
#else
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Fall back to the first implementation of tcp-alive mechanism for older Solaris,
|
/* Fall back to the first implementation of tcp-alive mechanism for older Solaris,
|
||||||
* simulate the tcp-alive mechanism on other platforms via `TCP_KEEPALIVE_THRESHOLD` + `TCP_KEEPALIVE_ABORT_THRESHOLD`.
|
* simulate the tcp-alive mechanism on other platforms via `TCP_KEEPALIVE_THRESHOLD` + `TCP_KEEPALIVE_ABORT_THRESHOLD`.
|
||||||
*/
|
*/
|
||||||
@ -222,8 +223,10 @@ int anetKeepAlive(char *err, int fd, int interval)
|
|||||||
anetSetError(err, "setsockopt TCP_KEEPCNT: %s\n", strerror(errno));
|
anetSetError(err, "setsockopt TCP_KEEPCNT: %s\n", strerror(errno));
|
||||||
return ANET_ERR;
|
return ANET_ERR;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
return ANET_OK;
|
return ANET_OK;
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef TCP_KEEPIDLE
|
#ifdef TCP_KEEPIDLE
|
||||||
|
Loading…
x
Reference in New Issue
Block a user