Spontaneous error reply can always happen

This commit is contained in:
Pieter Noordhuis 2012-07-31 17:40:46 -07:00
parent f2ddeeae95
commit 7ec4df9403

24
async.c
View File

@ -386,14 +386,22 @@ void redisProcessCallbacks(redisAsyncContext *ac) {
/* Even if the context is subscribed, pending regular callbacks will /* Even if the context is subscribed, pending regular callbacks will
* get a reply before pub/sub messages arrive. */ * get a reply before pub/sub messages arrive. */
if (__redisShiftCallback(&ac->replies,&cb) != REDIS_OK) { if (__redisShiftCallback(&ac->replies,&cb) != REDIS_OK) {
/* A spontaneous reply in a not-subscribed context can only be the /*
* error reply that is sent when a new connection exceeds the * A spontaneous reply in a not-subscribed context can be the error
* maximum number of allowed connections on the server side. This * reply that is sent when a new connection exceeds the maximum
* is seen as an error instead of a regular reply because the * number of allowed connections on the server side.
* server closes the connection after sending it. To prevent the *
* error from being overwritten by an EOF error the connection is * This is seen as an error instead of a regular reply because the
* closed here. See issue #43. */ * server closes the connection after sending it.
if ( !(c->flags & REDIS_SUBSCRIBED) && ((redisReply*)reply)->type == REDIS_REPLY_ERROR ) { *
* To prevent the error from being overwritten by an EOF error the
* connection is closed here. See issue #43.
*
* Another possibility is that the server is loading its dataset.
* In this case we also want to close the connection, and have the
* user wait until the server is ready to take our request.
*/
if (((redisReply*)reply)->type == REDIS_REPLY_ERROR) {
c->err = REDIS_ERR_OTHER; c->err = REDIS_ERR_OTHER;
snprintf(c->errstr,sizeof(c->errstr),"%s",((redisReply*)reply)->str); snprintf(c->errstr,sizeof(c->errstr),"%s",((redisReply*)reply)->str);
__redisAsyncDisconnect(ac); __redisAsyncDisconnect(ac);