]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/back-monitor/conn.c
Merge remote-tracking branch 'origin/mdb.master' into OPENLDAP_REL_ENG_2_4
[openldap] / servers / slapd / back-monitor / conn.c
index 21f0a1d34da0c8c6292e237ebfc1a2a6e8699f2f..28fc176b87bc72cdef6f314b2a5dc2451e3b808e 100644 (file)
@@ -2,7 +2,7 @@
 /* $OpenLDAP$ */
 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
  *
- * Copyright 2001-2006 The OpenLDAP Foundation.
+ * Copyright 2001-2013 The OpenLDAP Foundation.
  * Portions Copyright 2001-2003 Pierangelo Masarati.
  * All rights reserved.
  *
 #include "lutil.h"
 #include "back-monitor.h"
 
-#ifndef LDAP_DEVEL
-#define MONITOR_LEGACY_CONN
-#endif
-
 static int
 monitor_subsys_conn_update(
        Operation               *op,
@@ -54,6 +50,7 @@ monitor_subsys_conn_init(
        monitor_info_t  *mi;
        Entry           *e, **ep, *e_conn;
        monitor_entry_t *mp;
+       char            buf[ BACKMONITOR_BUFSIZE ];
        struct berval   bv;
 
        assert( be != NULL );
@@ -75,12 +72,57 @@ monitor_subsys_conn_init(
        mp->mp_children = NULL;
        ep = &mp->mp_children;
 
+       /*
+        * Max file descriptors
+        */
+       BER_BVSTR( &bv, "cn=Max File Descriptors" );
+       e = monitor_entry_stub( &ms->mss_dn, &ms->mss_ndn, &bv,
+               mi->mi_oc_monitorCounterObject, NULL, NULL );
+       
+       if ( e == NULL ) {
+               Debug( LDAP_DEBUG_ANY,
+                       "monitor_subsys_conn_init: "
+                       "unable to create entry \"%s,%s\"\n",
+                       bv.bv_val, ms->mss_ndn.bv_val, 0 );
+               return( -1 );
+       }
+
+       if ( dtblsize ) {
+               bv.bv_val = buf;
+               bv.bv_len = snprintf( buf, sizeof( buf ), "%d", dtblsize );
+
+       } else {
+               BER_BVSTR( &bv, "0" );
+       }
+       attr_merge_one( e, mi->mi_ad_monitorCounter, &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;
+       mp->mp_flags &= ~MONITOR_F_VOLATILE_CH;
+
+       if ( monitor_cache_add( mi, e ) ) {
+               Debug( LDAP_DEBUG_ANY,
+                       "monitor_subsys_conn_init: "
+                       "unable to add entry \"cn=Total,%s\"\n",
+                       ms->mss_ndn.bv_val, 0, 0 );
+               return( -1 );
+       }
+
+       *ep = e;
+       ep = &mp->mp_next;
+       
        /*
         * Total conns
         */
        BER_BVSTR( &bv, "cn=Total" );
        e = monitor_entry_stub( &ms->mss_dn, &ms->mss_ndn, &bv,
-               mi->mi_oc_monitorCounterObject, mi, NULL, NULL );
+               mi->mi_oc_monitorCounterObject, NULL, NULL );
        
        if ( e == NULL ) {
                Debug( LDAP_DEBUG_ANY,
@@ -90,8 +132,8 @@ monitor_subsys_conn_init(
                return( -1 );
        }
        
-       BER_BVSTR( &bv, "0" );
-       attr_merge_one( e, mi->mi_ad_monitorCounter, &bv, &bv );
+       BER_BVSTR( &bv, "-1" );
+       attr_merge_one( e, mi->mi_ad_monitorCounter, &bv, NULL );
        
        mp = monitor_entrypriv_create();
        if ( mp == NULL ) {
@@ -119,7 +161,7 @@ monitor_subsys_conn_init(
         */
        BER_BVSTR( &bv, "cn=Current" );
        e = monitor_entry_stub( &ms->mss_dn, &ms->mss_ndn, &bv,
-               mi->mi_oc_monitorCounterObject, mi, NULL, NULL );
+               mi->mi_oc_monitorCounterObject, NULL, NULL );
 
        if ( e == NULL ) {
                Debug( LDAP_DEBUG_ANY,
@@ -130,7 +172,7 @@ monitor_subsys_conn_init(
        }
        
        BER_BVSTR( &bv, "0" );
-       attr_merge_one( e, mi->mi_ad_monitorCounter, &bv, &bv );
+       attr_merge_one( e, mi->mi_ad_monitorCounter, &bv, NULL );
        
        mp = monitor_entrypriv_create();
        if ( mp == NULL ) {
@@ -181,11 +223,12 @@ monitor_subsys_conn_update(
 
        } else if ( dn_match( &rdn, &current_bv ) ) {
                Connection      *c;
-               int             connindex;
+               ber_socket_t    connindex;
 
                for ( n = 0, c = connection_first( &connindex );
                                c != NULL;
-                               n++, c = connection_next( c, &connindex ) ) {
+                               n++, c = connection_next( c, &connindex ) )
+               {
                        /* No Op */ ;
                }
                connection_done( c );
@@ -193,7 +236,7 @@ monitor_subsys_conn_update(
 
        if ( n != -1 ) {
                Attribute       *a;
-               char            buf[] = "+9223372036854775807L";
+               char            buf[LDAP_PVT_INTTYPE_CHARS(long)];
                ber_len_t       len;
 
                a = attr_find( e->e_attrs, mi->mi_ad_monitorCounter );
@@ -223,78 +266,33 @@ conn_create(
        monitor_subsys_t        *ms )
 {
        monitor_entry_t *mp;
-       struct tm       *tm;
+       struct tm       tm;
        char            buf[ BACKMONITOR_BUFSIZE ];
        char            buf2[ LDAP_LUTIL_GENTIME_BUFSIZE ];
        char            buf3[ LDAP_LUTIL_GENTIME_BUFSIZE ];
 
-       struct berval bv, ctmbv, mtmbv, bv2, bv3;
+       struct berval bv, ctmbv, mtmbv;
        struct berval bv_unknown= BER_BVC("unknown");
 
        Entry           *e;
 
-#ifdef HACK_LOCAL_TIME
-       char            ctmbuf[ LDAP_LUTIL_GENTIME_BUFSIZE ];
-       char            mtmbuf[ LDAP_LUTIL_GENTIME_BUFSIZE ];
-#endif
-#ifdef HAVE_GMTIME_R
-       struct tm       tm_buf;
-#endif /* HAVE_GMTIME_R */
-
        assert( c != NULL );
        assert( ep != NULL );
 
-#ifndef HAVE_GMTIME_R
-       ldap_pvt_thread_mutex_lock( &gmtime_mutex );
-#endif
-
-#ifdef HAVE_GMTIME_R
-       tm = gmtime_r( &c->c_starttime, &tm_buf );
-#else
-       tm = gmtime( &c->c_starttime );
-#endif
-       bv2.bv_len = lutil_gentime( buf2, sizeof( buf2 ), tm );
-       bv2.bv_val = buf2;
-#ifdef HACK_LOCAL_TIME
-# ifdef HAVE_LOCALTIME_R
-       tm = localtime_r( &c->c_starttime, &tm_buf );
-# else
-       tm = localtime( &c->c_starttime );
-# endif
-       ctmbv.bv_len = lutil_localtime( ctmbuf, sizeof( ctmbuf ), tm, -timezone );
-       ctmbv.bv_val = ctmbuf;
-#else /* !HACK_LOCAL_TIME */
-       ctmbv = bv2;
-#endif
-
-#ifdef HAVE_GMTIME_R
-       tm = gmtime_r( &c->c_activitytime, &tm_buf );
-#else
-       tm = gmtime( &c->c_activitytime );
-#endif
-       bv3.bv_len = lutil_gentime( buf3, sizeof( buf3 ), tm );
-       bv3.bv_val = buf3;
-#ifdef HACK_LOCAL_TIME
-# ifdef HAVE_LOCALTIME_R
-       tm = localtime_r( &c->c_activitytime, &tm_buf );
-# else
-       tm = localtime( &c->c_activitytime );
-# endif /* HAVE_LOCALTIME_R */
-       mtmbv.bv_len = lutil_localtime( mtmbuf, sizeof( mtmbuf ), tm, -timezone );
-       mtmbv.bv_val = mtmbuf;
-#else /* !HACK_LOCAL_TIME */
-       mtmbv = bv3;
-#endif
-
-#ifndef HAVE_GMTIME_R
-       ldap_pvt_thread_mutex_unlock( &gmtime_mutex );
-#endif
+       ldap_pvt_gmtime( &c->c_starttime, &tm );
+
+       ctmbv.bv_len = lutil_gentime( buf2, sizeof( buf2 ), &tm );
+       ctmbv.bv_val = buf2;
+
+       ldap_pvt_gmtime( &c->c_activitytime, &tm );
+       mtmbv.bv_len = lutil_gentime( buf3, sizeof( buf3 ), &tm );
+       mtmbv.bv_val = buf3;
 
        bv.bv_len = snprintf( buf, sizeof( buf ),
                "cn=Connection %ld", c->c_connid );
        bv.bv_val = buf;
        e = monitor_entry_stub( &ms->mss_dn, &ms->mss_ndn, &bv, 
-               mi->mi_oc_monitorConnection, mi, &ctmbv, &mtmbv );
+               mi->mi_oc_monitorConnection, &ctmbv, &mtmbv );
 
        if ( e == NULL) {
                Debug( LDAP_DEBUG_ANY,
@@ -340,20 +338,22 @@ conn_create(
                        c->c_dn.bv_len ? c->c_dn.bv_val : SLAPD_ANONYMOUS,
                        
                        c->c_listener_url.bv_val,
-                       c->c_peer_domain.bv_val,
-                       c->c_peer_name.bv_val,
+                       BER_BVISNULL( &c->c_peer_domain )
+                               ? "" : c->c_peer_domain.bv_val,
+                       BER_BVISNULL( &c->c_peer_name )
+                               ? "" : c->c_peer_name.bv_val,
                        c->c_sock_name.bv_val,
                        
                        buf2,
                        buf3 );
-       attr_merge_one( e, mi->mi_ad_monitoredInfo, &bv, NULL );
+       attr_merge_normalize_one( e, mi->mi_ad_monitoredInfo, &bv, NULL );
 #endif /* MONITOR_LEGACY_CONN */
 
        bv.bv_len = snprintf( buf, sizeof( buf ), "%lu", c->c_connid );
        attr_merge_one( e, mi->mi_ad_monitorConnectionNumber, &bv, NULL );
 
        bv.bv_len = snprintf( buf, sizeof( buf ), "%ld", (long) c->c_protocol );
-       attr_merge_one( e, mi->mi_ad_monitorConnectionProtocol, &bv, NULL );
+       attr_merge_normalize_one( e, mi->mi_ad_monitorConnectionProtocol, &bv, NULL );
 
        bv.bv_len = snprintf( buf, sizeof( buf ), "%ld", c->c_n_ops_received );
        attr_merge_one( e, mi->mi_ad_monitorConnectionOpsReceived, &bv, NULL );
@@ -383,29 +383,31 @@ conn_create(
                        LDAP_STAILQ_EMPTY( &c->c_pending_ops ) ? "" : "p",
                        connection_state2str( c->c_conn_state ),
                        c->c_sasl_bind_in_progress ? "S" : "" );
-       attr_merge_one( e, mi->mi_ad_monitorConnectionMask, &bv, NULL );
+       attr_merge_normalize_one( e, mi->mi_ad_monitorConnectionMask, &bv, NULL );
 
        attr_merge_one( e, mi->mi_ad_monitorConnectionAuthzDN,
                &c->c_dn, &c->c_ndn );
 
        /* NOTE: client connections leave the c_peer_* fields NULL */
-       attr_merge_one( e, mi->mi_ad_monitorConnectionListener,
+       assert( !BER_BVISNULL( &c->c_listener_url ) );
+       attr_merge_normalize_one( e, mi->mi_ad_monitorConnectionListener,
                &c->c_listener_url, NULL );
 
-       attr_merge_one( e, mi->mi_ad_monitorConnectionPeerDomain,
+       attr_merge_normalize_one( e, mi->mi_ad_monitorConnectionPeerDomain,
                BER_BVISNULL( &c->c_peer_domain ) ? &bv_unknown : &c->c_peer_domain,
                NULL );
 
-       attr_merge_one( e, mi->mi_ad_monitorConnectionPeerAddress,
+       attr_merge_normalize_one( e, mi->mi_ad_monitorConnectionPeerAddress,
                BER_BVISNULL( &c->c_peer_name ) ? &bv_unknown : &c->c_peer_name,
                NULL );
 
-       attr_merge_one( e, mi->mi_ad_monitorConnectionLocalAddress,
+       assert( !BER_BVISNULL( &c->c_sock_name ) );
+       attr_merge_normalize_one( e, mi->mi_ad_monitorConnectionLocalAddress,
                &c->c_sock_name, NULL );
 
-       attr_merge_one( e, mi->mi_ad_monitorConnectionStartTime, &bv2, NULL );
+       attr_merge_normalize_one( e, mi->mi_ad_monitorConnectionStartTime, &ctmbv, NULL );
 
-       attr_merge_one( e, mi->mi_ad_monitorConnectionActivityTime, &bv3, NULL );
+       attr_merge_normalize_one( e, mi->mi_ad_monitorConnectionActivityTime, &mtmbv, NULL );
 
        mp = monitor_entrypriv_create();
        if ( mp == NULL ) {
@@ -430,9 +432,6 @@ monitor_subsys_conn_create(
 {
        monitor_info_t  *mi = ( monitor_info_t * )op->o_bd->be_private;
 
-       Connection              *c;
-       int                     connindex;
-       monitor_entry_t         *mp;
        int                     rc = SLAP_CB_CONTINUE;
        monitor_subsys_t        *ms;
 
@@ -445,14 +444,18 @@ monitor_subsys_conn_create(
        *ep = NULL;
 
        if ( ndn == NULL ) {
-               Entry   *e = NULL,
-                       *e_tmp = NULL;
+               Connection      *c;
+               ber_socket_t    connindex;
+               Entry           *e = NULL,
+                               *e_tmp = NULL;
 
                /* create all the children of e_parent */
                for ( c = connection_first( &connindex );
                                c != NULL;
                                c = connection_next( c, &connindex ) )
                {
+                       monitor_entry_t         *mp;
+
                        if ( conn_create( mi, c, &e, ms ) != SLAP_CB_CONTINUE
                                        || e == NULL )
                        {
@@ -477,6 +480,8 @@ monitor_subsys_conn_create(
                *ep = e;
 
        } else {
+               Connection              *c;
+               ber_socket_t            connindex;
                unsigned long           connid;
                char                    *next = NULL;
                static struct berval    nconn_bv = BER_BVC( "cn=connection " );