diff --git a/common.h b/common.h index dbdf410f..9a46f992 100644 --- a/common.h +++ b/common.h @@ -37,6 +37,7 @@ typedef enum { REDIS_SOCK_STATUS_FAILED = -1, REDIS_SOCK_STATUS_DISCONNECTED, REDIS_SOCK_STATUS_CONNECTED, + REDIS_SOCK_STATUS_AUTHENTICATED, REDIS_SOCK_STATUS_READY } redis_sock_status; diff --git a/library.c b/library.c index d07ad6d2..e53f9a6b 100644 --- a/library.c +++ b/library.c @@ -375,13 +375,14 @@ redis_check_eof(RedisSock *redis_sock, zend_bool no_retry, zend_bool no_throw) errmsg = "AUTH failed while reconnecting"; break; } + redis_sock->status = REDIS_SOCK_STATUS_AUTHENTICATED; - redis_sock->status = REDIS_SOCK_STATUS_READY; /* If we're using a non-zero db, reselect it */ if (redis_sock->dbNumber && reselect_db(redis_sock) != 0) { errmsg = "SELECT failed while reconnecting"; break; } + redis_sock->status = REDIS_SOCK_STATUS_READY; /* Success */ return 0; } @@ -3015,7 +3016,7 @@ redis_sock_check_liveness(RedisSock *redis_sock) } else { goto failure; } - redis_sock->status = REDIS_SOCK_STATUS_READY; + redis_sock->status = REDIS_SOCK_STATUS_AUTHENTICATED; } else { if (strncmp(inbuf, "-NOAUTH", 7) == 0) { /* connection is fine but authentication required */ @@ -3179,13 +3180,19 @@ redis_sock_server_open(RedisSock *redis_sock) case REDIS_SOCK_STATUS_DISCONNECTED: if (redis_sock_connect(redis_sock) != SUCCESS) { break; - } else if (redis_sock->status == REDIS_SOCK_STATUS_READY) { - return SUCCESS; } + redis_sock->status = REDIS_SOCK_STATUS_CONNECTED; // fall through case REDIS_SOCK_STATUS_CONNECTED: - if (redis_sock_auth(redis_sock) != SUCCESS) + if (redis_sock_auth(redis_sock) != SUCCESS) { break; + } + redis_sock->status = REDIS_SOCK_STATUS_AUTHENTICATED; + // fall through + case REDIS_SOCK_STATUS_AUTHENTICATED: + if (redis_sock->dbNumber && reselect_db(redis_sock) != SUCCESS) { + break; + } redis_sock->status = REDIS_SOCK_STATUS_READY; // fall through case REDIS_SOCK_STATUS_READY: diff --git a/redis_session.c b/redis_session.c index 204f651d..2bdace7b 100644 --- a/redis_session.c +++ b/redis_session.c @@ -74,7 +74,6 @@ typedef struct redis_pool_member_ { RedisSock *redis_sock; int weight; - int database; struct redis_pool_member_ *next; } redis_pool_member; @@ -93,12 +92,11 @@ typedef struct { // } PHP_REDIS_API void -redis_pool_add(redis_pool *pool, RedisSock *redis_sock, int weight, int database) +redis_pool_add(redis_pool *pool, RedisSock *redis_sock, int weight) { redis_pool_member *rpm = ecalloc(1, sizeof(redis_pool_member)); rpm->redis_sock = redis_sock; rpm->weight = weight; - rpm->database = database; rpm->next = pool->head; pool->head = rpm; @@ -156,21 +154,6 @@ static int redis_simple_cmd(RedisSock *redis_sock, char *cmd, int cmdlen, return len_written; } -static void -redis_pool_member_select(redis_pool_member *rpm) { - RedisSock *redis_sock = rpm->redis_sock; - char *response, *cmd; - int response_len, cmd_len; - - cmd_len = REDIS_SPPRINTF(&cmd, "SELECT", "d", rpm->database); - if (redis_sock_write(redis_sock, cmd, cmd_len) >= 0) { - if ((response = redis_sock_read(redis_sock, &response_len))) { - efree(response); - } - } - efree(cmd); -} - PHP_REDIS_API redis_pool_member * redis_pool_get_sock(redis_pool *pool, const char *key) { @@ -183,10 +166,6 @@ redis_pool_get_sock(redis_pool *pool, const char *key) { for(i = 0; i < pool->totalWeight;) { if (pos >= i && pos < i + rpm->weight) { if (redis_sock_server_open(rpm->redis_sock) == 0) { - if (rpm->database >= 0) { /* default is -1 which leaves the choice to redis. */ - redis_pool_member_select(rpm); - } - return rpm; } } @@ -495,11 +474,15 @@ PS_OPEN_FUNC(redis) persistent, persistent_id ? ZSTR_VAL(persistent_id) : NULL, retry_interval); + if (db >= 0) { /* default is -1 which leaves the choice to redis. */ + redis_sock->dbNumber = db; + } + if (Z_TYPE(context) == IS_ARRAY) { redis_sock_set_stream_context(redis_sock, &context); } - redis_pool_add(pool, redis_sock, weight, db); + redis_pool_add(pool, redis_sock, weight); redis_sock->prefix = prefix; redis_sock_set_auth(redis_sock, user, pass); @@ -1294,4 +1277,4 @@ PS_GC_FUNC(rediscluster) { #endif -/* vim: set tabstop=4 expandtab: */ \ No newline at end of file +/* vim: set tabstop=4 expandtab: */