Hello,

    Fix error handling for initial zone refresh in persistent search.

    Old code terminates watcher thread in case of error. Now initial lookup
    is restarted after reconnect_interval seconds.


--
Petr^2 Spacek
From 99a820736eab9ad597b193fe504ca965263b6655 Mon Sep 17 00:00:00 2001
From: Petr Spacek <[email protected]>
Date: Thu, 22 Nov 2012 14:52:08 +0100
Subject: [PATCH] Fix error handling for initial zone refresh in persistent
 search.

Old code terminates watcher thread in case of error. Now initial lookup
is restarted after reconnect_interval seconds.

Signed-off-by: Petr Spacek <[email protected]>
---
 src/ldap_helper.c | 22 +++++++++++++++++++---
 1 file changed, 19 insertions(+), 3 deletions(-)

diff --git a/src/ldap_helper.c b/src/ldap_helper.c
index 57235de7da158b7a05de9e35fff2cdaaff74276c..28b2eb45c116572d76fefcfb9f5c1fba5411dc12 100644
--- a/src/ldap_helper.c
+++ b/src/ldap_helper.c
@@ -3757,6 +3757,7 @@ ldap_psearch_watcher(isc_threadarg_t arg)
 
 restart:
 	/* Perform initial lookup */
+	ldap_query_free(ISC_TRUE, &ldap_qresult);
 	flush_required = ISC_TRUE;
 	if (inst->psearch) {
 		log_debug(1, "Sending initial psearch lookup");
@@ -3794,15 +3795,30 @@ restart:
 				if (!sane_sleep(inst, inst->reconnect_interval))
 					goto cleanup;
 			}
-			ldap_query_free(ISC_TRUE, &ldap_qresult);
 			goto restart;
 		} else if (flush_required == ISC_TRUE) {
+			isc_boolean_t restart_needed = ISC_FALSE;
 			/* First LDAP result after (re)start was received successfully:
 			 * Unload old zones and flush record cache.
 			 * We want to save cache in case of search timeout during restart.
 			 */
-			CHECK(refresh_zones_from_ldap(inst, ISC_TRUE));
-			CHECK(flush_ldap_cache(inst->cache));
+			if ((result = refresh_zones_from_ldap(inst, ISC_TRUE))
+			     != ISC_R_SUCCESS) {
+				log_error_r("zone refresh after initial psearch lookup failed");
+				restart_needed = ISC_TRUE;
+			} else if ((result = flush_ldap_cache(inst->cache))
+				    != ISC_R_SUCCESS) {
+				log_error_r("cache flush after initial psearch lookup failed");
+				restart_needed = ISC_TRUE;
+			}
+
+			if (restart_needed) {
+				if (!sane_sleep(inst, inst->reconnect_interval))
+					goto cleanup;
+
+				goto restart;
+			}
+
 			flush_required = ISC_FALSE;
 		}
 
-- 
1.7.11.7

_______________________________________________
Freeipa-devel mailing list
[email protected]
https://www.redhat.com/mailman/listinfo/freeipa-devel

Reply via email to