From 1c29aafd4701b92cd743a1635af640f1f3330689 Mon Sep 17 00:00:00 2001 From: Pieter Noordhuis Date: Wed, 25 May 2011 15:28:54 +0200 Subject: Clarify rationale behind issue #43 --- async.c | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/async.c b/async.c index cd49d3c..ed6c530 100644 --- a/async.c +++ b/async.c @@ -361,17 +361,20 @@ void redisProcessCallbacks(redisAsyncContext *ac) { /* Even if the context is subscribed, pending regular callbacks will * get a reply before pub/sub messages arrive. */ if (__redisShiftCallback(&ac->replies,&cb) != REDIS_OK) { - // error reply before any callbacks were setup + /* A spontaneous reply in a not-subscribed context can only be the + * error reply that is sent when a new connection exceeds the + * maximum number of allowed connections on the server side. This + * is seen as an error instead of a regular reply because the + * server closes the connection after sending it. To prevent the + * error from being overwritten by an EOF error the connection is + * closed here. See issue #43. */ if ( !(c->flags & REDIS_SUBSCRIBED) && ((redisReply*)reply)->type == REDIS_REPLY_ERROR ) { c->err = REDIS_ERR_OTHER; - err_len = strlen(((redisReply*)reply)->str); - err_len = err_len < (sizeof(c->errstr)-1) ? err_len : (sizeof(c->errstr)-1); - memcpy(c->errstr, ((redisReply*)reply)->str, err_len); - c->errstr[err_len] = '\0'; + snprintf(c->errstr,sizeof(c->errstr),"%s",((redisReply*)reply)->str); __redisAsyncDisconnect(ac); return; } - /* No more regular callbacks and no errors, the context *must* be subscribed. */ + /* No more regular callbacks and no errors, the context *must* be subscribed. */ assert(c->flags & REDIS_SUBSCRIBED); __redisGetSubscribeCallback(ac,reply,&cb); } -- cgit v1.2.3