cb_monitor.c 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228
  1. /** BEGIN COPYRIGHT BLOCK
  2. * Copyright 2001 Sun Microsystems, Inc.
  3. * Portions copyright 1999, 2001-2003 Netscape Communications Corporation.
  4. * All rights reserved.
  5. * END COPYRIGHT BLOCK **/
  6. #include "cb.h"
  7. extern cb_instance_config_info cb_the_instance_config[];
  8. /*
  9. ** Chaining backend instance monitor function
  10. ** This function wraps up backend specific monitoring information
  11. ** and return it to the client as an LDAP entry.
  12. ** This function is usually called upon receipt of the monitor
  13. ** dn for this backend
  14. **
  15. ** Monitor information:
  16. **
  17. ** Database misc
  18. ** database
  19. **
  20. ** Number of hits for each operation
  21. ** addopcount
  22. ** modifyopcount
  23. ** deleteopcount
  24. ** modrdnopcount
  25. ** compareopcount
  26. ** searchsubtreeopcount
  27. ** searchonelevelopcount
  28. ** searchbaseopcount
  29. ** bindopcount
  30. ** unbindopcount
  31. ** abandonopcount
  32. **
  33. ** Outgoing connections
  34. ** outgoingopconnections
  35. ** outgoingbindconnections
  36. **
  37. */
  38. int
  39. cb_search_monitor_callback(Slapi_PBlock * pb, Slapi_Entry * e, Slapi_Entry * entryAfter, int * returnCode, char * returnText, void * arg)
  40. {
  41. char buf[CB_BUFSIZE];
  42. struct berval val;
  43. struct berval *vals[2];
  44. int deletecount,addcount,modifycount,modrdncount,searchbasecount,searchonelevelcount;
  45. int searchsubtreecount,abandoncount,bindcount,unbindcount,comparecount;
  46. int outgoingconn, outgoingbindconn;
  47. cb_backend_instance *inst = (cb_backend_instance *)arg;
  48. /* First make sure the backend instance is configured */
  49. /* If not, don't return anything */
  50. PR_RWLock_Rlock(inst->rwl_config_lock);
  51. if (!inst->isconfigured) {
  52. *returnCode= LDAP_NO_SUCH_OBJECT;
  53. PR_RWLock_Unlock(inst->rwl_config_lock);
  54. return SLAPI_DSE_CALLBACK_ERROR;
  55. }
  56. PR_RWLock_Unlock(inst->rwl_config_lock);
  57. vals[0] = &val;
  58. vals[1] = NULL;
  59. slapi_lock_mutex(inst->monitor.mutex);
  60. addcount =inst->monitor.addcount;
  61. deletecount =inst->monitor.deletecount;
  62. modifycount =inst->monitor.modifycount;
  63. modrdncount =inst->monitor.modrdncount;
  64. searchbasecount =inst->monitor.searchbasecount;
  65. searchonelevelcount =inst->monitor.searchonelevelcount;
  66. searchsubtreecount =inst->monitor.searchsubtreecount;
  67. abandoncount =inst->monitor.abandoncount;
  68. bindcount =inst->monitor.bindcount;
  69. unbindcount =inst->monitor.unbindcount;
  70. comparecount =inst->monitor.comparecount;
  71. slapi_unlock_mutex(inst->monitor.mutex);
  72. /*
  73. ** Get connection information
  74. */
  75. slapi_lock_mutex(inst->pool->conn.conn_list_mutex);
  76. outgoingconn= inst->pool->conn.conn_list_count;
  77. slapi_unlock_mutex(inst->pool->conn.conn_list_mutex);
  78. slapi_lock_mutex(inst->bind_pool->conn.conn_list_mutex);
  79. outgoingbindconn= inst->bind_pool->conn.conn_list_count;
  80. slapi_unlock_mutex(inst->bind_pool->conn.conn_list_mutex);
  81. sprintf( buf, "%lu", addcount );
  82. val.bv_val = buf;
  83. val.bv_len = strlen( buf );
  84. slapi_entry_attr_replace( e, CB_MONITOR_ADDCOUNT, ( struct berval **)vals );
  85. sprintf( buf, "%lu", deletecount );
  86. val.bv_val = buf;
  87. val.bv_len = strlen( buf );
  88. slapi_entry_attr_replace( e, CB_MONITOR_DELETECOUNT, ( struct berval **)vals );
  89. sprintf( buf, "%lu", modifycount );
  90. val.bv_val = buf;
  91. val.bv_len = strlen( buf );
  92. slapi_entry_attr_replace( e, CB_MONITOR_MODIFYCOUNT, ( struct berval **)vals );
  93. sprintf( buf, "%lu", modrdncount );
  94. val.bv_val = buf;
  95. val.bv_len = strlen( buf );
  96. slapi_entry_attr_replace( e, CB_MONITOR_MODRDNCOUNT, ( struct berval **)vals );
  97. sprintf( buf, "%lu", searchbasecount );
  98. val.bv_val = buf;
  99. val.bv_len = strlen( buf );
  100. slapi_entry_attr_replace( e, CB_MONITOR_SEARCHBASECOUNT, ( struct berval **)vals );
  101. sprintf( buf, "%lu", searchonelevelcount );
  102. val.bv_val = buf;
  103. val.bv_len = strlen( buf );
  104. slapi_entry_attr_replace( e, CB_MONITOR_SEARCHONELEVELCOUNT, ( struct berval **)vals );
  105. sprintf( buf, "%lu", searchsubtreecount );
  106. val.bv_val = buf;
  107. val.bv_len = strlen( buf );
  108. slapi_entry_attr_replace( e, CB_MONITOR_SEARCHSUBTREECOUNT, ( struct berval **)vals );
  109. sprintf( buf, "%lu", abandoncount );
  110. val.bv_val = buf;
  111. val.bv_len = strlen( buf );
  112. slapi_entry_attr_replace( e, CB_MONITOR_ABANDONCOUNT, ( struct berval **)vals );
  113. sprintf( buf, "%lu", bindcount );
  114. val.bv_val = buf;
  115. val.bv_len = strlen( buf );
  116. slapi_entry_attr_replace( e, CB_MONITOR_BINDCOUNT, ( struct berval **)vals );
  117. sprintf( buf, "%lu", unbindcount );
  118. val.bv_val = buf;
  119. val.bv_len = strlen( buf );
  120. slapi_entry_attr_replace( e, CB_MONITOR_UNBINDCOUNT, ( struct berval **)vals );
  121. sprintf( buf, "%lu", comparecount );
  122. val.bv_val = buf;
  123. val.bv_len = strlen( buf );
  124. slapi_entry_attr_replace( e, CB_MONITOR_COMPARECOUNT, ( struct berval **)vals );
  125. sprintf( buf, "%d", outgoingconn );
  126. val.bv_val = buf;
  127. val.bv_len = strlen( buf );
  128. slapi_entry_attr_replace( e, CB_MONITOR_OUTGOINGCONN, ( struct berval **)vals );
  129. sprintf( buf, "%d", outgoingbindconn );
  130. val.bv_val = buf;
  131. val.bv_len = strlen( buf );
  132. slapi_entry_attr_replace( e, CB_MONITOR_OUTGOINGBINDCOUNT, ( struct berval **)vals );
  133. *returnCode= LDAP_SUCCESS;
  134. return(SLAPI_DSE_CALLBACK_OK);
  135. }
  136. void
  137. cb_update_monitor_info(Slapi_PBlock * pb, cb_backend_instance * inst,int op)
  138. {
  139. int scope;
  140. slapi_lock_mutex(inst->monitor.mutex);
  141. switch (op) {
  142. case SLAPI_OPERATION_ADD:
  143. inst->monitor.addcount++;
  144. break;
  145. case SLAPI_OPERATION_MODIFY:
  146. inst->monitor.modifycount++;
  147. break;
  148. case SLAPI_OPERATION_DELETE:
  149. inst->monitor.deletecount++;
  150. break;
  151. case SLAPI_OPERATION_MODRDN:
  152. /** case SLAPI_OPERATION_MODDN: **/
  153. inst->monitor.modrdncount++;
  154. break;
  155. case SLAPI_OPERATION_COMPARE:
  156. inst->monitor.comparecount++;
  157. break;
  158. case SLAPI_OPERATION_ABANDON:
  159. inst->monitor.abandoncount++;
  160. break;
  161. case SLAPI_OPERATION_BIND:
  162. inst->monitor.bindcount++;
  163. break;
  164. case SLAPI_OPERATION_UNBIND:
  165. inst->monitor.unbindcount++;
  166. break;
  167. case SLAPI_OPERATION_SEARCH:
  168. slapi_pblock_get( pb, SLAPI_SEARCH_SCOPE, &scope );
  169. if ( LDAP_SCOPE_BASE == scope )
  170. inst->monitor.searchbasecount++;
  171. else
  172. if ( LDAP_SCOPE_ONELEVEL == scope )
  173. inst->monitor.searchonelevelcount++;
  174. else
  175. inst->monitor.searchsubtreecount++;
  176. break;
  177. default:
  178. slapi_log_error( SLAPI_LOG_PLUGIN, CB_PLUGIN_SUBSYSTEM,"cb_update_monitor_info: invalid op type <%d>\n",op);
  179. }
  180. slapi_unlock_mutex(inst->monitor.mutex);
  181. }
  182. int
  183. cb_delete_monitor_callback(Slapi_PBlock * pb, Slapi_Entry * e, Slapi_Entry * entryAfter, int * returnCode, char * returnText, void * arg)
  184. {
  185. cb_backend_instance *inst = (cb_backend_instance *)arg;
  186. slapi_config_remove_callback(SLAPI_OPERATION_SEARCH, DSE_FLAG_PREOP, inst->monitorDn, LDAP_SCOPE_BASE,
  187. "(objectclass=*)", cb_search_monitor_callback);
  188. slapi_config_remove_callback(SLAPI_OPERATION_MODIFY, DSE_FLAG_PREOP, inst->monitorDn, LDAP_SCOPE_BASE,
  189. "(objectclass=*)", cb_dont_allow_that);
  190. slapi_config_remove_callback(SLAPI_OPERATION_DELETE, DSE_FLAG_PREOP, inst->monitorDn, LDAP_SCOPE_BASE,
  191. "(objectclass=*)", cb_delete_monitor_callback);
  192. *returnCode= LDAP_SUCCESS;
  193. return(SLAPI_DSE_CALLBACK_OK);
  194. }