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

Skip to content

add support for 'connect_timeout' option for redis arrays #347

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 18 additions & 3 deletions redis_array.c
Original file line number Diff line number Diff line change
Expand Up @@ -196,7 +196,8 @@ PHP_METHOD(RedisArray, __construct)
RedisArray *ra = NULL;
zend_bool b_index = 0, b_autorehash = 0;
HashTable *hPrev = NULL, *hOpts = NULL;
long l_retry_interval = 0;
long l_retry_interval = 0;
double d_connect_timeout = 0;

if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z|a", &z0, &z_opts) == FAILURE) {
RETURN_FALSE;
Expand Down Expand Up @@ -239,7 +240,7 @@ PHP_METHOD(RedisArray, __construct)
}

/* extract retry_interval option. */
zval **z_retry_interval_pp;
zval **z_retry_interval_pp;
if (FAILURE != zend_hash_find(hOpts, "retry_interval", sizeof("retry_interval"), (void**)&z_retry_interval_pp)) {
if (Z_TYPE_PP(z_retry_interval_pp) == IS_LONG || Z_TYPE_PP(z_retry_interval_pp) == IS_STRING) {
if (Z_TYPE_PP(z_retry_interval_pp) == IS_LONG) {
Expand All @@ -250,6 +251,19 @@ PHP_METHOD(RedisArray, __construct)
}
}
}

/* extract connect_timeout option */
zval **z_connect_timeout_pp;
if (FAILURE != zend_hash_find(hOpts, "connect_timeout", sizeof("connect_timeout"), (void**)&z_connect_timeout_pp)) {
if (Z_TYPE_PP(z_connect_timeout_pp) == IS_DOUBLE || Z_TYPE_PP(z_connect_timeout_pp) == IS_STRING) {
if (Z_TYPE_PP(z_connect_timeout_pp) == IS_DOUBLE) {
d_connect_timeout = Z_DVAL_PP(z_connect_timeout_pp);
}
else {
d_connect_timeout = atof(Z_STRVAL_PP(z_connect_timeout_pp));
}
}
}
}

/* extract either name of list of hosts from z0 */
Expand All @@ -259,7 +273,7 @@ PHP_METHOD(RedisArray, __construct)
break;

case IS_ARRAY:
ra = ra_make_array(Z_ARRVAL_P(z0), z_fun, z_dist, hPrev, b_index, l_retry_interval TSRMLS_CC);
ra = ra_make_array(Z_ARRVAL_P(z0), z_fun, z_dist, hPrev, b_index, d_connect_timeout, l_retry_interval TSRMLS_CC);
break;

default:
Expand All @@ -269,6 +283,7 @@ PHP_METHOD(RedisArray, __construct)

if(ra) {
ra->auto_rehash = b_autorehash;
ra->connect_timeout = d_connect_timeout;
#if PHP_VERSION_ID >= 50400
id = zend_list_insert(ra, le_redis_array TSRMLS_CC);
#else
Expand Down
1 change: 1 addition & 0 deletions redis_array.h
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ typedef struct RedisArray_ {
zval *z_fun; /* key extractor, callable */
zval *z_dist; /* key distributor, callable */
zval *z_pure_cmds; /* hash table */
double connect_timeout; /* socket connect timeout */

struct RedisArray_ *prev;
} RedisArray;
Expand Down
28 changes: 24 additions & 4 deletions redis_array_impl.c
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@ ra_load_hosts(RedisArray *ra, HashTable *hosts, long retry_interval TSRMLS_DC)
call_user_function(&redis_ce->function_table, &ra->redis[i], &z_cons, &z_ret, 0, NULL TSRMLS_CC);

/* create socket */
redis_sock = redis_sock_create(host, host_len, port, 0, 0, NULL, retry_interval); /* TODO: persistence? */
redis_sock = redis_sock_create(host, host_len, port, ra->connect_timeout, 0, NULL, retry_interval); /* TODO: persistence? */

/* connect */
redis_sock_server_open(redis_sock, 1 TSRMLS_CC);
Expand Down Expand Up @@ -160,10 +160,12 @@ RedisArray *ra_load_array(const char *name TSRMLS_DC) {
zval *z_params_index;
zval *z_params_autorehash;
zval *z_params_retry_interval;
zval *z_params_connect_timeout;
RedisArray *ra = NULL;

zend_bool b_index = 0, b_autorehash = 0;
long l_retry_interval = 0;
double d_connect_timeout = 0;
HashTable *hHosts = NULL, *hPrev = NULL;

/* find entry */
Expand Down Expand Up @@ -241,8 +243,23 @@ RedisArray *ra_load_array(const char *name TSRMLS_DC) {
}
}

/* find connect timeout option */
MAKE_STD_ZVAL(z_params_connect_timeout);
array_init(z_params_connect_timeout);
sapi_module.treat_data(PARSE_STRING, estrdup(INI_STR("redis.arrays.connecttimeout")), z_params_connect_timeout TSRMLS_CC);
if (zend_hash_find(Z_ARRVAL_P(z_params_connect_timeout), name, strlen(name) + 1, (void **) &z_data_pp) != FAILURE) {
if (Z_TYPE_PP(z_data_pp) == IS_DOUBLE || Z_TYPE_PP(z_data_pp) == IS_STRING) {
if (Z_TYPE_PP(z_data_pp) == IS_DOUBLE) {
d_connect_timeout = Z_DVAL_PP(z_data_pp);
}
else {
d_connect_timeout = atof(Z_STRVAL_PP(z_data_pp));
}
}
}

/* create RedisArray object */
ra = ra_make_array(hHosts, z_fun, z_dist, hPrev, b_index, l_retry_interval TSRMLS_CC);
ra = ra_make_array(hHosts, z_fun, z_dist, hPrev, b_index, d_connect_timeout, l_retry_interval TSRMLS_CC);
ra->auto_rehash = b_autorehash;

/* cleanup */
Expand All @@ -258,12 +275,14 @@ RedisArray *ra_load_array(const char *name TSRMLS_DC) {
efree(z_params_autorehash);
zval_dtor(z_params_retry_interval);
efree(z_params_retry_interval);
zval_dtor(z_params_connect_timeout);
efree(z_params_connect_timeout);

return ra;
}

RedisArray *
ra_make_array(HashTable *hosts, zval *z_fun, zval *z_dist, HashTable *hosts_prev, zend_bool b_index, long retry_interval TSRMLS_DC) {
ra_make_array(HashTable *hosts, zval *z_fun, zval *z_dist, HashTable *hosts_prev, zend_bool b_index, double connect_timeout, long retry_interval TSRMLS_DC) {

int count = zend_hash_num_elements(hosts);

Expand All @@ -277,14 +296,15 @@ ra_make_array(HashTable *hosts, zval *z_fun, zval *z_dist, HashTable *hosts_prev
ra->z_multi_exec = NULL;
ra->index = b_index;
ra->auto_rehash = 0;
ra->connect_timeout = connect_timeout;

/* init array data structures */
ra_init_function_table(ra);

if(NULL == ra_load_hosts(ra, hosts, retry_interval TSRMLS_CC)) {
return NULL;
}
ra->prev = hosts_prev ? ra_make_array(hosts_prev, z_fun, z_dist, NULL, b_index, retry_interval TSRMLS_CC) : NULL;
ra->prev = hosts_prev ? ra_make_array(hosts_prev, z_fun, z_dist, NULL, b_index, connect_timeout, retry_interval TSRMLS_CC) : NULL;

/* copy function if provided */
if(z_fun) {
Expand Down
2 changes: 1 addition & 1 deletion redis_array_impl.h
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@

RedisArray *ra_load_hosts(RedisArray *ra, HashTable *hosts, long retry_interval TSRMLS_DC);
RedisArray *ra_load_array(const char *name TSRMLS_DC);
RedisArray *ra_make_array(HashTable *hosts, zval *z_fun, zval *z_dist, HashTable *hosts_prev, zend_bool b_index, long retry_interval TSRMLS_DC);
RedisArray *ra_make_array(HashTable *hosts, zval *z_fun, zval *z_dist, HashTable *hosts_prev, zend_bool b_index, double connect_timeout, long retry_interval TSRMLS_DC);
zval *ra_find_node_by_name(RedisArray *ra, const char *host, int host_len TSRMLS_DC);
zval *ra_find_node(RedisArray *ra, const char *key, int key_len, int *out_pos TSRMLS_DC);
void ra_init_function_table(RedisArray *ra);
Expand Down