Auto-select db in redis_sock_server_open

This commit is contained in:
Pavlo Yatsukhnenko
2023-04-02 14:14:24 +03:00
parent 82265c4d54
commit 6930a81cb4
3 changed files with 20 additions and 29 deletions
+1
View File
@@ -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;
+12 -5
View File
@@ -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:
+7 -24
View File
@@ -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: */
/* vim: set tabstop=4 expandtab: */