From ea7e40b8e7e35b8df974f73c5f5120afe6c6349c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Kuzn=C3=ADk?= Date: Wed, 3 May 2017 11:07:35 +0100 Subject: [PATCH] Shutdown handling --- servers/lloadd/backend.c | 66 ++++++++++++++++++++++++++++++- servers/lloadd/client.c | 2 - servers/lloadd/connection.c | 2 + servers/lloadd/daemon.c | 12 ++++++ servers/lloadd/libevent_support.c | 6 +++ servers/lloadd/main.c | 10 +++++ servers/lloadd/proto-slap.h | 2 + 7 files changed, 97 insertions(+), 3 deletions(-) diff --git a/servers/lloadd/backend.c b/servers/lloadd/backend.c index 43bd05e386..c5fbeda858 100644 --- a/servers/lloadd/backend.c +++ b/servers/lloadd/backend.c @@ -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 ); + } +} diff --git a/servers/lloadd/client.c b/servers/lloadd/client.c index f2dac9c7d5..6748689cc8 100644 --- a/servers/lloadd/client.c +++ b/servers/lloadd/client.c @@ -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: " diff --git a/servers/lloadd/connection.c b/servers/lloadd/connection.c index b1720c1efe..8c6634f965 100644 --- a/servers/lloadd/connection.c +++ b/servers/lloadd/connection.c @@ -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 ); diff --git a/servers/lloadd/daemon.c b/servers/lloadd/daemon.c index 1956ba5f7e..94b16d83ff 100644 --- a/servers/lloadd/daemon.c +++ b/servers/lloadd/daemon.c @@ -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; diff --git a/servers/lloadd/libevent_support.c b/servers/lloadd/libevent_support.c index 7a5be047c9..a9c3efffc5 100644 --- a/servers/lloadd/libevent_support.c +++ b/servers/lloadd/libevent_support.c @@ -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(); +} diff --git a/servers/lloadd/main.c b/servers/lloadd/main.c index 0fd5200161..3c3577ead5 100644 --- a/servers/lloadd/main.c +++ b/servers/lloadd/main.c @@ -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 ); } diff --git a/servers/lloadd/proto-slap.h b/servers/lloadd/proto-slap.h index f949ef546e..3d9d1a40fc 100644 --- a/servers/lloadd/proto-slap.h +++ b/servers/lloadd/proto-slap.h @@ -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