diff options
author | Pavlo Yatsukhnenko <yatsukhnenko@gmail.com> | 2017-08-04 09:57:47 +0300 |
---|---|---|
committer | Pavlo Yatsukhnenko <yatsukhnenko@gmail.com> | 2017-08-04 09:57:47 +0300 |
commit | 577a91909989924c841ed45f9e57a0518aa3ab30 (patch) | |
tree | 9b3f51c223e680b4c07bc96e20df7b3d37873127 /redis_array_impl.c | |
parent | e53465437d707f12ba8f461b391902dc9f7b9dd7 (diff) |
Remove ra_rehash_scan
Diffstat (limited to 'redis_array_impl.c')
-rw-r--r-- | redis_array_impl.c | 106 |
1 files changed, 35 insertions, 71 deletions
diff --git a/redis_array_impl.c b/redis_array_impl.c index ceab1884..ce2ceb19 100644 --- a/redis_array_impl.c +++ b/redis_array_impl.c @@ -693,52 +693,6 @@ ra_is_write_cmd(RedisArray *ra, const char *cmd, int cmd_len) { return !ret; } -/* list keys from array index */ -static long -ra_rehash_scan(zval *z_redis, char ***keys, int **key_lens, const char *cmd, const char *arg TSRMLS_DC) { - - long count, i; - zval z_fun_smembers, z_ret, z_arg[1], *z_data_p; - HashTable *h_keys; - char *key; - int key_len; - - /* arg */ - ZVAL_STRING(&z_arg[0], arg); - - /* run SMEMBERS */ - ZVAL_STRING(&z_fun_smembers, cmd); - call_user_function(&redis_ce->function_table, z_redis, &z_fun_smembers, &z_ret, 1, z_arg); - zval_dtor(&z_fun_smembers); - zval_dtor(&z_arg[0]); - if(Z_TYPE(z_ret) != IS_ARRAY) { /* failure */ - zval_dtor(&z_ret); - return -1; /* TODO: log error. */ - } - h_keys = Z_ARRVAL(z_ret); - - /* allocate key array */ - count = zend_hash_num_elements(h_keys); - *keys = emalloc(count * sizeof(char*)); - *key_lens = emalloc(count * sizeof(int)); - - i = 0; - ZEND_HASH_FOREACH_VAL(h_keys, z_data_p) { - key = Z_STRVAL_P(z_data_p); - key_len = Z_STRLEN_P(z_data_p); - - /* copy key and length */ - (*keys)[i] = estrndup(key, key_len); - (*key_lens)[i] = key_len; - i++; - } ZEND_HASH_FOREACH_END(); - - /* cleanup */ - zval_dtor(&z_ret); - - return count; -} - /* run TYPE to find the type */ static zend_bool ra_get_key_type(zval *z_redis, const char *key, int key_len, zval *z_from, long *res TSRMLS_DC) { @@ -1184,42 +1138,52 @@ static void ra_rehash_server(RedisArray *ra, zval *z_redis, const char *hostname, zend_bool b_index, zend_fcall_info *z_cb, zend_fcall_info_cache *z_cb_cache TSRMLS_DC) { - char **keys; - long count, i; - int *key_lens, target_pos; - zval *z_target; + HashTable *h_keys; + long count = 0; + zval z_fun, z_ret, z_argv, *z_ele; - /* list all keys */ - if(b_index) { - count = ra_rehash_scan(z_redis, &keys, &key_lens, "SMEMBERS", PHPREDIS_INDEX_NAME TSRMLS_CC); - } else { - count = ra_rehash_scan(z_redis, &keys, &key_lens, "KEYS", "*" TSRMLS_CC); - } + /* list all keys */ + if (b_index) { + ZVAL_STRING(&z_fun, "SMEMBERS"); + ZVAL_STRING(&z_argv, PHPREDIS_INDEX_NAME); + } else { + ZVAL_STRING(&z_fun, "KEYS"); + ZVAL_STRING(&z_argv, "*"); + } + ZVAL_NULL(&z_ret); + call_user_function(&redis_ce->function_table, z_redis, &z_fun, &z_ret, 1, &z_argv); + zval_dtor(&z_argv); + zval_dtor(&z_fun); - if (count < 0) return; + if (Z_TYPE(z_ret) == IS_ARRAY) { + h_keys = Z_ARRVAL(z_ret); + count = zend_hash_num_elements(h_keys); + } + + if (!count) { + zval_dtor(&z_ret); + return; + } /* callback */ if(z_cb && z_cb_cache) { zval_rehash_callback(z_cb, z_cb_cache, hostname, count TSRMLS_CC); } - /* for each key, redistribute */ - for(i = 0; i < count; ++i) { + /* for each key, redistribute */ + ZEND_HASH_FOREACH_VAL(h_keys, z_ele) { + int pos = 0; + /* check that we're not moving to the same node. */ + zval *z_target = ra_find_node(ra, Z_STRVAL_P(z_ele), Z_STRLEN_P(z_ele), &pos TSRMLS_CC); - /* check that we're not moving to the same node. */ - z_target = ra_find_node(ra, keys[i], key_lens[i], &target_pos TSRMLS_CC); - - if (z_target && strcmp(hostname, ra->hosts[target_pos])) { /* different host */ - /* php_printf("move [%s] from [%s] to [%s]\n", keys[i], hostname, ra->hosts[target_pos]); */ - ra_move_key(keys[i], key_lens[i], z_redis, z_target TSRMLS_CC); - } + if (z_target && strcmp(hostname, ra->hosts[pos])) { /* different host */ + ra_move_key(Z_STRVAL_P(z_ele), Z_STRLEN_P(z_ele), z_redis, z_target TSRMLS_CC); + } - /* cleanup */ - efree(keys[i]); - } + } ZEND_HASH_FOREACH_END(); - efree(keys); - efree(key_lens); + /* cleanup */ + zval_dtor(&z_ret); } void |