]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/back-monitor/rww.c
#include <ac/string.h>, to get strlen(), strncmp() and strncasecmp().
[openldap] / servers / slapd / back-monitor / rww.c
index 91ccc0bb0f6e647b3709bb0d6f22e77235fc6797..0f7cf75eb3b6681df08e9bb323674626cb87eac3 100644 (file)
@@ -1,12 +1,9 @@
 /* readw.c - deal with read waiters subsystem */
 /*
- * Copyright 1998-2000 The OpenLDAP Foundation, All Rights Reserved.
+ * Copyright 1998-2003 The OpenLDAP Foundation, All Rights Reserved.
  * COPYING RESTRICTIONS APPLY, see COPYRIGHT file
  */
 /*
- * Copyright 2001 The OpenLDAP Foundation, All Rights Reserved.
- * COPYING RESTRICTIONS APPLY, see COPYRIGHT file
- * 
  * Copyright 2001, Pierangelo Masarati, All rights reserved. <ando@sys-net.it>
  * 
  * This work has beed deveolped for the OpenLDAP Foundation 
 #include "portable.h"
 
 #include <stdio.h>
+#include <ac/string.h>
 
 #include "slap.h"
+#include "lutil.h"
 #include "back-monitor.h"
 
-static int monitor_subsys_readw_update_internal( struct monitorinfo *mi, Entry *e, int rw );
-
-int 
-monitor_subsys_readw_update( 
-       struct monitorinfo      *mi,
-       Entry                   *e
+int
+monitor_subsys_rww_init(
+       BackendDB               *be
 )
 {
-       return monitor_subsys_readw_update_internal( mi, e, 0 );
-}
+       struct monitorinfo      *mi;
+       
+       Entry                   *e, *e_tmp, *e_conn;
+       struct monitorentrypriv *mp;
+       char                    buf[ BACKMONITOR_BUFSIZE ];
+       struct berval           bv;
 
-int 
-monitor_subsys_writew_update( 
-       struct monitorinfo      *mi,
-       Entry                   *e
-)
-{
-       return monitor_subsys_readw_update_internal( mi, e, 1 );
+       assert( be != NULL );
+
+       mi = ( struct monitorinfo * )be->be_private;
+
+       if ( monitor_cache_get( mi,
+                       &monitor_subsys[SLAPD_MONITOR_RWW].mss_ndn, &e_conn ) ) {
+#ifdef NEW_LOGGING
+               LDAP_LOG( OPERATION, CRIT,
+                       "monitor_subsys_rww_init: "
+                       "unable to get entry '%s'\n",
+                       monitor_subsys[SLAPD_MONITOR_RWW].mss_ndn.bv_val, 0, 0 );
+#else
+               Debug( LDAP_DEBUG_ANY,
+                       "monitor_subsys_rww_init: "
+                       "unable to get entry '%s'\n%s%s",
+                       monitor_subsys[SLAPD_MONITOR_RWW].mss_ndn.bv_val, 
+                       "", "" );
+#endif
+               return( -1 );
+       }
+
+       e_tmp = NULL;
+
+       /*
+        * Total conns
+        */
+       snprintf( buf, sizeof( buf ),
+               "dn: cn=Read,%s\n"
+               "objectClass: %s\n"
+               "structuralObjectClass: %s\n"
+               "cn: Read\n",
+               monitor_subsys[SLAPD_MONITOR_RWW].mss_dn.bv_val,
+               mi->oc_monitorCounterObject->soc_cname.bv_val,
+               mi->oc_monitorCounterObject->soc_cname.bv_val );
+       
+       e = str2entry( buf );
+       if ( e == NULL ) {
+#ifdef NEW_LOGGING
+               LDAP_LOG( OPERATION, CRIT,
+                       "monitor_subsys_rww_init: "
+                       "unable to create entry 'cn=Read,%s'\n",
+                       monitor_subsys[SLAPD_MONITOR_RWW].mss_ndn.bv_val, 0, 0 );
+#else
+               Debug( LDAP_DEBUG_ANY,
+                       "monitor_subsys_rww_init: "
+                       "unable to create entry 'cn=Read,%s'\n",
+                       monitor_subsys[SLAPD_MONITOR_RWW].mss_ndn.bv_val, 0, 0 );
+#endif
+               return( -1 );
+       }
+       
+       bv.bv_val = "0";
+       bv.bv_len = 1;
+       attr_merge_one( e, mi->ad_monitorCounter, &bv, NULL );
+       
+       mp = ( struct monitorentrypriv * )ch_calloc( sizeof( struct monitorentrypriv ), 1 );
+       e->e_private = ( void * )mp;
+       mp->mp_next = e_tmp;
+       mp->mp_children = NULL;
+       mp->mp_info = &monitor_subsys[SLAPD_MONITOR_RWW];
+       mp->mp_flags = monitor_subsys[SLAPD_MONITOR_RWW].mss_flags \
+               | MONITOR_F_SUB | MONITOR_F_PERSISTENT;
+
+       if ( monitor_cache_add( mi, e ) ) {
+#ifdef NEW_LOGGING
+               LDAP_LOG( OPERATION, CRIT,
+                       "monitor_subsys_rww_init: "
+                       "unable to add entry 'cn=Read,%s'\n",
+                       monitor_subsys[SLAPD_MONITOR_RWW].mss_ndn.bv_val, 0, 0 );
+#else
+               Debug( LDAP_DEBUG_ANY,
+                       "monitor_subsys_rww_init: "
+                       "unable to add entry 'cn=Read,%s'\n",
+                       monitor_subsys[SLAPD_MONITOR_RWW].mss_ndn.bv_val, 0, 0 );
+#endif
+               return( -1 );
+       }
+       
+       e_tmp = e;
+
+       /*
+        * Current conns
+        */
+       snprintf( buf, sizeof( buf ),
+               "dn: cn=Write,%s\n"
+               "objectClass: %s\n"
+               "structuralObjectClass: %s\n"
+               "cn: Write\n",
+               monitor_subsys[SLAPD_MONITOR_RWW].mss_dn.bv_val,
+               mi->oc_monitorCounterObject->soc_cname.bv_val,
+               mi->oc_monitorCounterObject->soc_cname.bv_val );
+       
+       e = str2entry( buf );
+       if ( e == NULL ) {
+#ifdef NEW_LOGGING
+               LDAP_LOG( OPERATION, CRIT,
+                       "monitor_subsys_rww_init: "
+                       "unable to create entry 'cn=Write,%s'\n",
+                       monitor_subsys[SLAPD_MONITOR_RWW].mss_ndn.bv_val, 0, 0 );
+#else
+               Debug( LDAP_DEBUG_ANY,
+                       "monitor_subsys_rww_init: "
+                       "unable to create entry 'cn=Write,%s'\n",
+                       monitor_subsys[SLAPD_MONITOR_RWW].mss_ndn.bv_val, 0, 0 );
+#endif
+               return( -1 );
+       }
+       
+       bv.bv_val = "0";
+       bv.bv_len = 1;
+       attr_merge_one( e, mi->ad_monitorCounter, &bv, NULL );
+       
+       mp = ( struct monitorentrypriv * )ch_calloc( sizeof( struct monitorentrypriv ), 1 );
+       e->e_private = ( void * )mp;
+       mp->mp_next = e_tmp;
+       mp->mp_children = NULL;
+       mp->mp_info = &monitor_subsys[SLAPD_MONITOR_RWW];
+       mp->mp_flags = monitor_subsys[SLAPD_MONITOR_RWW].mss_flags \
+               | MONITOR_F_SUB | MONITOR_F_PERSISTENT;
+
+       if ( monitor_cache_add( mi, e ) ) {
+#ifdef NEW_LOGGING
+               LDAP_LOG( OPERATION, CRIT,
+                       "monitor_subsys_rww_init: "
+                       "unable to add entry 'cn=Write,%s'\n",
+                       monitor_subsys[SLAPD_MONITOR_RWW].mss_ndn.bv_val, 0, 0 );
+#else
+               Debug( LDAP_DEBUG_ANY,
+                       "monitor_subsys_rww_init: "
+                       "unable to add entry 'cn=Write,%s'\n",
+                       monitor_subsys[SLAPD_MONITOR_RWW].mss_ndn.bv_val, 0, 0 );
+#endif
+               return( -1 );
+       }
+       
+       e_tmp = e;
+
+       mp = ( struct monitorentrypriv * )e_conn->e_private;
+       mp->mp_children = e_tmp;
+
+       monitor_cache_release( mi, e_conn );
+
+       return( 0 );
 }
 
-static int 
-monitor_subsys_readw_update_internal( 
-       struct monitorinfo      *mi,
-       Entry                   *e,
-       int                     rw
+int
+monitor_subsys_rww_update(
+       Operation               *op,
+       Entry                   *e
 )
 {
+       struct monitorinfo *mi = (struct monitorinfo *)op->o_bd->be_private;
        Connection              *c;
        int                     connindex;
-       int                     nconns, nwritewaiters, nreadwaiters;
+       long                    nconns, nwritewaiters, nreadwaiters;
+
+#define RWW_NONE       0
+#define RWW_READ       1
+#define RWW_WRITE      2
+       int                     type = RWW_NONE;
        
        Attribute               *a;
-       struct berval           *bv[2], val, **b = NULL;
-       char                    buf[1024];
+       struct berval           *b = NULL;
+       char                    buf[] = "+9223372036854775807L";
        
        char                    *str = NULL;
-       int                     num = 0;
-
-       bv[0] = &val;
-       bv[1] = NULL;
+       long                    num = 0;
 
        assert( mi != NULL );
        assert( e != NULL );
        
-       bv[0] = &val;
-       bv[1] = NULL;
-       
+       if ( strncasecmp( e->e_ndn, "cn=read", 
+                               sizeof("cn=read")-1 ) == 0 ) {
+               type = RWW_READ;
+
+       } else if ( strncasecmp( e->e_ndn, "cn=write", 
+                               sizeof("cn=write")-1 ) == 0 ) {
+               type = RWW_WRITE;
+
+       } else {
+               return( 0 );
+       }
+
        nconns = nwritewaiters = nreadwaiters = 0;
        for ( c = connection_first( &connindex );
                        c != NULL;
@@ -101,34 +248,26 @@ monitor_subsys_readw_update_internal(
        }
        connection_done(c);
 
-       switch ( rw ) {
-       case 0:
-               str = "read waiters";
+       switch ( type ) {
+       case RWW_READ:
                num = nreadwaiters;
                break;
-       case 1:
-               str = "write waiters";
+
+       case RWW_WRITE:
                num = nwritewaiters;
                break;
-       }
-       snprintf( buf, sizeof( buf ), "%s=%d", str, num );
-
-       if ( ( a = attr_find( e->e_attrs, monitor_ad_desc ) ) != NULL ) {
-               for ( b = a->a_vals; b[0] != NULL; b++ ) {
-                       if ( strncmp( b[0]->bv_val, str, strlen( str ) ) == 0 ) {
-                               ber_bvfree( b[0] );
-                               b[0] = ber_bvstrdup( buf );
-                               break;
-                       }
-               }
-       }
 
-       if ( b == NULL || b[0] == NULL ) {
-               val.bv_val = buf;
-               val.bv_len = strlen( buf );
-               attr_merge( e, monitor_ad_desc, bv );
+       default:
+               assert( 0 );
        }
 
+       snprintf( buf, sizeof( buf ), "%ld", num );
+
+       a = attr_find( e->e_attrs, mi->ad_monitorCounter );
+       assert( a );
+       free( a->a_vals[0].bv_val );
+       ber_str2bv( buf, 0, 1, &a->a_vals[ 0 ] );
+
        return( 0 );
 }