mirror of
https://git.openldap.org/openldap/openldap.git
synced 2024-12-21 03:10:25 +08:00
Added "threads" config to slapd.conf.
This commit is contained in:
parent
060ee8ee88
commit
d4d03e36e5
@ -138,7 +138,7 @@ typedef ldap_int_thread_pool_t ldap_pvt_thread_pool_t;
|
|||||||
LDAP_F( int )
|
LDAP_F( int )
|
||||||
ldap_pvt_thread_pool_init LDAP_P((
|
ldap_pvt_thread_pool_init LDAP_P((
|
||||||
ldap_pvt_thread_pool_t *pool_out,
|
ldap_pvt_thread_pool_t *pool_out,
|
||||||
int max_concurrency,
|
int max_threads,
|
||||||
int max_pending ));
|
int max_pending ));
|
||||||
|
|
||||||
LDAP_F( int )
|
LDAP_F( int )
|
||||||
@ -147,6 +147,11 @@ ldap_pvt_thread_pool_submit LDAP_P((
|
|||||||
void *(*start_routine)( void * ),
|
void *(*start_routine)( void * ),
|
||||||
void *arg ));
|
void *arg ));
|
||||||
|
|
||||||
|
LDAP_F( int )
|
||||||
|
ldap_pvt_thread_pool_maxthreads LDAP_P((
|
||||||
|
ldap_pvt_thread_pool_t *pool,
|
||||||
|
int max_threads ));
|
||||||
|
|
||||||
LDAP_F( int )
|
LDAP_F( int )
|
||||||
ldap_pvt_thread_pool_backload LDAP_P((
|
ldap_pvt_thread_pool_backload LDAP_P((
|
||||||
ldap_pvt_thread_pool_t *pool ));
|
ldap_pvt_thread_pool_t *pool ));
|
||||||
|
@ -85,7 +85,7 @@ ldap_int_thread_pool_shutdown ( void )
|
|||||||
int
|
int
|
||||||
ldap_pvt_thread_pool_init (
|
ldap_pvt_thread_pool_init (
|
||||||
ldap_pvt_thread_pool_t *tpool,
|
ldap_pvt_thread_pool_t *tpool,
|
||||||
int max_concurrency,
|
int max_threads,
|
||||||
int max_pending )
|
int max_pending )
|
||||||
{
|
{
|
||||||
ldap_pvt_thread_pool_t pool;
|
ldap_pvt_thread_pool_t pool;
|
||||||
@ -104,7 +104,7 @@ ldap_pvt_thread_pool_init (
|
|||||||
if (rc != 0)
|
if (rc != 0)
|
||||||
return(rc);
|
return(rc);
|
||||||
pool->ltp_state = LDAP_INT_THREAD_POOL_RUNNING;
|
pool->ltp_state = LDAP_INT_THREAD_POOL_RUNNING;
|
||||||
pool->ltp_max_count = max_concurrency;
|
pool->ltp_max_count = max_threads;
|
||||||
pool->ltp_max_pending = max_pending;
|
pool->ltp_max_pending = max_pending;
|
||||||
ldap_pvt_thread_mutex_lock(&ldap_pvt_thread_pool_mutex);
|
ldap_pvt_thread_mutex_lock(&ldap_pvt_thread_pool_mutex);
|
||||||
ldap_int_thread_enlist(&ldap_int_thread_pool_list, pool);
|
ldap_int_thread_enlist(&ldap_int_thread_pool_list, pool);
|
||||||
@ -235,6 +235,25 @@ ldap_pvt_thread_pool_submit (
|
|||||||
return(0);
|
return(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
ldap_pvt_thread_pool_maxthreads ( ldap_pvt_thread_pool_t *tpool, int max_threads )
|
||||||
|
{
|
||||||
|
struct ldap_int_thread_pool_s *pool;
|
||||||
|
|
||||||
|
if (tpool == NULL)
|
||||||
|
return(-1);
|
||||||
|
|
||||||
|
pool = *tpool;
|
||||||
|
|
||||||
|
if (pool == NULL)
|
||||||
|
return(-1);
|
||||||
|
|
||||||
|
ldap_pvt_thread_mutex_lock(&pool->ltp_mutex);
|
||||||
|
pool->ltp_max_count = max_threads;
|
||||||
|
ldap_pvt_thread_mutex_unlock(&pool->ltp_mutex);
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
ldap_pvt_thread_pool_backload ( ldap_pvt_thread_pool_t *tpool )
|
ldap_pvt_thread_pool_backload ( ldap_pvt_thread_pool_t *tpool )
|
||||||
{
|
{
|
||||||
@ -325,6 +344,17 @@ ldap_int_thread_pool_wrapper (
|
|||||||
if (ctx == NULL) {
|
if (ctx == NULL) {
|
||||||
if (pool->ltp_state == LDAP_INT_THREAD_POOL_FINISHING)
|
if (pool->ltp_state == LDAP_INT_THREAD_POOL_FINISHING)
|
||||||
break;
|
break;
|
||||||
|
if (pool->ltp_max_count > 0
|
||||||
|
&& pool->ltp_open_count > pool->ltp_max_count)
|
||||||
|
{
|
||||||
|
/* too many threads running (can happen if the
|
||||||
|
* maximum threads value is set during ongoing
|
||||||
|
* operation using ldap_pvt_thread_pool_maxthreads)
|
||||||
|
* so let this thread die.
|
||||||
|
*/
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
/* we could check an idle timer here, and let the
|
/* we could check an idle timer here, and let the
|
||||||
* thread die if it has been inactive for a while.
|
* thread die if it has been inactive for a while.
|
||||||
* only die if there are other open threads (i.e.,
|
* only die if there are other open threads (i.e.,
|
||||||
|
@ -161,6 +161,27 @@ read_config( const char *fname )
|
|||||||
|
|
||||||
ldap_pvt_thread_set_concurrency( c );
|
ldap_pvt_thread_set_concurrency( c );
|
||||||
|
|
||||||
|
/* set maximum threads in thread pool */
|
||||||
|
} else if ( strcasecmp( cargv[0], "threads" ) == 0 ) {
|
||||||
|
int c;
|
||||||
|
if ( cargc < 2 ) {
|
||||||
|
Debug( LDAP_DEBUG_ANY,
|
||||||
|
"%s: line %d: missing count in \"threads <count>\" line\n",
|
||||||
|
fname, lineno, 0 );
|
||||||
|
return( 1 );
|
||||||
|
}
|
||||||
|
|
||||||
|
c = atoi( cargv[1] );
|
||||||
|
|
||||||
|
if( c < 0 ) {
|
||||||
|
Debug( LDAP_DEBUG_ANY,
|
||||||
|
"%s: line %d: invalid level (%d) in \"threads <count>\" line\n",
|
||||||
|
fname, lineno, c );
|
||||||
|
return( 1 );
|
||||||
|
}
|
||||||
|
|
||||||
|
ldap_pvt_thread_pool_maxthreads( &connection_pool, c );
|
||||||
|
|
||||||
/* get pid file name */
|
/* get pid file name */
|
||||||
} else if ( strcasecmp( cargv[0], "pidfile" ) == 0 ) {
|
} else if ( strcasecmp( cargv[0], "pidfile" ) == 0 ) {
|
||||||
if ( cargc < 2 ) {
|
if ( cargc < 2 ) {
|
||||||
|
@ -94,7 +94,7 @@ slap_init( int mode, const char *name )
|
|||||||
|
|
||||||
(void) ldap_pvt_thread_initialize();
|
(void) ldap_pvt_thread_initialize();
|
||||||
|
|
||||||
ldap_pvt_thread_pool_init(&connection_pool, 0, 0);
|
ldap_pvt_thread_pool_init(&connection_pool, SLAP_MAX_WORKER_THREADS, 0);
|
||||||
|
|
||||||
ldap_pvt_thread_mutex_init( ¤ttime_mutex );
|
ldap_pvt_thread_mutex_init( ¤ttime_mutex );
|
||||||
ldap_pvt_thread_mutex_init( &entry2str_mutex );
|
ldap_pvt_thread_mutex_init( &entry2str_mutex );
|
||||||
|
@ -62,6 +62,8 @@ LDAP_BEGIN_DECL
|
|||||||
|
|
||||||
#define MAXREMATCHES 10
|
#define MAXREMATCHES 10
|
||||||
|
|
||||||
|
#define SLAP_MAX_WORKER_THREADS 32
|
||||||
|
|
||||||
|
|
||||||
/* psuedo error code indicating abandoned operation */
|
/* psuedo error code indicating abandoned operation */
|
||||||
#define SLAPD_ABANDON (-1)
|
#define SLAPD_ABANDON (-1)
|
||||||
|
Loading…
Reference in New Issue
Block a user