From 5328e0520c64a973a9e74daefb89a1347677a02f 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 1/4] cache_req: allow cache_req to return ERR_OFFLINE if all
 dp request failed

---
 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 |  1 +
 4 files changed, 30 insertions(+)

diff --git a/src/responder/common/cache_req/cache_req.c b/src/responder/common/cache_req/cache_req.c
index afb0e7cdac..4a6bb53f52 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->return_offline && !state->dp_success) {
+                /* Not found and data provider request failed so were
+                 * unable to fetch the data. */
+                ret = ERR_OFFLINE;
+                goto done;
+            }
+
             /* Not found. */
             ret = ENOENT;
             goto done;
@@ -1002,6 +1009,12 @@ static void cache_req_search_domains_done(struct tevent_req *subreq)
     case EAGAIN:
         break;
     default:
+        if (ret == ENOENT && state->cr->data->return_offline
+                && !state->dp_success) {
+            /* Not found and data provider request failed so 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 72d4abe5ec..745f9c7c55 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_return_offline(struct cache_req_data *data,
+                                  bool return_offline);
+
 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 14c4ad14f0..986dc10ef3 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_return_offline(struct cache_req_data *data,
+                                  bool return_offline)
+{
+    if (data == NULL) {
+        DEBUG(SSSDBG_CRIT_FAILURE, "cache_req_data should never be NULL\n");
+        return;
+    }
+
+    data->return_offline = return_offline;
+}
+
 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 bfca688b92..d6f3a49f81 100644
--- a/src/responder/common/cache_req/cache_req_private.h
+++ b/src/responder/common/cache_req/cache_req_private.h
@@ -103,6 +103,7 @@ struct cache_req_data {
 
     /* if set, only search in the listed domains */
     char **requested_domains;
+    bool return_offline;
 };
 
 struct tevent_req *

From 4eac814373eb898c987a4049f216850a5927ebff Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Pavel=20B=C5=99ezina?= <pbrezina@redhat.com>
Date: Fri, 6 Mar 2020 13:12:46 +0100
Subject: [PATCH 2/4] autofs: return ERR_OFFLINE if we fail to get information
 from backend and cache is empty

Resolves:
https://github.com/SSSD/sssd/issues/3413
---
 .../common/cache_req/plugins/cache_req_autofs_entry_by_name.c   | 2 ++
 .../common/cache_req/plugins/cache_req_autofs_map_by_name.c     | 2 ++
 .../common/cache_req/plugins/cache_req_autofs_map_entries.c     | 2 ++
 3 files changed, 6 insertions(+)

diff --git a/src/responder/common/cache_req/plugins/cache_req_autofs_entry_by_name.c b/src/responder/common/cache_req/plugins/cache_req_autofs_entry_by_name.c
index cb674add69..8180f2a58f 100644
--- a/src/responder/common/cache_req/plugins/cache_req_autofs_entry_by_name.c
+++ b/src/responder/common/cache_req/plugins/cache_req_autofs_entry_by_name.c
@@ -142,6 +142,8 @@ cache_req_autofs_entry_by_name_send(TALLOC_CTX *mem_ctx,
         return NULL;
     }
 
+    cache_req_data_set_return_offline(data, true);
+
     return cache_req_steal_data_and_send(mem_ctx, ev, rctx, ncache,
                                          cache_refresh_percent,
                                          CACHE_REQ_POSIX_DOM, domain,
diff --git a/src/responder/common/cache_req/plugins/cache_req_autofs_map_by_name.c b/src/responder/common/cache_req/plugins/cache_req_autofs_map_by_name.c
index 3c08eaf4f8..0f441d2357 100644
--- a/src/responder/common/cache_req/plugins/cache_req_autofs_map_by_name.c
+++ b/src/responder/common/cache_req/plugins/cache_req_autofs_map_by_name.c
@@ -136,6 +136,8 @@ cache_req_autofs_map_by_name_send(TALLOC_CTX *mem_ctx,
         return NULL;
     }
 
+    cache_req_data_set_return_offline(data, true);
+
     return cache_req_steal_data_and_send(mem_ctx, ev, rctx, ncache,
                                          cache_refresh_percent,
                                          CACHE_REQ_POSIX_DOM, domain,
diff --git a/src/responder/common/cache_req/plugins/cache_req_autofs_map_entries.c b/src/responder/common/cache_req/plugins/cache_req_autofs_map_entries.c
index 1b5645fa0e..c01e815380 100644
--- a/src/responder/common/cache_req/plugins/cache_req_autofs_map_entries.c
+++ b/src/responder/common/cache_req/plugins/cache_req_autofs_map_entries.c
@@ -168,6 +168,8 @@ cache_req_autofs_map_entries_send(TALLOC_CTX *mem_ctx,
         return NULL;
     }
 
+    cache_req_data_set_return_offline(data, true);
+
     return cache_req_steal_data_and_send(mem_ctx, ev, rctx, ncache,
                                          cache_refresh_percent,
                                          CACHE_REQ_POSIX_DOM, domain,

From d4312531a8d489eca2997e7e547085cfdbc50525 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Pavel=20B=C5=99ezina?= <pbrezina@redhat.com>
Date: Fri, 6 Mar 2020 13:44:56 +0100
Subject: [PATCH 3/4] autofs: translate ERR_OFFLINE to EHOSTDOWN

So we do not publish internal error code.

Resolves:
https://github.com/SSSD/sssd/issues/3413
---
 src/sss_client/common.c | 15 ++++++++++++---
 1 file changed, 12 insertions(+), 3 deletions(-)

diff --git a/src/sss_client/common.c b/src/sss_client/common.c
index 902438c866..d293329397 100644
--- a/src/sss_client/common.c
+++ b/src/sss_client/common.c
@@ -44,6 +44,7 @@
 #define _(STRING) dgettext (PACKAGE, STRING)
 #include "sss_cli.h"
 #include "common_private.h"
+#include "util/util_errors.h"
 
 #if HAVE_PTHREAD
 #include <pthread.h>
@@ -1054,9 +1055,17 @@ int sss_autofs_make_request(enum sss_cli_command cmd,
                             uint8_t **repbuf, size_t *replen,
                             int *errnop)
 {
-    return sss_cli_make_request_with_checks(cmd, rd, SSS_CLI_SOCKET_TIMEOUT,
-                                            repbuf, replen, errnop,
-                                            SSS_AUTOFS_SOCKET_NAME);
+    enum sss_status status;
+
+    status = sss_cli_make_request_with_checks(cmd, rd, SSS_CLI_SOCKET_TIMEOUT,
+                                              repbuf, replen, errnop,
+                                              SSS_AUTOFS_SOCKET_NAME);
+
+    if (*errnop == ERR_OFFLINE) {
+        *errnop = EHOSTDOWN;
+    }
+
+    return status;
 }
 
 int sss_ssh_make_request(enum sss_cli_command cmd,

From 5d7a9b680abedfdd26e68af9d83d00271a84adf4 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Pavel=20B=C5=99ezina?= <pbrezina@redhat.com>
Date: Tue, 22 Sep 2020 11:04:25 +0200
Subject: [PATCH 4/4] autofs: disable fast reply

If the backend is offline when autofs starts and reads auto.master map
we don't want to wait 60 seconds before the offline flag is reset. We
need to allow autofs to retry the call much sooner.

Resolves:
https://github.com/SSSD/sssd/issues/3413
---
 .../common/cache_req/plugins/cache_req_autofs_entry_by_name.c   | 2 +-
 .../common/cache_req/plugins/cache_req_autofs_map_by_name.c     | 2 +-
 .../common/cache_req/plugins/cache_req_autofs_map_entries.c     | 2 +-
 3 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/src/responder/common/cache_req/plugins/cache_req_autofs_entry_by_name.c b/src/responder/common/cache_req/plugins/cache_req_autofs_entry_by_name.c
index 8180f2a58f..cefd2a738b 100644
--- a/src/responder/common/cache_req/plugins/cache_req_autofs_entry_by_name.c
+++ b/src/responder/common/cache_req/plugins/cache_req_autofs_entry_by_name.c
@@ -84,7 +84,7 @@ cache_req_autofs_entry_by_name_dp_send(TALLOC_CTX *mem_ctx,
 
     return sbus_call_dp_autofs_GetEntry_send(mem_ctx, be_conn->conn,
                                              be_conn->bus_name, SSS_BUS_PATH,
-                                             DP_FAST_REPLY, data->name.name,
+                                             0, data->name.name,
                                              data->autofs_entry_name);
 }
 
diff --git a/src/responder/common/cache_req/plugins/cache_req_autofs_map_by_name.c b/src/responder/common/cache_req/plugins/cache_req_autofs_map_by_name.c
index 0f441d2357..19a2a3c86c 100644
--- a/src/responder/common/cache_req/plugins/cache_req_autofs_map_by_name.c
+++ b/src/responder/common/cache_req/plugins/cache_req_autofs_map_by_name.c
@@ -81,7 +81,7 @@ cache_req_autofs_map_by_name_dp_send(TALLOC_CTX *mem_ctx,
 
     return sbus_call_dp_autofs_GetMap_send(mem_ctx, be_conn->conn,
                                            be_conn->bus_name, SSS_BUS_PATH,
-                                           DP_FAST_REPLY, data->name.name);
+                                           0, data->name.name);
 }
 
 bool
diff --git a/src/responder/common/cache_req/plugins/cache_req_autofs_map_entries.c b/src/responder/common/cache_req/plugins/cache_req_autofs_map_entries.c
index c01e815380..d4d897eaa5 100644
--- a/src/responder/common/cache_req/plugins/cache_req_autofs_map_entries.c
+++ b/src/responder/common/cache_req/plugins/cache_req_autofs_map_entries.c
@@ -113,7 +113,7 @@ cache_req_autofs_map_entries_dp_send(TALLOC_CTX *mem_ctx,
 
     return sbus_call_dp_autofs_Enumerate_send(mem_ctx, be_conn->conn,
                                               be_conn->bus_name, SSS_BUS_PATH,
-                                              DP_FAST_REPLY, data->name.name);
+                                              0, data->name.name);
 }
 
 bool
