diff options
author | michael-grunder <michael.grunder@gmail.com> | 2014-07-15 21:51:13 +0400 |
---|---|---|
committer | michael-grunder <michael.grunder@gmail.com> | 2015-05-06 01:05:29 +0300 |
commit | 05597f1e6d3f8d47b40690993f8da51fdcd11cf2 (patch) | |
tree | 35ea690aeb0ff4e534c84fc9479bf7355f9654e0 | |
parent | 667fa06f16efde5bc5e826ba35b7ba737ae2c2bb (diff) |
Add a no_throw option to redis_check_eof
We don't want redis_check_eof to throw an exception in Cluster, as
we'll be getting bounced around while the slave election is in
process.
Added a very simple debugging function for testing stability, etc.
-rw-r--r-- | cluster_library.c | 22 | ||||
-rw-r--r-- | library.c | 26 | ||||
-rw-r--r-- | library.h | 2 | ||||
-rw-r--r-- | redis.c | 2 |
4 files changed, 33 insertions, 19 deletions
diff --git a/cluster_library.c b/cluster_library.c index 1619af2b..9173cdcd 100644 --- a/cluster_library.c +++ b/cluster_library.c @@ -28,6 +28,18 @@ static void cluster_dump_nodes(redisCluster *c) { } } +static void cluster_log(char *fmt, ...) +{ + va_list args; + char buffer[1024]; + + va_start(args, fmt); + vsnprintf(buffer,sizeof(buffer),fmt,args); + va_end(args); + + fprintf(stderr, "%s\n", buffer); +} + /* Direct handling of variant replies, in a hiredis like way. These methods * are used for non userland facing commands, as well as passed through from * them when the reply is just variant (e.g. eval) */ @@ -710,7 +722,7 @@ static int cluster_send_asking(RedisSock *redis_sock TSRMLS_DC) char buf[255]; // Make sure we can send the request - if(redis_check_eof(redis_sock TSRMLS_DC) || + if(redis_check_eof(redis_sock, 1 TSRMLS_DC) || php_stream_write(redis_sock->stream, RESP_ASKING_CMD, sizeof(RESP_ASKING_CMD)-1) != sizeof(RESP_ASKING_CMD)-1) { @@ -718,7 +730,7 @@ static int cluster_send_asking(RedisSock *redis_sock TSRMLS_DC) } // Read our reply type - if((redis_check_eof(redis_sock TSRMLS_CC) == - 1) || + if((redis_check_eof(redis_sock, 1 TSRMLS_CC) == - 1) || (reply_type = php_stream_getc(redis_sock->stream TSRMLS_DC) != TYPE_LINE)) { @@ -906,7 +918,7 @@ static int cluster_check_response(redisCluster *c, unsigned short slot, CLUSTER_CLEAR_ERROR(c); CLUSTER_CLEAR_REPLY(c); - if(-1 == redis_check_eof(SLOT_SOCK(c,slot)) || + if(-1 == redis_check_eof(SLOT_SOCK(c,slot), 1 TSRMLS_CC) || EOF == (*reply_type = php_stream_getc(SLOT_STREAM(c,slot)))) { return -1; @@ -998,7 +1010,7 @@ static int cluster_sock_write(redisCluster *c, unsigned short slot, // First attempt to write it to the slot that's been requested if(redis_sock && redis_sock->stream && - !redis_check_eof(redis_sock TSRMLS_CC) && + !redis_check_eof(redis_sock, 1 TSRMLS_CC) && php_stream_write(redis_sock->stream, cmd, sz)==sz) { // We were able to write it @@ -1022,7 +1034,7 @@ static int cluster_sock_write(redisCluster *c, unsigned short slot, CLUSTER_LAZY_CONNECT((*seed_node)->sock); // Attempt to write our request to this node - if(!redis_check_eof((*seed_node)->sock TSRMLS_CC) && + if(!redis_check_eof((*seed_node)->sock, 1 TSRMLS_CC) && php_stream_write((*seed_node)->sock->stream, cmd, sz)==sz) { // Just return the first slot we think this node handles @@ -157,8 +157,10 @@ PHP_REDIS_API int redis_check_eof(RedisSock *redis_sock TSRMLS_DC) redis_sock->status = REDIS_SOCK_STATUS_FAILED; redis_sock->watching = 0; } - zend_throw_exception(redis_exception_ce, "Connection lost", - 0 TSRMLS_CC); + if(!no_throw) { + zend_throw_exception(redis_exception_ce, "Connection lost", + 0 TSRMLS_CC); + } return -1; } if(redis_sock->stream) { /* close existing stream before reconnecting */ @@ -416,7 +418,7 @@ redis_sock_read_multibulk_reply_zval(INTERNAL_FUNCTION_PARAMETERS, int numElems; zval *z_tab; - if(-1 == redis_check_eof(redis_sock TSRMLS_CC)) { + if(-1 == redis_check_eof(redis_sock, 0 TSRMLS_CC)) { return NULL; } @@ -455,7 +457,7 @@ PHP_REDIS_API char *redis_sock_read_bulk_reply(RedisSock *redis_sock, int bytes char * reply; - if(-1 == redis_check_eof(redis_sock TSRMLS_CC)) { + if(-1 == redis_check_eof(redis_sock, 0 TSRMLS_CC)) { return NULL; } @@ -496,7 +498,7 @@ PHP_REDIS_API char *redis_sock_read(RedisSock *redis_sock, int *buf_len TSRMLS_D char *resp = NULL; size_t err_len; - if(-1 == redis_check_eof(redis_sock TSRMLS_CC)) { + if(-1 == redis_check_eof(redis_sock, 0 TSRMLS_CC)) { return NULL; } @@ -1235,7 +1237,7 @@ redis_sock_read_multibulk_reply_zipped_with_flag(INTERNAL_FUNCTION_PARAMETERS, int numElems; zval *z_multi_result; - if(-1 == redis_check_eof(redis_sock TSRMLS_CC)) { + if(-1 == redis_check_eof(redis_sock, 0 TSRMLS_CC)) { return -1; } if(php_stream_gets(redis_sock->stream, inbuf, 1024) == NULL) { @@ -1717,7 +1719,7 @@ PHPAPI int redis_sock_read_multibulk_reply(INTERNAL_FUNCTION_PARAMETERS, int numElems; zval *z_multi_result; - if(-1 == redis_check_eof(redis_sock TSRMLS_CC)) { + if(-1 == redis_check_eof(redis_sock, 0 TSRMLS_CC)) { return -1; } if(php_stream_gets(redis_sock->stream, inbuf, 1024) == NULL) { @@ -1774,7 +1776,7 @@ PHPAPI int redis_sock_read_multibulk_reply_raw(INTERNAL_FUNCTION_PARAMETERS, int numElems; zval *z_multi_result; - if(-1 == redis_check_eof(redis_sock TSRMLS_CC)) { + if(-1 == redis_check_eof(redis_sock, 0 TSRMLS_CC)) { return -1; } if(php_stream_gets(redis_sock->stream, inbuf, 1024) == NULL) { @@ -1898,7 +1900,7 @@ PHPAPI int redis_sock_read_multibulk_reply_assoc(INTERNAL_FUNCTION_PARAMETERS, zval **z_keys = ctx; - if(-1 == redis_check_eof(redis_sock TSRMLS_CC)) { + if(-1 == redis_check_eof(redis_sock, 0 TSRMLS_CC)) { return -1; } if(php_stream_gets(redis_sock->stream, inbuf, 1024) == NULL) { @@ -1970,7 +1972,7 @@ PHPAPI int redis_sock_write(RedisSock *redis_sock, char *cmd, size_t sz 0 TSRMLS_CC); return -1; } - if(-1 == redis_check_eof(redis_sock TSRMLS_CC)) { + if(-1 == redis_check_eof(redis_sock, 0 TSRMLS_CC)) { return -1; } return php_stream_write(redis_sock->stream, cmd, sz); @@ -2159,7 +2161,7 @@ redis_sock_gets(RedisSock *redis_sock, char *buf, int buf_size, size_t *line_size TSRMLS_DC) { // Handle EOF - if(-1 == redis_check_eof(redis_sock TSRMLS_CC)) { + if(-1 == redis_check_eof(redis_sock, 0 TSRMLS_CC)) { return -1; } @@ -2191,7 +2193,7 @@ redis_read_reply_type(RedisSock *redis_sock, REDIS_REPLY_TYPE *reply_type, int *reply_info TSRMLS_DC) { // Make sure we haven't lost the connection, even trying to reconnect - if(-1 == redis_check_eof(redis_sock TSRMLS_CC)) { + if(-1 == redis_check_eof(redis_sock, 0 TSRMLS_CC)) { // Failure return -1; } @@ -50,7 +50,7 @@ PHPAPI int redis_unsubscribe_response(INTERNAL_FUNCTION_PARAMETERS, PHPAPI int redis_sock_write(RedisSock *redis_sock, char *cmd, size_t sz TSRMLS_DC); PHPAPI void redis_stream_close(RedisSock *redis_sock TSRMLS_DC); -PHPAPI int redis_check_eof(RedisSock *redis_sock TSRMLS_DC); +PHPAPI int redis_check_eof(RedisSock *redis_sock, int no_throw TSRMLS_DC); PHPAPI int redis_sock_get(zval *id, RedisSock **redis_sock TSRMLS_DC, int nothrow); PHPAPI void redis_free_socket(RedisSock *redis_sock); PHPAPI void redis_send_discard(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock); @@ -2378,7 +2378,7 @@ PHP_REDIS_API int redis_sock_read_multibulk_multi_reply(INTERNAL_FUNCTION_PARAME int numElems; zval *z_tab; - redis_check_eof(redis_sock TSRMLS_CC); + redis_check_eof(redis_sock, 0 TSRMLS_CC); php_stream_gets(redis_sock->stream, inbuf, 1024); if(inbuf[0] != '*') { |