소스 검색

[Minor] Always try to check IPv4 address first when checking HTTP maps

tags/2.6
Vsevolod Stakhov 3 년 전
부모
커밋
28193d7f3f
1개의 변경된 파일48개의 추가작업 그리고 5개의 파일을 삭제
  1. 48
    5
      src/libserver/maps/map.c

+ 48
- 5
src/libserver/maps/map.c 파일 보기

@@ -1127,6 +1127,40 @@ rspamd_map_schedule_periodic (struct rspamd_map *map, int how)
cbd, jittered_sec, map->name, reason);
}

static gint
rspamd_map_af_to_weight (const rspamd_inet_addr_t *addr)
{
int ret;

switch (rspamd_inet_address_get_af (addr)) {
case AF_UNIX:
ret = 2;
break;
case AF_INET:
ret = 1;
break;
default:
ret = 0;
break;
}

return ret;
}

static gint
rspamd_map_dns_address_sort_func (gconstpointer a, gconstpointer b)
{
const rspamd_inet_addr_t *ip1 = *(const rspamd_inet_addr_t **)a,
*ip2 = *(const rspamd_inet_addr_t **)b;
gint w1, w2;

w1 = rspamd_map_af_to_weight (ip1);
w2 = rspamd_map_af_to_weight (ip2);

/* Inverse order */
return w2 - w1;
}

static void
rspamd_map_dns_callback (struct rdns_reply *reply, void *arg)
{
@@ -1188,11 +1222,20 @@ rspamd_map_dns_callback (struct rdns_reply *reply, void *arg)
}

if (cbd->stage == http_map_http_conn && cbd->addrs->len > 0) {
guint selected_addr_idx;

selected_addr_idx = rspamd_random_uint64_fast () % cbd->addrs->len;
cbd->addr = (rspamd_inet_addr_t *)g_ptr_array_index (cbd->addrs,
selected_addr_idx);
rspamd_ptr_array_shuffle (cbd->addrs);
/*
* For the existing addr we can just select any address as we have
* data available
*/
if (cbd->map->nelts > 0 && rspamd_random_double_fast () > 0.5) {
/* Already shuffled, use whatever is the first */
cbd->addr = (rspamd_inet_addr_t *) g_ptr_array_index (cbd->addrs, 0);
}
else {
/* Always prefer IPv4 as IPv6 is almost all the time broken */
g_ptr_array_sort (cbd->addrs, rspamd_map_dns_address_sort_func);
cbd->addr = (rspamd_inet_addr_t *) g_ptr_array_index (cbd->addrs, 0);
}

msg_debug_map ("open http connection to %s",
rspamd_inet_address_to_string_pretty (cbd->addr));

Loading…
취소
저장