X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=servers%2Fslapd%2Fback-monitor%2Fthread.c;h=e432d20c04e1b1d890ba1d1e44515d56b37878cc;hb=48685b7962e9c365752a7eaeaeda9785cdee7946;hp=47b39c82d0e475fe45f53370361a3e04c111653f;hpb=a05a8972b2ad9764ad5290adf030aa71076eabc2;p=openldap diff --git a/servers/slapd/back-monitor/thread.c b/servers/slapd/back-monitor/thread.c index 47b39c82d0..e432d20c04 100644 --- a/servers/slapd/back-monitor/thread.c +++ b/servers/slapd/back-monitor/thread.c @@ -2,7 +2,7 @@ /* $OpenLDAP$ */ /* This work is part of OpenLDAP Software . * - * Copyright 2001-2006 The OpenLDAP Foundation. + * Copyright 2001-2012 The OpenLDAP Foundation. * Portions Copyright 2001-2003 Pierangelo Masarati. * All rights reserved. * @@ -29,11 +29,74 @@ #include +#ifndef NO_THREADS +typedef enum { + MT_UNKNOWN, + MT_RUNQUEUE, + MT_TASKLIST, + + MT_LAST +} monitor_thread_t; + +static struct { + struct berval rdn; + struct berval desc; + struct berval nrdn; + ldap_pvt_thread_pool_param_t param; + monitor_thread_t mt; +} mt[] = { + { BER_BVC( "cn=Max" ), + BER_BVC("Maximum number of threads as configured"), + BER_BVNULL, LDAP_PVT_THREAD_POOL_PARAM_MAX, MT_UNKNOWN }, + { BER_BVC( "cn=Max Pending" ), + BER_BVC("Maximum number of pending threads"), + BER_BVNULL, LDAP_PVT_THREAD_POOL_PARAM_MAX_PENDING, MT_UNKNOWN }, + { BER_BVC( "cn=Open" ), + BER_BVC("Number of open threads"), + BER_BVNULL, LDAP_PVT_THREAD_POOL_PARAM_OPEN, MT_UNKNOWN }, + { BER_BVC( "cn=Starting" ), + BER_BVC("Number of threads being started"), + BER_BVNULL, LDAP_PVT_THREAD_POOL_PARAM_STARTING, MT_UNKNOWN }, + { BER_BVC( "cn=Active" ), + BER_BVC("Number of active threads"), + BER_BVNULL, LDAP_PVT_THREAD_POOL_PARAM_ACTIVE, MT_UNKNOWN }, + { BER_BVC( "cn=Pending" ), + BER_BVC("Number of pending threads"), + BER_BVNULL, LDAP_PVT_THREAD_POOL_PARAM_PENDING, MT_UNKNOWN }, + { BER_BVC( "cn=Backload" ), + BER_BVC("Number of active plus pending threads"), + BER_BVNULL, LDAP_PVT_THREAD_POOL_PARAM_BACKLOAD, MT_UNKNOWN }, +#if 0 /* not meaningful right now */ + { BER_BVC( "cn=Active Max" ), + BER_BVNULL, + BER_BVNULL, LDAP_PVT_THREAD_POOL_PARAM_ACTIVE_MAX, MT_UNKNOWN }, + { BER_BVC( "cn=Pending Max" ), + BER_BVNULL, + BER_BVNULL, LDAP_PVT_THREAD_POOL_PARAM_PENDING_MAX, MT_UNKNOWN }, + { BER_BVC( "cn=Backload Max" ), + BER_BVNULL, + BER_BVNULL, LDAP_PVT_THREAD_POOL_PARAM_BACKLOAD_MAX,MT_UNKNOWN }, +#endif + { BER_BVC( "cn=State" ), + BER_BVC("Thread pool state"), + BER_BVNULL, LDAP_PVT_THREAD_POOL_PARAM_STATE, MT_UNKNOWN }, + + { BER_BVC( "cn=Runqueue" ), + BER_BVC("Queue of running threads - besides those handling operations"), + BER_BVNULL, LDAP_PVT_THREAD_POOL_PARAM_UNKNOWN, MT_RUNQUEUE }, + { BER_BVC( "cn=Tasklist" ), + BER_BVC("List of running plus standby threads - besides those handling operations"), + BER_BVNULL, LDAP_PVT_THREAD_POOL_PARAM_UNKNOWN, MT_TASKLIST }, + + { BER_BVNULL } +}; + static int monitor_subsys_thread_update( Operation *op, SlapReply *rs, Entry *e ); +#endif /* ! NO_THREADS */ /* * initializes log subentry @@ -41,14 +104,13 @@ monitor_subsys_thread_update( int monitor_subsys_thread_init( BackendDB *be, - monitor_subsys_t *ms -) + monitor_subsys_t *ms ) { +#ifndef NO_THREADS monitor_info_t *mi; monitor_entry_t *mp; Entry *e, **ep, *e_thread; - static char buf[ BACKMONITOR_BUFSIZE ]; - struct berval bv; + int i; ms->mss_update = monitor_subsys_thread_update; @@ -57,7 +119,7 @@ monitor_subsys_thread_init( if ( monitor_cache_get( mi, &ms->mss_ndn, &e_thread ) ) { Debug( LDAP_DEBUG_ANY, "monitor_subsys_thread_init: unable to get entry \"%s\"\n", - ms->mss_ndn.bv_val, + ms->mss_dn.bv_val, 0, 0 ); return( -1 ); } @@ -66,156 +128,94 @@ monitor_subsys_thread_init( mp->mp_children = NULL; ep = &mp->mp_children; - /* - * Max - */ - BER_BVSTR( &bv, "cn=Max" ); - e = monitor_entry_stub( &ms->mss_dn, &ms->mss_ndn, &bv, - mi->mi_oc_monitoredObject, mi, NULL, NULL ); - if ( e == NULL ) { - Debug( LDAP_DEBUG_ANY, - "monitor_subsys_thread_init: " - "unable to create entry \"cn=Max,%s\"\n", - ms->mss_ndn.bv_val, 0, 0 ); - return( -1 ); - } - bv.bv_len = snprintf( buf, sizeof( buf ), "%d", connection_pool_max ); - bv.bv_val = buf; - attr_merge_normalize_one( e, mi->mi_ad_monitoredInfo, &bv, NULL ); - - mp = monitor_entrypriv_create(); - if ( mp == NULL ) { - return -1; - } - e->e_private = ( void * )mp; - mp->mp_info = ms; - mp->mp_flags = ms->mss_flags \ - | MONITOR_F_SUB | MONITOR_F_PERSISTENT; + for ( i = 0; !BER_BVISNULL( &mt[ i ].rdn ); i++ ) { + static char buf[ BACKMONITOR_BUFSIZE ]; + int count = -1; + char *state = NULL; + struct berval bv = BER_BVNULL; + + /* + * Max + */ + e = monitor_entry_stub( &ms->mss_dn, &ms->mss_ndn, + &mt[ i ].rdn, + mi->mi_oc_monitoredObject, NULL, NULL ); + if ( e == NULL ) { + Debug( LDAP_DEBUG_ANY, + "monitor_subsys_thread_init: " + "unable to create entry \"%s,%s\"\n", + mt[ i ].rdn.bv_val, + ms->mss_ndn.bv_val, 0 ); + return( -1 ); + } - if ( monitor_cache_add( mi, e ) ) { - Debug( LDAP_DEBUG_ANY, - "monitor_subsys_thread_init: " - "unable to add entry \"cn=Max,%s\"\n", - ms->mss_ndn.bv_val, 0, 0 ); - return( -1 ); - } - - *ep = e; - ep = &mp->mp_next; - - /* - * Backload - */ - BER_BVSTR( &bv, "cn=Backload" ); - e = monitor_entry_stub( &ms->mss_dn, &ms->mss_ndn, &bv, - mi->mi_oc_monitoredObject, mi, NULL, NULL ); - if ( e == NULL ) { - Debug( LDAP_DEBUG_ANY, - "monitor_subsys_thread_init: " - "unable to create entry \"cn=Backload,%s\"\n", - ms->mss_ndn.bv_val, 0, 0 ); - return( -1 ); - } - BER_BVSTR( &bv, "0" ); - attr_merge_normalize_one( e, mi->mi_ad_monitoredInfo, &bv, NULL ); + /* NOTE: reference to the normalized DN of the entry, + * under the assumption it's not modified */ + dnRdn( &e->e_nname, &mt[ i ].nrdn ); - mp = monitor_entrypriv_create(); - if ( mp == NULL ) { - return -1; - } - e->e_private = ( void * )mp; - mp->mp_info = ms; - mp->mp_flags = ms->mss_flags \ - | MONITOR_F_SUB | MONITOR_F_PERSISTENT; + switch ( mt[ i ].param ) { + case LDAP_PVT_THREAD_POOL_PARAM_UNKNOWN: + break; - if ( monitor_cache_add( mi, e ) ) { - Debug( LDAP_DEBUG_ANY, - "monitor_subsys_thread_init: " - "unable to add entry \"cn=Backload,%s\"\n", - ms->mss_ndn.bv_val, 0, 0 ); - return( -1 ); - } - - *ep = e; - ep = &mp->mp_next; - - /* - * Runqueue runners - */ - BER_BVSTR( &bv, "cn=Runqueue" ); - e = monitor_entry_stub( &ms->mss_dn, &ms->mss_ndn, &bv, - mi->mi_oc_monitoredObject, mi, NULL, NULL ); - if ( e == NULL ) { - Debug( LDAP_DEBUG_ANY, - "monitor_subsys_thread_init: " - "unable to create entry \"cn=Runqueue,%s\"\n", - ms->mss_ndn.bv_val, 0, 0 ); - return( -1 ); - } - BER_BVSTR( &bv, "0" ); - attr_merge_normalize_one( e, mi->mi_ad_monitoredInfo, &bv, NULL ); + case LDAP_PVT_THREAD_POOL_PARAM_STATE: + if ( ldap_pvt_thread_pool_query( &connection_pool, + mt[ i ].param, (void *)&state ) == 0 ) + { + ber_str2bv( state, 0, 0, &bv ); - mp = monitor_entrypriv_create(); - if ( mp == NULL ) { - return -1; - } - e->e_private = ( void * )mp; - mp->mp_info = ms; - mp->mp_flags = ms->mss_flags \ - | MONITOR_F_SUB | MONITOR_F_PERSISTENT; - - if ( monitor_cache_add( mi, e ) ) { - Debug( LDAP_DEBUG_ANY, - "monitor_subsys_thread_init: " - "unable to add entry \"cn=Runqueue,%s\"\n", - ms->mss_ndn.bv_val, 0, 0 ); - return( -1 ); - } - - *ep = e; - ep = &mp->mp_next; - - /* - * Tasklist - */ - BER_BVSTR( &bv, "cn=Tasklist" ); - e = monitor_entry_stub( &ms->mss_dn, &ms->mss_ndn, &bv, - mi->mi_oc_monitoredObject, mi, NULL, NULL ); - if ( e == NULL ) { - Debug( LDAP_DEBUG_ANY, - "monitor_subsys_thread_init: " - "unable to create entry \"%s,%s\"\n", - bv.bv_val, ms->mss_ndn.bv_val, 0 ); - return( -1 ); - } - BER_BVSTR( &bv, "0" ); - attr_merge_normalize_one( e, mi->mi_ad_monitoredInfo, &bv, NULL ); + } else { + BER_BVSTR( &bv, "unknown" ); + } + break; + + default: + /* NOTE: in case of error, it'll be set to -1 */ + (void)ldap_pvt_thread_pool_query( &connection_pool, + mt[ i ].param, (void *)&count ); + bv.bv_val = buf; + bv.bv_len = snprintf( buf, sizeof( buf ), "%d", count ); + break; + } - mp = monitor_entrypriv_create(); - if ( mp == NULL ) { - return -1; - } - e->e_private = ( void * )mp; - mp->mp_info = ms; - mp->mp_flags = ms->mss_flags \ - | MONITOR_F_SUB | MONITOR_F_PERSISTENT; + if ( !BER_BVISNULL( &bv ) ) { + attr_merge_normalize_one( e, mi->mi_ad_monitoredInfo, &bv, NULL ); + } - if ( monitor_cache_add( mi, e ) ) { - Debug( LDAP_DEBUG_ANY, - "monitor_subsys_thread_init: " - "unable to add entry \"%s\"\n", - e->e_name.bv_val, 0, 0 ); - return( -1 ); - } + if ( !BER_BVISNULL( &mt[ i ].desc ) ) { + attr_merge_normalize_one( e, + slap_schema.si_ad_description, + &mt[ i ].desc, NULL ); + } - *ep = e; - ep = &mp->mp_next; + mp = monitor_entrypriv_create(); + if ( mp == NULL ) { + return -1; + } + e->e_private = ( void * )mp; + mp->mp_info = ms; + mp->mp_flags = ms->mss_flags \ + | MONITOR_F_SUB | MONITOR_F_PERSISTENT; + + if ( monitor_cache_add( mi, e ) ) { + Debug( LDAP_DEBUG_ANY, + "monitor_subsys_thread_init: " + "unable to add entry \"%s,%s\"\n", + mt[ i ].rdn.bv_val, + ms->mss_dn.bv_val, 0 ); + return( -1 ); + } + + *ep = e; + ep = &mp->mp_next; + } monitor_cache_release( mi, e_thread ); +#endif /* ! NO_THREADS */ return( 0 ); } +#ifndef NO_THREADS static int monitor_subsys_thread_update( Operation *op, @@ -224,112 +224,130 @@ monitor_subsys_thread_update( { monitor_info_t *mi = ( monitor_info_t * )op->o_bd->be_private; Attribute *a; + BerVarray vals = NULL; char buf[ BACKMONITOR_BUFSIZE ]; - enum { - MT_UNKNOWN, - MT_BACKLOAD, - MT_RUNQUEUE, - MT_TASKLIST, - MT_MAX /* unused */ - }; - static slap_verbmasks mt[] = { - { BER_BVC( "cn=backload" ), MT_BACKLOAD }, - { BER_BVC( "cn=runqueue" ), MT_RUNQUEUE }, - { BER_BVC( "cn=tasklist" ), MT_TASKLIST }, - { BER_BVC( "cn=max" ), MT_UNKNOWN }, - { BER_BVNULL, MT_UNKNOWN } - }; struct berval rdn, bv; - ber_len_t len; int which, i; struct re_s *re; + int count = -1; + char *state = NULL; assert( mi != NULL ); dnRdn( &e->e_nname, &rdn ); - which = bverb_to_mask( &rdn, mt ); - if ( BER_BVISNULL( &mt[ which ].word ) - || mt[ which ].mask == MT_UNKNOWN ) - { + for ( i = 0; !BER_BVISNULL( &mt[ i ].nrdn ); i++ ) { + if ( dn_match( &mt[ i ].nrdn, &rdn ) ) { + break; + } + } + + which = i; + if ( BER_BVISNULL( &mt[ which ].nrdn ) ) { return SLAP_CB_CONTINUE; } a = attr_find( e->e_attrs, mi->mi_ad_monitoredInfo ); - if ( a == NULL ) { - return rs->sr_err = LDAP_OTHER; - } - switch ( mt[ which ].mask ) { - case MT_BACKLOAD: - snprintf( buf, sizeof( buf ), "%d", - ldap_pvt_thread_pool_backload( &connection_pool ) ); - len = strlen( buf ); - if ( len > a->a_vals[ 0 ].bv_len ) { - a->a_vals[ 0 ].bv_val = ber_memrealloc( a->a_vals[ 0 ].bv_val, len + 1 ); - } - a->a_vals[ 0 ].bv_len = len; - AC_MEMCPY( a->a_vals[ 0 ].bv_val, buf, len + 1 ); - break; + switch ( mt[ which ].param ) { + case LDAP_PVT_THREAD_POOL_PARAM_UNKNOWN: + switch ( mt[ which ].mt ) { + case MT_RUNQUEUE: + if ( a != NULL ) { + if ( a->a_nvals != a->a_vals ) { + ber_bvarray_free( a->a_nvals ); + } + ber_bvarray_free( a->a_vals ); + a->a_vals = NULL; + a->a_nvals = NULL; + a->a_numvals = 0; + } - case MT_RUNQUEUE: - for ( i = 0; !BER_BVISNULL( &a->a_vals[ i ] ); i++ ) { - ch_free( a->a_vals[ i ].bv_val ); - BER_BVZERO( &a->a_vals[ i ] ); - } - if ( a->a_nvals != a->a_vals ) { - ber_bvarray_free( a->a_nvals ); - } - a->a_nvals = NULL; - bv.bv_val = buf; - ldap_pvt_thread_mutex_lock( &slapd_rq.rq_mutex ); - i = 0; - LDAP_STAILQ_FOREACH( re, &slapd_rq.run_list, rnext ) { - bv.bv_len = snprintf( buf, sizeof( buf ), "{%d}%s(%s)", - i, re->tname, re->tspec ); - if ( bv.bv_len < sizeof( buf ) ) { - value_add_one( &a->a_vals, &bv ); + i = 0; + bv.bv_val = buf; + ldap_pvt_thread_mutex_lock( &slapd_rq.rq_mutex ); + LDAP_STAILQ_FOREACH( re, &slapd_rq.run_list, rnext ) { + bv.bv_len = snprintf( buf, sizeof( buf ), "{%d}%s(%s)", + i, re->tname, re->tspec ); + if ( bv.bv_len < sizeof( buf ) ) { + value_add_one( &vals, &bv ); + } + i++; } - i++; - } - ldap_pvt_thread_mutex_unlock( &slapd_rq.rq_mutex ); + ldap_pvt_thread_mutex_unlock( &slapd_rq.rq_mutex ); + + if ( vals ) { + attr_merge_normalize( e, mi->mi_ad_monitoredInfo, vals, NULL ); + ber_bvarray_free( vals ); + + } else { + attr_delete( &e->e_attrs, mi->mi_ad_monitoredInfo ); + } + break; + + case MT_TASKLIST: + if ( a != NULL ) { + if ( a->a_nvals != a->a_vals ) { + ber_bvarray_free( a->a_nvals ); + } + ber_bvarray_free( a->a_vals ); + a->a_vals = NULL; + a->a_nvals = NULL; + a->a_numvals = 0; + } + + i = 0; + bv.bv_val = buf; + ldap_pvt_thread_mutex_lock( &slapd_rq.rq_mutex ); + LDAP_STAILQ_FOREACH( re, &slapd_rq.task_list, tnext ) { + bv.bv_len = snprintf( buf, sizeof( buf ), "{%d}%s(%s)", + i, re->tname, re->tspec ); + if ( bv.bv_len < sizeof( buf ) ) { + value_add_one( &vals, &bv ); + } + i++; + } + ldap_pvt_thread_mutex_unlock( &slapd_rq.rq_mutex ); + + if ( vals ) { + attr_merge_normalize( e, mi->mi_ad_monitoredInfo, vals, NULL ); + ber_bvarray_free( vals ); - /* don't leave 'round attributes with no values */ - if ( BER_BVISNULL( &a->a_vals[ 0 ] ) ) { - BER_BVSTR( &bv, "{0}()" ); - value_add_one( &a->a_vals, &bv ); + } else { + attr_delete( &e->e_attrs, mi->mi_ad_monitoredInfo ); + } + break; + + default: + assert( 0 ); } - a->a_nvals = a->a_vals; break; - case MT_TASKLIST: - for ( i = 0; !BER_BVISNULL( &a->a_vals[ i ] ); i++ ) { - ch_free( a->a_vals[ i ].bv_val ); - BER_BVZERO( &a->a_vals[ i ] ); + case LDAP_PVT_THREAD_POOL_PARAM_STATE: + if ( a == NULL ) { + return rs->sr_err = LDAP_OTHER; } - if ( a->a_nvals != a->a_vals ) { - ber_bvarray_free( a->a_nvals ); + if ( ldap_pvt_thread_pool_query( &connection_pool, + mt[ i ].param, (void *)&state ) == 0 ) + { + ber_str2bv( state, 0, 0, &bv ); + ber_bvreplace( &a->a_vals[ 0 ], &bv ); + } + break; + + default: + if ( a == NULL ) { + return rs->sr_err = LDAP_OTHER; } - a->a_nvals = NULL; - bv.bv_val = buf; - ldap_pvt_thread_mutex_lock( &slapd_rq.rq_mutex ); - i = 0; - LDAP_STAILQ_FOREACH( re, &slapd_rq.task_list, tnext ) { - bv.bv_len = snprintf( buf, sizeof( buf ), "{%d}%s(%s)", - i, re->tname, re->tspec ); + if ( ldap_pvt_thread_pool_query( &connection_pool, + mt[ i ].param, (void *)&count ) == 0 ) + { + bv.bv_val = buf; + bv.bv_len = snprintf( buf, sizeof( buf ), "%d", count ); if ( bv.bv_len < sizeof( buf ) ) { - value_add_one( &a->a_vals, &bv ); + ber_bvreplace( &a->a_vals[ 0 ], &bv ); } - i++; - } - ldap_pvt_thread_mutex_unlock( &slapd_rq.rq_mutex ); - - /* don't leave 'round attributes with no values */ - if ( BER_BVISNULL( &a->a_vals[ 0 ] ) ) { - BER_BVSTR( &bv, "{0}()" ); - value_add_one( &a->a_vals, &bv ); } - a->a_nvals = a->a_vals; break; } @@ -337,4 +355,4 @@ monitor_subsys_thread_update( return SLAP_CB_CONTINUE; } - +#endif /* ! NO_THREADS */