]> git.sur5r.net Git - openldap/commitdiff
more cache monitoring (ITS#5178)
authorPierangelo Masarati <ando@openldap.org>
Wed, 19 Aug 2009 23:09:52 +0000 (23:09 +0000)
committerPierangelo Masarati <ando@openldap.org>
Wed, 19 Aug 2009 23:09:52 +0000 (23:09 +0000)
servers/slapd/overlays/pcache.c

index 8c3209abb1718200ebe698074baf9d3a786e5618..2e7a427127b07fd7adf1f9b34d365bb8e57df2ba 100644 (file)
@@ -251,6 +251,7 @@ static int privDB_cid;
 static AttributeDescription    *ad_queryId, *ad_cachedQueryURL;
 
 #ifdef PCACHE_MONITOR
+static AttributeDescription    *ad_numQueries, *ad_numEntries;
 static ObjectClass             *oc_olmPCache;
 #endif /* PCACHE_MONITOR */
 
@@ -285,6 +286,24 @@ static struct {
                "NO-USER-MODIFICATION "
                "USAGE directoryOperation )",
                &ad_cachedQueryURL },
+#ifdef PCACHE_MONITOR
+       { "( PCacheAttributes:3 "
+               "NAME 'pcacheNumQueries' "
+               "DESC 'Number of cached queries' "
+               "EQUALITY integerMatch "
+               "SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 "
+               "NO-USER-MODIFICATION "
+               "USAGE directoryOperation )",
+               &ad_numQueries },
+       { "( PCacheAttributes:4 "
+               "NAME 'pcacheNumEntries' "
+               "DESC 'Number of cached entries' "
+               "EQUALITY integerMatch "
+               "SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 "
+               "NO-USER-MODIFICATION "
+               "USAGE directoryOperation )",
+               &ad_numEntries },
+#endif /* PCACHE_MONITOR */
 
        { NULL }
 };
@@ -299,8 +318,10 @@ static struct {
                "NAME ( 'olmPCache' ) "
                "SUP top AUXILIARY "
                "MAY ( "
-                       "pcacheQueryURL"
-                       ") )",
+                       "pcacheQueryURL "
+                       "$ pcacheNumQueries "
+                       "$ pcacheNumEntries "
+                       " ) )",
                &oc_olmPCache },
 #endif /* PCACHE_MONITOR */
 
@@ -5176,8 +5197,6 @@ pcache_monitor_update(
        CachedQuery     *qc;
        BerVarray       vals = NULL;
 
-       assert( ad_cachedQueryURL != NULL );
-
        attr_delete( &e->e_attrs, ad_cachedQueryURL );
        if ( ( SLAP_OPATTRS( rs->sr_attr_flags ) || ad_inlist( ad_cachedQueryURL, rs->sr_attrs ) )
                && qm->templates != NULL )
@@ -5201,6 +5220,36 @@ pcache_monitor_update(
                }
        }
 
+       {
+               Attribute       *a;
+               char            *buf[ SLAP_TEXT_BUFLEN ];
+               struct berval   bv;
+
+               /* number of cached queries */
+               a = attr_find( e->e_attrs, ad_numQueries );
+               assert( a != NULL );
+
+               bv.bv_val = buf;
+               bv.bv_len = snprintf( buf, sizeof( buf ), "%lu", cm->num_cached_queries );
+
+               if ( a->a_nvals != a->a_vals ) {
+                       ber_bvreplace( &a->a_nvals[ 0 ], &bv );
+               }
+               ber_bvreplace( &a->a_vals[ 0 ], &bv );
+
+               /* number of cached entries */
+               a = attr_find( e->e_attrs, ad_numEntries );
+               assert( a != NULL );
+
+               bv.bv_val = buf;
+               bv.bv_len = snprintf( buf, sizeof( buf ), "%d", cm->cur_entries );
+
+               if ( a->a_nvals != a->a_vals ) {
+                       ber_bvreplace( &a->a_nvals[ 0 ], &bv );
+               }
+               ber_bvreplace( &a->a_vals[ 0 ], &bv );
+       }
+
        return SLAP_CB_CONTINUE;
 }
 
@@ -5240,6 +5289,22 @@ pcache_monitor_free(
                textbuf, sizeof( textbuf ) );
        /* don't care too much about return code... */
 
+       /* remove attrs */
+       mod.sm_values = NULL;
+       mod.sm_desc = ad_numQueries;
+       mod.sm_numvals = 0;
+       rc = modify_delete_values( e, &mod, 1, &text,
+               textbuf, sizeof( textbuf ) );
+       /* don't care too much about return code... */
+
+       /* remove attrs */
+       mod.sm_values = NULL;
+       mod.sm_desc = ad_numEntries;
+       mod.sm_numvals = 0;
+       rc = modify_delete_values( e, &mod, 1, &text,
+               textbuf, sizeof( textbuf ) );
+       /* don't care too much about return code... */
+
        return SLAP_CB_CONTINUE;
 }
 
@@ -5310,7 +5375,7 @@ pcache_monitor_db_open( BackendDB *be )
        }
 
        /* alloc as many as required (plus 1 for objectClass) */
-       a = attrs_alloc( 1 + 0 );
+       a = attrs_alloc( 1 + 2 );
        if ( a == NULL ) {
                rc = 1;
                goto cleanup;
@@ -5320,6 +5385,18 @@ pcache_monitor_db_open( BackendDB *be )
        attr_valadd( a, &oc_olmPCache->soc_cname, NULL, 1 );
        next = a->a_next;
 
+       {
+               struct berval   bv = BER_BVC( "0" );
+
+               next->a_desc = ad_numQueries;
+               attr_valadd( next, &bv, NULL, 1 );
+               next = next->a_next;
+
+               next->a_desc = ad_numEntries;
+               attr_valadd( next, &bv, NULL, 1 );
+               next = next->a_next;
+       }
+
        cb = ch_calloc( sizeof( monitor_callback_t ), 1 );
        cb->mc_update = pcache_monitor_update;
        cb->mc_free = pcache_monitor_free;