Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/phpredis/phpredis.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormichael-grunder <michael.grunder@gmail.com>2014-07-15 21:51:13 +0400
committermichael-grunder <michael.grunder@gmail.com>2015-05-06 01:05:29 +0300
commit05597f1e6d3f8d47b40690993f8da51fdcd11cf2 (patch)
tree35ea690aeb0ff4e534c84fc9479bf7355f9654e0
parent667fa06f16efde5bc5e826ba35b7ba737ae2c2bb (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.c22
-rw-r--r--library.c26
-rw-r--r--library.h2
-rw-r--r--redis.c2
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
diff --git a/library.c b/library.c
index 14be3802..82fcaae6 100644
--- a/library.c
+++ b/library.c
@@ -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;
}
diff --git a/library.h b/library.h
index 97eb543e..bcd3bd5b 100644
--- a/library.h
+++ b/library.h
@@ -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);
diff --git a/redis.c b/redis.c
index d4e36280..dd168a7b 100644
--- a/redis.c
+++ b/redis.c
@@ -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] != '*') {