From e6b3fe548421b0f555c6d9d94dea4c26640ba716 Mon Sep 17 00:00:00 2001 From: Pavlo Yatsukhnenko Date: Fri, 27 May 2022 15:20:19 +0300 Subject: [PATCH] Backoff settings in constructor --- README.markdown | 5 +++++ library.c | 38 ++++++++++++++++++++++++++++++++++++++ library.h | 1 + redis.c | 8 ++++++-- 4 files changed, 50 insertions(+), 2 deletions(-) diff --git a/README.markdown b/README.markdown index ec7afd5..5f35476 100644 --- a/README.markdown +++ b/README.markdown @@ -161,6 +161,11 @@ $redis = new Redis([ 'connectTimeout' => 2.5, 'auth' => ['phpredis', 'phpredis'], 'ssl' => ['verify_peer' => false], + 'backoff' => [ + 'algorithm' => Redis::BACKOFF_ALGORITHM_DECORRELATED_JITTER, + 'base' => 500, + 'cap' => 750, + ], ]); ~~~ diff --git a/library.c b/library.c index 2e428e0..6c2b24d 100644 --- a/library.c +++ b/library.c @@ -2589,6 +2589,44 @@ redis_sock_set_stream_context(RedisSock *redis_sock, zval *options) return SUCCESS; } +PHP_REDIS_API int +redis_sock_set_backoff(RedisSock *redis_sock, zval *options) +{ + zend_string *zkey; + zend_long val; + zval *z_ele; + + if (!redis_sock || Z_TYPE_P(options) != IS_ARRAY) { + return FAILURE; + } + + ZEND_HASH_FOREACH_STR_KEY_VAL(Z_ARRVAL_P(options), zkey, z_ele) { + if (zkey != NULL) { + ZVAL_DEREF(z_ele); + if (zend_string_equals_literal_ci(zkey, "algorithm")) { + if ((val = zval_get_long(z_ele)) < 0 || val >= REDIS_BACKOFF_ALGORITHMS) { + return FAILURE; + } + redis_sock->backoff.algorithm = val; + } else if (zend_string_equals_literal_ci(zkey, "base")) { + if ((val = zval_get_long(z_ele)) < 0) { + return FAILURE; + } + redis_sock->backoff.base = val * 1000; + } else if (zend_string_equals_literal_ci(zkey, "cap")) { + if ((val = zval_get_long(z_ele)) < 0) { + return FAILURE; + } + redis_sock->backoff.cap = val * 1000; + } else { + php_error_docref(NULL, E_WARNING, "Skip unknown backoff option '%s'", ZSTR_VAL(zkey)); + } + } + } ZEND_HASH_FOREACH_END(); + + return SUCCESS; +} + /** * redis_sock_read_multibulk_reply */ diff --git a/library.h b/library.h index 8c277b9..cbf26a7 100644 --- a/library.h +++ b/library.h @@ -117,6 +117,7 @@ PHP_REDIS_API RedisSock *redis_sock_get(zval *id, int nothrow); PHP_REDIS_API void redis_free_socket(RedisSock *redis_sock); PHP_REDIS_API void redis_sock_set_err(RedisSock *redis_sock, const char *msg, int msg_len); PHP_REDIS_API int redis_sock_set_stream_context(RedisSock *redis_sock, zval *options); +PHP_REDIS_API int redis_sock_set_backoff(RedisSock *redis_sock, zval *options); PHP_REDIS_API int redis_serialize(RedisSock *redis_sock, zval *z, char **val, size_t *val_len); diff --git a/redis.c b/redis.c index ade8d3b..d526b99 100644 --- a/redis.c +++ b/redis.c @@ -650,17 +650,21 @@ PHP_METHOD(Redis, __construct) } redis->sock->retry_interval = zval_get_long(val); } else if (zend_string_equals_literal_ci(zkey, "ssl")) { - if (Z_TYPE_P(val) != IS_ARRAY) { + if (redis_sock_set_stream_context(redis->sock, val) != SUCCESS) { REDIS_VALUE_EXCEPTION("Invalid SSL context options"); RETURN_THROWS(); } - redis_sock_set_stream_context(redis->sock, val); } else if (zend_string_equals_literal_ci(zkey, "auth")) { if (Z_TYPE_P(val) != IS_STRING && Z_TYPE_P(val) != IS_ARRAY) { REDIS_VALUE_EXCEPTION("Invalid auth credentials"); RETURN_THROWS(); } redis_sock_set_auth_zval(redis->sock, val); + } else if (zend_string_equals_literal_ci(zkey, "backoff")) { + if (redis_sock_set_backoff(redis->sock, val) != SUCCESS) { + REDIS_VALUE_EXCEPTION("Invalid backoff options"); + RETURN_THROWS(); + } } else { php_error_docref(NULL, E_WARNING, "Skip unknown option '%s'", ZSTR_VAL(zkey)); }