Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
ruanhaishen
hiredis
Commits
392de5d7
Unverified
Commit
392de5d7
authored
Jun 22, 2020
by
OmriSteiner
Committed by
GitHub
Jun 22, 2020
Browse files
fix #785: defer TCP_NODELAY in async tcp connections (#836)
Co-authored-by:
Omri Steiner
<
omri@insoundz.com
>
parent
a28de70a
Changes
3
Hide whitespace changes
Inline
Side-by-side
async.c
View file @
392de5d7
...
...
@@ -539,20 +539,31 @@ void redisProcessCallbacks(redisAsyncContext *ac) {
__redisAsyncDisconnect
(
ac
);
}
static
void
__redisAsyncHandleConnectFailure
(
redisAsyncContext
*
ac
)
{
if
(
ac
->
onConnect
)
ac
->
onConnect
(
ac
,
REDIS_ERR
);
__redisAsyncDisconnect
(
ac
);
}
/* Internal helper function to detect socket status the first time a read or
* write event fires. When connecting was not successful, the connect callback
* is called with a REDIS_ERR status and the context is free'd. */
static
int
__redisAsyncHandleConnect
(
redisAsyncContext
*
ac
)
{
int
completed
=
0
;
redisContext
*
c
=
&
(
ac
->
c
);
if
(
redisCheckConnectDone
(
c
,
&
completed
)
==
REDIS_ERR
)
{
/* Error! */
redisCheckSocketError
(
c
);
if
(
ac
->
onConnect
)
ac
->
onConnect
(
ac
,
REDIS_ERR
);
__redisAsyncDisconnect
(
ac
);
__redisAsyncHandleConnectFailure
(
ac
);
return
REDIS_ERR
;
}
else
if
(
completed
==
1
)
{
/* connected! */
if
(
c
->
connection_type
==
REDIS_CONN_TCP
&&
redisSetTcpNoDelay
(
c
)
==
REDIS_ERR
)
{
__redisAsyncHandleConnectFailure
(
ac
);
return
REDIS_ERR
;
}
if
(
ac
->
onConnect
)
ac
->
onConnect
(
ac
,
REDIS_OK
);
c
->
flags
|=
REDIS_CONNECTED
;
return
REDIS_OK
;
...
...
net.c
View file @
392de5d7
...
...
@@ -203,7 +203,7 @@ int redisKeepAlive(redisContext *c, int interval) {
return
REDIS_OK
;
}
static
int
redisSetTcpNoDelay
(
redisContext
*
c
)
{
int
redisSetTcpNoDelay
(
redisContext
*
c
)
{
int
yes
=
1
;
if
(
setsockopt
(
c
->
fd
,
IPPROTO_TCP
,
TCP_NODELAY
,
&
yes
,
sizeof
(
yes
))
==
-
1
)
{
__redisSetErrorFromErrno
(
c
,
REDIS_ERR_IO
,
"setsockopt(TCP_NODELAY)"
);
...
...
@@ -487,12 +487,12 @@ addrretry:
wait_for_ready:
if
(
redisContextWaitReady
(
c
,
timeout_msec
)
!=
REDIS_OK
)
goto
error
;
if
(
redisSetTcpNoDelay
(
c
)
!=
REDIS_OK
)
goto
error
;
}
}
if
(
blocking
&&
redisSetBlocking
(
c
,
1
)
!=
REDIS_OK
)
goto
error
;
if
(
redisSetTcpNoDelay
(
c
)
!=
REDIS_OK
)
goto
error
;
c
->
flags
|=
REDIS_CONNECTED
;
rv
=
REDIS_OK
;
...
...
net.h
View file @
392de5d7
...
...
@@ -51,4 +51,6 @@ int redisContextConnectUnix(redisContext *c, const char *path, const struct time
int
redisKeepAlive
(
redisContext
*
c
,
int
interval
);
int
redisCheckConnectDone
(
redisContext
*
c
,
int
*
completed
);
int
redisSetTcpNoDelay
(
redisContext
*
c
);
#endif
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment