]> git.ipfire.org Git - thirdparty/openldap.git/commitdiff
Shutdown handling
authorOndřej Kuzník <ondra@mistotebe.net>
Wed, 3 May 2017 10:07:35 +0000 (11:07 +0100)
committerOndřej Kuzník <okuznik@symas.com>
Tue, 17 Nov 2020 17:55:46 +0000 (17:55 +0000)
servers/lloadd/backend.c
servers/lloadd/client.c
servers/lloadd/connection.c
servers/lloadd/daemon.c
servers/lloadd/libevent_support.c
servers/lloadd/main.c
servers/lloadd/proto-slap.h

index 43bd05e3867aab8a47b95bf7e1884be1f0122dc4..c5fbeda858b050692fc6986073c657f5d147555b 100644 (file)
@@ -151,6 +151,12 @@ backend_retry( Backend *b )
 {
     int rc, requested;
 
+    if ( slapd_shutdown ) {
+        Debug( LDAP_DEBUG_CONNS, "backend_retry: "
+                "shutting down\n" );
+        return;
+    }
+
     ldap_pvt_thread_mutex_lock( &b->b_mutex );
 
     requested = b->b_numconns;
@@ -177,7 +183,6 @@ backend_retry( Backend *b )
             b->b_opening++;
             rc = ldap_pvt_thread_pool_submit(
                     &connection_pool, backend_connect_task, b );
-            /* TODO check we're not shutting down */
             if ( rc ) {
                 ldap_pvt_thread_mutex_unlock( &b->b_mutex );
                 backend_connect( -1, 0, b );
@@ -198,6 +203,12 @@ backend_connect( evutil_socket_t s, short what, void *arg )
     Backend *b = arg;
     char *hostname;
 
+    if ( slapd_shutdown ) {
+        Debug( LDAP_DEBUG_CONNS, "backend_connect: "
+                "doing nothing, shutdown in progress\n" );
+        return;
+    }
+
     ldap_pvt_thread_mutex_lock( &b->b_mutex );
     Debug( LDAP_DEBUG_CONNS, "backend_connect: "
             "attempting connection to %s\n",
@@ -269,3 +280,56 @@ backend_connect_task( void *ctx, void *arg )
     backend_connect( -1, 0, arg );
     return NULL;
 }
+
+void
+backends_destroy( void )
+{
+    Backend *b;
+
+    while ( (b = LDAP_STAILQ_FIRST( &backend )) ) {
+        Connection *c;
+
+        Debug( LDAP_DEBUG_CONNS, "backends_destroy: "
+                "destroying backend uri='%s', numconns=%d, numbindconns=%d\n",
+                b->b_bindconf.sb_uri.bv_val, b->b_numconns, b->b_numbindconns );
+
+        while ( (c = LDAP_LIST_FIRST( &b->b_bindconns )) ) {
+            CONNECTION_LOCK(c);
+            UPSTREAM_DESTROY(c);
+        }
+        while ( (c = LDAP_LIST_FIRST( &b->b_conns )) ) {
+            CONNECTION_LOCK(c);
+            UPSTREAM_DESTROY(c);
+        }
+
+        LDAP_STAILQ_REMOVE_HEAD( &backend, b_next );
+        ldap_pvt_thread_mutex_destroy( &b->b_mutex );
+
+        event_del( b->b_retry_event );
+        event_free( b->b_retry_event );
+
+        ch_free( b->b_host );
+        ch_free( b->b_bindconf.sb_uri.bv_val );
+        ch_free( b->b_bindconf.sb_binddn.bv_val );
+        ch_free( b->b_bindconf.sb_cred.bv_val );
+        ch_free( b->b_bindconf.sb_saslmech.bv_val );
+        ch_free( b->b_bindconf.sb_secprops );
+        ch_free( b->b_bindconf.sb_realm.bv_val );
+        ch_free( b->b_bindconf.sb_authcId.bv_val );
+        ch_free( b->b_bindconf.sb_authzId.bv_val );
+
+#ifdef HAVE_TLS
+        ch_free( b->b_bindconf.sb_tls_cert );
+        ch_free( b->b_bindconf.sb_tls_key );
+        ch_free( b->b_bindconf.sb_tls_cacert );
+        ch_free( b->b_bindconf.sb_tls_cacertdir );
+        ch_free( b->b_bindconf.sb_tls_reqcert );
+        ch_free( b->b_bindconf.sb_tls_cipher_suite );
+        ch_free( b->b_bindconf.sb_tls_protocol_min );
+#ifdef HAVE_OPENSSL_CRL
+        ch_free( b->b_bindconf.sb_tls_crlcheck );
+#endif
+#endif
+        ch_free( b );
+    }
+}
index f2dac9c7d5ba5c8010aedfd2f7f7296c0ea87dd1..6748689cc883463f2460243d669a6db0a9704751 100644 (file)
@@ -34,8 +34,6 @@ client_read_cb( evutil_socket_t s, short what, void *arg )
     ber_tag_t tag;
     ber_len_t len;
 
-    /* What if the shutdown is already in progress and we get to lock the
-     * connection? */
     CONNECTION_LOCK(c);
 
     Debug( LDAP_DEBUG_CONNS, "client_read_cb: "
index b1720c1efebc28aba52c20298999ff5d7fb8451a..8c6634f9655500085c054b441bf9539920c1bc29 100644 (file)
@@ -153,6 +153,8 @@ connection_init( ber_socket_t s, const char *peername, int flags )
     c->c_next_msgid = 1;
     c->c_refcnt = c->c_live = 1;
 
+    LDAP_LIST_ENTRY_INIT( c, c_next );
+
     ldap_pvt_thread_mutex_init( &c->c_mutex );
     ldap_pvt_thread_mutex_init( &c->c_io_mutex );
 
index 1956ba5f7e3f28fab31f2c92a5d50691ec137b1a..94b16d83ffaf01ad5a68cf18d4716340689c8687 100644 (file)
@@ -782,6 +782,12 @@ slapd_daemon_destroy( void )
 
         for ( i = 0; i < slapd_daemon_threads; i++ ) {
             ldap_pvt_thread_mutex_destroy( &slap_daemon[i].sd_mutex );
+            if ( slap_daemon[i].wakeup_event ) {
+                event_free( slap_daemon[i].wakeup_event );
+            }
+            if ( slap_daemon[i].base ) {
+                event_base_free( slap_daemon[i].base );
+            }
         }
         lloadd_inited = 0;
 #ifdef HAVE_TCPD
@@ -844,6 +850,10 @@ destroy_listeners( void )
 
     free( slap_listeners );
     slap_listeners = NULL;
+
+    if ( listener_base ) {
+        event_base_free( listener_base );
+    }
 }
 
 static void
@@ -1342,6 +1352,8 @@ slapd_daemon( struct event_base *daemon_base )
                 t );
     }
     ldap_pvt_thread_pool_close( &connection_pool, 1 );
+    backends_destroy();
+    evdns_base_free( dnsbase, 0 );
 
     ch_free( daemon_tid );
     daemon_tid = NULL;
index 7a5be047c9ef84cda05428c4a0907cb3d03411fe..a9c3efffc5387a12002cc52b00969a280cd98f88 100644 (file)
@@ -159,3 +159,9 @@ lload_libevent_init( void )
     evthread_set_id_callback( ldap_pvt_thread_self );
     return 0;
 }
+
+void
+lload_libevent_destroy( void )
+{
+    libevent_global_shutdown();
+}
index 0fd5200161e27f529806e23d210ea76c137f831d..3c3577ead54cf13b4cac348b4cc6addd6b14684d 100644 (file)
@@ -883,6 +883,16 @@ unhandled_option:;
 #endif
 
 destroy:
+    if ( daemon_base ) {
+        for ( i = 0; signal_handlers[i].signal; i++ ) {
+            if ( signal_handlers[i].event ) {
+                event_del( signal_handlers[i].event );
+                event_free( signal_handlers[i].event );
+            }
+        }
+        event_base_free( daemon_base );
+    }
+
     if ( check & CHECK_LOGLEVEL ) {
         (void)loglevel_print( stdout );
     }
index f949ef546ea91ee56ba1ad0d8c90f208f56084ce..3d9d1a40fc1fb4345e2e574c6d87f059763269d2 100644 (file)
@@ -44,6 +44,7 @@ LDAP_SLAPD_F (void) backend_connect( evutil_socket_t s, short what, void *arg );
 LDAP_SLAPD_F (void *) backend_connect_task( void *ctx, void *arg );
 LDAP_SLAPD_F (void) backend_retry( Backend *b );
 LDAP_SLAPD_F (Connection *) backend_select( Operation *op );
+LDAP_SLAPD_F (void) backends_destroy( void );
 
 /*
  * ch_malloc.c
@@ -138,6 +139,7 @@ LDAP_SLAPD_F (int) slap_destroy( void );
  * libevent_support.c
  */
 LDAP_SLAPD_F (int) lload_libevent_init( void );
+LDAP_SLAPD_F (void) lload_libevent_destroy( void );
 
 /*
  * main.c