101 lines
3.7 KiB
Diff
101 lines
3.7 KiB
Diff
From 3f0ba4c2dcf9126b0f94bca4a056b516759d25c1 Mon Sep 17 00:00:00 2001
|
|
From: =?UTF-8?q?Pavel=20B=C5=99ezina?= <pbrezina@redhat.com>
|
|
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 <atikhono@redhat.com>
|
|
---
|
|
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
|
|
|