mirror of https://github.com/getdnsapi/getdns.git
Limit back_off value to avoid very long retry interval
This commit is contained in:
parent
d1aa3922fe
commit
a0fb2c8424
|
@ -679,6 +679,7 @@ upstreams_create(getdns_context *context, size_t size)
|
||||||
r->count = 0;
|
r->count = 0;
|
||||||
r->current_udp = 0;
|
r->current_udp = 0;
|
||||||
r->current_stateful = 0;
|
r->current_stateful = 0;
|
||||||
|
r->max_backoff_value = context->max_backoff_value;
|
||||||
r->tls_backoff_time = context->tls_backoff_time;
|
r->tls_backoff_time = context->tls_backoff_time;
|
||||||
r->tls_connection_retries = context->tls_connection_retries;
|
r->tls_connection_retries = context->tls_connection_retries;
|
||||||
r->log = context->log;
|
r->log = context->log;
|
||||||
|
@ -1664,6 +1665,7 @@ getdns_context_create_with_extended_memory_functions(
|
||||||
result->tls_backoff_time = 3600;
|
result->tls_backoff_time = 3600;
|
||||||
result->tls_connection_retries = 2;
|
result->tls_connection_retries = 2;
|
||||||
result->limit_outstanding_queries = 0;
|
result->limit_outstanding_queries = 0;
|
||||||
|
result->max_backoff_value = 1000;
|
||||||
|
|
||||||
/* unbound context is initialized here */
|
/* unbound context is initialized here */
|
||||||
/* Unbound needs SSL to be init'ed this early when TLS is used. However we
|
/* Unbound needs SSL to be init'ed this early when TLS is used. However we
|
||||||
|
@ -2362,6 +2364,22 @@ getdns_context_set_round_robin_upstreams(getdns_context *context, uint8_t value)
|
||||||
return GETDNS_RETURN_GOOD;
|
return GETDNS_RETURN_GOOD;
|
||||||
} /* getdns_context_set_round_robin_upstreams */
|
} /* getdns_context_set_round_robin_upstreams */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* getdns_context_set_max_backoff_value
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
getdns_return_t
|
||||||
|
getdns_context_set_max_backoff_value(getdns_context *context, uint16_t value)
|
||||||
|
{
|
||||||
|
RETURN_IF_NULL(context, GETDNS_RETURN_INVALID_PARAMETER);
|
||||||
|
|
||||||
|
context->max_backoff_value = value;
|
||||||
|
|
||||||
|
dispatch_updated(context, GETDNS_CONTEXT_CODE_MAX_BACKOFF_VALUE);
|
||||||
|
|
||||||
|
return GETDNS_RETURN_GOOD;
|
||||||
|
} /* getdns_context_set_max_backoff_value */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* getdns_context_set_tls_backoff_time
|
* getdns_context_set_tls_backoff_time
|
||||||
*
|
*
|
||||||
|
@ -3931,6 +3949,8 @@ _get_context_settings(getdns_context* context)
|
||||||
context->tls_auth)
|
context->tls_auth)
|
||||||
|| getdns_dict_set_int(result, "round_robin_upstreams",
|
|| getdns_dict_set_int(result, "round_robin_upstreams",
|
||||||
context->round_robin_upstreams)
|
context->round_robin_upstreams)
|
||||||
|
|| getdns_dict_set_int(result, "max_backoff_value",
|
||||||
|
context->max_backoff_value)
|
||||||
|| getdns_dict_set_int(result, "tls_backoff_time",
|
|| getdns_dict_set_int(result, "tls_backoff_time",
|
||||||
context->tls_backoff_time)
|
context->tls_backoff_time)
|
||||||
|| getdns_dict_set_int(result, "tls_connection_retries",
|
|| getdns_dict_set_int(result, "tls_connection_retries",
|
||||||
|
@ -4378,6 +4398,15 @@ getdns_context_get_round_robin_upstreams(getdns_context *context,
|
||||||
return GETDNS_RETURN_GOOD;
|
return GETDNS_RETURN_GOOD;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
getdns_return_t
|
||||||
|
getdns_context_get_max_backoff_value(getdns_context *context,
|
||||||
|
uint16_t* value) {
|
||||||
|
RETURN_IF_NULL(context, GETDNS_RETURN_INVALID_PARAMETER);
|
||||||
|
RETURN_IF_NULL(value, GETDNS_RETURN_INVALID_PARAMETER);
|
||||||
|
*value = context->max_backoff_value;
|
||||||
|
return GETDNS_RETURN_GOOD;
|
||||||
|
}
|
||||||
|
|
||||||
getdns_return_t
|
getdns_return_t
|
||||||
getdns_context_get_tls_backoff_time(getdns_context *context,
|
getdns_context_get_tls_backoff_time(getdns_context *context,
|
||||||
uint16_t* value) {
|
uint16_t* value) {
|
||||||
|
|
|
@ -263,6 +263,7 @@ typedef struct getdns_upstreams {
|
||||||
size_t count;
|
size_t count;
|
||||||
size_t current_udp;
|
size_t current_udp;
|
||||||
size_t current_stateful;
|
size_t current_stateful;
|
||||||
|
uint16_t max_backoff_value;
|
||||||
uint16_t tls_backoff_time;
|
uint16_t tls_backoff_time;
|
||||||
uint16_t tls_connection_retries;
|
uint16_t tls_connection_retries;
|
||||||
getdns_log_config log;
|
getdns_log_config log;
|
||||||
|
@ -357,6 +358,7 @@ struct getdns_context {
|
||||||
getdns_tls_authentication_t tls_auth; /* What user requested for TLS*/
|
getdns_tls_authentication_t tls_auth; /* What user requested for TLS*/
|
||||||
getdns_tls_authentication_t tls_auth_min; /* Derived minimum auth allowed*/
|
getdns_tls_authentication_t tls_auth_min; /* Derived minimum auth allowed*/
|
||||||
uint8_t round_robin_upstreams;
|
uint8_t round_robin_upstreams;
|
||||||
|
uint16_t max_backoff_value;
|
||||||
uint16_t tls_backoff_time;
|
uint16_t tls_backoff_time;
|
||||||
uint16_t tls_connection_retries;
|
uint16_t tls_connection_retries;
|
||||||
|
|
||||||
|
|
|
@ -103,6 +103,9 @@ extern "C" {
|
||||||
#define GETDNS_CONTEXT_CODE_TLS_CURVES_LIST 634
|
#define GETDNS_CONTEXT_CODE_TLS_CURVES_LIST 634
|
||||||
#define GETDNS_CONTEXT_CODE_TLS_CURVES_LIST_TEXT "Change related to getdns_context_set_tls_curves_list"
|
#define GETDNS_CONTEXT_CODE_TLS_CURVES_LIST_TEXT "Change related to getdns_context_set_tls_curves_list"
|
||||||
|
|
||||||
|
#define GETDNS_CONTEXT_CODE_MAX_BACKOFF_VALUE 635
|
||||||
|
#define GETDNS_CONTEXT_CODE_MAX_BACKOFF_VALUE_TEXT "Change related to getdns_context_set_max_backoff_value"
|
||||||
|
|
||||||
/** @}
|
/** @}
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
@ -768,6 +771,19 @@ getdns_return_t
|
||||||
getdns_context_set_tls_curves_list(
|
getdns_context_set_tls_curves_list(
|
||||||
getdns_context *context, const char *curves_list);
|
getdns_context *context, const char *curves_list);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the maximum number of messages that can be sent to other upstreams
|
||||||
|
* before the upstream which has previously timed out will be tried again.
|
||||||
|
* @see getdns_context_get_max_backoff_value
|
||||||
|
* @param[in] context The context to configure
|
||||||
|
* @param[in[ value Number of messages sent to other upstreams before
|
||||||
|
* retrying the upstream which had timed out.
|
||||||
|
* @return GETDNS_RETURN_GOOD on success
|
||||||
|
* @return GETDNS_RETURN_INVALID_PARAMETER if context is null.
|
||||||
|
*/
|
||||||
|
getdns_return_t
|
||||||
|
getdns_context_set_max_backoff_value(getdns_context *context, uint16_t value);
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the current resolution type setting from this context.
|
* Get the current resolution type setting from this context.
|
||||||
|
@ -1076,7 +1092,7 @@ getdns_context_get_tls_authentication(getdns_context *context,
|
||||||
/**
|
/**
|
||||||
* Get whether the context is configured to round robin queries over the available
|
* Get whether the context is configured to round robin queries over the available
|
||||||
* upstreams.
|
* upstreams.
|
||||||
* @see getdns_context_get_round_robin_upstreams
|
* @see getdns_context_set_round_robin_upstreams
|
||||||
* @param[in] context The context from which to get the setting
|
* @param[in] context The context from which to get the setting
|
||||||
* @param[out] value 1 if the setting is on, 0 otherwise
|
* @param[out] value 1 if the setting is on, 0 otherwise
|
||||||
* @return GETDNS_RETURN_GOOD when successful
|
* @return GETDNS_RETURN_GOOD when successful
|
||||||
|
@ -1303,6 +1319,19 @@ getdns_return_t
|
||||||
getdns_context_get_tls_curves_list(
|
getdns_context_get_tls_curves_list(
|
||||||
getdns_context *context, const char **curves_list);
|
getdns_context *context, const char **curves_list);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the maximum number of messages that can be sent to other upstreams
|
||||||
|
* before the upstream which has previously timed out will be tried again.
|
||||||
|
* @see getdns_context_set_max_backoff_value
|
||||||
|
* @param[in] context The context from which to get the setting
|
||||||
|
* @param[out] value Number of messages sent to other upstreams before
|
||||||
|
* retrying the upstream which had timed out.
|
||||||
|
* @return GETDNS_RETURN_GOOD on success
|
||||||
|
* @return GETDNS_RETURN_INVALID_PARAMETER if context is null.
|
||||||
|
*/
|
||||||
|
getdns_return_t
|
||||||
|
getdns_context_get_max_backoff_value(getdns_context *context,
|
||||||
|
uint16_t* value);
|
||||||
|
|
||||||
/** @}
|
/** @}
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -29,6 +29,7 @@ getdns_context_get_num_pending_requests
|
||||||
getdns_context_get_resolution_type
|
getdns_context_get_resolution_type
|
||||||
getdns_context_get_resolvconf
|
getdns_context_get_resolvconf
|
||||||
getdns_context_get_round_robin_upstreams
|
getdns_context_get_round_robin_upstreams
|
||||||
|
getdns_context_get_max_backoff_value
|
||||||
getdns_context_get_suffix
|
getdns_context_get_suffix
|
||||||
getdns_context_get_timeout
|
getdns_context_get_timeout
|
||||||
getdns_context_get_tls_authentication
|
getdns_context_get_tls_authentication
|
||||||
|
@ -73,6 +74,7 @@ getdns_context_set_resolution_type
|
||||||
getdns_context_set_resolvconf
|
getdns_context_set_resolvconf
|
||||||
getdns_context_set_return_dnssec_status
|
getdns_context_set_return_dnssec_status
|
||||||
getdns_context_set_round_robin_upstreams
|
getdns_context_set_round_robin_upstreams
|
||||||
|
getdns_context_set_max_backoff_value
|
||||||
getdns_context_set_suffix
|
getdns_context_set_suffix
|
||||||
getdns_context_set_timeout
|
getdns_context_set_timeout
|
||||||
getdns_context_set_tls_authentication
|
getdns_context_set_tls_authentication
|
||||||
|
|
|
@ -460,8 +460,13 @@ stub_next_upstream(getdns_network_req *netreq)
|
||||||
{
|
{
|
||||||
getdns_dns_req *dnsreq = netreq->owner;
|
getdns_dns_req *dnsreq = netreq->owner;
|
||||||
|
|
||||||
if (! --netreq->upstream->to_retry)
|
if (! --netreq->upstream->to_retry) {
|
||||||
netreq->upstream->to_retry = -(netreq->upstream->back_off *= 2);
|
/* Limit back_off value to configured maximum */
|
||||||
|
if (netreq->upstream->back_off * 2 > dnsreq->context->max_backoff_value)
|
||||||
|
netreq->upstream->to_retry = -(dnsreq->context->max_backoff_value);
|
||||||
|
else
|
||||||
|
netreq->upstream->to_retry = -(netreq->upstream->back_off *= 2);
|
||||||
|
}
|
||||||
|
|
||||||
dnsreq->upstreams->current_udp+=GETDNS_UPSTREAM_TRANSPORTS;
|
dnsreq->upstreams->current_udp+=GETDNS_UPSTREAM_TRANSPORTS;
|
||||||
if (dnsreq->upstreams->current_udp >= dnsreq->upstreams->count)
|
if (dnsreq->upstreams->current_udp >= dnsreq->upstreams->count)
|
||||||
|
|
Loading…
Reference in New Issue