Blame SOURCES/autofs-5.1.2-work-around-sss-startup-delay.patch

4d476f
autofs-5.1.2 - work around sss startup delay
4d476f
4d476f
From: Ian Kent <raven@themaw.net>
4d476f
4d476f
When sssd is starting up there can be a delay before the map
4d476f
information is read. During that time an ENOENT can be returned
4d476f
when there actually is a map and autofs must respect the ENOENT
4d476f
return and continue because no map present is a valid response.
4d476f
4d476f
To work around that make the master map read wait and retry for
4d476f
for a time to give sssd a chance to read the map before returning
4d476f
either an ENOENT or, if the retry limit is exceeded, ETIMEDOUT.
4d476f
4d476f
Signed-off-by: Ian Kent <raven@themaw.net>
4d476f
---
4d476f
 CHANGELOG            |    1 
4d476f
 modules/lookup_sss.c |   61 +++++++++++++++++++++++++++++++++++++++++++++++++++
4d476f
 2 files changed, 62 insertions(+)
4d476f
4d476f
--- autofs-5.0.7.orig/CHANGELOG
4d476f
+++ autofs-5.0.7/CHANGELOG
4d476f
@@ -240,6 +240,7 @@
4d476f
 - log functions to prefix messages with attempt_id if available.
4d476f
 - factor out set_thread_mount_request_log_id().
4d476f
 - add config option to use mount request log id.
4d476f
+- work around sss startup delay.
4d476f
 
4d476f
 25/07/2012 autofs-5.0.7
4d476f
 =======================
4d476f
--- autofs-5.0.7.orig/modules/lookup_sss.c
4d476f
+++ autofs-5.0.7/modules/lookup_sss.c
4d476f
@@ -30,6 +30,11 @@
4d476f
 
4d476f
 #define MAPFMT_DEFAULT "sun"
4d476f
 
4d476f
+/* Half a second between retries */
4d476f
+#define SETAUTOMOUNTENT_MASTER_INTERVAL	500000000
4d476f
+/* Try for 10 seconds */
4d476f
+#define SETAUTOMOUNTENT_MASTER_RETRIES	10 * 2
4d476f
+
4d476f
 #define MODPREFIX "lookup(sss): "
4d476f
 
4d476f
 #define SSS_SO_NAME "libsss_autofs"
4d476f
@@ -219,6 +224,53 @@ static int setautomntent(unsigned int lo
4d476f
 	return ret;
4d476f
 }
4d476f
 
4d476f
+static int setautomntent_wait(unsigned int logopt,
4d476f
+			      struct lookup_context *ctxt,
4d476f
+			      const char *mapname,
4d476f
+			      void **sss_ctxt, unsigned int retries)
4d476f
+{
4d476f
+	unsigned int retry = 0;
4d476f
+	int ret = 0;
4d476f
+
4d476f
+	*sss_ctxt = NULL;
4d476f
+
4d476f
+	while (++retry < retries) {
4d476f
+		struct timespec t = { 0, SETAUTOMOUNTENT_MASTER_INTERVAL };
4d476f
+		struct timespec r;
4d476f
+
4d476f
+		ret = ctxt->setautomntent(mapname, sss_ctxt);
4d476f
+		if (ret != ENOENT)
4d476f
+			break;
4d476f
+
4d476f
+		if (*sss_ctxt) {
4d476f
+			free(*sss_ctxt);
4d476f
+			*sss_ctxt = NULL;
4d476f
+		}
4d476f
+
4d476f
+		while (nanosleep(&t, &r) == -1 && errno == EINTR)
4d476f
+			memcpy(&t, &r, sizeof(struct timespec));
4d476f
+	}
4d476f
+
4d476f
+
4d476f
+	if (ret) {
4d476f
+		char buf[MAX_ERR_BUF];
4d476f
+		char *estr;
4d476f
+
4d476f
+		if (*sss_ctxt) {
4d476f
+			free(*sss_ctxt);
4d476f
+			*sss_ctxt = NULL;
4d476f
+		}
4d476f
+
4d476f
+		if (retry == retries)
4d476f
+			ret = ETIMEDOUT;
4d476f
+
4d476f
+		estr = strerror_r(ret, buf, MAX_ERR_BUF);
4d476f
+		error(logopt, MODPREFIX "setautomntent: %s", estr);
4d476f
+	}
4d476f
+
4d476f
+	return ret;
4d476f
+}
4d476f
+
4d476f
 static int endautomntent(unsigned int logopt,
4d476f
 			 struct lookup_context *ctxt, void **sss_ctxt)
4d476f
 {
4d476f
@@ -247,6 +299,15 @@ int lookup_read_master(struct master *ma
4d476f
 
4d476f
 	ret = setautomntent(logopt, ctxt, ctxt->mapname, &sss_ctxt);
4d476f
 	if (ret) {
4d476f
+		unsigned int retries;
4d476f
+
4d476f
+		if (ret != ENOENT)
4d476f
+			return NSS_STATUS_UNAVAIL;
4d476f
+
4d476f
+		retries = SETAUTOMOUNTENT_MASTER_RETRIES;
4d476f
+		ret = setautomntent_wait(logopt,
4d476f
+					 ctxt, ctxt->mapname, &sss_ctxt,
4d476f
+					 retries);
4d476f
 		if (ret == ENOENT)
4d476f
 			return NSS_STATUS_NOTFOUND;
4d476f
 		return NSS_STATUS_UNAVAIL;