return 0;
}
+/*
+ * Do resolve error management callback
+ * returns:
+ * 0 if we can trash answser items.
+ * 1 when safely ignored and we must kept answer items
+ */
int act_resolution_error_cb(struct resolv_requester *requester, int error_code)
{
struct stream *stream;
unsigned short query_id;
struct eb32_node *eb;
struct resolv_requester *req;
+ int keep_answer_items;
resolvers = ns->parent;
HA_SPIN_LOCK(DNS_LOCK, &resolvers->lock);
goto report_res_success;
report_res_error:
+ keep_answer_items = 0;
list_for_each_entry(req, &res->requesters, list)
- req->requester_error_cb(req, dns_resp);
+ keep_answer_items |= req->requester_error_cb(req, dns_resp);
+ if (!keep_answer_items)
+ resolv_purge_resolution_answer_records(res);
resolv_reset_resolution(res);
LIST_DELETE(&res->list);
LIST_APPEND(&resolvers->resolutions.wait, &res->list);
* the list */
if (!res->try) {
struct resolv_requester *req;
+ int keep_answer_items = 0;
/* Notify the result to the requesters */
if (!res->nb_responses)
res->status = RSLV_STATUS_TIMEOUT;
list_for_each_entry(req, &res->requesters, list)
- req->requester_error_cb(req, res->status);
+ keep_answer_items |= req->requester_error_cb(req, res->status);
+ if (!keep_answer_items)
+ resolv_purge_resolution_answer_records(res);
/* Clean up resolution info and remove it from the
* current list */
/*
* SRV record error management callback
* returns:
- * 0 on error
- * 1 when no error or safe ignore
+ * 0 if we can trash answser items.
+ * 1 when safely ignored and we must kept answer items
*
* Grabs the server's lock.
*/
/* SRV records */
srvrq = objt_resolv_srvrq(requester->owner);
if (!srvrq)
- return 1;
+ return 0;
resolvers = srvrq->resolvers;
res = requester->resolution;
HA_SPIN_UNLOCK(SERVER_LOCK, &s->lock);
}
- resolv_purge_resolution_answer_records(res);
-
- return 1;
+ return 0;
}
/*
* Server Name Resolution error management callback
* returns:
- * 0 on error
- * 1 when no error or safe ignore
+ * 0 if we can trash answser items.
+ * 1 when safely ignored and we must kept answer items
*
* Grabs the server's lock.
*/
s = objt_server(requester->owner);
if (!s)
- return 1;
+ return 0;
+
HA_SPIN_LOCK(SERVER_LOCK, &s->lock);
- if (!snr_update_srv_status(s, 1))
+ if (!snr_update_srv_status(s, 1)) {
memset(&s->addr, 0, sizeof(s->addr));
+ HA_SPIN_UNLOCK(SERVER_LOCK, &s->lock);
+ return 0;
+ }
HA_SPIN_UNLOCK(SERVER_LOCK, &s->lock);
+
return 1;
}