end
for idx, s in ipairs(servers) do
+ local server_addr = s:get_addr()
+ if not server_addr then
+ -- Pending DNS resolution; mark as tempfail so the next attempt retries
+ script.servers_ready[idx] = "tempfail"
+ logger.infox(rspamd_config,
+ 'skipping SCRIPT LOAD for upstream %s: address not resolved yet',
+ s:get_name())
+ else
local cur_opts = {
- host = s:get_addr(),
+ host = server_addr,
timeout = script.redis_params['timeout'],
cmd = 'SCRIPT',
args = { 'LOAD', script.script },
end
table.insert(options, cur_opts)
+ end
end
return options
local function connect_to_upstream(up, redis_params)
local rspamd_redis = require "rspamd_redis"
+ local up_addr = up:get_addr()
+ if not up_addr then
+ rspamd_logger.errx("cannot connect to redis %s: address not resolved yet",
+ up:get_name())
+ return false, nil
+ end
local ret, conn = rspamd_redis.connect_sync({
- host = up:get_addr(),
+ host = up_addr,
timeout = redis_params.timeout,
config = rspamd_config,
ev_base = rspamadm_ev_base,
rspamd_inet_addr_t *
rspamd_upstream_addr_next(struct upstream *up)
{
- unsigned int idx = up->addrs.cur, next_idx = up->addrs.cur, cur_af,
- min_errors, min_errors_idx;
+ unsigned int idx, next_idx, cur_af,
+ min_errors, min_errors_idx;
struct upstream_addr_elt *e1, *e2;
/*
* 4) If we cannot find such element, then we return the next element (switching AF)
*/
+ if (up == NULL || up->addrs.addr == NULL ||
+ up->addrs.addr->len == 0) {
+ /* Pending DNS resolution or never had any addresses */
+ return NULL;
+ }
+
+ idx = up->addrs.cur;
+ next_idx = up->addrs.cur;
e1 = g_ptr_array_index(up->addrs.addr, up->addrs.cur);
cur_af = rspamd_inet_address_get_af(e1->addr);
min_errors = e1->errors;
{
struct upstream_addr_elt *elt;
+ if (up == NULL || up->addrs.addr == NULL ||
+ up->addrs.addr->len == 0) {
+ return NULL;
+ }
+
elt = g_ptr_array_index(up->addrs.addr, up->addrs.cur);
return elt->addr;
{
struct upstream_addr_elt *elt;
+ if (up == NULL || up->addrs.addr == NULL ||
+ up->addrs.addr->len == 0) {
+ /* Pending or never resolved: fall back to the parsed port if known */
+ return up != NULL ? (int) up->deferred_port : -1;
+ }
+
elt = g_ptr_array_index(up->addrs.addr, up->addrs.cur);
return rspamd_inet_address_get_port(elt->addr);
}
struct rspamd_lua_upstream *up = lua_check_upstream(L, 1);
if (up) {
- rspamd_lua_ip_push(L, rspamd_upstream_addr_next(up->up));
+ rspamd_inet_addr_t *addr = rspamd_upstream_addr_next(up->up);
+ if (addr) {
+ rspamd_lua_ip_push(L, addr);
+ }
+ else {
+ /* Upstream has no addresses yet (pending DNS resolution) */
+ lua_pushnil(L);
+ }
}
else {
lua_pushnil(L);
end
local function check_clickhouse_upstream(upstream, ev_base, cfg)
+ if not upstream:get_addr() then
+ rspamd_logger.infox(rspamd_config,
+ 'skipping clickhouse upstream %s: address not resolved yet',
+ upstream:get_name())
+ return
+ end
local ch_params = {
ev_base = ev_base,
config = cfg,