Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit c33db92

Browse files
committed
Add failover support to PS_DESTROY_FUNC (phpredis#203).
1 parent e4ee953 commit c33db92

File tree

1 file changed

+39
-16
lines changed

1 file changed

+39
-16
lines changed

redis_session.c

+39-16
Original file line numberDiff line numberDiff line change
@@ -448,32 +448,22 @@ PS_WRITE_FUNC(redis)
448448
}
449449
/* }}} */
450450

451-
/* {{{ PS_DESTROY_FUNC
452-
*/
453-
PS_DESTROY_FUNC(redis)
451+
static int
452+
destroy_session(redis_pool_member *rpm, RedisSock *sock, const char *session, int session_len TSRMLS_DC)
454453
{
455-
char *cmd, *response, *session;
456-
int cmd_len, response_len, session_len;
457-
458-
redis_pool *pool = PS_GET_MOD_DATA();
459-
redis_pool_member *rpm = redis_pool_get_sock(pool, key TSRMLS_CC);
460-
RedisSock *redis_sock = rpm?rpm->redis_sock:NULL;
461-
if(!rpm || !redis_sock){
462-
return FAILURE;
463-
}
454+
char *cmd, *response;
455+
int cmd_len, response_len;
464456

465457
/* send DEL command */
466-
session = redis_session_key(rpm, key, strlen(key), &session_len);
467458
cmd_len = redis_cmd_format_static(&cmd, "DEL", "s", session, session_len);
468-
efree(session);
469-
if(redis_sock_write(redis_sock, cmd, cmd_len TSRMLS_CC) < 0) {
459+
if(redis_sock_write(sock, cmd, cmd_len TSRMLS_CC) < 0) {
470460
efree(cmd);
471461
return FAILURE;
472462
}
473463
efree(cmd);
474464

475465
/* read response */
476-
if ((response = redis_sock_read(redis_sock, &response_len TSRMLS_CC)) == NULL) {
466+
if ((response = redis_sock_read(sock, &response_len TSRMLS_CC)) == NULL) {
477467
return FAILURE;
478468
}
479469

@@ -485,6 +475,39 @@ PS_DESTROY_FUNC(redis)
485475
return FAILURE;
486476
}
487477
}
478+
479+
/* {{{ PS_DESTROY_FUNC
480+
*/
481+
PS_DESTROY_FUNC(redis)
482+
{
483+
char *session;
484+
int session_len;
485+
int ret;
486+
487+
redis_pool *pool = PS_GET_MOD_DATA();
488+
redis_pool_member *rpm = redis_pool_get_sock(pool, key TSRMLS_CC);
489+
RedisSock *redis_sock = rpm?rpm->redis_sock:NULL;
490+
if(!rpm || !redis_sock){
491+
return FAILURE;
492+
}
493+
494+
/* disable exceptions */
495+
redis_sock->nothrow = 1;
496+
497+
/* delete session from main server or failover. */
498+
session = redis_session_key(rpm, key, strlen(key), &session_len);
499+
ret = destroy_session(rpm, redis_sock, session, session_len TSRMLS_CC);
500+
if(ret == FAILURE && rpm->failover_sock) {
501+
ret = destroy_session(rpm, rpm->failover_sock, session, session_len TSRMLS_CC);
502+
}
503+
efree(session);
504+
505+
/* re-enable exceptions */
506+
redis_sock->nothrow = 0;
507+
508+
return ret;
509+
510+
}
488511
/* }}} */
489512

490513
/* {{{ PS_GC_FUNC

0 commit comments

Comments
 (0)