summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--async.c15
-rw-r--r--net.c6
-rw-r--r--net.h2
3 files changed, 18 insertions, 5 deletions
diff --git a/async.c b/async.c
index 261fe24..2cff0b1 100644
--- a/async.c
+++ b/async.c
@@ -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;
diff --git a/net.c b/net.c
index aa5b183..882e2c4 100644
--- a/net.c
+++ b/net.c
@@ -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;
diff --git a/net.h b/net.h
index e28c403..9f43283 100644
--- a/net.h
+++ b/net.h
@@ -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