Blob Blame History Raw
autofs-5.1.6 - sss introduce a flag to indicate map being read

From: Ian Kent <raven@themaw.net>

When the master map is being read for the first time a retry loop is
used by the caller to try harder to read the master map because it
is required for autofs to start up.

But when re-reading the master map, reading dependent maps, or doing
key lookups that loop isn't used so a longer retry is needed for those
cases.

Introduce a flag to indicate which map is being read, or if the master
map is being re-read, or if a key lookup is being done so the number
of retries can be adjusted accordingly.

Signed-off-by: Ian Kent <raven@themaw.net>
---
 CHANGELOG            |    1 +
 modules/lookup_sss.c |   87 +++++++++++++++++++++++++++++++++++++++++---------
 2 files changed, 72 insertions(+), 16 deletions(-)

diff --git a/CHANGELOG b/CHANGELOG
index 4a6c042..2d98a3a 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -104,6 +104,7 @@ xx/xx/2018 autofs-5.1.5
 - improve sss getautomntent() error handling.
 - sss introduce calculate_retry_count() function.
 - move readall into struct master.
+- sss introduce a flag to indicate map being read.
 
 19/12/2017 autofs-5.1.4
 - fix spec file url.
diff --git a/modules/lookup_sss.c b/modules/lookup_sss.c
index 29666a3..3c0ffde 100644
--- a/modules/lookup_sss.c
+++ b/modules/lookup_sss.c
@@ -53,6 +53,24 @@
  */
 #define SSS_PROTO_VERSION 1
 
+#define SSS_DEFAULT_WAIT	10
+
+/* When the master map is being read a retry loop is used by the
+ * caller to try harder to read the master map because it is required
+ * for autofs to start up.
+ *
+ * But when reading dependent maps or looking up a key that loop isn't
+ * used so a longer retry is needed for those cases.
+ *
+ * Introduce a flag to indicate which map is being read or if a lookup
+ * is being done so the number of retries can be adjusted accordingly.
+ */
+#define SSS_READ_NONE		0x00
+#define SSS_READ_MASTER_MAP	0x01
+#define SSS_REREAD_MASTER_MAP	0x02
+#define SSS_READ_DEPENDENT_MAP	0x04
+#define SSS_LOOKUP_KEY		0x08
+
 unsigned int _sss_auto_protocol_version(unsigned int);
 int _sss_setautomntent(const char *, void **);
 int _sss_getautomntent_r(char **, char **, void *);
@@ -249,7 +267,7 @@ static unsigned int proto_version(struct lookup_context *ctxt)
 	return proto_version;
 }
 
-static unsigned int calculate_retry_count(struct lookup_context *ctxt)
+static unsigned int calculate_retry_count(struct lookup_context *ctxt, unsigned int flags)
 {
 	int retries;
 
@@ -269,15 +287,39 @@ static unsigned int calculate_retry_count(struct lookup_context *ctxt)
 		 * a host being down, return 0 for retries.
 		 */
 		if (proto_version(ctxt) == 0)
-			retries = 0;
+			return 0;
 		else
-			retries = 10;
+			retries = SSS_DEFAULT_WAIT;
 	}
+
+	if (proto_version(ctxt) == 0)
+		return retries;
+
+	/* When the master map is being read there's an additional
+	 * outer wait loop.
+	 *
+	 * If master map wait is set in the configuration there
+	 * will be an outer loop interating master_map_wait / 2
+	 * times so adjust the number of retries here to account
+	 * for this for the cases where the master map isn't being
+	 * read.
+	 */
+
+	if (!(flags & SSS_READ_MASTER_MAP) ||
+	     (flags & SSS_REREAD_MASTER_MAP)) {
+		unsigned int master_map_wait = defaults_get_master_wait();
+		unsigned int m_wait;
+
+		m_wait = master_map_wait ? master_map_wait : SSS_DEFAULT_WAIT;
+		retries *= (m_wait / 2);
+	}
+
 	return retries;
 }
 
 static int setautomntent_wait(unsigned int logopt,
-			      struct lookup_context *ctxt, void **sss_ctxt)
+			      struct lookup_context *ctxt, void **sss_ctxt,
+			      unsigned int flags)
 {
 	unsigned int retries;
 	unsigned int retry = 0;
@@ -285,7 +327,7 @@ static int setautomntent_wait(unsigned int logopt,
 
 	*sss_ctxt = NULL;
 
-	retries = calculate_retry_count(ctxt);
+	retries = calculate_retry_count(ctxt, flags);
 	if (retries == 0) {
 		if (proto_version(ctxt) == 0)
 			return EINVAL;
@@ -333,7 +375,8 @@ static int setautomntent_wait(unsigned int logopt,
 }
 
 static int setautomntent(unsigned int logopt,
-			 struct lookup_context *ctxt, void **sss_ctxt)
+			 struct lookup_context *ctxt, void **sss_ctxt,
+			 unsigned int flags)
 {
 	char buf[MAX_ERR_BUF];
 	char *estr;
@@ -355,7 +398,7 @@ static int setautomntent(unsigned int logopt,
 				goto error;
 		}
 
-		ret = setautomntent_wait(logopt, ctxt, sss_ctxt);
+		ret = setautomntent_wait(logopt, ctxt, sss_ctxt, flags);
 		if (ret) {
 			if (ret == ECONNREFUSED) {
 				err = NSS_STATUS_UNKNOWN;
@@ -400,13 +443,14 @@ static int endautomntent(unsigned int logopt,
 
 static int getautomntent_wait(unsigned int logopt,
 			 struct lookup_context *ctxt,
-			 char **key, char **value, void *sss_ctxt)
+			 char **key, char **value, void *sss_ctxt,
+			 unsigned int flags)
 {
 	unsigned int retries;
 	unsigned int retry = 0;
 	int ret = 0;
 
-	retries = calculate_retry_count(ctxt);
+	retries = calculate_retry_count(ctxt, flags);
 	if (retries == 0) {
 		if (proto_version(ctxt) == 0)
 			return EINVAL;
@@ -446,7 +490,8 @@ static int getautomntent_wait(unsigned int logopt,
 
 static int getautomntent(unsigned int logopt,
 			 struct lookup_context *ctxt,
-			 char **key, char **value, int count, void *sss_ctxt)
+			 char **key, char **value, int count,
+			 void *sss_ctxt, unsigned int flags)
 {
 	char buf[MAX_ERR_BUF];
 	char *estr;
@@ -486,7 +531,7 @@ static int getautomntent(unsigned int logopt,
 		}
 
 		ret = getautomntent_wait(logopt, ctxt,
-					 key, value, sss_ctxt);
+					 key, value, sss_ctxt, flags);
 		if (ret) {
 			if (ret == ECONNREFUSED) {
 				err = NSS_STATUS_UNKNOWN;
@@ -534,8 +579,13 @@ int lookup_read_master(struct master *master, time_t age, void *context)
 	char *key;
 	char *value = NULL;
 	int count, ret;
+	unsigned int flags;
+
+	flags = SSS_READ_MASTER_MAP;
+	if (master->readall)
+		flags |= SSS_REREAD_MASTER_MAP;
 
-	ret = setautomntent(logopt, ctxt, &sss_ctxt);
+	ret = setautomntent(logopt, ctxt, &sss_ctxt, flags);
 	if (ret)
 		return ret;
 
@@ -543,7 +593,9 @@ int lookup_read_master(struct master *master, time_t age, void *context)
 	while (1) {
 	        key = NULL;
 	        value = NULL;
-		ret = getautomntent(logopt, ctxt, &key, &value, count, sss_ctxt);
+		ret = getautomntent(logopt, ctxt,
+				    &key, &value, count,
+				    sss_ctxt, SSS_READ_MASTER_MAP);
 		if (ret) {
 			endautomntent(logopt, ctxt, &sss_ctxt);
 			return ret;
@@ -622,7 +674,8 @@ int lookup_read_map(struct autofs_point *ap, time_t age, void *context)
 		return NSS_STATUS_SUCCESS;
 	}
 
-	ret = setautomntent(ap->logopt, ctxt, &sss_ctxt);
+	ret = setautomntent(ap->logopt, ctxt,
+			    &sss_ctxt, SSS_READ_DEPENDENT_MAP);
 	if (ret)
 		return ret;
 
@@ -630,7 +683,9 @@ int lookup_read_map(struct autofs_point *ap, time_t age, void *context)
 	while (1) {
 	        key = NULL;
 	        value = NULL;
-		ret = getautomntent(ap->logopt, ctxt, &key, &value, count, sss_ctxt);
+		ret = getautomntent(ap->logopt, ctxt,
+				    &key, &value, count,
+				    sss_ctxt, SSS_READ_DEPENDENT_MAP);
 		if (ret) {
 			endautomntent(ap->logopt, ctxt, &sss_ctxt);
 			return ret;
@@ -711,7 +766,7 @@ static int lookup_one(struct autofs_point *ap,
 
 	mc = source->mc;
 
-	ret = setautomntent(ap->logopt, ctxt, &sss_ctxt);
+	ret = setautomntent(ap->logopt, ctxt, &sss_ctxt, SSS_LOOKUP_KEY);
 	if (ret)
 		return ret;