Blame SOURCES/0028-cache_req-allow-cache_req-to-return-ERR_OFFLINE-if-a.patch

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