From cca81b0164c83a90eafa8d27d4887638cae080b5 Mon Sep 17 00:00:00 2001
From: Alan Hicks <ahicks@p-o.co.uk>
Date: Tue, 4 Oct 2016 15:34:04 +0100
Subject: [PATCH 11/33] Add retries for binding and searching

---
 src/modules/authldap.c | 43 +++++++++++++++++++++++++++----------------
 1 file changed, 27 insertions(+), 16 deletions(-)

diff --git src/modules/authldap.c src/modules/authldap.c
index 1b1b1bd..475c985 100644
--- src/modules/authldap.c
+++ src/modules/authldap.c
@@ -126,10 +126,11 @@ static LDAP * ldap_con_get(void)
 		return ld;
 	}
 	int c = 0;
+	int c_tries = 120;
 	int err = -1; // Start wanting success
-	while (err != 0 && c++ < 120) {
+	while (err != 0 && c++ < c_tries) {
 		// Loop until success or too many retries
-		TRACE(TRACE_DEBUG, "No connection trying [%d]", c);
+		TRACE(TRACE_DEBUG, "No connection trying [%d/%d]", c, c_tries);
 
 		err = authldap_connect();
 
@@ -139,11 +140,13 @@ static LDAP * ldap_con_get(void)
 				TRACE(TRACE_DEBUG, "connection [%p]", ld);
 				break;
 			case LDAP_SERVER_DOWN:
-				TRACE(TRACE_WARNING, "LDAP gone away: %s. Trying to reconnect(%d/120).", ldap_err2string(err),c);
+				TRACE(TRACE_WARNING, "LDAP gone away: %s. Trying to reconnect(%d/%d).", ldap_err2string(err), c, c_tries);
 				sleep(1); // reconnect failed. wait before trying again
 				break;
 			default:
+				// Includes timeouts etc. Should probably refactor.
 				TRACE(TRACE_ERR, "LDAP error(%d): %s", err, ldap_err2string(err));
+				sleep(1);
 				break;
 		}
 	}
@@ -261,7 +264,9 @@ static LDAPMessage * authldap_search(const gchar *query)
 	LDAPMessage *ldap_res;
 	int _ldap_attrsonly = 0;
 	char **_ldap_attrs = NULL;
-	int err;
+	int err = -1; // Start wanting success
+	int c = 0;
+	int c_tries = 10;
 	LDAP *_ldap_conn;
 
 	g_return_val_if_fail(query!=NULL, NULL);
@@ -269,20 +274,26 @@ static LDAPMessage * authldap_search(const gchar *query)
 	_ldap_conn = ldap_con_get();
 
 	TRACE(TRACE_DEBUG, " [%s]", query);
-	err = ldap_search_s(_ldap_conn, _ldap_cfg.base_dn, _ldap_cfg.scope_int, 
-			query, _ldap_attrs, _ldap_attrsonly, &ldap_res);
 
-	if (! err)
-		return ldap_res;
+	while (err != 0 && c++ < c_tries) {
+		// Loop until success or too many retries
+
+		err = ldap_search_s(_ldap_conn, _ldap_cfg.base_dn, _ldap_cfg.scope_int, 
+				query, _ldap_attrs, _ldap_attrsonly, &ldap_res);
 
-	switch (err) {
-		case LDAP_SERVER_DOWN:
-			TRACE(TRACE_WARNING, "LDAP gone away: %s).", ldap_err2string(err));
-			break;
-		default:
-			TRACE(TRACE_ERR, "LDAP error(%d): %s", err, ldap_err2string(err));
-			return NULL;
-			break;
+		switch (err) {
+			case LDAP_SUCCESS:
+				return ldap_res;
+				break;
+			case LDAP_SERVER_DOWN:
+				TRACE(TRACE_WARNING, "LDAP gone away: %s. Trying again(%d/%d).", ldap_err2string(err), c, c_tries);
+				break;
+			default:
+				// Includes timeouts etc. Should probably refactor.
+				TRACE(TRACE_ERR, "LDAP error(%d): %s. Trying again (%d/%d).", err, ldap_err2string(err), c, c_tries);
+				break;
+		}
+		sleep(1); // Search failed. Wait before trying again.
 	}
 
 	TRACE(TRACE_EMERG,"unrecoverable error while talking to ldap server");
-- 
2.10.1 (Apple Git-78)

