cb_monitor.c 7.2 KB

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