]> git.sur5r.net Git - openldap/commitdiff
fix for persistent search termination (ITS#2724)
authorJong Hyuk Choi <jongchoi@openldap.org>
Wed, 17 Sep 2003 10:34:10 +0000 (10:34 +0000)
committerJong Hyuk Choi <jongchoi@openldap.org>
Wed, 17 Sep 2003 10:34:10 +0000 (10:34 +0000)
 - the consumer slapd did not terminate when the provider is alive
 - use a timeout in ldap_result() of syncrepl.c

servers/slapd/daemon.c
servers/slapd/proto-slap.h
servers/slapd/syncrepl.c

index 042fa24b01ca5d020088ca9478f5ca7c17259f60..d83974becef47da5ef7651388d59a186f4d3e467 100644 (file)
@@ -68,6 +68,7 @@ do { if (w) tcp_write( wake_sds[1], "0", 1 ); } while(0)
 static
 #endif
 volatile sig_atomic_t slapd_shutdown = 0, slapd_gentle_shutdown = 0;
+volatile sig_atomic_t slapd_abrupt_shutdown = 0;
 
 static struct slap_daemon {
        ldap_pvt_thread_mutex_t sd_mutex;
@@ -1951,6 +1952,7 @@ slapd_daemon_task(
        slap_listeners = NULL;
 
        if( !slapd_gentle_shutdown ) {
+               slapd_abrupt_shutdown = 1;
                connections_shutdown();
        }
 
index 008a258941b2874bf4b85e109a9ece44a093d642..47803caa77330f5407f346b8c330700dbbc7f977 100644 (file)
@@ -382,6 +382,8 @@ LDAP_SLAPD_F (void) slapd_clr_write LDAP_P((ber_socket_t s, int wake));
 LDAP_SLAPD_F (void) slapd_set_read LDAP_P((ber_socket_t s, int wake));
 LDAP_SLAPD_F (void) slapd_clr_read LDAP_P((ber_socket_t s, int wake));
 
+LDAP_SLAPD_V (volatile sig_atomic_t) slapd_abrupt_shutdown;
+
 /*
  * dn.c
  */
index 864557dc01947cef23788cdd05f0d3d306ae4c9e..36a77183fcf87cd9c8b470698c1c5b769124ac63 100644 (file)
@@ -209,6 +209,9 @@ do_syncrepl(
        const char              *text;
        int                             match;
 
+       struct timeval *tout_p = NULL;
+       struct timeval tout = { 10, 0 };
+
 #ifdef NEW_LOGGING
        LDAP_LOG ( OPERATION, DETAIL1, "do_syncrepl\n", 0, 0, 0 );
 #else
@@ -444,7 +447,21 @@ do_syncrepl(
                return NULL;
        }
 
-       while (( rc = ldap_result( ld, LDAP_RES_ANY, LDAP_MSG_ONE, NULL, &res )) > 0 ) {
+       if ( abs(si->type) == LDAP_SYNC_REFRESH_AND_PERSIST ){
+               tout_p = &tout;
+       } else {
+               tout_p = NULL;
+       }
+
+       while (( rc = ldap_result( ld, LDAP_RES_ANY, LDAP_MSG_ONE, tout_p, &res )) >= 0 ) {
+
+               if ( rc == 0 ) {
+                       if ( slapd_abrupt_shutdown ) {
+                               break;
+                       } else {
+                               continue;
+                       }
+               }
 
                for ( msg = ldap_first_message( ld, res );
                      msg != NULL;
@@ -630,6 +647,7 @@ done:
 
        if ( res )
                ldap_msgfree( res );
+
        ldap_unbind( ld );
 
        ldap_pvt_thread_mutex_lock( &syncrepl_rq.rq_mutex );