From 3f0ba4c2dcf9126b0f94bca4a056b516759d25c1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pavel=20B=C5=99ezina?= Date: Fri, 6 Mar 2020 12:49:04 +0100 Subject: [PATCH 13/18] cache_req: allow cache_req to return ERR_OFFLINE if all dp request failed Reviewed-by: Alexey Tikhonov --- src/responder/common/cache_req/cache_req.c | 13 +++++++++++++ src/responder/common/cache_req/cache_req.h | 4 ++++ src/responder/common/cache_req/cache_req_data.c | 12 ++++++++++++ src/responder/common/cache_req/cache_req_private.h | 3 +++ 4 files changed, 32 insertions(+) diff --git a/src/responder/common/cache_req/cache_req.c b/src/responder/common/cache_req/cache_req.c index afb0e7cda..0c8538414 100644 --- a/src/responder/common/cache_req/cache_req.c +++ b/src/responder/common/cache_req/cache_req.c @@ -974,6 +974,13 @@ static void cache_req_search_domains_done(struct tevent_req *subreq) case ERR_ID_OUTSIDE_RANGE: case ENOENT: if (state->check_next == false) { + if (state->cr->data->propogate_offline_status && !state->dp_success) { + /* Not found and data provider request failed so we were + * unable to fetch the data. */ + ret = ERR_OFFLINE; + goto done; + } + /* Not found. */ ret = ENOENT; goto done; @@ -1002,6 +1009,12 @@ done: case EAGAIN: break; default: + if (ret == ENOENT && state->cr->data->propogate_offline_status + && !state->dp_success) { + /* Not found and data provider request failed so we were + * unable to fetch the data. */ + ret = ERR_OFFLINE; + } tevent_req_error(req, ret); break; } diff --git a/src/responder/common/cache_req/cache_req.h b/src/responder/common/cache_req/cache_req.h index 72d4abe5e..d36cb2d3b 100644 --- a/src/responder/common/cache_req/cache_req.h +++ b/src/responder/common/cache_req/cache_req.h @@ -171,6 +171,10 @@ void cache_req_data_set_requested_domains(struct cache_req_data *data, char **requested_domains); +void +cache_req_data_set_propogate_offline_status(struct cache_req_data *data, + bool propogate_offline_status); + enum cache_req_type cache_req_data_get_type(struct cache_req_data *data); diff --git a/src/responder/common/cache_req/cache_req_data.c b/src/responder/common/cache_req/cache_req_data.c index 14c4ad14f..fe9f3db29 100644 --- a/src/responder/common/cache_req/cache_req_data.c +++ b/src/responder/common/cache_req/cache_req_data.c @@ -455,6 +455,18 @@ cache_req_data_set_requested_domains(struct cache_req_data *data, data->requested_domains = requested_domains; } +void +cache_req_data_set_propogate_offline_status(struct cache_req_data *data, + bool propogate_offline_status) +{ + if (data == NULL) { + DEBUG(SSSDBG_CRIT_FAILURE, "cache_req_data should never be NULL\n"); + return; + } + + data->propogate_offline_status = propogate_offline_status; +} + enum cache_req_type cache_req_data_get_type(struct cache_req_data *data) { diff --git a/src/responder/common/cache_req/cache_req_private.h b/src/responder/common/cache_req/cache_req_private.h index bfca688b9..2d52e7600 100644 --- a/src/responder/common/cache_req/cache_req_private.h +++ b/src/responder/common/cache_req/cache_req_private.h @@ -103,6 +103,9 @@ struct cache_req_data { /* if set, only search in the listed domains */ char **requested_domains; + + /* if set, ERR_OFFLINE is returned if data provider is offline */ + bool propogate_offline_status; }; struct tevent_req * -- 2.21.3