Commit d1d3f4d Ticket 49116 - Pblock usage analytics

8 files Authored and Committed by firstyear a month ago
Ticket 49116 - Pblock usage analytics

Bug Description:  In order to refactor and improve the pblock we need to know
what is using it.

Fix Description:  This provides basic usage tracking so that we can account for
access to get and set of the pblock. This allows us to group usage patterns
so that we can refactor.

https://fedorahosted.org/389/ticket/49116

Author: wibrown

Review by: mreynolds (Thanks!)

    
1 @@ -259,6 +259,8 @@
2           log.fatal('test_basic_import_export: Failed to run offline db2ldif')
3           assert False
4   
5 +     topology_st.standalone.start()
6 + 
7       #
8       # Cleanup - Import the Example LDIF for the other tests in this suite
9       #
  1 @@ -12,14 +12,123 @@
  2   #  include <config.h>
  3   #endif
  4   
  5 - 
  6 - 
  7   #include <stdio.h>
  8   #include <string.h>
  9   #include <sys/types.h>
 10   #include "slap.h"
 11   #include "cert.h"
 12   
 13 + #ifdef PBLOCK_ANALYTICS
 14 + 
 15 + #define NUMBER_SLAPI_ATTRS 320
 16 + #define ANALYTICS_MAGIC 0x7645
 17 + 
 18 + static PRLock *pblock_analytics_lock = NULL;
 19 + 
 20 + static PLHashNumber
 21 + hash_int_func(const void *key) {
 22 +     uint64_t ik = (uint64_t)key;
 23 +     return ik % NUMBER_SLAPI_ATTRS;
 24 + }
 25 + 
 26 + static PRIntn
 27 + hash_key_compare(const void *a, const void *b) {
 28 +     uint64_t ia = (uint64_t)a;
 29 +     uint64_t ib = (uint64_t)b;
 30 +     return ia == ib;
 31 + }
 32 + 
 33 + static PRIntn
 34 + hash_value_compare(const void *a, const void *b) {
 35 +     uint64_t ia = (uint64_t)a;
 36 +     uint64_t ib = (uint64_t)b;
 37 +     return ia == ib;
 38 + }
 39 + 
 40 + static void
 41 + pblock_analytics_init( Slapi_PBlock *pb ) {
 42 +     if (pblock_analytics_lock == NULL) {
 43 +         pblock_analytics_lock = PR_NewLock();
 44 +     }
 45 +     /* Create an array of values for us to use. */
 46 +     if (pb->analytics == NULL) {
 47 +         pb->analytics = PL_NewHashTable(NUMBER_SLAPI_ATTRS, hash_int_func, hash_key_compare, hash_value_compare, NULL, NULL);
 48 +     }
 49 +     pb->analytics_init = ANALYTICS_MAGIC;
 50 + }
 51 + 
 52 + static void
 53 + pblock_analytics_destroy( Slapi_PBlock *pb ) {
 54 +     /* Some parts of DS re-use or double free pblocks >.< */
 55 +     if (pb->analytics_init != ANALYTICS_MAGIC) {
 56 +         return;
 57 +     }
 58 +     /* Free the array of values */
 59 +     PL_HashTableDestroy(pb->analytics);
 60 +     pb->analytics_init = 0;
 61 + }
 62 + 
 63 + static void
 64 + pblock_analytics_record( Slapi_PBlock *pb, int access_type ) {
 65 +     if (pb->analytics_init != ANALYTICS_MAGIC) {
 66 +         pblock_analytics_init(pb);
 67 +     }
 68 +     /* record an access of type to the values */
 69 +     /* Is the value there? */
 70 +     uint64_t uact = (uint64_t)access_type;
 71 +     uint64_t value = (uint64_t)PL_HashTableLookup(pb->analytics, (void *)uact);
 72 +     if (value == 0) {
 73 +         PL_HashTableAdd(pb->analytics, (void *)uact, (void *)1);
 74 +     } else {
 75 +         /* If not, increment it. */
 76 +         PL_HashTableAdd(pb->analytics, (void *)uact, (void *)(value + 1));
 77 +     }
 78 + }
 79 + 
 80 + static PRIntn
 81 + pblock_analytics_report_entry(PLHashEntry *he, PRIntn index, void *arg) {
 82 +     FILE *fp = (FILE *)arg;
 83 +     /* Print a pair of values */
 84 +     fprintf(fp, "%"PRIu64":%"PRIu64",", (uint64_t)he->key, (uint64_t)he->value);
 85 + 
 86 +     return HT_ENUMERATE_NEXT;
 87 + }
 88 + 
 89 + static void
 90 + pblock_analytics_report( Slapi_PBlock *pb ) {
 91 +     /* Some parts of DS re-use or double free pblocks >.< */
 92 +     if (pb->analytics_init != ANALYTICS_MAGIC) {
 93 +         return;
 94 +     }
 95 +     /* Write the report to disk. */
 96 +     /* Take the write lock. */
 97 +     PR_Lock(pblock_analytics_lock);
 98 + 
 99 +     FILE *fp = NULL;
100 +     fp = fopen("/tmp/pblock_stats.csv", "a");
101 +     if (fp == NULL) {
102 +         int errsv = errno;
103 +         printf("%d\n", errsv);
104 +         abort();
105 +     }
106 +     /* Map over the hashmap */
107 +     PL_HashTableEnumerateEntries(pb->analytics, pblock_analytics_report_entry, fp);
108 +     /* Printf the new line */
109 +     fprintf(fp, "\n");
110 +     fclose(fp);
111 +     /* Unlock */
112 +     PR_Unlock(pblock_analytics_lock);
113 + }
114 + 
115 + uint64_t
116 + pblock_analytics_query( Slapi_PBlock *pb, int access_type) {
117 +     uint64_t uact = (uint64_t)access_type;
118 +     /* For testing, allow querying of the stats we have taken. */
119 +     return (uint64_t)PL_HashTableLookup(pb->analytics, (void *)uact);
120 + }
121 + 
122 + #endif
123 + 
124   void
125   pblock_init( Slapi_PBlock *pb )
126   {
127 @@ -35,54 +144,72 @@
128   )
129   {
130       PR_ASSERT( NULL != pb );
131 + #ifdef PBLOCK_ANALYTICS
132 +     pblock_analytics_init(pb);
133 + #endif
134       /* No need to memset, this is only called in backend_manager, and it uses {0} */
135       pb->pb_backend = be;
136       pb->pb_conn = conn;
137       pb->pb_op = op;
138   }
139   
140 - void
141 + /* NO LONGER USED!!! */
142 + static void
143   slapi_pblock_get_common(
144 -     Slapi_PBlock»       *pb,
145 -     Slapi_Backend»       **be,
146 -     Connection»       **conn,
147 -     Operation»       **op
148 +     Slapi_PBlock    *pb,
149 +     Slapi_Backend   **be,
150 +     Connection  **conn,
151 +     Operation   **op
152   )
153   {
154 - »       PR_ASSERT( NULL != pb );
155 - »       PR_ASSERT( NULL != be );
156 - »       PR_ASSERT( NULL != conn );
157 - »       PR_ASSERT( NULL != op );
158 - »       *be = pb->pb_backend;
159 - »       *conn = pb->pb_conn;
160 - »       *op = pb->pb_op;
161 +     PR_ASSERT( NULL != pb );
162 +     PR_ASSERT( NULL != be );
163 +     PR_ASSERT( NULL != conn );
164 +     PR_ASSERT( NULL != op );
165 +     *be = pb->pb_backend;
166 +     *conn = pb->pb_conn;
167 +     *op = pb->pb_op;
168   }
169   
170   Slapi_PBlock *
171   slapi_pblock_new()
172   {
173 - »       Slapi_PBlock»       *pb;
174 +     Slapi_PBlock    *pb;
175   
176 - »       pb = (Slapi_PBlock *) slapi_ch_calloc( 1, sizeof(Slapi_PBlock) );
177 - »       return pb;
178 +     pb = (Slapi_PBlock *) slapi_ch_calloc( 1, sizeof(Slapi_PBlock) );
179 + #ifdef PBLOCK_ANALYTICS
180 +     pblock_analytics_init(pb);
181 + #endif
182 +     return pb;
183   }
184   
185   void
186   slapi_pblock_init( Slapi_PBlock *pb )
187   {
188 - »       if(pb!=NULL)
189 - »       {
190 - »       »       pblock_done(pb);
191 - »       »       pblock_init(pb);
192 - »       }
193 +     if(pb!=NULL)
194 +     {
195 +         pblock_done(pb);
196 +         pblock_init(pb);
197 + #ifdef PBLOCK_ANALYTICS
198 +         pblock_analytics_init(pb);
199 + #endif
200 +     }
201   }
202   
203 + /*
204 +  * THIS FUNCTION IS AWFUL, WE SHOULD NOT REUSE PBLOCKS
205 +  */
206   void
207   pblock_done( Slapi_PBlock *pb )
208   {
209 + #ifdef PBLOCK_ANALYTICS
210 +     pblock_analytics_report(pb);
211 +     pblock_analytics_destroy(pb);
212 + #endif
213       if(pb->pb_op!=NULL)
214       {
215           operation_free(&pb->pb_op,pb->pb_conn);
216 +         pb->pb_op = NULL;
217       }
218       delete_passwdPolicy(&pb->pwdpolicy);
219       slapi_ch_free((void**)&(pb->pb_vattr_context));
220 @@ -92,11 +219,11 @@
221   void
222   slapi_pblock_destroy( Slapi_PBlock* pb )
223   {
224 - »       if(pb!=NULL)
225 - »       {
226 - »       »       pblock_done(pb);
227 - »           slapi_ch_free((void**)&pb);
228 - »       }
229 +     if(pb!=NULL)
230 +     {
231 +         pblock_done(pb);
232 +         slapi_ch_free((void**)&pb);
233 +     }
234   }
235   
236   /* JCM - when pb_o_params is used, check the operation type. */
237 @@ -129,6 +256,11 @@
238   #  endif
239   #endif
240   {
241 + 
242 + #ifdef PBLOCK_ANALYTICS
243 +     pblock_analytics_record(pblock, arg);
244 + #endif
245 + 
246   »       char *authtype;
247   »       Slapi_Backend»       »       *be;
248   
249 @@ -1162,7 +1294,7 @@
250   »       »       »       return( -1 );
251   »       »       }
252   »       »       break;
253 - »       case SLAPI_TARGET_SDN:
254 + »       case SLAPI_TARGET_SDN: /* Alias from SLAPI_ADD_TARGET_SDN */
255   »       »       if(pblock->pb_op!=NULL)
256   »       »       {
257   »       »       »       (*(Slapi_DN **)value) = pblock->pb_op->o_params.target_address.sdn;
258 @@ -2013,6 +2145,9 @@
259   #  endif
260   #endif
261   {
262 + #ifdef PBLOCK_ANALYTICS
263 +     pblock_analytics_record(pblock, arg);
264 + #endif
265   »       char *authtype;
266   
267   »       PR_ASSERT( NULL != pblock );
268 @@ -2890,20 +3025,19 @@
269   »       »        * the address using slapi_pblock_get(pb, SLAPI_TARGET_SDN, &sdn). */
270   »       »       if(pblock->pb_op!=NULL)
271   »       »       {
272 - »       »       »       Slapi_DN *sdn = pblock->pb_op->o_params.target_address.sdn;
273 - »       »       »       slapi_sdn_free(&sdn);
274 - »       »       »       pblock->pb_op->o_params.target_address.sdn =
275 - »       »       »                                     slapi_sdn_new_dn_byval((char *)value);
276 +             Slapi_DN *sdn = pblock->pb_op->o_params.target_address.sdn;
277 +             slapi_sdn_free(&sdn);
278 +             pblock->pb_op->o_params.target_address.sdn = slapi_sdn_new_dn_byval((char *)value);
279   »       »       }
280   »       »       else
281   »       »       {
282   »       »       »       return( -1 );
283   »       »       }
284   »       »       break;
285 - »       case SLAPI_TARGET_SDN:
286 + »       case SLAPI_TARGET_SDN: /* alias from SLAPI_ADD_TARGET_SDN */
287   »       »       if(pblock->pb_op!=NULL)
288   »       »       {
289 - »       »       »       pblock->pb_op->o_params.target_address.sdn = (Slapi_DN *)value;
290 +             pblock->pb_op->o_params.target_address.sdn = (Slapi_DN *)value;
291   »       »       }
292   »       »       else
293   »       »       {
294 @@ -3634,6 +3768,10 @@
295   int
296   slapi_is_ldapi_conn(Slapi_PBlock *pb)
297   {
298 + #ifdef PBLOCK_ANALYTICS
299 +     // MAKE THIS BETTER.
300 +     pblock_analytics_record(pb, SLAPI_CONNECTION);
301 + #endif
302       if(pb && pb->pb_conn){
303       »       return pb->pb_conn->c_unix_local;
304       } else {
 1 @@ -1936,6 +1936,7 @@
 2   »       »       »       »       plugin_call_one( global_plugin_shutdown_order[index].plugin, SLAPI_PLUGIN_CLOSE_FN, &pb);
 3   »       »       »       »       /* set plg_closed to 1 to prevent any further plugin pre/post op function calls */
 4   »       »       »       »       global_plugin_shutdown_order[index].plugin->plg_closed = 1;
 5 + »       »       »       »       pblock_done(&pb);
 6   »       »       »       }
 7   »       »       »       plugins_closed++;
 8   
 9 @@ -3142,6 +3143,7 @@
10   »       »       plugin_free(plugin);
11       }
12   »       slapi_ch_free((void **)&configdir);
13 + »       pblock_done(&pb);
14   
15   »       return status;
16   }
 1 @@ -134,6 +134,12 @@
 2   #include <systemd/sd-daemon.h>
 3   #endif
 4   
 5 + #ifdef DEBUG
 6 +  // #define PBLOCK_ANALYTICS 1
 7 + #else
 8 + #undef PBLOCK_ANALYTICS
 9 + #endif
10 + 
11   #if defined(OS_solaris)
12   #  include <thread.h>
13   #  define GET_THREAD_ID() thr_self()
14 @@ -1913,6 +1919,10 @@
15   »       int pb_aci_target_check; /* this flag prevents duplicate checking of ACI's target existence */
16   
17       struct slapi_entry *pb_pw_entry; /* stash dup'ed entry that shadow info is added/replaced */
18 + #ifdef PBLOCK_ANALYTICS
19 +     uint32_t analytics_init;
20 +     PLHashTable *analytics;
21 + #endif
22   } slapi_pblock;
23   
24   /* index if substrlens */
 1 @@ -9,9 +9,27 @@
 2   
 3   #include "../../test_slapd.h"
 4   
 5 + /* Define this here to access the symbol in libslapd */
 6 + uint64_t pblock_analytics_query( Slapi_PBlock *pb, int access_type);
 7 + 
 8   void
 9   test_libslapd_pblock_analytics(void **state __attribute__((unused))) {
10 + #ifdef PBLOCK_ANALYTICS
11 +     /* Create a pblock */
12 +     Slapi_PBlock *pb = slapi_pblock_new();
13 +     slapi_pblock_init(pb);
14 +     /* Check the counters are 0 */
15 +     assert_int_equal(pblock_analytics_query(pb, SLAPI_BACKEND_COUNT), 0);
16 + 
17 +     uint32_t becount = 0;
18 +     /* Test get and set */
19 +     slapi_pblock_get(pb, SLAPI_BACKEND_COUNT, &becount);
20 + 
21 +     /* Make sure the counters were changed correctly */
22 +     assert_int_equal(pblock_analytics_query(pb, SLAPI_BACKEND_COUNT), 1);
23 + 
24       /* It works! */
25 -     assert_int_equal(1, 1);
26 +     slapi_pblock_destroy(pb);
27 + #endif
28   }
29   
  1 @@ -0,0 +1,319 @@
  2 + SLAPI_ABANDON_MSGID
  3 + SLAPI_ACI_TARGET_CHECK
  4 + SLAPI_ADD_ENTRY
  5 + SLAPI_ADD_EXISTING_DN_ENTRY
  6 + SLAPI_ADD_EXISTING_UNIQUEID_ENTRY
  7 + SLAPI_ADD_PARENT_ENTRY
  8 + SLAPI_ADD_PARENT_UNIQUEID
  9 + SLAPI_ADD_RESCONTROL
 10 + SLAPI_ARGC
 11 + SLAPI_ARGV
 12 + SLAPI_BACKEND
 13 + SLAPI_BACKEND_COUNT
 14 + SLAPI_BACKEND_INSTANCE_NAME
 15 + SLAPI_BACKEND_TASK
 16 + SLAPI_BE_LASTMOD
 17 + SLAPI_BE_MAXNESTLEVEL
 18 + SLAPI_BE_READONLY
 19 + SLAPI_BE_TYPE
 20 + SLAPI_BIND_CREDENTIALS
 21 + SLAPI_BIND_METHOD
 22 + SLAPI_BIND_RET_SASLCREDS
 23 + SLAPI_BIND_SASLMECHANISM
 24 + SLAPI_BULK_IMPORT_ENTRY
 25 + SLAPI_BULK_IMPORT_STATE
 26 + SLAPI_CLIENT_DNS
 27 + SLAPI_COMPARE_TYPE
 28 + SLAPI_COMPARE_VALUE
 29 + SLAPI_CONFIG_ARGC
 30 + SLAPI_CONFIG_ARGV
 31 + SLAPI_CONFIG_DIRECTORY
 32 + SLAPI_CONFIG_FILENAME
 33 + SLAPI_CONFIG_LINENO
 34 + SLAPI_CONN_AUTHMETHOD
 35 + SLAPI_CONN_AUTHTYPE
 36 + SLAPI_CONN_CERT
 37 + SLAPI_CONN_CLIENTIP
 38 + SLAPI_CONN_CLIENTNETADDR
 39 + SLAPI_CONN_DN
 40 + SLAPI_CONNECTION
 41 + SLAPI_CONN_ID
 42 + SLAPI_CONN_IS_REPLICATION_SESSION
 43 + SLAPI_CONN_IS_SSL_SESSION
 44 + SLAPI_CONN_LOCAL_SSF
 45 + SLAPI_CONN_SASL_SSF
 46 + SLAPI_CONN_SERVERIP
 47 + SLAPI_CONN_SERVERNETADDR
 48 + SLAPI_CONN_SSL_SSF
 49 + SLAPI_CONTROLS_ARG
 50 + SLAPI_DB2INDEX_ATTRS
 51 + SLAPI_DB2LDIF_DECRYPT
 52 + SLAPI_DB2LDIF_DUMP_UNIQUEID
 53 + SLAPI_DB2LDIF_FILE
 54 + SLAPI_DB2LDIF_PRINTKEY
 55 + SLAPI_DB2LDIF_SERVER_RUNNING
 56 + SLAPI_DBSIZE
 57 + SLAPI_DBVERIFY_DBDIR
 58 + SLAPI_DESTROY_CONTENT
 59 + SLAPI_DSE_DONT_CHECK_DUPS
 60 + SLAPI_DSE_DONT_WRITE_WHEN_ADDING
 61 + SLAPI_DSE_IS_PRIMARY_FILE
 62 + SLAPI_DSE_MERGE_WHEN_ADDING
 63 + SLAPI_DSE_REAPPLY_MODS
 64 + SLAPI_ENTRY_POST_OP
 65 + SLAPI_ENTRY_PRE_OP
 66 + SLAPI_EXT_OP_REQ_OID
 67 + SLAPI_EXT_OP_REQ_VALUE
 68 + SLAPI_EXT_OP_RET_OID
 69 + SLAPI_EXT_OP_RET_VALUE
 70 + SLAPI_IS_LEGACY_REPLICATED_OPERATION
 71 + SLAPI_IS_MMR_REPLICATED_OPERATION
 72 + SLAPI_IS_REPLICATED_OPERATION
 73 + SLAPI_LDIF2DB_ENCRYPT
 74 + SLAPI_LDIF2DB_EXCLUDE
 75 + SLAPI_LDIF2DB_FILE
 76 + SLAPI_LDIF2DB_GENERATE_UNIQUEID
 77 + SLAPI_LDIF2DB_INCLUDE
 78 + SLAPI_LDIF2DB_NAMESPACEID
 79 + SLAPI_LDIF2DB_NOATTRINDEXES
 80 + SLAPI_LDIF2DB_REMOVEDUPVALS
 81 + SLAPI_MANAGEDSAIT
 82 + SLAPI_MODIFY_MODS
 83 + SLAPI_MODRDN_DELOLDRDN
 84 + SLAPI_MODRDN_NEWPARENT_ENTRY
 85 + SLAPI_MODRDN_NEWRDN
 86 + SLAPI_MODRDN_NEWSUPERIOR_ADDRESS
 87 + SLAPI_MODRDN_NEWSUPERIOR
 88 + SLAPI_MODRDN_NEWSUPERIOR_SDN
 89 + SLAPI_MODRDN_PARENT_ENTRY
 90 + SLAPI_MODRDN_TARGET_ENTRY
 91 + SLAPI_NENTRIES
 92 + SLAPI_OPERATION
 93 + SLAPI_OPERATION_AUTHTYPE
 94 + SLAPI_OPERATION_ID
 95 + SLAPI_OPERATION_NOTES
 96 + SLAPI_OPERATION_PARAMETERS
 97 + SLAPI_OPERATION_SSF
 98 + SLAPI_OPERATION_TYPE
 99 + SLAPI_OPINITIATED_TIME
100 + SLAPI_ORIGINAL_TARGET_DN
101 + SLAPI_PAGED_RESULTS_COOKIE
102 + SLAPI_PAGED_RESULTS_INDEX
103 + SLAPI_PARENT_TXN
104 + SLAPI_PB_RESULT_TEXT
105 + SLAPI_PLUGIN
106 + SLAPI_PLUGIN_ACL_ALLOW_ACCESS
107 + SLAPI_PLUGIN_ACL_INIT
108 + SLAPI_PLUGIN_ACL_MODS_ALLOWED
109 + SLAPI_PLUGIN_ACL_MODS_UPDATE
110 + SLAPI_PLUGIN_ACL_SYNTAX_CHECK
111 + SLAPI_PLUGIN_ARGC
112 + SLAPI_PLUGIN_ARGV
113 + SLAPI_PLUGIN_BE_POST_ADD_FN
114 + SLAPI_PLUGIN_BE_POST_BACKUP_FN
115 + SLAPI_PLUGIN_BE_POST_DELETE_FN
116 + SLAPI_PLUGIN_BE_POST_MODIFY_FN
117 + SLAPI_PLUGIN_BE_POST_MODRDN_FN
118 + SLAPI_PLUGIN_BE_POST_OPEN_FN
119 + SLAPI_PLUGIN_BE_PRE_ADD_FN
120 + SLAPI_PLUGIN_BE_PRE_BACKUP_FN
121 + SLAPI_PLUGIN_BE_PRE_CLOSE_FN
122 + SLAPI_PLUGIN_BE_PRE_DELETE_FN
123 + SLAPI_PLUGIN_BE_PRE_MODIFY_FN
124 + SLAPI_PLUGIN_BE_PRE_MODRDN_FN
125 + SLAPI_PLUGIN_BE_TXN_POST_ADD_FN
126 + SLAPI_PLUGIN_BE_TXN_POST_DELETE_FN
127 + SLAPI_PLUGIN_BE_TXN_POST_MODIFY_FN
128 + SLAPI_PLUGIN_BE_TXN_POST_MODRDN_FN
129 + SLAPI_PLUGIN_BE_TXN_PRE_ADD_FN
130 + SLAPI_PLUGIN_BE_TXN_PRE_DELETE_FN
131 + SLAPI_PLUGIN_BE_TXN_PRE_DELETE_TOMBSTONE_FN
132 + SLAPI_PLUGIN_BE_TXN_PRE_MODIFY_FN
133 + SLAPI_PLUGIN_BE_TXN_PRE_MODRDN_FN
134 + SLAPI_PLUGIN_CLEANUP_FN
135 + SLAPI_PLUGIN_CLOSE_FN
136 + SLAPI_PLUGIN_CONFIG_AREA
137 + SLAPI_PLUGIN_CONFIG_DN
138 + SLAPI_PLUGIN_DB_ABANDON_FN
139 + SLAPI_PLUGIN_DB_ABORT_FN
140 + SLAPI_PLUGIN_DB_ADD_FN
141 + SLAPI_PLUGIN_DB_ADD_SCHEMA_FN
142 + SLAPI_PLUGIN_DB_ARCHIVE2DB_FN
143 + SLAPI_PLUGIN_DB_BEGIN_FN
144 + SLAPI_PLUGIN_DB_BIND_FN
145 + SLAPI_PLUGIN_DB_COMMIT_FN
146 + SLAPI_PLUGIN_DB_COMPARE_FN
147 + SLAPI_PLUGIN_DB_CONFIG_FN
148 + SLAPI_PLUGIN_DB_CTRL_INFO_FN
149 + SLAPI_PLUGIN_DB_DB2ARCHIVE_FN
150 + SLAPI_PLUGIN_DB_DB2INDEX_FN
151 + SLAPI_PLUGIN_DB_DB2LDIF_FN
152 + SLAPI_PLUGIN_DB_DBVERIFY_FN
153 + SLAPI_PLUGIN_DB_DELETE_FN
154 + SLAPI_PLUGIN_DB_ENTRY_FN
155 + SLAPI_PLUGIN_DB_ENTRY_RELEASE_FN
156 + SLAPI_PLUGIN_DB_FLUSH_FN
157 + SLAPI_PLUGIN_DB_GET_INFO_FN
158 + SLAPI_PLUGIN_DB_INIT_INSTANCE_FN
159 + SLAPI_PLUGIN_DB_LDIF2DB_FN
160 + SLAPI_PLUGIN_DB_MODIFY_FN
161 + SLAPI_PLUGIN_DB_MODRDN_FN
162 + SLAPI_PLUGIN_DB_NEXT_SEARCH_ENTRY_EXT_FN
163 + SLAPI_PLUGIN_DB_NEXT_SEARCH_ENTRY_FN
164 + SLAPI_PLUGIN_DB_NO_ACL
165 + SLAPI_PLUGIN_DB_PREV_SEARCH_RESULTS_FN
166 + SLAPI_PLUGIN_DB_REFERRAL_FN
167 + SLAPI_PLUGIN_DB_RESULT_FN
168 + SLAPI_PLUGIN_DB_RMDB_FN
169 + SLAPI_PLUGIN_DB_SEARCH_FN
170 + SLAPI_PLUGIN_DB_SEARCH_RESULTS_RELEASE_FN
171 + SLAPI_PLUGIN_DB_SEQ_FN
172 + SLAPI_PLUGIN_DB_SET_INFO_FN
173 + SLAPI_PLUGIN_DB_SIZE_FN
174 + SLAPI_PLUGIN_DB_TEST_FN
175 + SLAPI_PLUGIN_DB_UNBIND_FN
176 + SLAPI_PLUGIN_DB_UPGRADEDB_FN
177 + SLAPI_PLUGIN_DB_UPGRADEDNFORMAT_FN
178 + SLAPI_PLUGIN_DB_WIRE_IMPORT_FN
179 + SLAPI_PLUGIN_DESCRIPTION
180 + SLAPI_PLUGIN_DESTROY_FN
181 + SLAPI_PLUGIN_ENABLED
182 + SLAPI_PLUGIN_ENTRY_FETCH_FUNC
183 + SLAPI_PLUGIN_ENTRY_STORE_FUNC
184 + SLAPI_PLUGIN_EXT_OP_BACKEND_FN
185 + SLAPI_PLUGIN_EXT_OP_FN
186 + SLAPI_PLUGIN_EXT_OP_NAMELIST
187 + SLAPI_PLUGIN_EXT_OP_OIDLIST
188 + SLAPI_PLUGIN_IDENTITY
189 + SLAPI_PLUGIN_INTERNAL_POST_ADD_FN
190 + SLAPI_PLUGIN_INTERNAL_POST_DELETE_FN
191 + SLAPI_PLUGIN_INTERNAL_POST_MODIFY_FN
192 + SLAPI_PLUGIN_INTERNAL_POST_MODRDN_FN
193 + SLAPI_PLUGIN_INTERNAL_PRE_ADD_FN
194 + SLAPI_PLUGIN_INTERNAL_PRE_BIND_FN
195 + SLAPI_PLUGIN_INTERNAL_PRE_DELETE_FN
196 + SLAPI_PLUGIN_INTERNAL_PRE_MODIFY_FN
197 + SLAPI_PLUGIN_INTERNAL_PRE_MODRDN_FN
198 + SLAPI_PLUGIN_INTOP_RESULT
199 + SLAPI_PLUGIN_INTOP_SEARCH_ENTRIES
200 + SLAPI_PLUGIN_INTOP_SEARCH_REFERRALS
201 + SLAPI_PLUGIN_MR_ASSERTION2KEYS_AVA
202 + SLAPI_PLUGIN_MR_ASSERTION2KEYS_SUB
203 + SLAPI_PLUGIN_MR_COMPARE
204 + SLAPI_PLUGIN_MR_FILTER_AVA
205 + SLAPI_PLUGIN_MR_FILTER_CREATE_FN
206 + SLAPI_PLUGIN_MR_FILTER_INDEX_FN
207 + SLAPI_PLUGIN_MR_FILTER_MATCH_FN
208 + SLAPI_PLUGIN_MR_FILTER_RESET_FN
209 + SLAPI_PLUGIN_MR_FILTER_REUSABLE
210 + SLAPI_PLUGIN_MR_FILTER_SUB
211 + SLAPI_PLUGIN_MR_FLAGS
212 + SLAPI_PLUGIN_MR_INDEXER_CREATE_FN
213 + SLAPI_PLUGIN_MR_INDEX_FN
214 + SLAPI_PLUGIN_MR_INDEX_SV_FN
215 + SLAPI_PLUGIN_MR_KEYS
216 + SLAPI_PLUGIN_MR_NAMES
217 + SLAPI_PLUGIN_MR_NORMALIZE
218 + SLAPI_PLUGIN_MR_OID
219 + SLAPI_PLUGIN_MR_QUERY_OPERATOR
220 + SLAPI_PLUGIN_MR_TYPE
221 + SLAPI_PLUGIN_MR_USAGE
222 + SLAPI_PLUGIN_MR_VALUE
223 + SLAPI_PLUGIN_MR_VALUES
224 + SLAPI_PLUGIN_MR_VALUES2KEYS
225 + SLAPI_PLUGIN_OBJECT
226 + SLAPI_PLUGIN_OPRETURN
227 + SLAPI_PLUGIN_POST_ABANDON_FN
228 + SLAPI_PLUGIN_POST_ADD_FN
229 + SLAPI_PLUGIN_POST_BIND_FN
230 + SLAPI_PLUGIN_POST_COMPARE_FN
231 + SLAPI_PLUGIN_POST_DELETE_FN
232 + SLAPI_PLUGIN_POST_ENTRY_FN
233 + SLAPI_PLUGIN_POST_EXTOP_FN
234 + SLAPI_PLUGIN_POST_MODIFY_FN
235 + SLAPI_PLUGIN_POST_MODRDN_FN
236 + SLAPI_PLUGIN_POST_REFERRAL_FN
237 + SLAPI_PLUGIN_POST_RESULT_FN
238 + SLAPI_PLUGIN_POST_SEARCH_FAIL_FN
239 + SLAPI_PLUGIN_POST_SEARCH_FN
240 + SLAPI_PLUGIN_POSTSTART_FN
241 + SLAPI_PLUGIN_POST_UNBIND_FN
242 + SLAPI_PLUGIN_PRE_ABANDON_FN
243 + SLAPI_PLUGIN_PRE_ADD_FN
244 + SLAPI_PLUGIN_PRE_BIND_FN
245 + SLAPI_PLUGIN_PRECEDENCE
246 + SLAPI_PLUGIN_PRE_COMPARE_FN
247 + SLAPI_PLUGIN_PRE_DELETE_FN
248 + SLAPI_PLUGIN_PRE_ENTRY_FN
249 + SLAPI_PLUGIN_PRE_EXTOP_FN
250 + SLAPI_PLUGIN_PRE_MODIFY_FN
251 + SLAPI_PLUGIN_PRE_MODRDN_FN
252 + SLAPI_PLUGIN_PRE_REFERRAL_FN
253 + SLAPI_PLUGIN_PRE_RESULT_FN
254 + SLAPI_PLUGIN_PRE_SEARCH_FN
255 + SLAPI_PLUGIN_PRE_UNBIND_FN
256 + SLAPI_PLUGIN_PRIVATE
257 + SLAPI_PLUGIN_PWD_STORAGE_SCHEME_CMP_FN
258 + SLAPI_PLUGIN_PWD_STORAGE_SCHEME_DB_PWD
259 + SLAPI_PLUGIN_PWD_STORAGE_SCHEME_DEC_FN
260 + SLAPI_PLUGIN_PWD_STORAGE_SCHEME_ENC_FN
261 + SLAPI_PLUGIN_PWD_STORAGE_SCHEME_NAME
262 + SLAPI_PLUGIN_PWD_STORAGE_SCHEME_USER_PWD
263 + SLAPI_PLUGIN_START_FN
264 + SLAPI_PLUGIN_SYNTAX_ASSERTION2KEYS_AVA
265 + SLAPI_PLUGIN_SYNTAX_ASSERTION2KEYS_SUB
266 + SLAPI_PLUGIN_SYNTAX_COMPARE
267 + SLAPI_PLUGIN_SYNTAX_FILTER_AVA
268 + SLAPI_PLUGIN_SYNTAX_FILTER_DATA
269 + SLAPI_PLUGIN_SYNTAX_FILTER_NORMALIZED
270 + SLAPI_PLUGIN_SYNTAX_FILTER_SUB
271 + SLAPI_PLUGIN_SYNTAX_FLAGS
272 + SLAPI_PLUGIN_SYNTAX_NAMES
273 + SLAPI_PLUGIN_SYNTAX_NORMALIZE
274 + SLAPI_PLUGIN_SYNTAX_OID
275 + SLAPI_PLUGIN_SYNTAX_VALIDATE
276 + SLAPI_PLUGIN_SYNTAX_VALUES2KEYS
277 + SLAPI_PLUGIN_TYPE
278 + SLAPI_PLUGIN_VERSION
279 + SLAPI_PWPOLICY
280 + SLAPI_REQCONTROLS
281 + SLAPI_REQUESTOR_DN
282 + SLAPI_REQUESTOR_ISROOT
283 + SLAPI_REQUESTOR_NDN
284 + SLAPI_REQUESTOR_SDN
285 + SLAPI_RESCONTROLS
286 + SLAPI_RESULT_CODE
287 + SLAPI_RESULT_MATCHED
288 + SLAPI_RESULT_TEXT
289 + SLAPI_SCHEMA_FLAGS
290 + SLAPI_SEARCH_ATTRS
291 + SLAPI_SEARCH_ATTRSONLY
292 + SLAPI_SEARCH_CTRLS
293 + SLAPI_SEARCH_DEREF
294 + SLAPI_SEARCH_FILTER
295 + SLAPI_SEARCH_GERATTRS
296 + SLAPI_SEARCH_IS_AND
297 + SLAPI_SEARCH_REFERRALS
298 + SLAPI_SEARCH_REQATTRS
299 + SLAPI_SEARCH_RESULT_ENTRY
300 + SLAPI_SEARCH_RESULT_ENTRY_EXT
301 + SLAPI_SEARCH_RESULT_SET
302 + SLAPI_SEARCH_RESULT_SET_SIZE_ESTIMATE
303 + SLAPI_SEARCH_SCOPE
304 + SLAPI_SEARCH_SIZELIMIT
305 + SLAPI_SEARCH_STRFILTER
306 + SLAPI_SEARCH_TIMELIMIT
307 + SLAPI_SEQ_ATTRNAME
308 + SLAPI_SEQ_TYPE
309 + SLAPI_SEQ_VAL
310 + SLAPI_SKIP_MODIFIED_ATTRS
311 + SLAPI_SYNTAX_SUBSTRLENS
312 + SLAPI_TARGET_ADDRESS
313 + SLAPI_TARGET_DN
314 + SLAPI_TARGET_SDN
315 + SLAPI_TARGET_UNIQUEID
316 + SLAPI_TASK_FLAGS
317 + SLAPI_TXN
318 + SLAPI_TXN_RUV_MODS_FN
319 + SLAPI_URP_NAMING_COLLISION_DN
320 + SLAPI_URP_TOMBSTONE_UNIQUEID
  1 @@ -0,0 +1,638 @@
  2 + SLAPI_ABANDON_MSGID
  3 + 10
  4 + SLAPI_ACI_TARGET_CHECK
  5 + 9
  6 + SLAPI_ADD_ENTRY
  7 + 60
  8 + SLAPI_ADD_EXISTING_DN_ENTRY
  9 + 21
 10 + SLAPI_ADD_EXISTING_UNIQUEID_ENTRY
 11 + 12
 12 + SLAPI_ADD_PARENT_ENTRY
 13 + 14
 14 + SLAPI_ADD_PARENT_UNIQUEID
 15 + 7
 16 + SLAPI_ADD_RESCONTROL
 17 + 23
 18 + SLAPI_ARGC
 19 + 12
 20 + SLAPI_ARGV
 21 + 11
 22 + SLAPI_BACKEND
 23 + 163
 24 + SLAPI_BACKEND_COUNT
 25 + 13
 26 + SLAPI_BACKEND_INSTANCE_NAME
 27 + 14
 28 + SLAPI_BACKEND_TASK
 29 + 14
 30 + SLAPI_BE_LASTMOD
 31 + 10
 32 + SLAPI_BE_MAXNESTLEVEL
 33 + 7
 34 + SLAPI_BE_READONLY
 35 + 7
 36 + SLAPI_BE_TYPE
 37 + 7
 38 + SLAPI_BIND_CREDENTIALS
 39 + 24
 40 + SLAPI_BIND_METHOD
 41 + 22
 42 + SLAPI_BIND_RET_SASLCREDS
 43 + 13
 44 + SLAPI_BIND_SASLMECHANISM
 45 + 11
 46 + SLAPI_BULK_IMPORT_ENTRY
 47 + 10
 48 + SLAPI_BULK_IMPORT_STATE
 49 + 12
 50 + SLAPI_CLIENT_DNS
 51 + 12
 52 + SLAPI_COMPARE_TYPE
 53 + 11
 54 + SLAPI_COMPARE_VALUE
 55 + 11
 56 + SLAPI_CONFIG_ARGC
 57 + 6
 58 + SLAPI_CONFIG_ARGV
 59 + 6
 60 + SLAPI_CONFIG_DIRECTORY
 61 + 10
 62 + SLAPI_CONFIG_FILENAME
 63 + 6
 64 + SLAPI_CONFIG_LINENO
 65 + 6
 66 + SLAPI_CONN_AUTHMETHOD
 67 + 18
 68 + SLAPI_CONN_AUTHTYPE
 69 + 8
 70 + SLAPI_CONN_CERT
 71 + 8
 72 + SLAPI_CONN_CLIENTIP
 73 + 4
 74 + SLAPI_CONN_CLIENTNETADDR
 75 + 12
 76 + SLAPI_CONN_DN
 77 + 28
 78 + SLAPI_CONNECTION
 79 + 36
 80 + SLAPI_CONN_ID
 81 + 31
 82 + SLAPI_CONN_IS_REPLICATION_SESSION
 83 + 13
 84 + SLAPI_CONN_IS_SSL_SESSION
 85 + 8
 86 + SLAPI_CONN_LOCAL_SSF
 87 + 9
 88 + SLAPI_CONN_SASL_SSF
 89 + 9
 90 + SLAPI_CONN_SERVERIP
 91 + 4
 92 + SLAPI_CONN_SERVERNETADDR
 93 + 8
 94 + SLAPI_CONN_SSL_SSF
 95 + 7
 96 + SLAPI_CONTROLS_ARG
 97 + 30
 98 + SLAPI_DB2INDEX_ATTRS
 99 + 8
100 + SLAPI_DB2LDIF_DECRYPT
101 + 8
102 + SLAPI_DB2LDIF_DUMP_UNIQUEID
103 + 8
104 + SLAPI_DB2LDIF_FILE
105 + 7
106 + SLAPI_DB2LDIF_PRINTKEY
107 + 8
108 + SLAPI_DB2LDIF_SERVER_RUNNING
109 + 10
110 + SLAPI_DBSIZE
111 + 9
112 + SLAPI_DBVERIFY_DBDIR
113 + 8
114 + SLAPI_DESTROY_CONTENT
115 + 7
116 + SLAPI_DSE_DONT_CHECK_DUPS
117 + 9
118 + SLAPI_DSE_DONT_WRITE_WHEN_ADDING
119 + 19
120 + SLAPI_DSE_IS_PRIMARY_FILE
121 + 9
122 + SLAPI_DSE_MERGE_WHEN_ADDING
123 + 9
124 + SLAPI_DSE_REAPPLY_MODS
125 + 10
126 + SLAPI_ENTRY_POST_OP
127 + 61
128 + SLAPI_ENTRY_PRE_OP
129 + 60
130 + SLAPI_EXT_OP_REQ_OID
131 + 20
132 + SLAPI_EXT_OP_REQ_VALUE
133 + 19
134 + SLAPI_EXT_OP_RET_OID
135 + 18
136 + SLAPI_EXT_OP_RET_VALUE
137 + 19
138 + SLAPI_IS_LEGACY_REPLICATED_OPERATION
139 + 7
140 + SLAPI_IS_MMR_REPLICATED_OPERATION
141 + 7
142 + SLAPI_IS_REPLICATED_OPERATION
143 + 48
144 + SLAPI_LDIF2DB_ENCRYPT
145 + 10
146 + SLAPI_LDIF2DB_EXCLUDE
147 + 7
148 + SLAPI_LDIF2DB_FILE
149 + 8
150 + SLAPI_LDIF2DB_GENERATE_UNIQUEID
151 + 12
152 + SLAPI_LDIF2DB_INCLUDE
153 + 7
154 + SLAPI_LDIF2DB_NAMESPACEID
155 + 9
156 + SLAPI_LDIF2DB_NOATTRINDEXES
157 + 8
158 + SLAPI_LDIF2DB_REMOVEDUPVALS
159 + 8
160 + SLAPI_MANAGEDSAIT
161 + 24
162 + SLAPI_MODIFY_MODS
163 + 88
164 + SLAPI_MODRDN_DELOLDRDN
165 + 21
166 + SLAPI_MODRDN_NEWPARENT_ENTRY
167 + 12
168 + SLAPI_MODRDN_NEWRDN
169 + 34
170 + SLAPI_MODRDN_NEWSUPERIOR_ADDRESS
171 + 9
172 + SLAPI_MODRDN_NEWSUPERIOR
173 + 46
174 + SLAPI_MODRDN_NEWSUPERIOR_SDN
175 + 30
176 + SLAPI_MODRDN_PARENT_ENTRY
177 + 11
178 + SLAPI_MODRDN_TARGET_ENTRY
179 + 14
180 + SLAPI_NENTRIES
181 + 18
182 + SLAPI_OPERATION
183 + 790
184 + SLAPI_OPERATION_AUTHTYPE
185 + 7
186 + SLAPI_OPERATION_ID
187 + 20
188 + SLAPI_OPERATION_NOTES
189 + 19
190 + SLAPI_OPERATION_PARAMETERS
191 + 18
192 + SLAPI_OPERATION_SSF
193 + 7
194 + SLAPI_OPERATION_TYPE
195 + 22
196 + SLAPI_OPINITIATED_TIME
197 + 16
198 + SLAPI_ORIGINAL_TARGET_DN
199 + 27
200 + SLAPI_PAGED_RESULTS_COOKIE
201 + 9
202 + SLAPI_PAGED_RESULTS_INDEX
203 + 20
204 + SLAPI_PARENT_TXN
205 + 8
206 + SLAPI_PB_RESULT_TEXT
207 + 88
208 + SLAPI_PLUGIN
209 + 3961
210 + SLAPI_PLUGIN_ACL_ALLOW_ACCESS
211 + 9
212 + SLAPI_PLUGIN_ACL_INIT
213 + 7
214 + SLAPI_PLUGIN_ACL_MODS_ALLOWED
215 + 9
216 + SLAPI_PLUGIN_ACL_MODS_UPDATE
217 + 9
218 + SLAPI_PLUGIN_ACL_SYNTAX_CHECK
219 + 9
220 + SLAPI_PLUGIN_ARGC
221 + 18
222 + SLAPI_PLUGIN_ARGV
223 + 21
224 + SLAPI_PLUGIN_BE_POST_ADD_FN
225 + 12
226 + SLAPI_PLUGIN_BE_POST_BACKUP_FN
227 + 12
228 + SLAPI_PLUGIN_BE_POST_DELETE_FN
229 + 13
230 + SLAPI_PLUGIN_BE_POST_MODIFY_FN
231 + 12
232 + SLAPI_PLUGIN_BE_POST_MODRDN_FN
233 + 12
234 + SLAPI_PLUGIN_BE_POST_OPEN_FN
235 + 12
236 + SLAPI_PLUGIN_BE_PRE_ADD_FN
237 + 14
238 + SLAPI_PLUGIN_BE_PRE_BACKUP_FN
239 + 11
240 + SLAPI_PLUGIN_BE_PRE_CLOSE_FN
241 + 11
242 + SLAPI_PLUGIN_BE_PRE_DELETE_FN
243 + 12
244 + SLAPI_PLUGIN_BE_PRE_MODIFY_FN
245 + 16
246 + SLAPI_PLUGIN_BE_PRE_MODRDN_FN
247 + 12
248 + SLAPI_PLUGIN_BE_TXN_POST_ADD_FN
249 + 25
250 + SLAPI_PLUGIN_BE_TXN_POST_DELETE_FN
251 + 27
252 + SLAPI_PLUGIN_BE_TXN_POST_MODIFY_FN
253 + 26
254 + SLAPI_PLUGIN_BE_TXN_POST_MODRDN_FN
255 + 26
256 + SLAPI_PLUGIN_BE_TXN_PRE_ADD_FN
257 + 21
258 + SLAPI_PLUGIN_BE_TXN_PRE_DELETE_FN
259 + 16
260 + SLAPI_PLUGIN_BE_TXN_PRE_DELETE_TOMBSTONE_FN
261 + 10
262 + SLAPI_PLUGIN_BE_TXN_PRE_MODIFY_FN
263 + 22
264 + SLAPI_PLUGIN_BE_TXN_PRE_MODRDN_FN
265 + 15
266 + SLAPI_PLUGIN_CLEANUP_FN
267 + 12
268 + SLAPI_PLUGIN_CLOSE_FN
269 + 55
270 + SLAPI_PLUGIN_CONFIG_AREA
271 + 17
272 + SLAPI_PLUGIN_CONFIG_DN
273 + 5
274 + SLAPI_PLUGIN_DB_ABANDON_FN
275 + 10
276 + SLAPI_PLUGIN_DB_ABORT_FN
277 + 8
278 + SLAPI_PLUGIN_DB_ADD_FN
279 + 11
280 + SLAPI_PLUGIN_DB_ADD_SCHEMA_FN
281 + 6
282 + SLAPI_PLUGIN_DB_ARCHIVE2DB_FN
283 + 9
284 + SLAPI_PLUGIN_DB_BEGIN_FN
285 + 8
286 + SLAPI_PLUGIN_DB_BIND_FN
287 + 11
288 + SLAPI_PLUGIN_DB_COMMIT_FN
289 + 8
290 + SLAPI_PLUGIN_DB_COMPARE_FN
291 + 11
292 + SLAPI_PLUGIN_DB_CONFIG_FN
293 + 8
294 + SLAPI_PLUGIN_DB_CTRL_INFO_FN
295 + 6
296 + SLAPI_PLUGIN_DB_DB2ARCHIVE_FN
297 + 9
298 + SLAPI_PLUGIN_DB_DB2INDEX_FN
299 + 9
300 + SLAPI_PLUGIN_DB_DB2LDIF_FN
301 + 9
302 + SLAPI_PLUGIN_DB_DBVERIFY_FN
303 + 6
304 + SLAPI_PLUGIN_DB_DELETE_FN
305 + 11
306 + SLAPI_PLUGIN_DB_ENTRY_FN
307 + 7
308 + SLAPI_PLUGIN_DB_ENTRY_RELEASE_FN
309 + 9
310 + SLAPI_PLUGIN_DB_FLUSH_FN
311 + 10
312 + SLAPI_PLUGIN_DB_GET_INFO_FN
313 + 6
314 + SLAPI_PLUGIN_DB_INIT_INSTANCE_FN
315 + 9
316 + SLAPI_PLUGIN_DB_LDIF2DB_FN
317 + 9
318 + SLAPI_PLUGIN_DB_MODIFY_FN
319 + 11
320 + SLAPI_PLUGIN_DB_MODRDN_FN
321 + 11
322 + SLAPI_PLUGIN_DB_NEXT_SEARCH_ENTRY_EXT_FN
323 + 9
324 + SLAPI_PLUGIN_DB_NEXT_SEARCH_ENTRY_FN
325 + 10
326 + SLAPI_PLUGIN_DB_NO_ACL
327 + 10
328 + SLAPI_PLUGIN_DB_PREV_SEARCH_RESULTS_FN
329 + 9
330 + SLAPI_PLUGIN_DB_REFERRAL_FN
331 + 7
332 + SLAPI_PLUGIN_DB_RESULT_FN
333 + 10
334 + SLAPI_PLUGIN_DB_RMDB_FN
335 + 10
336 + SLAPI_PLUGIN_DB_SEARCH_FN
337 + 11
338 + SLAPI_PLUGIN_DB_SEARCH_RESULTS_RELEASE_FN
339 + 9
340 + SLAPI_PLUGIN_DB_SEQ_FN
341 + 9
342 + SLAPI_PLUGIN_DB_SET_INFO_FN
343 + 6
344 + SLAPI_PLUGIN_DB_SIZE_FN
345 + 9
346 + SLAPI_PLUGIN_DB_TEST_FN
347 + 8
348 + SLAPI_PLUGIN_DB_UNBIND_FN
349 + 10
350 + SLAPI_PLUGIN_DB_UPGRADEDB_FN
351 + 6
352 + SLAPI_PLUGIN_DB_UPGRADEDNFORMAT_FN
353 + 6
354 + SLAPI_PLUGIN_DB_WIRE_IMPORT_FN
355 + 6
356 + SLAPI_PLUGIN_DESCRIPTION
357 + 132
358 + SLAPI_PLUGIN_DESTROY_FN
359 + 17
360 + SLAPI_PLUGIN_ENABLED
361 + 9
362 + SLAPI_PLUGIN_ENTRY_FETCH_FUNC
363 + 8
364 + SLAPI_PLUGIN_ENTRY_STORE_FUNC
365 + 8
366 + SLAPI_PLUGIN_EXT_OP_BACKEND_FN
367 + 8
368 + SLAPI_PLUGIN_EXT_OP_FN
369 + 20
370 + SLAPI_PLUGIN_EXT_OP_NAMELIST
371 + 19
372 + SLAPI_PLUGIN_EXT_OP_OIDLIST
373 + 20
374 + SLAPI_PLUGIN_IDENTITY
375 + 79
376 + SLAPI_PLUGIN_INTERNAL_POST_ADD_FN
377 + 19
378 + SLAPI_PLUGIN_INTERNAL_POST_DELETE_FN
379 + 19
380 + SLAPI_PLUGIN_INTERNAL_POST_MODIFY_FN
381 + 19
382 + SLAPI_PLUGIN_INTERNAL_POST_MODRDN_FN
383 + 19
384 + SLAPI_PLUGIN_INTERNAL_PRE_ADD_FN
385 + 11
386 + SLAPI_PLUGIN_INTERNAL_PRE_BIND_FN
387 + 10
388 + SLAPI_PLUGIN_INTERNAL_PRE_DELETE_FN
389 + 11
390 + SLAPI_PLUGIN_INTERNAL_PRE_MODIFY_FN
391 + 11
392 + SLAPI_PLUGIN_INTERNAL_PRE_MODRDN_FN
393 + 11
394 + SLAPI_PLUGIN_INTOP_RESULT
395 + 231
396 + SLAPI_PLUGIN_INTOP_SEARCH_ENTRIES
397 + 105
398 + SLAPI_PLUGIN_INTOP_SEARCH_REFERRALS
399 + 9
400 + SLAPI_PLUGIN_MR_ASSERTION2KEYS_AVA
401 + 9
402 + SLAPI_PLUGIN_MR_ASSERTION2KEYS_SUB
403 + 9
404 + SLAPI_PLUGIN_MR_COMPARE
405 + 9
406 + SLAPI_PLUGIN_MR_FILTER_AVA
407 + 9
408 + SLAPI_PLUGIN_MR_FILTER_CREATE_FN
409 + 14
410 + SLAPI_PLUGIN_MR_FILTER_INDEX_FN
411 + 10
412 + SLAPI_PLUGIN_MR_FILTER_MATCH_FN
413 + 12
414 + SLAPI_PLUGIN_MR_FILTER_RESET_FN
415 + 9
416 + SLAPI_PLUGIN_MR_FILTER_REUSABLE
417 + 9
418 + SLAPI_PLUGIN_MR_FILTER_SUB
419 + 9
420 + SLAPI_PLUGIN_MR_FLAGS
421 + 7
422 + SLAPI_PLUGIN_MR_INDEXER_CREATE_FN
423 + 14
424 + SLAPI_PLUGIN_MR_INDEX_FN
425 + 18
426 + SLAPI_PLUGIN_MR_INDEX_SV_FN
427 + 12
428 + SLAPI_PLUGIN_MR_KEYS
429 + 29
430 + SLAPI_PLUGIN_MR_NAMES
431 + 9
432 + SLAPI_PLUGIN_MR_NORMALIZE
433 + 8
434 + SLAPI_PLUGIN_MR_OID
435 + 25
436 + SLAPI_PLUGIN_MR_QUERY_OPERATOR
437 + 13
438 + SLAPI_PLUGIN_MR_TYPE
439 + 20
440 + SLAPI_PLUGIN_MR_USAGE
441 + 19
442 + SLAPI_PLUGIN_MR_VALUE
443 + 42
444 + SLAPI_PLUGIN_MR_VALUES
445 + 31
446 + SLAPI_PLUGIN_MR_VALUES2KEYS
447 + 9
448 + SLAPI_PLUGIN_OBJECT
449 + 36
450 + SLAPI_PLUGIN_OPRETURN
451 + 85
452 + SLAPI_PLUGIN_POST_ABANDON_FN
453 + 10
454 + SLAPI_PLUGIN_POST_ADD_FN
455 + 23
456 + SLAPI_PLUGIN_POST_BIND_FN
457 + 20
458 + SLAPI_PLUGIN_POST_COMPARE_FN
459 + 9
460 + SLAPI_PLUGIN_POST_DELETE_FN
461 + 23
462 + SLAPI_PLUGIN_POST_ENTRY_FN
463 + 9
464 + SLAPI_PLUGIN_POST_EXTOP_FN
465 + 7
466 + SLAPI_PLUGIN_POST_MODIFY_FN
467 + 24
468 + SLAPI_PLUGIN_POST_MODRDN_FN
469 + 23
470 + SLAPI_PLUGIN_POST_REFERRAL_FN
471 + 9
472 + SLAPI_PLUGIN_POST_RESULT_FN
473 + 9
474 + SLAPI_PLUGIN_POST_SEARCH_FAIL_FN
475 + 9
476 + SLAPI_PLUGIN_POST_SEARCH_FN
477 + 11
478 + SLAPI_PLUGIN_POSTSTART_FN
479 + 9
480 + SLAPI_PLUGIN_POST_UNBIND_FN
481 + 9
482 + SLAPI_PLUGIN_PRE_ABANDON_FN
483 + 10
484 + SLAPI_PLUGIN_PRE_ADD_FN
485 + 21
486 + SLAPI_PLUGIN_PRE_BIND_FN
487 + 27
488 + SLAPI_PLUGIN_PRECEDENCE
489 + 8
490 + SLAPI_PLUGIN_PRE_COMPARE_FN
491 + 12
492 + SLAPI_PLUGIN_PRE_DELETE_FN
493 + 17
494 + SLAPI_PLUGIN_PRE_ENTRY_FN
495 + 14
496 + SLAPI_PLUGIN_PRE_EXTOP_FN
497 + 7
498 + SLAPI_PLUGIN_PRE_MODIFY_FN
499 + 22
500 + SLAPI_PLUGIN_PRE_MODRDN_FN
501 + 17
502 + SLAPI_PLUGIN_PRE_REFERRAL_FN
503 + 9
504 + SLAPI_PLUGIN_PRE_RESULT_FN
505 + 10
506 + SLAPI_PLUGIN_PRE_SEARCH_FN
507 + 19
508 + SLAPI_PLUGIN_PRE_UNBIND_FN
509 + 9
510 + SLAPI_PLUGIN_PRIVATE
511 + 67
512 + SLAPI_PLUGIN_PWD_STORAGE_SCHEME_CMP_FN
513 + 23
514 + SLAPI_PLUGIN_PWD_STORAGE_SCHEME_DB_PWD
515 + 7
516 + SLAPI_PLUGIN_PWD_STORAGE_SCHEME_DEC_FN
517 + 9
518 + SLAPI_PLUGIN_PWD_STORAGE_SCHEME_ENC_FN
519 + 23
520 + SLAPI_PLUGIN_PWD_STORAGE_SCHEME_NAME
521 + 23
522 + SLAPI_PLUGIN_PWD_STORAGE_SCHEME_USER_PWD
523 + 7
524 + SLAPI_PLUGIN_START_FN
525 + 55
526 + SLAPI_PLUGIN_SYNTAX_ASSERTION2KEYS_AVA
527 + 23
528 + SLAPI_PLUGIN_SYNTAX_ASSERTION2KEYS_SUB
529 + 20
530 + SLAPI_PLUGIN_SYNTAX_COMPARE
531 + 21
532 + SLAPI_PLUGIN_SYNTAX_FILTER_AVA
533 + 23
534 + SLAPI_PLUGIN_SYNTAX_FILTER_DATA
535 + 9
536 + SLAPI_PLUGIN_SYNTAX_FILTER_NORMALIZED
537 + 29
538 + SLAPI_PLUGIN_SYNTAX_FILTER_SUB
539 + 20
540 + SLAPI_PLUGIN_SYNTAX_FLAGS
541 + 23
542 + SLAPI_PLUGIN_SYNTAX_NAMES
543 + 23
544 + SLAPI_PLUGIN_SYNTAX_NORMALIZE
545 + 21
546 + SLAPI_PLUGIN_SYNTAX_OID
547 + 23
548 + SLAPI_PLUGIN_SYNTAX_VALIDATE
549 + 21
550 + SLAPI_PLUGIN_SYNTAX_VALUES2KEYS
551 + 23
552 + SLAPI_PLUGIN_TYPE
553 + 19
554 + SLAPI_PLUGIN_VERSION
555 + 246
556 + SLAPI_PWPOLICY
557 + 20
558 + SLAPI_REQCONTROLS
559 + 43
560 + SLAPI_REQUESTOR_DN
561 + 29
562 + SLAPI_REQUESTOR_ISROOT
563 + 42
564 + SLAPI_REQUESTOR_NDN
565 + 8
566 + SLAPI_REQUESTOR_SDN
567 + 8
568 + SLAPI_RESCONTROLS
569 + 15
570 + SLAPI_RESULT_CODE
571 + 141
572 + SLAPI_RESULT_MATCHED
573 + 11
574 + SLAPI_RESULT_TEXT
575 + 12
576 + SLAPI_SCHEMA_FLAGS
577 + 13
578 + SLAPI_SEARCH_ATTRS
579 + 57
580 + SLAPI_SEARCH_ATTRSONLY
581 + 25
582 + SLAPI_SEARCH_CTRLS
583 + 16
584 + SLAPI_SEARCH_DEREF
585 + 13
586 + SLAPI_SEARCH_FILTER
587 + 30
588 + SLAPI_SEARCH_GERATTRS
589 + 13
590 + SLAPI_SEARCH_IS_AND
591 + 12
592 + SLAPI_SEARCH_REFERRALS
593 + 12
594 + SLAPI_SEARCH_REQATTRS
595 + 9
596 + SLAPI_SEARCH_RESULT_ENTRY
597 + 63
598 + SLAPI_SEARCH_RESULT_ENTRY_EXT
599 + 17
600 + SLAPI_SEARCH_RESULT_SET
601 + 61
602 + SLAPI_SEARCH_RESULT_SET_SIZE_ESTIMATE
603 + 18
604 + SLAPI_SEARCH_SCOPE
605 + 37
606 + SLAPI_SEARCH_SIZELIMIT
607 + 20
608 + SLAPI_SEARCH_STRFILTER
609 + 24
610 + SLAPI_SEARCH_TIMELIMIT
611 + 23
612 + SLAPI_SEQ_ATTRNAME
613 + 12
614 + SLAPI_SEQ_TYPE
615 + 20
616 + SLAPI_SEQ_VAL
617 + 23
618 + SLAPI_SKIP_MODIFIED_ATTRS
619 + 9
620 + SLAPI_SYNTAX_SUBSTRLENS
621 + 14
622 + SLAPI_TARGET_ADDRESS
623 + 15
624 + SLAPI_TARGET_DN
625 + 47
626 + SLAPI_TARGET_SDN
627 + 104
628 + SLAPI_TARGET_UNIQUEID
629 + 27
630 + SLAPI_TASK_FLAGS
631 + 15
632 + SLAPI_TXN
633 + 78
634 + SLAPI_TXN_RUV_MODS_FN
635 + 14
636 + SLAPI_URP_NAMING_COLLISION_DN
637 + 13
638 + SLAPI_URP_TOMBSTONE_UNIQUEID
639 + 10
  1 @@ -0,0 +1,108 @@
  2 + #!/usr/bin/python
  3 + 
  4 + # Display stats about pblock usage.
  5 + 
  6 + def parse(filepath):
  7 +     results = []
  8 +     flat_results = []
  9 +     # Read the file
 10 +     with open(filepath, 'r') as f:
 11 +         # For each line
 12 +         for l in f.readlines():
 13 +             pbc = {}
 14 +             pbs = set()
 15 +             # Trim the line.
 16 +             ls = l.strip()
 17 +             for access in ls.split(','):
 18 +                 if len(access.strip()) == 0:
 19 +                     continue
 20 +                 k, count = access.split(':')
 21 +                 pbc[k] = int(count)
 22 +                 pbs.add(k)
 23 +             if (pbc not in results):
 24 +                 results.append(pbc)
 25 +             if (pbs not in flat_results):
 26 +                 flat_results.append(pbs)
 27 +             #print(pbc)
 28 +     return results, flat_results
 29 + 
 30 + def determine_pblock_groups(flat_results):
 31 +     # This function will take the flattened results, and calculate a unique
 32 +     # set of pblock parameter combinations that may exist.
 33 +     # Make a set of all possible access values.
 34 +     results = {}
 35 +     access_values = set()
 36 +     for pbs in flat_results:
 37 +         access_values.update(pbs)
 38 + 
 39 +     print('all possible values %s' % access_values)
 40 +     # For each access value
 41 +     for av in access_values:
 42 +         results[av] = 0
 43 +         for s in flat_results:
 44 +             if av in s:
 45 +                 results[av] += 1
 46 +     # Count the number of sets that contain it.
 47 +     # Sort by most popular access values.
 48 +     # Take the first pblock.
 49 +     #     take it's first value.
 50 +     #     make a new set
 51 +     for r in sorted(results, key=results.get, reverse=True):
 52 +         print('pop: av %s count %s' % (r, results[r]))
 53 + 
 54 +     # Find things that are subsets, and eliminate them.
 55 +     ss_flat_results = []
 56 +     for pbs_a in flat_results:
 57 +         subset = False
 58 +         for pbs_b in flat_results:
 59 +             if pbs_a.issubset(pbs_b) and pbs_a != pbs_b:
 60 +                 subset = True
 61 +         if subset is False:
 62 +             ss_flat_results.append(pbs_a)
 63 + 
 64 +     #for pbs in sorted(ss_flat_results, key=len):
 65 +     #    print(pbs)
 66 + 
 67 +     # Now, we can group these by plugin callback, and searches.
 68 +     # Check for plugin_enabled
 69 +     plugin_set = set()
 70 +     search_set = set()
 71 +     other_set = set()
 72 +     for pbs in ss_flat_results:
 73 +         # 815 is plugin_enabled
 74 +         if '815' in pbs:
 75 +             plugin_set.update(pbs)
 76 +         elif '216' in pbs: # This is db_result_fn
 77 +             search_set.update(pbs)
 78 +         else:
 79 +             other_set.update(pbs)
 80 + 
 81 +     overlap_set = plugin_set & search_set
 82 + 
 83 +     print('plugin_set: %s' % plugin_set)
 84 +     print('search_set: %s' % search_set)
 85 +     print('other_set: %s' % other_set)
 86 +     print('overlap : %s' % (plugin_set & search_set))
 87 + 
 88 +     print ('== frequency of overlap from %s unique pblocks ==' % (len(flat_results)))
 89 +     for r in sorted(results, key=results.get, reverse=True):
 90 +         if r in overlap_set:
 91 +             print('pop: av %s count %s' % (r, results[r]))
 92 +     print ('== frequency of other from %s unique pblocks ==' % (len(flat_results)))
 93 +     for r in sorted(results, key=results.get, reverse=True):
 94 +         if r in other_set:
 95 +             print('pop: av %s count %s' % (r, results[r]))
 96 + 
 97 + 
 98 + def analyse():
 99 +     # Read the file
100 +     results, flat_results = parse('/tmp/pblock_stats.csv')
101 +     # Results is now a flat set of pblocks.
102 +     for pbs in flat_results:
103 +         print(pbs)
104 +     determine_pblock_groups(flat_results)
105 + 
106 + 
107 + 
108 + if __name__ == '__main__':
109 +     analyse()