|
|
@@ -338,23 +338,12 @@ rspamd_upstream_revive_cb (int fd, short what, void *arg) |
|
|
}
|
|
|
|
|
|
static void
|
|
|
-rspamd_upstream_set_inactive (struct upstream_list *ls, struct upstream *up)
|
|
|
+rspamd_upstream_resolve_addrs (const struct upstream_list *ls,
|
|
|
+ struct upstream *up)
|
|
|
{
|
|
|
- gdouble ntim;
|
|
|
- guint i;
|
|
|
- struct upstream *cur;
|
|
|
-
|
|
|
- RSPAMD_UPSTREAM_LOCK (ls->lock);
|
|
|
- g_ptr_array_remove_index (ls->alive, up->active_idx);
|
|
|
- up->active_idx = -1;
|
|
|
-
|
|
|
- /* We need to update all indicies */
|
|
|
- for (i = 0; i < ls->alive->len; i ++) {
|
|
|
- cur = g_ptr_array_index (ls->alive, i);
|
|
|
- cur->active_idx = i;
|
|
|
- }
|
|
|
-
|
|
|
- if (up->ctx->res != NULL && up->ctx->configured &&
|
|
|
+ if (up->ctx->res != NULL &&
|
|
|
+ up->ctx->configured &&
|
|
|
+ up->dns_requests == 0 &&
|
|
|
!(ls->flags & RSPAMD_UPSTREAM_FLAG_NORESOLVE)) {
|
|
|
/* Resolve name of the upstream one more time */
|
|
|
if (up->name[0] != '/') {
|
|
|
@@ -374,6 +363,26 @@ rspamd_upstream_set_inactive (struct upstream_list *ls, struct upstream *up) |
|
|
}
|
|
|
}
|
|
|
}
|
|
|
+}
|
|
|
+
|
|
|
+static void
|
|
|
+rspamd_upstream_set_inactive (struct upstream_list *ls, struct upstream *up)
|
|
|
+{
|
|
|
+ gdouble ntim;
|
|
|
+ guint i;
|
|
|
+ struct upstream *cur;
|
|
|
+
|
|
|
+ RSPAMD_UPSTREAM_LOCK (ls->lock);
|
|
|
+ g_ptr_array_remove_index (ls->alive, up->active_idx);
|
|
|
+ up->active_idx = -1;
|
|
|
+
|
|
|
+ /* We need to update all indicies */
|
|
|
+ for (i = 0; i < ls->alive->len; i ++) {
|
|
|
+ cur = g_ptr_array_index (ls->alive, i);
|
|
|
+ cur->active_idx = i;
|
|
|
+ }
|
|
|
+
|
|
|
+ rspamd_upstream_resolve_addrs (ls, up);
|
|
|
|
|
|
REF_RETAIN (up);
|
|
|
evtimer_set (&up->ev, rspamd_upstream_revive_cb, up);
|
|
|
@@ -421,10 +430,16 @@ rspamd_upstream_fail (struct upstream *up) |
|
|
max_error_rate = 0;
|
|
|
}
|
|
|
|
|
|
- if (up->ls->ups->len > 1 && error_rate > max_error_rate) {
|
|
|
+ if (error_rate > max_error_rate) {
|
|
|
/* Remove upstream from the active list */
|
|
|
- up->errors = 0;
|
|
|
- rspamd_upstream_set_inactive (up->ls, up);
|
|
|
+ if (up->ls->ups->len > 1) {
|
|
|
+ up->errors = 0;
|
|
|
+ rspamd_upstream_set_inactive (up->ls, up);
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ /* Just re-resolve addresses */
|
|
|
+ rspamd_upstream_resolve_addrs (up->ls, up);
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
@@ -926,34 +941,7 @@ rspamd_upstream_reresolve (struct upstream_ctx *ctx) |
|
|
while (cur) {
|
|
|
up = cur->data;
|
|
|
REF_RETAIN (up);
|
|
|
-
|
|
|
- if (up->name[0] != '/' && ctx->res != NULL &&
|
|
|
- !(up->ls->flags & RSPAMD_UPSTREAM_FLAG_NORESOLVE)) {
|
|
|
- if (rdns_make_request_full (ctx->res,
|
|
|
- rspamd_upstream_dns_cb,
|
|
|
- up,
|
|
|
- ctx->dns_timeout,
|
|
|
- ctx->dns_retransmits,
|
|
|
- 1,
|
|
|
- up->name,
|
|
|
- RDNS_REQUEST_A) != NULL) {
|
|
|
- up->dns_requests++;
|
|
|
- REF_RETAIN (up);
|
|
|
- }
|
|
|
-
|
|
|
- if (rdns_make_request_full (ctx->res,
|
|
|
- rspamd_upstream_dns_cb,
|
|
|
- up,
|
|
|
- ctx->dns_timeout,
|
|
|
- ctx->dns_retransmits,
|
|
|
- 1,
|
|
|
- up->name,
|
|
|
- RDNS_REQUEST_AAAA) != NULL) {
|
|
|
- up->dns_requests++;
|
|
|
- REF_RETAIN (up);
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
+ rspamd_upstream_resolve_addrs (up->ls, up);
|
|
|
REF_RELEASE (up);
|
|
|
cur = g_list_next (cur);
|
|
|
}
|
|
|
|
0 comments on commit
81d002b