]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/back-monitor/sent.c
fix zeroing out attribute values (should fix ITS#5311)
[openldap] / servers / slapd / back-monitor / sent.c
index f6c0a9f17fce87498d7ada9a35db5e7023a0da58..5991a5d0572a832c521bbea85dd4ab94c1395e04 100644 (file)
@@ -2,7 +2,7 @@
 /* $OpenLDAP$ */
 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
  *
- * Copyright 2001-2005 The OpenLDAP Foundation.
+ * Copyright 2001-2008 The OpenLDAP Foundation.
  * Portions Copyright 2001-2003 Pierangelo Masarati.
  * All rights reserved.
  *
@@ -89,30 +89,13 @@ monitor_subsys_sent_init(
        ep = &mp->mp_children;
 
        for ( i = 0; i < MONITOR_SENT_LAST; i++ ) {
-               char                    buf[ BACKMONITOR_BUFSIZE ];
                struct berval           nrdn, bv;
                Entry                   *e;
 
-               snprintf( buf, sizeof( buf ),
-                               "dn: %s,%s\n"
-                               "objectClass: %s\n"
-                               "structuralObjectClass: %s\n"
-                               "cn: %s\n"
-                               "creatorsName: %s\n"
-                               "modifiersName: %s\n"
-                               "createTimestamp: %s\n"
-                               "modifyTimestamp: %s\n",
-                               monitor_sent[ i ].rdn.bv_val,
-                               ms->mss_dn.bv_val,
-                               mi->mi_oc_monitorCounterObject->soc_cname.bv_val,
-                               mi->mi_oc_monitorCounterObject->soc_cname.bv_val,
-                               &monitor_sent[ i ].rdn.bv_val[ STRLENOF( "cn=" ) ],
-                               mi->mi_creatorsName.bv_val,
-                               mi->mi_creatorsName.bv_val,
-                               mi->mi_startTime.bv_val,
-                               mi->mi_startTime.bv_val );
-
-               e = str2entry( buf );
+               e = monitor_entry_stub( &ms->mss_dn, &ms->mss_ndn,
+                       &monitor_sent[i].rdn, mi->mi_oc_monitorCounterObject,
+                       mi, NULL, NULL );
+                       
                if ( e == NULL ) {
                        Debug( LDAP_DEBUG_ANY,
                                "monitor_subsys_sent_init: "
@@ -127,7 +110,7 @@ monitor_subsys_sent_init(
                ber_dupbv( &monitor_sent[ i ].nrdn, &nrdn );
        
                BER_BVSTR( &bv, "0" );
-               attr_merge_one( e, mi->mi_ad_monitorCounter, &bv, &bv );
+               attr_merge_normalize_one( e, mi->mi_ad_monitorCounter, &bv, NULL );
        
                mp = monitor_entrypriv_create();
                if ( mp == NULL ) {
@@ -183,6 +166,7 @@ monitor_subsys_sent_update(
        struct berval           nrdn;
        ldap_pvt_mp_t           n;
        Attribute               *a;
+       slap_counters_t *sc;
        int                     i;
 
        assert( mi != NULL );
@@ -200,28 +184,48 @@ monitor_subsys_sent_update(
                return SLAP_CB_CONTINUE;
        }
 
-       ldap_pvt_thread_mutex_lock(&slap_counters.sc_sent_mutex);
+       ldap_pvt_thread_mutex_lock(&slap_counters.sc_mutex);
        switch ( i ) {
        case MONITOR_SENT_ENTRIES:
                ldap_pvt_mp_init_set( n, slap_counters.sc_entries );
+               for ( sc = slap_counters.sc_next; sc; sc = sc->sc_next ) {
+                       ldap_pvt_thread_mutex_lock( &sc->sc_mutex );
+                       ldap_pvt_mp_add( n, sc->sc_entries );
+                       ldap_pvt_thread_mutex_unlock( &sc->sc_mutex );
+               }
                break;
 
        case MONITOR_SENT_REFERRALS:
                ldap_pvt_mp_init_set( n, slap_counters.sc_refs );
+               for ( sc = slap_counters.sc_next; sc; sc = sc->sc_next ) {
+                       ldap_pvt_thread_mutex_lock( &sc->sc_mutex );
+                       ldap_pvt_mp_add( n, sc->sc_refs );
+                       ldap_pvt_thread_mutex_unlock( &sc->sc_mutex );
+               }
                break;
 
        case MONITOR_SENT_PDU:
                ldap_pvt_mp_init_set( n, slap_counters.sc_pdu );
+               for ( sc = slap_counters.sc_next; sc; sc = sc->sc_next ) {
+                       ldap_pvt_thread_mutex_lock( &sc->sc_mutex );
+                       ldap_pvt_mp_add( n, sc->sc_pdu );
+                       ldap_pvt_thread_mutex_unlock( &sc->sc_mutex );
+               }
                break;
 
        case MONITOR_SENT_BYTES:
                ldap_pvt_mp_init_set( n, slap_counters.sc_bytes );
+               for ( sc = slap_counters.sc_next; sc; sc = sc->sc_next ) {
+                       ldap_pvt_thread_mutex_lock( &sc->sc_mutex );
+                       ldap_pvt_mp_add( n, sc->sc_bytes );
+                       ldap_pvt_thread_mutex_unlock( &sc->sc_mutex );
+               }
                break;
 
        default:
                assert(0);
        }
-       ldap_pvt_thread_mutex_unlock(&slap_counters.sc_sent_mutex);
+       ldap_pvt_thread_mutex_unlock(&slap_counters.sc_mutex);
        
        a = attr_find( e->e_attrs, mi->mi_ad_monitorCounter );
        assert( a != NULL );