mirror of
https://git.openldap.org/openldap/openldap.git
synced 2026-01-16 03:44:58 -05:00
Implement "quick" shutdown (similiar in behavior to shutdown
prior to connection management changes). No "normal" (wait for pending operations to complete) shutdown mode (yet). Changes: Add connections_destroy() implementation to connections.c. Move connections_init() call to slap_daemon(). Add connections_destroy() call to slap_daemon(). Add connections_shutdown() implementation to connections.c. calls connection_closing()/connection_close() for each "in use" connection. Add connections_shutdown() call to slap_daemon_task().
This commit is contained in:
parent
866f82409c
commit
fa6fec3c9c
3 changed files with 71 additions and 5 deletions
|
|
@ -36,6 +36,7 @@ void slapd_remove(int s);
|
|||
static Connection* connection_get( int s );
|
||||
|
||||
static int connection_input( Connection *c );
|
||||
static void connection_close( Connection *c );
|
||||
|
||||
static int connection_op_activate( Connection *conn, Operation *op );
|
||||
static int connection_resched( Connection *conn );
|
||||
|
|
@ -54,7 +55,7 @@ int connections_init(void)
|
|||
|
||||
assert( connections == NULL );
|
||||
|
||||
if( connections != NULL) { /* probably should assert this */
|
||||
if( connections != NULL) {
|
||||
Debug( LDAP_DEBUG_ANY, "connections_init: already initialized.\n",
|
||||
0, 0, 0 );
|
||||
return -1;
|
||||
|
|
@ -83,6 +84,59 @@ int connections_init(void)
|
|||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Destroy connection management infrastructure.
|
||||
*/
|
||||
int connections_destroy(void)
|
||||
{
|
||||
int i;
|
||||
|
||||
/* should check return of every call */
|
||||
|
||||
if( connections == NULL) {
|
||||
Debug( LDAP_DEBUG_ANY, "connections_destroy: nothing to destroy.\n",
|
||||
0, 0, 0 );
|
||||
return -1;
|
||||
}
|
||||
|
||||
for ( i = 0; i < dtblsize; i++ ) {
|
||||
ldap_pvt_thread_mutex_destroy( &connections[i].c_mutex );
|
||||
ldap_pvt_thread_mutex_destroy( &connections[i].c_write_mutex );
|
||||
ldap_pvt_thread_cond_destroy( &connections[i].c_write_cv );
|
||||
|
||||
free( &connections[i] );
|
||||
}
|
||||
|
||||
free( connections );
|
||||
connections = NULL;
|
||||
|
||||
ldap_pvt_thread_mutex_destroy( &connections_mutex );
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* shutdown all connections
|
||||
*/
|
||||
int connections_shutdown(void)
|
||||
{
|
||||
int i;
|
||||
|
||||
ldap_pvt_thread_mutex_lock( &connections_mutex );
|
||||
|
||||
for ( i = 0; i < dtblsize; i++ ) {
|
||||
if( connections[i].c_struct_state != SLAP_C_USED ) {
|
||||
continue;
|
||||
}
|
||||
|
||||
ldap_pvt_thread_mutex_lock( &connections[i].c_mutex );
|
||||
connection_closing( &connections[i] );
|
||||
connection_close( &connections[i] );
|
||||
ldap_pvt_thread_mutex_unlock( &connections[i].c_mutex );
|
||||
}
|
||||
|
||||
ldap_pvt_thread_mutex_unlock( &connections_mutex );
|
||||
}
|
||||
|
||||
static Connection* connection_get( int s )
|
||||
{
|
||||
Connection *c = NULL;
|
||||
|
|
@ -310,11 +364,17 @@ connection_destroy( Connection *c )
|
|||
|
||||
int connection_state_closing( Connection *c )
|
||||
{
|
||||
int state;
|
||||
assert( c != NULL );
|
||||
assert( c->c_struct_state == SLAP_C_USED );
|
||||
assert( c->c_conn_state != SLAP_C_INVALID );
|
||||
|
||||
return c->c_conn_state == SLAP_C_CLOSING;
|
||||
ldap_pvt_thread_mutex_lock( &c->c_mutex );
|
||||
state = c->c_conn_state;
|
||||
ldap_pvt_thread_mutex_unlock( &c->c_mutex );
|
||||
|
||||
assert( state != SLAP_C_INVALID );
|
||||
|
||||
return state == SLAP_C_CLOSING;
|
||||
}
|
||||
|
||||
void connection_closing( Connection *c )
|
||||
|
|
|
|||
|
|
@ -232,8 +232,6 @@ slapd_daemon_task(
|
|||
|
||||
slapd_listener=1;
|
||||
|
||||
connections_init();
|
||||
|
||||
ldap_pvt_thread_mutex_init( &slap_daemon.sd_mutex );
|
||||
FD_ZERO( &slap_daemon.sd_readers );
|
||||
FD_ZERO( &slap_daemon.sd_writers );
|
||||
|
|
@ -582,6 +580,9 @@ slapd_daemon_task(
|
|||
tcp_close( tcps );
|
||||
}
|
||||
|
||||
/* we only implement "quick" shutdown */
|
||||
connections_shutdown();
|
||||
|
||||
ldap_pvt_thread_mutex_lock( &active_threads_mutex );
|
||||
Debug( LDAP_DEBUG_ANY,
|
||||
"slapd shutdown: waiting for %d threads to terminate\n",
|
||||
|
|
@ -602,6 +603,8 @@ int slapd_daemon( int inetd, int tcps )
|
|||
args[0] = inetd;
|
||||
args[1] = tcps;
|
||||
|
||||
connections_init();
|
||||
|
||||
#define SLAPD_LISTENER_THREAD 1
|
||||
#if SLAPD_LISTENER_THREAD
|
||||
/* listener as a separate THREAD */
|
||||
|
|
@ -622,6 +625,7 @@ int slapd_daemon( int inetd, int tcps )
|
|||
slapd_daemon_task( args );
|
||||
#endif
|
||||
|
||||
connections_destroy();
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -114,6 +114,8 @@ int read_config LDAP_P(( char *fname ));
|
|||
* connection.c
|
||||
*/
|
||||
int connections_init LDAP_P((void));
|
||||
int connections_shutdown LDAP_P((void));
|
||||
int connections_destroy LDAP_P((void));
|
||||
|
||||
long connection_init LDAP_P((
|
||||
int s,
|
||||
|
|
|
|||
Loading…
Reference in a new issue