From e2b04c434ed55768bf5a336957cddf27653c2a49 Mon Sep 17 00:00:00 2001 From: Nadezhda Ivanova Date: Mon, 28 Oct 2024 15:48:33 +0200 Subject: [PATCH] ITS#9186 Add a counter to cn=Listener to track total number of established connections since startup --- servers/slapd/back-monitor/back-monitor.h | 1 + servers/slapd/back-monitor/init.c | 7 ++++ servers/slapd/back-monitor/listener.c | 46 +++++++++++++++++++++++ servers/slapd/connection.c | 4 ++ servers/slapd/daemon.c | 1 + servers/slapd/slap.h | 1 + 6 files changed, 60 insertions(+) diff --git a/servers/slapd/back-monitor/back-monitor.h b/servers/slapd/back-monitor/back-monitor.h index 30851afbb3..e6441f27db 100644 --- a/servers/slapd/back-monitor/back-monitor.h +++ b/servers/slapd/back-monitor/back-monitor.h @@ -140,6 +140,7 @@ typedef struct monitor_info_t { AttributeDescription *mi_ad_monitorConnectionOpsAsync; AttributeDescription *mi_ad_monitorLogLevel; AttributeDescription *mi_ad_monitorDebugLevel; + AttributeDescription *mi_ad_monitorTotalListenerConnections; /* * Generic description attribute diff --git a/servers/slapd/back-monitor/init.c b/servers/slapd/back-monitor/init.c index 4749946a1d..48e3e630d9 100644 --- a/servers/slapd/back-monitor/init.c +++ b/servers/slapd/back-monitor/init.c @@ -1954,6 +1954,13 @@ monitor_back_initialize( "SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 " "USAGE dSAOperation )", SLAP_AT_FINAL|SLAP_AT_HIDE, offsetof(monitor_info_t, mi_ad_monitorDebugLevel) }, + { "( 1.3.6.1.4.1.4203.666.1.55.34 " + "NAME 'monitorTotalListenerConnections' " + "DESC 'monitor total number established of connections per listener since startup' " + "SUP monitorCounter " + "NO-USER-MODIFICATION " + "USAGE dSAOperation )", SLAP_AT_FINAL|SLAP_AT_HIDE, + offsetof(monitor_info_t, mi_ad_monitorTotalListenerConnections) }, { NULL, 0, -1 } }; diff --git a/servers/slapd/back-monitor/listener.c b/servers/slapd/back-monitor/listener.c index 63ab3b9061..22ce6b95fa 100644 --- a/servers/slapd/back-monitor/listener.c +++ b/servers/slapd/back-monitor/listener.c @@ -27,6 +27,46 @@ #include "slap.h" #include "back-monitor.h" +static int +monitor_subsys_listener_update( + Operation *op, + SlapReply *rs, + Entry *e ) +{ + monitor_info_t *mi = ( monitor_info_t * )op->o_bd->be_private; + int i; + Listener **l; + + assert( mi != NULL ); + assert( e != NULL ); + + if ( ( l = slapd_get_listeners() ) == NULL ) { + if ( slapMode & SLAP_TOOL_MODE ) { + return 0; + } + + Debug( LDAP_DEBUG_ANY, + "monitor_subsys_listener_update: " + "unable to get listeners\n" ); + return( -1 ); + } + + for ( i = 0; l[ i ]; i++ ) { + char buf[ BACKMONITOR_BUFSIZE ]; + struct berval sl_bv; + struct berval rdn; + dnRdn( &e->e_nname, &rdn ); + sl_bv.bv_len = snprintf( buf, sizeof( buf ), + "cn=listener %d", i ); + sl_bv.bv_val = buf; + if ( dn_match( &rdn, &sl_bv ) ) { + Attribute *a = attr_find( e->e_attrs, mi->mi_ad_monitorTotalListenerConnections ); + assert( a != NULL ); + UI2BV( &a->a_vals[ 0 ], l[ i ]->sl_n_conns_opened ); + } + } +} + int monitor_subsys_listener_init( BackendDB *be, @@ -52,6 +92,8 @@ monitor_subsys_listener_init( return( -1 ); } + ms->mss_update = monitor_subsys_listener_update; + mi = ( monitor_info_t * )be->be_private; if ( monitor_cache_get( mi, &ms->mss_ndn, &e_listener ) ) { @@ -87,6 +129,10 @@ monitor_subsys_listener_init( attr_merge_normalize_one( e, slap_schema.si_ad_labeledURI, &l[ i ]->sl_url, NULL ); + ber_str2bv( "0", STRLENOF( "0" ), 0, &bv ); + attr_merge_normalize_one( e, mi->mi_ad_monitorTotalListenerConnections, + &bv, NULL ); + #ifdef HAVE_TLS if ( l[ i ]->sl_is_tls ) { struct berval bv; diff --git a/servers/slapd/connection.c b/servers/slapd/connection.c index 717934b55e..2766b94193 100644 --- a/servers/slapd/connection.c +++ b/servers/slapd/connection.c @@ -537,6 +537,10 @@ Connection * connection_init( slapd_add_internal( s, 1 ); backend_connection_init(c); + + if ( c->c_listener ) + ldap_pvt_mp_add_ulong(c->c_listener->sl_n_conns_opened, 1); + ldap_pvt_thread_mutex_unlock( &c->c_mutex ); if ( !(flags & CONN_IS_UDP )) diff --git a/servers/slapd/daemon.c b/servers/slapd/daemon.c index 2b6d26c7ac..c08e560fcd 100644 --- a/servers/slapd/daemon.c +++ b/servers/slapd/daemon.c @@ -1561,6 +1561,7 @@ slap_open_listener( l.sl_tcp_rmem = 0; l.sl_tcp_wmem = 0; #endif /* LDAP_TCP_BUFFER */ + ldap_pvt_mp_init( l.sl_n_conns_opened ); port = (unsigned short) lud->lud_port; diff --git a/servers/slapd/slap.h b/servers/slapd/slap.h index d234ac5477..d0d6d69395 100644 --- a/servers/slapd/slap.h +++ b/servers/slapd/slap.h @@ -3046,6 +3046,7 @@ struct Listener { int sl_tcp_rmem; /* custom TCP read buffer size */ int sl_tcp_wmem; /* custom TCP write buffer size */ #endif + ldap_pvt_mp_t sl_n_conns_opened; /* total number of connections opened since startup */ }; /* -- 2.47.2