couchbase-memcached 1.2.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (539) hide show
  1. data.tar.gz.sig +2 -0
  2. data/BENCHMARKS +134 -0
  3. data/CHANGELOG +127 -0
  4. data/LICENSE +184 -0
  5. data/Manifest +535 -0
  6. data/README +118 -0
  7. data/Rakefile +83 -0
  8. data/TODO +4 -0
  9. data/couchbase-memcached.gemspec +33 -0
  10. data/ext/extconf-make.rb +25 -0
  11. data/ext/extconf.rb +91 -0
  12. data/ext/libmemcached-0.50/AUTHORS +11 -0
  13. data/ext/libmemcached-0.50/COPYING +33 -0
  14. data/ext/libmemcached-0.50/ChangeLog +392 -0
  15. data/ext/libmemcached-0.50/Makefile.am +114 -0
  16. data/ext/libmemcached-0.50/Makefile.in +4232 -0
  17. data/ext/libmemcached-0.50/NEWS +1 -0
  18. data/ext/libmemcached-0.50/README +43 -0
  19. data/ext/libmemcached-0.50/README.FIRST +31 -0
  20. data/ext/libmemcached-0.50/README.win32 +25 -0
  21. data/ext/libmemcached-0.50/THANKS +14 -0
  22. data/ext/libmemcached-0.50/TODO +11 -0
  23. data/ext/libmemcached-0.50/aclocal.m4 +1077 -0
  24. data/ext/libmemcached-0.50/clients/client_options.h +45 -0
  25. data/ext/libmemcached-0.50/clients/execute.cc +131 -0
  26. data/ext/libmemcached-0.50/clients/execute.h +30 -0
  27. data/ext/libmemcached-0.50/clients/generator.cc +96 -0
  28. data/ext/libmemcached-0.50/clients/generator.h +36 -0
  29. data/ext/libmemcached-0.50/clients/include.am +116 -0
  30. data/ext/libmemcached-0.50/clients/memaslap.c +908 -0
  31. data/ext/libmemcached-0.50/clients/memcapable.cc +2094 -0
  32. data/ext/libmemcached-0.50/clients/memcat.cc +242 -0
  33. data/ext/libmemcached-0.50/clients/memcp.cc +317 -0
  34. data/ext/libmemcached-0.50/clients/memdump.cc +183 -0
  35. data/ext/libmemcached-0.50/clients/memerror.cc +102 -0
  36. data/ext/libmemcached-0.50/clients/memflush.cc +154 -0
  37. data/ext/libmemcached-0.50/clients/memparse.cc +68 -0
  38. data/ext/libmemcached-0.50/clients/memrm.cc +177 -0
  39. data/ext/libmemcached-0.50/clients/memslap.cc +495 -0
  40. data/ext/libmemcached-0.50/clients/memstat.cc +349 -0
  41. data/ext/libmemcached-0.50/clients/ms_atomic.h +69 -0
  42. data/ext/libmemcached-0.50/clients/ms_conn.c +3413 -0
  43. data/ext/libmemcached-0.50/clients/ms_conn.h +241 -0
  44. data/ext/libmemcached-0.50/clients/ms_memslap.h +132 -0
  45. data/ext/libmemcached-0.50/clients/ms_setting.c +1068 -0
  46. data/ext/libmemcached-0.50/clients/ms_setting.h +181 -0
  47. data/ext/libmemcached-0.50/clients/ms_sigsegv.c +126 -0
  48. data/ext/libmemcached-0.50/clients/ms_sigsegv.h +34 -0
  49. data/ext/libmemcached-0.50/clients/ms_stats.c +307 -0
  50. data/ext/libmemcached-0.50/clients/ms_stats.h +69 -0
  51. data/ext/libmemcached-0.50/clients/ms_task.c +1114 -0
  52. data/ext/libmemcached-0.50/clients/ms_task.h +94 -0
  53. data/ext/libmemcached-0.50/clients/ms_thread.c +351 -0
  54. data/ext/libmemcached-0.50/clients/ms_thread.h +78 -0
  55. data/ext/libmemcached-0.50/clients/utilities.cc +231 -0
  56. data/ext/libmemcached-0.50/clients/utilities.h +64 -0
  57. data/ext/libmemcached-0.50/config.h.in +647 -0
  58. data/ext/libmemcached-0.50/config/autorun.sh +126 -0
  59. data/ext/libmemcached-0.50/config/compile +143 -0
  60. data/ext/libmemcached-0.50/config/config.guess +1517 -0
  61. data/ext/libmemcached-0.50/config/config.rpath +666 -0
  62. data/ext/libmemcached-0.50/config/config.sub +1760 -0
  63. data/ext/libmemcached-0.50/config/depcomp +630 -0
  64. data/ext/libmemcached-0.50/config/install-sh +520 -0
  65. data/ext/libmemcached-0.50/config/ltmain.sh +9642 -0
  66. data/ext/libmemcached-0.50/config/missing +376 -0
  67. data/ext/libmemcached-0.50/config/pandora-plugin +752 -0
  68. data/ext/libmemcached-0.50/config/uncrustify.cfg +1112 -0
  69. data/ext/libmemcached-0.50/configure +27103 -0
  70. data/ext/libmemcached-0.50/configure.ac +186 -0
  71. data/ext/libmemcached-0.50/docs/conf.py.in +354 -0
  72. data/ext/libmemcached-0.50/docs/include.am +240 -0
  73. data/ext/libmemcached-0.50/docs/man/hashkit_clone.3 +88 -0
  74. data/ext/libmemcached-0.50/docs/man/hashkit_crc32.3 +105 -0
  75. data/ext/libmemcached-0.50/docs/man/hashkit_create.3 +88 -0
  76. data/ext/libmemcached-0.50/docs/man/hashkit_fnv1_32.3 +105 -0
  77. data/ext/libmemcached-0.50/docs/man/hashkit_fnv1_64.3 +105 -0
  78. data/ext/libmemcached-0.50/docs/man/hashkit_fnv1a_32.3 +105 -0
  79. data/ext/libmemcached-0.50/docs/man/hashkit_fnv1a_64.3 +105 -0
  80. data/ext/libmemcached-0.50/docs/man/hashkit_free.3 +88 -0
  81. data/ext/libmemcached-0.50/docs/man/hashkit_functions.3 +105 -0
  82. data/ext/libmemcached-0.50/docs/man/hashkit_hsieh.3 +105 -0
  83. data/ext/libmemcached-0.50/docs/man/hashkit_is_allocated.3 +88 -0
  84. data/ext/libmemcached-0.50/docs/man/hashkit_jenkins.3 +105 -0
  85. data/ext/libmemcached-0.50/docs/man/hashkit_md5.3 +105 -0
  86. data/ext/libmemcached-0.50/docs/man/hashkit_murmur.3 +105 -0
  87. data/ext/libmemcached-0.50/docs/man/hashkit_value.3 +66 -0
  88. data/ext/libmemcached-0.50/docs/man/libhashkit.3 +57 -0
  89. data/ext/libmemcached-0.50/docs/man/libmemcached.3 +208 -0
  90. data/ext/libmemcached-0.50/docs/man/libmemcached_check_configuration.3 +293 -0
  91. data/ext/libmemcached-0.50/docs/man/libmemcached_configuration.3 +293 -0
  92. data/ext/libmemcached-0.50/docs/man/libmemcached_examples.3 +144 -0
  93. data/ext/libmemcached-0.50/docs/man/libmemcachedutil.3 +68 -0
  94. data/ext/libmemcached-0.50/docs/man/memaslap.1 +1222 -0
  95. data/ext/libmemcached-0.50/docs/man/memcached.3 +293 -0
  96. data/ext/libmemcached-0.50/docs/man/memcached_add.3 +132 -0
  97. data/ext/libmemcached-0.50/docs/man/memcached_add_by_key.3 +132 -0
  98. data/ext/libmemcached-0.50/docs/man/memcached_analyze.3 +77 -0
  99. data/ext/libmemcached-0.50/docs/man/memcached_append.3 +111 -0
  100. data/ext/libmemcached-0.50/docs/man/memcached_append_by_key.3 +111 -0
  101. data/ext/libmemcached-0.50/docs/man/memcached_behavior_get.3 +333 -0
  102. data/ext/libmemcached-0.50/docs/man/memcached_behavior_set.3 +333 -0
  103. data/ext/libmemcached-0.50/docs/man/memcached_callback_get.3 +159 -0
  104. data/ext/libmemcached-0.50/docs/man/memcached_callback_set.3 +159 -0
  105. data/ext/libmemcached-0.50/docs/man/memcached_cas.3 +91 -0
  106. data/ext/libmemcached-0.50/docs/man/memcached_cas_by_key.3 +91 -0
  107. data/ext/libmemcached-0.50/docs/man/memcached_clone.3 +99 -0
  108. data/ext/libmemcached-0.50/docs/man/memcached_create.3 +99 -0
  109. data/ext/libmemcached-0.50/docs/man/memcached_decrement.3 +124 -0
  110. data/ext/libmemcached-0.50/docs/man/memcached_decrement_with_initial.3 +124 -0
  111. data/ext/libmemcached-0.50/docs/man/memcached_delete.3 +83 -0
  112. data/ext/libmemcached-0.50/docs/man/memcached_delete_by_key.3 +83 -0
  113. data/ext/libmemcached-0.50/docs/man/memcached_destroy_sasl_auth_data.3 +95 -0
  114. data/ext/libmemcached-0.50/docs/man/memcached_dump.3 +77 -0
  115. data/ext/libmemcached-0.50/docs/man/memcached_fetch.3 +174 -0
  116. data/ext/libmemcached-0.50/docs/man/memcached_fetch_execute.3 +174 -0
  117. data/ext/libmemcached-0.50/docs/man/memcached_fetch_result.3 +174 -0
  118. data/ext/libmemcached-0.50/docs/man/memcached_flush_buffers.3 +72 -0
  119. data/ext/libmemcached-0.50/docs/man/memcached_free.3 +99 -0
  120. data/ext/libmemcached-0.50/docs/man/memcached_generate_hash.3 +85 -0
  121. data/ext/libmemcached-0.50/docs/man/memcached_generate_hash_value.3 +85 -0
  122. data/ext/libmemcached-0.50/docs/man/memcached_get.3 +174 -0
  123. data/ext/libmemcached-0.50/docs/man/memcached_get_by_key.3 +174 -0
  124. data/ext/libmemcached-0.50/docs/man/memcached_get_memory_allocators.3 +111 -0
  125. data/ext/libmemcached-0.50/docs/man/memcached_get_sasl_callbacks.3 +95 -0
  126. data/ext/libmemcached-0.50/docs/man/memcached_get_user_data.3 +79 -0
  127. data/ext/libmemcached-0.50/docs/man/memcached_increment.3 +124 -0
  128. data/ext/libmemcached-0.50/docs/man/memcached_increment_with_initial.3 +124 -0
  129. data/ext/libmemcached-0.50/docs/man/memcached_lib_version.3 +76 -0
  130. data/ext/libmemcached-0.50/docs/man/memcached_mget.3 +174 -0
  131. data/ext/libmemcached-0.50/docs/man/memcached_mget_by_key.3 +174 -0
  132. data/ext/libmemcached-0.50/docs/man/memcached_mget_execute.3 +174 -0
  133. data/ext/libmemcached-0.50/docs/man/memcached_mget_execute_by_key.3 +174 -0
  134. data/ext/libmemcached-0.50/docs/man/memcached_pool_behavior_get.3 +139 -0
  135. data/ext/libmemcached-0.50/docs/man/memcached_pool_behavior_set.3 +139 -0
  136. data/ext/libmemcached-0.50/docs/man/memcached_pool_create.3 +139 -0
  137. data/ext/libmemcached-0.50/docs/man/memcached_pool_destroy.3 +139 -0
  138. data/ext/libmemcached-0.50/docs/man/memcached_pool_pop.3 +139 -0
  139. data/ext/libmemcached-0.50/docs/man/memcached_pool_push.3 +139 -0
  140. data/ext/libmemcached-0.50/docs/man/memcached_pool_st.3 +139 -0
  141. data/ext/libmemcached-0.50/docs/man/memcached_prepend.3 +111 -0
  142. data/ext/libmemcached-0.50/docs/man/memcached_prepend_by_key.3 +111 -0
  143. data/ext/libmemcached-0.50/docs/man/memcached_quit.3 +74 -0
  144. data/ext/libmemcached-0.50/docs/man/memcached_replace.3 +132 -0
  145. data/ext/libmemcached-0.50/docs/man/memcached_replace_by_key.3 +132 -0
  146. data/ext/libmemcached-0.50/docs/man/memcached_sasl_set_auth_data.3 +95 -0
  147. data/ext/libmemcached-0.50/docs/man/memcached_server_add.3 +141 -0
  148. data/ext/libmemcached-0.50/docs/man/memcached_server_count.3 +141 -0
  149. data/ext/libmemcached-0.50/docs/man/memcached_server_cursor.3 +141 -0
  150. data/ext/libmemcached-0.50/docs/man/memcached_server_list.3 +141 -0
  151. data/ext/libmemcached-0.50/docs/man/memcached_server_list_append.3 +111 -0
  152. data/ext/libmemcached-0.50/docs/man/memcached_server_list_count.3 +111 -0
  153. data/ext/libmemcached-0.50/docs/man/memcached_server_list_free.3 +111 -0
  154. data/ext/libmemcached-0.50/docs/man/memcached_server_push.3 +141 -0
  155. data/ext/libmemcached-0.50/docs/man/memcached_servers_parse.3 +111 -0
  156. data/ext/libmemcached-0.50/docs/man/memcached_set.3 +132 -0
  157. data/ext/libmemcached-0.50/docs/man/memcached_set_by_key.3 +132 -0
  158. data/ext/libmemcached-0.50/docs/man/memcached_set_memory_allocators.3 +111 -0
  159. data/ext/libmemcached-0.50/docs/man/memcached_set_sasl_callbacks.3 +95 -0
  160. data/ext/libmemcached-0.50/docs/man/memcached_set_user_data.3 +79 -0
  161. data/ext/libmemcached-0.50/docs/man/memcached_stat.3 +116 -0
  162. data/ext/libmemcached-0.50/docs/man/memcached_stat_execute.3 +116 -0
  163. data/ext/libmemcached-0.50/docs/man/memcached_stat_get_keys.3 +116 -0
  164. data/ext/libmemcached-0.50/docs/man/memcached_stat_get_value.3 +116 -0
  165. data/ext/libmemcached-0.50/docs/man/memcached_stat_servername.3 +116 -0
  166. data/ext/libmemcached-0.50/docs/man/memcached_strerror.3 +69 -0
  167. data/ext/libmemcached-0.50/docs/man/memcached_verbosity.3 +66 -0
  168. data/ext/libmemcached-0.50/docs/man/memcached_version.3 +76 -0
  169. data/ext/libmemcached-0.50/docs/man/memcapable.1 +92 -0
  170. data/ext/libmemcached-0.50/docs/man/memcat.1 +71 -0
  171. data/ext/libmemcached-0.50/docs/man/memcp.1 +77 -0
  172. data/ext/libmemcached-0.50/docs/man/memdump.1 +66 -0
  173. data/ext/libmemcached-0.50/docs/man/memerror.1 +65 -0
  174. data/ext/libmemcached-0.50/docs/man/memflush.1 +73 -0
  175. data/ext/libmemcached-0.50/docs/man/memrm.1 +72 -0
  176. data/ext/libmemcached-0.50/docs/man/memslap.1 +59 -0
  177. data/ext/libmemcached-0.50/docs/man/memstat.1 +70 -0
  178. data/ext/libmemcached-0.50/example/include.am +24 -0
  179. data/ext/libmemcached-0.50/example/interface_v0.c +594 -0
  180. data/ext/libmemcached-0.50/example/interface_v1.c +411 -0
  181. data/ext/libmemcached-0.50/example/memcached_light.c +474 -0
  182. data/ext/libmemcached-0.50/example/memcached_light.h +7 -0
  183. data/ext/libmemcached-0.50/example/storage.c +172 -0
  184. data/ext/libmemcached-0.50/example/storage.h +27 -0
  185. data/ext/libmemcached-0.50/example/storage_innodb.c +535 -0
  186. data/ext/libmemcached-0.50/libhashkit/algorithm.cc +69 -0
  187. data/ext/libmemcached-0.50/libhashkit/algorithm.h +96 -0
  188. data/ext/libmemcached-0.50/libhashkit/behavior.cc +9 -0
  189. data/ext/libmemcached-0.50/libhashkit/behavior.h +26 -0
  190. data/ext/libmemcached-0.50/libhashkit/common.h +33 -0
  191. data/ext/libmemcached-0.50/libhashkit/configure.h.in +19 -0
  192. data/ext/libmemcached-0.50/libhashkit/crc32.cc +86 -0
  193. data/ext/libmemcached-0.50/libhashkit/digest.cc +62 -0
  194. data/ext/libmemcached-0.50/libhashkit/digest.h +30 -0
  195. data/ext/libmemcached-0.50/libhashkit/fnv.cc +75 -0
  196. data/ext/libmemcached-0.50/libhashkit/function.cc +156 -0
  197. data/ext/libmemcached-0.50/libhashkit/function.h +44 -0
  198. data/ext/libmemcached-0.50/libhashkit/hashkit.cc +100 -0
  199. data/ext/libmemcached-0.50/libhashkit/hashkit.h +95 -0
  200. data/ext/libmemcached-0.50/libhashkit/hashkit.hpp +97 -0
  201. data/ext/libmemcached-0.50/libhashkit/hsieh.cc +70 -0
  202. data/ext/libmemcached-0.50/libhashkit/include.am +69 -0
  203. data/ext/libmemcached-0.50/libhashkit/jenkins.cc +214 -0
  204. data/ext/libmemcached-0.50/libhashkit/ketama.cc +164 -0
  205. data/ext/libmemcached-0.50/libhashkit/md5.cc +367 -0
  206. data/ext/libmemcached-0.50/libhashkit/murmur.cc +77 -0
  207. data/ext/libmemcached-0.50/libhashkit/one_at_a_time.cc +34 -0
  208. data/ext/libmemcached-0.50/libhashkit/str_algorithm.cc +58 -0
  209. data/ext/libmemcached-0.50/libhashkit/str_algorithm.h +48 -0
  210. data/ext/libmemcached-0.50/libhashkit/strerror.cc +25 -0
  211. data/ext/libmemcached-0.50/libhashkit/strerror.h +23 -0
  212. data/ext/libmemcached-0.50/libhashkit/types.h +90 -0
  213. data/ext/libmemcached-0.50/libhashkit/visibility.h +48 -0
  214. data/ext/libmemcached-0.50/libmemcached/allocators.cc +119 -0
  215. data/ext/libmemcached-0.50/libmemcached/allocators.h +87 -0
  216. data/ext/libmemcached-0.50/libmemcached/analyze.cc +110 -0
  217. data/ext/libmemcached-0.50/libmemcached/analyze.h +66 -0
  218. data/ext/libmemcached-0.50/libmemcached/array.c +128 -0
  219. data/ext/libmemcached-0.50/libmemcached/array.h +75 -0
  220. data/ext/libmemcached-0.50/libmemcached/auto.cc +383 -0
  221. data/ext/libmemcached-0.50/libmemcached/auto.h +111 -0
  222. data/ext/libmemcached-0.50/libmemcached/basic_string.h +55 -0
  223. data/ext/libmemcached-0.50/libmemcached/behavior.cc +590 -0
  224. data/ext/libmemcached-0.50/libmemcached/behavior.h +86 -0
  225. data/ext/libmemcached-0.50/libmemcached/byteorder.cc +90 -0
  226. data/ext/libmemcached-0.50/libmemcached/byteorder.h +52 -0
  227. data/ext/libmemcached-0.50/libmemcached/callback.cc +160 -0
  228. data/ext/libmemcached-0.50/libmemcached/callback.h +61 -0
  229. data/ext/libmemcached-0.50/libmemcached/common.h +182 -0
  230. data/ext/libmemcached-0.50/libmemcached/configure.h.in +52 -0
  231. data/ext/libmemcached-0.50/libmemcached/connect.cc +626 -0
  232. data/ext/libmemcached-0.50/libmemcached/constants.h +167 -0
  233. data/ext/libmemcached-0.50/libmemcached/delete.cc +266 -0
  234. data/ext/libmemcached-0.50/libmemcached/delete.h +57 -0
  235. data/ext/libmemcached-0.50/libmemcached/do.cc +100 -0
  236. data/ext/libmemcached-0.50/libmemcached/do.hpp +49 -0
  237. data/ext/libmemcached-0.50/libmemcached/dump.cc +107 -0
  238. data/ext/libmemcached-0.50/libmemcached/dump.h +51 -0
  239. data/ext/libmemcached-0.50/libmemcached/error.cc +419 -0
  240. data/ext/libmemcached-0.50/libmemcached/error.h +61 -0
  241. data/ext/libmemcached-0.50/libmemcached/error.hpp +87 -0
  242. data/ext/libmemcached-0.50/libmemcached/exception.hpp +63 -0
  243. data/ext/libmemcached-0.50/libmemcached/fetch.cc +267 -0
  244. data/ext/libmemcached-0.50/libmemcached/fetch.h +53 -0
  245. data/ext/libmemcached-0.50/libmemcached/flush.cc +149 -0
  246. data/ext/libmemcached-0.50/libmemcached/flush.h +49 -0
  247. data/ext/libmemcached-0.50/libmemcached/flush_buffers.cc +66 -0
  248. data/ext/libmemcached-0.50/libmemcached/flush_buffers.h +49 -0
  249. data/ext/libmemcached-0.50/libmemcached/get.cc +842 -0
  250. data/ext/libmemcached-0.50/libmemcached/get.h +135 -0
  251. data/ext/libmemcached-0.50/libmemcached/hash.cc +178 -0
  252. data/ext/libmemcached-0.50/libmemcached/hash.h +68 -0
  253. data/ext/libmemcached-0.50/libmemcached/hosts.cc +516 -0
  254. data/ext/libmemcached-0.50/libmemcached/include.am +183 -0
  255. data/ext/libmemcached-0.50/libmemcached/initialize_query.cc +70 -0
  256. data/ext/libmemcached-0.50/libmemcached/initialize_query.h +51 -0
  257. data/ext/libmemcached-0.50/libmemcached/internal.h +46 -0
  258. data/ext/libmemcached-0.50/libmemcached/io.cc +920 -0
  259. data/ext/libmemcached-0.50/libmemcached/io.h +119 -0
  260. data/ext/libmemcached-0.50/libmemcached/is.h +48 -0
  261. data/ext/libmemcached-0.50/libmemcached/key.cc +23 -0
  262. data/ext/libmemcached-0.50/libmemcached/libmemcached_probes.d +30 -0
  263. data/ext/libmemcached-0.50/libmemcached/libmemcached_probes.h +118 -0
  264. data/ext/libmemcached-0.50/libmemcached/memcached.cc +437 -0
  265. data/ext/libmemcached-0.50/libmemcached/memcached.h +214 -0
  266. data/ext/libmemcached-0.50/libmemcached/memcached.hpp +799 -0
  267. data/ext/libmemcached-0.50/libmemcached/memcached/README.txt +7 -0
  268. data/ext/libmemcached-0.50/libmemcached/memcached/protocol_binary.h +726 -0
  269. data/ext/libmemcached-0.50/libmemcached/memcached/vbucket.h +26 -0
  270. data/ext/libmemcached-0.50/libmemcached/memcached_util.h +44 -0
  271. data/ext/libmemcached-0.50/libmemcached/memory.h +79 -0
  272. data/ext/libmemcached-0.50/libmemcached/options.cc +178 -0
  273. data/ext/libmemcached-0.50/libmemcached/options.h +49 -0
  274. data/ext/libmemcached-0.50/libmemcached/options.hpp +56 -0
  275. data/ext/libmemcached-0.50/libmemcached/options/context.h +151 -0
  276. data/ext/libmemcached-0.50/libmemcached/options/include.am +19 -0
  277. data/ext/libmemcached-0.50/libmemcached/options/parser.am +0 -0
  278. data/ext/libmemcached-0.50/libmemcached/options/parser.cc +2324 -0
  279. data/ext/libmemcached-0.50/libmemcached/options/parser.h +122 -0
  280. data/ext/libmemcached-0.50/libmemcached/options/scanner.cc +3203 -0
  281. data/ext/libmemcached-0.50/libmemcached/options/scanner.h +479 -0
  282. data/ext/libmemcached-0.50/libmemcached/options/server.h +60 -0
  283. data/ext/libmemcached-0.50/libmemcached/options/symbol.h +57 -0
  284. data/ext/libmemcached-0.50/libmemcached/parse.cc +110 -0
  285. data/ext/libmemcached-0.50/libmemcached/parse.h +23 -0
  286. data/ext/libmemcached-0.50/libmemcached/platform.h +56 -0
  287. data/ext/libmemcached-0.50/libmemcached/prefix_key.cc +65 -0
  288. data/ext/libmemcached-0.50/libmemcached/prefix_key.h +49 -0
  289. data/ext/libmemcached-0.50/libmemcached/protocol/ascii_handler.c +963 -0
  290. data/ext/libmemcached-0.50/libmemcached/protocol/ascii_handler.h +40 -0
  291. data/ext/libmemcached-0.50/libmemcached/protocol/binary_handler.c +1121 -0
  292. data/ext/libmemcached-0.50/libmemcached/protocol/binary_handler.h +47 -0
  293. data/ext/libmemcached-0.50/libmemcached/protocol/cache.c +149 -0
  294. data/ext/libmemcached-0.50/libmemcached/protocol/cache.h +116 -0
  295. data/ext/libmemcached-0.50/libmemcached/protocol/callback.h +418 -0
  296. data/ext/libmemcached-0.50/libmemcached/protocol/common.h +163 -0
  297. data/ext/libmemcached-0.50/libmemcached/protocol/include.am +26 -0
  298. data/ext/libmemcached-0.50/libmemcached/protocol/pedantic.c +202 -0
  299. data/ext/libmemcached-0.50/libmemcached/protocol/protocol_handler.c +365 -0
  300. data/ext/libmemcached-0.50/libmemcached/protocol_handler.h +215 -0
  301. data/ext/libmemcached-0.50/libmemcached/purge.cc +90 -0
  302. data/ext/libmemcached-0.50/libmemcached/quit.cc +139 -0
  303. data/ext/libmemcached-0.50/libmemcached/quit.h +55 -0
  304. data/ext/libmemcached-0.50/libmemcached/response.cc +619 -0
  305. data/ext/libmemcached-0.50/libmemcached/response.h +57 -0
  306. data/ext/libmemcached-0.50/libmemcached/result.cc +173 -0
  307. data/ext/libmemcached-0.50/libmemcached/result.h +100 -0
  308. data/ext/libmemcached-0.50/libmemcached/return.h +98 -0
  309. data/ext/libmemcached-0.50/libmemcached/sasl.c +408 -0
  310. data/ext/libmemcached-0.50/libmemcached/sasl.h +86 -0
  311. data/ext/libmemcached-0.50/libmemcached/server.cc +351 -0
  312. data/ext/libmemcached-0.50/libmemcached/server.h +169 -0
  313. data/ext/libmemcached-0.50/libmemcached/server_list.cc +88 -0
  314. data/ext/libmemcached-0.50/libmemcached/server_list.h +77 -0
  315. data/ext/libmemcached-0.50/libmemcached/stats.cc +623 -0
  316. data/ext/libmemcached-0.50/libmemcached/stats.h +96 -0
  317. data/ext/libmemcached-0.50/libmemcached/storage.cc +567 -0
  318. data/ext/libmemcached-0.50/libmemcached/storage.h +133 -0
  319. data/ext/libmemcached-0.50/libmemcached/strerror.cc +189 -0
  320. data/ext/libmemcached-0.50/libmemcached/strerror.h +50 -0
  321. data/ext/libmemcached-0.50/libmemcached/string.cc +253 -0
  322. data/ext/libmemcached-0.50/libmemcached/string.h +121 -0
  323. data/ext/libmemcached-0.50/libmemcached/touch.cc +106 -0
  324. data/ext/libmemcached-0.50/libmemcached/touch.h +59 -0
  325. data/ext/libmemcached-0.50/libmemcached/types.h +117 -0
  326. data/ext/libmemcached-0.50/libmemcached/util.h +40 -0
  327. data/ext/libmemcached-0.50/libmemcached/util/flush.cc +61 -0
  328. data/ext/libmemcached-0.50/libmemcached/util/flush.h +50 -0
  329. data/ext/libmemcached-0.50/libmemcached/util/include.am +34 -0
  330. data/ext/libmemcached-0.50/libmemcached/util/ping.cc +62 -0
  331. data/ext/libmemcached-0.50/libmemcached/util/ping.h +49 -0
  332. data/ext/libmemcached-0.50/libmemcached/util/pool.cc +392 -0
  333. data/ext/libmemcached-0.50/libmemcached/util/pool.h +78 -0
  334. data/ext/libmemcached-0.50/libmemcached/util/version.cc +87 -0
  335. data/ext/libmemcached-0.50/libmemcached/util/version.h +53 -0
  336. data/ext/libmemcached-0.50/libmemcached/verbosity.cc +97 -0
  337. data/ext/libmemcached-0.50/libmemcached/verbosity.h +50 -0
  338. data/ext/libmemcached-0.50/libmemcached/version.cc +214 -0
  339. data/ext/libmemcached-0.50/libmemcached/version.h +52 -0
  340. data/ext/libmemcached-0.50/libmemcached/virtual_bucket.c +118 -0
  341. data/ext/libmemcached-0.50/libmemcached/virtual_bucket.h +59 -0
  342. data/ext/libmemcached-0.50/libmemcached/visibility.h +51 -0
  343. data/ext/libmemcached-0.50/libmemcached/watchpoint.h +110 -0
  344. data/ext/libmemcached-0.50/libtest/callbacks.h +21 -0
  345. data/ext/libmemcached-0.50/libtest/collection.h +19 -0
  346. data/ext/libmemcached-0.50/libtest/common.h +50 -0
  347. data/ext/libmemcached-0.50/libtest/core.h +11 -0
  348. data/ext/libmemcached-0.50/libtest/error.h +18 -0
  349. data/ext/libmemcached-0.50/libtest/failed.h +52 -0
  350. data/ext/libmemcached-0.50/libtest/framework.cc +57 -0
  351. data/ext/libmemcached-0.50/libtest/framework.h +137 -0
  352. data/ext/libmemcached-0.50/libtest/get.h +22 -0
  353. data/ext/libmemcached-0.50/libtest/include.am +52 -0
  354. data/ext/libmemcached-0.50/libtest/runner.h +19 -0
  355. data/ext/libmemcached-0.50/libtest/server.c +355 -0
  356. data/ext/libmemcached-0.50/libtest/server.h +43 -0
  357. data/ext/libmemcached-0.50/libtest/stats.h +30 -0
  358. data/ext/libmemcached-0.50/libtest/strerror.h +14 -0
  359. data/ext/libmemcached-0.50/libtest/test.cc +319 -0
  360. data/ext/libmemcached-0.50/libtest/test.h +162 -0
  361. data/ext/libmemcached-0.50/libtest/test.hpp +46 -0
  362. data/ext/libmemcached-0.50/libtest/visibility.h +69 -0
  363. data/ext/libmemcached-0.50/m4/ac_cxx_header_stdcxx_98.m4 +83 -0
  364. data/ext/libmemcached-0.50/m4/acx_pthread.m4 +271 -0
  365. data/ext/libmemcached-0.50/m4/byteorder.m4 +19 -0
  366. data/ext/libmemcached-0.50/m4/deprecated.m4 +17 -0
  367. data/ext/libmemcached-0.50/m4/eagain.m4 +28 -0
  368. data/ext/libmemcached-0.50/m4/enable_utillib.m4 +16 -0
  369. data/ext/libmemcached-0.50/m4/gettext.m4 +379 -0
  370. data/ext/libmemcached-0.50/m4/hsieh.m4 +18 -0
  371. data/ext/libmemcached-0.50/m4/iconv.m4 +214 -0
  372. data/ext/libmemcached-0.50/m4/lib-ld.m4 +110 -0
  373. data/ext/libmemcached-0.50/m4/lib-link.m4 +767 -0
  374. data/ext/libmemcached-0.50/m4/lib-prefix.m4 +221 -0
  375. data/ext/libmemcached-0.50/m4/libtool.m4 +7851 -0
  376. data/ext/libmemcached-0.50/m4/ltoptions.m4 +369 -0
  377. data/ext/libmemcached-0.50/m4/ltsugar.m4 +123 -0
  378. data/ext/libmemcached-0.50/m4/ltversion.m4 +23 -0
  379. data/ext/libmemcached-0.50/m4/lt~obsolete.m4 +98 -0
  380. data/ext/libmemcached-0.50/m4/memaslap.m4 +9 -0
  381. data/ext/libmemcached-0.50/m4/memcached.m4 +31 -0
  382. data/ext/libmemcached-0.50/m4/murmur.m4 +18 -0
  383. data/ext/libmemcached-0.50/m4/pandora_64bit.m4 +60 -0
  384. data/ext/libmemcached-0.50/m4/pandora_bison.m4 +33 -0
  385. data/ext/libmemcached-0.50/m4/pandora_canonical.m4 +418 -0
  386. data/ext/libmemcached-0.50/m4/pandora_check_compiler_version.m4 +37 -0
  387. data/ext/libmemcached-0.50/m4/pandora_check_cxx_standard.m4 +23 -0
  388. data/ext/libmemcached-0.50/m4/pandora_cinttypes.m4 +39 -0
  389. data/ext/libmemcached-0.50/m4/pandora_clock_gettime.m4 +15 -0
  390. data/ext/libmemcached-0.50/m4/pandora_compile_stdcxx_0x.m4 +103 -0
  391. data/ext/libmemcached-0.50/m4/pandora_cstdint.m4 +38 -0
  392. data/ext/libmemcached-0.50/m4/pandora_cxx_demangle.m4 +27 -0
  393. data/ext/libmemcached-0.50/m4/pandora_enable_dtrace.m4 +60 -0
  394. data/ext/libmemcached-0.50/m4/pandora_ensure_gcc_version.m4 +62 -0
  395. data/ext/libmemcached-0.50/m4/pandora_extensions.m4 +16 -0
  396. data/ext/libmemcached-0.50/m4/pandora_fdatasync.m4 +25 -0
  397. data/ext/libmemcached-0.50/m4/pandora_flex.m4 +33 -0
  398. data/ext/libmemcached-0.50/m4/pandora_have_better_malloc.m4 +66 -0
  399. data/ext/libmemcached-0.50/m4/pandora_have_boost.m4 +93 -0
  400. data/ext/libmemcached-0.50/m4/pandora_have_gcc_atomics.m4 +37 -0
  401. data/ext/libmemcached-0.50/m4/pandora_have_innodb.m4 +41 -0
  402. data/ext/libmemcached-0.50/m4/pandora_have_libaio.m4 +56 -0
  403. data/ext/libmemcached-0.50/m4/pandora_have_libavahi.m4 +41 -0
  404. data/ext/libmemcached-0.50/m4/pandora_have_libbdb.m4 +40 -0
  405. data/ext/libmemcached-0.50/m4/pandora_have_libboost_date_time.m4 +46 -0
  406. data/ext/libmemcached-0.50/m4/pandora_have_libboost_filesystem.m4 +47 -0
  407. data/ext/libmemcached-0.50/m4/pandora_have_libboost_iostreams.m4 +49 -0
  408. data/ext/libmemcached-0.50/m4/pandora_have_libboost_options.m4 +47 -0
  409. data/ext/libmemcached-0.50/m4/pandora_have_libboost_regex.m4 +54 -0
  410. data/ext/libmemcached-0.50/m4/pandora_have_libboost_test.m4 +45 -0
  411. data/ext/libmemcached-0.50/m4/pandora_have_libboost_thread.m4 +54 -0
  412. data/ext/libmemcached-0.50/m4/pandora_have_libcassandra.m4 +44 -0
  413. data/ext/libmemcached-0.50/m4/pandora_have_libcurl.m4 +62 -0
  414. data/ext/libmemcached-0.50/m4/pandora_have_libdl.m4 +51 -0
  415. data/ext/libmemcached-0.50/m4/pandora_have_libdrizzle.m4 +61 -0
  416. data/ext/libmemcached-0.50/m4/pandora_have_libevent.m4 +66 -0
  417. data/ext/libmemcached-0.50/m4/pandora_have_libgearman.m4 +41 -0
  418. data/ext/libmemcached-0.50/m4/pandora_have_libgtest.m4 +47 -0
  419. data/ext/libmemcached-0.50/m4/pandora_have_libhaildb.m4 +43 -0
  420. data/ext/libmemcached-0.50/m4/pandora_have_libhashkit.m4 +42 -0
  421. data/ext/libmemcached-0.50/m4/pandora_have_libinnodb.m4 +64 -0
  422. data/ext/libmemcached-0.50/m4/pandora_have_libldap.m4 +73 -0
  423. data/ext/libmemcached-0.50/m4/pandora_have_libmemcached.m4 +106 -0
  424. data/ext/libmemcached-0.50/m4/pandora_have_libmysqlclient.m4 +146 -0
  425. data/ext/libmemcached-0.50/m4/pandora_have_libndbclient.m4 +80 -0
  426. data/ext/libmemcached-0.50/m4/pandora_have_libpcre.m4 +73 -0
  427. data/ext/libmemcached-0.50/m4/pandora_have_libpq.m4 +46 -0
  428. data/ext/libmemcached-0.50/m4/pandora_have_libpqxx.m4 +44 -0
  429. data/ext/libmemcached-0.50/m4/pandora_have_libsqlite3.m4 +42 -0
  430. data/ext/libmemcached-0.50/m4/pandora_have_libtokyocabinet.m4 +54 -0
  431. data/ext/libmemcached-0.50/m4/pandora_have_libuuid.m4 +55 -0
  432. data/ext/libmemcached-0.50/m4/pandora_have_libvbucket.m4 +40 -0
  433. data/ext/libmemcached-0.50/m4/pandora_have_libxml2.m4 +52 -0
  434. data/ext/libmemcached-0.50/m4/pandora_have_libz.m4 +51 -0
  435. data/ext/libmemcached-0.50/m4/pandora_have_protobuf.m4 +82 -0
  436. data/ext/libmemcached-0.50/m4/pandora_have_sasl.m4 +133 -0
  437. data/ext/libmemcached-0.50/m4/pandora_have_thrift.m4 +45 -0
  438. data/ext/libmemcached-0.50/m4/pandora_header_assert.m4 +23 -0
  439. data/ext/libmemcached-0.50/m4/pandora_header_stdcxx_98.m4 +83 -0
  440. data/ext/libmemcached-0.50/m4/pandora_intltool.m4 +225 -0
  441. data/ext/libmemcached-0.50/m4/pandora_libtool.m4 +25 -0
  442. data/ext/libmemcached-0.50/m4/pandora_optimize.m4 +75 -0
  443. data/ext/libmemcached-0.50/m4/pandora_platform.m4 +117 -0
  444. data/ext/libmemcached-0.50/m4/pandora_plugins.m4 +62 -0
  445. data/ext/libmemcached-0.50/m4/pandora_print_callstack.m4 +61 -0
  446. data/ext/libmemcached-0.50/m4/pandora_pthread.m4 +258 -0
  447. data/ext/libmemcached-0.50/m4/pandora_python3_devel.m4 +236 -0
  448. data/ext/libmemcached-0.50/m4/pandora_run_cpplint.m4 +8 -0
  449. data/ext/libmemcached-0.50/m4/pandora_sasl.m4 +133 -0
  450. data/ext/libmemcached-0.50/m4/pandora_shared_ptr.m4 +59 -0
  451. data/ext/libmemcached-0.50/m4/pandora_stack_direction.m4 +39 -0
  452. data/ext/libmemcached-0.50/m4/pandora_stl_hash.m4 +94 -0
  453. data/ext/libmemcached-0.50/m4/pandora_swig.m4 +39 -0
  454. data/ext/libmemcached-0.50/m4/pandora_use_pipe.m4 +36 -0
  455. data/ext/libmemcached-0.50/m4/pandora_vc_build.m4 +168 -0
  456. data/ext/libmemcached-0.50/m4/pandora_version.m4 +11 -0
  457. data/ext/libmemcached-0.50/m4/pandora_visibility.m4 +75 -0
  458. data/ext/libmemcached-0.50/m4/pandora_warnings.m4 +447 -0
  459. data/ext/libmemcached-0.50/m4/pandora_with_gettext.m4 +44 -0
  460. data/ext/libmemcached-0.50/m4/pandora_with_lua.m4 +55 -0
  461. data/ext/libmemcached-0.50/m4/pandora_with_memcached.m4 +41 -0
  462. data/ext/libmemcached-0.50/m4/pandora_with_perl.m4 +81 -0
  463. data/ext/libmemcached-0.50/m4/pandora_with_php.m4 +56 -0
  464. data/ext/libmemcached-0.50/m4/pandora_with_python.m4 +37 -0
  465. data/ext/libmemcached-0.50/m4/pandora_with_python3.m4 +44 -0
  466. data/ext/libmemcached-0.50/m4/pandora_with_r.m4 +33 -0
  467. data/ext/libmemcached-0.50/m4/pandora_with_ruby.m4 +79 -0
  468. data/ext/libmemcached-0.50/m4/pandora_with_valgrind.m4 +17 -0
  469. data/ext/libmemcached-0.50/m4/pkg.m4 +157 -0
  470. data/ext/libmemcached-0.50/m4/po.m4 +449 -0
  471. data/ext/libmemcached-0.50/m4/progtest.m4 +92 -0
  472. data/ext/libmemcached-0.50/m4/protocol_binary.m4 +36 -0
  473. data/ext/libmemcached-0.50/m4/setsockopt.m4 +73 -0
  474. data/ext/libmemcached-0.50/m4/socket_send_flags.m4 +66 -0
  475. data/ext/libmemcached-0.50/poll/include.am +8 -0
  476. data/ext/libmemcached-0.50/poll/poll.c +77 -0
  477. data/ext/libmemcached-0.50/poll/poll.h +45 -0
  478. data/ext/libmemcached-0.50/support/include.am +11 -0
  479. data/ext/libmemcached-0.50/support/libmemcached-fc.spec.in +105 -0
  480. data/ext/libmemcached-0.50/support/libmemcached.pc.in +10 -0
  481. data/ext/libmemcached-0.50/support/libmemcached.spec.in +281 -0
  482. data/ext/libmemcached-0.50/support/set_benchmark.sh +5 -0
  483. data/ext/libmemcached-0.50/tests/atomsmasher.cc +295 -0
  484. data/ext/libmemcached-0.50/tests/basic.cc +134 -0
  485. data/ext/libmemcached-0.50/tests/basic.h +66 -0
  486. data/ext/libmemcached-0.50/tests/cpp_example.cc +195 -0
  487. data/ext/libmemcached-0.50/tests/deprecated.cc +72 -0
  488. data/ext/libmemcached-0.50/tests/deprecated.h +49 -0
  489. data/ext/libmemcached-0.50/tests/error_conditions.cc +63 -0
  490. data/ext/libmemcached-0.50/tests/error_conditions.h +48 -0
  491. data/ext/libmemcached-0.50/tests/hash_plus.cc +225 -0
  492. data/ext/libmemcached-0.50/tests/hash_results.h +127 -0
  493. data/ext/libmemcached-0.50/tests/hashkit_functions.cc +619 -0
  494. data/ext/libmemcached-0.50/tests/include.am +342 -0
  495. data/ext/libmemcached-0.50/tests/ketama_test_cases.h +121 -0
  496. data/ext/libmemcached-0.50/tests/ketama_test_cases_spy.h +118 -0
  497. data/ext/libmemcached-0.50/tests/libmemcached_world.h +205 -0
  498. data/ext/libmemcached-0.50/tests/mem_functions.cc +6648 -0
  499. data/ext/libmemcached-0.50/tests/mem_udp.cc +510 -0
  500. data/ext/libmemcached-0.50/tests/output_plus.res +5 -0
  501. data/ext/libmemcached-0.50/tests/parser.cc +599 -0
  502. data/ext/libmemcached-0.50/tests/parser.h +109 -0
  503. data/ext/libmemcached-0.50/tests/plus.cpp +240 -0
  504. data/ext/libmemcached-0.50/tests/pool.cc +78 -0
  505. data/ext/libmemcached-0.50/tests/pool.h +49 -0
  506. data/ext/libmemcached-0.50/tests/print.cc +58 -0
  507. data/ext/libmemcached-0.50/tests/print.h +51 -0
  508. data/ext/libmemcached-0.50/tests/replication.cc +333 -0
  509. data/ext/libmemcached-0.50/tests/replication.h +64 -0
  510. data/ext/libmemcached-0.50/tests/start.cc +29 -0
  511. data/ext/libmemcached-0.50/tests/string.cc +174 -0
  512. data/ext/libmemcached-0.50/tests/string.h +67 -0
  513. data/ext/libmemcached-0.50/tests/virtual_buckets.cc +143 -0
  514. data/ext/libmemcached-0.50/tests/virtual_buckets.h +51 -0
  515. data/ext/libmemcached-0.50/win32/include.am +11 -0
  516. data/ext/libmemcached-0.50/win32/wrappers.h +55 -0
  517. data/ext/rlibmemcached.i +263 -0
  518. data/ext/rlibmemcached_wrap.c +16732 -0
  519. data/lib/memcached.rb +32 -0
  520. data/lib/memcached/auth.rb +16 -0
  521. data/lib/memcached/behaviors.rb +77 -0
  522. data/lib/memcached/exceptions.rb +84 -0
  523. data/lib/memcached/experimental.rb +48 -0
  524. data/lib/memcached/memcached.rb +660 -0
  525. data/lib/memcached/rails.rb +133 -0
  526. data/test/profile/benchmark.rb +245 -0
  527. data/test/profile/c_profiler.rb +14 -0
  528. data/test/profile/exercise.rb +185 -0
  529. data/test/profile/rb_profiler.rb +21 -0
  530. data/test/profile/valgrind.rb +10 -0
  531. data/test/setup.rb +30 -0
  532. data/test/teardown.rb +0 -0
  533. data/test/test_helper.rb +19 -0
  534. data/test/unit/binding_test.rb +8 -0
  535. data/test/unit/memcached_experimental_test.rb +274 -0
  536. data/test/unit/memcached_test.rb +1293 -0
  537. data/test/unit/rails_test.rb +122 -0
  538. metadata +650 -0
  539. metadata.gz.sig +0 -0
@@ -0,0 +1,69 @@
1
+ /*
2
+ * File: ms_stats.h
3
+ * Author: Mingqiang Zhuang
4
+ *
5
+ * Created on March 25, 2009
6
+ *
7
+ * (c) Copyright 2009, Schooner Information Technology, Inc.
8
+ * http://www.schoonerinfotech.com/
9
+ *
10
+ */
11
+ #ifndef MS_STAT_H
12
+ #define MS_STAT_H
13
+
14
+ #include <math.h>
15
+ #include <unistd.h>
16
+ #include <stdio.h>
17
+ #include <stdlib.h>
18
+ #include <stdint.h>
19
+ #include <string.h>
20
+
21
+ #ifdef __cplusplus
22
+ extern "C" {
23
+ #endif
24
+
25
+ /* statistic structure of response time */
26
+ typedef struct
27
+ {
28
+ char *name;
29
+ uint64_t total_time;
30
+ uint64_t min_time;
31
+ uint64_t max_time;
32
+ uint64_t get_miss;
33
+ uint64_t dist[65];
34
+ double squares;
35
+ double log_product;
36
+
37
+ uint64_t period_min_time;
38
+ uint64_t period_max_time;
39
+ uint64_t pre_get_miss;
40
+ uint64_t pre_events;
41
+ uint64_t pre_total_time;
42
+ uint64_t pre_squares;
43
+ double pre_log_product;
44
+ } ms_stat_t;
45
+
46
+ /* initialize statistic */
47
+ void ms_init_stats(ms_stat_t *stat, const char *name);
48
+
49
+
50
+ /* record one event */
51
+ void ms_record_event(ms_stat_t *stat, uint64_t time, int get_miss);
52
+
53
+
54
+ /* dump the statistics */
55
+ void ms_dump_stats(ms_stat_t *stat);
56
+
57
+
58
+ /* dump the format statistics */
59
+ void ms_dump_format_stats(ms_stat_t *stat,
60
+ int run_time,
61
+ int freq,
62
+ int obj_size);
63
+
64
+
65
+ #ifdef __cplusplus
66
+ }
67
+ #endif
68
+
69
+ #endif /* MS_STAT_H */
@@ -0,0 +1,1114 @@
1
+ /*
2
+ * File: ms_task.c
3
+ * Author: Mingqiang Zhuang
4
+ *
5
+ * Created on February 10, 2009
6
+ *
7
+ * (c) Copyright 2009, Schooner Information Technology, Inc.
8
+ * http://www.schoonerinfotech.com/
9
+ *
10
+ */
11
+
12
+ #include "config.h"
13
+
14
+ #include <inttypes.h>
15
+ #if TIME_WITH_SYS_TIME
16
+ # include <sys/time.h>
17
+ # include <time.h>
18
+ #else
19
+ # if HAVE_SYS_TIME_H
20
+ # include <sys/time.h>
21
+ # else
22
+ # include <time.h>
23
+ # endif
24
+ #endif
25
+
26
+ #include "ms_thread.h"
27
+ #include "ms_setting.h"
28
+ #include "ms_atomic.h"
29
+
30
+ /* command distribution adjustment cycle */
31
+ #define CMD_DISTR_ADJUST_CYCLE 1000
32
+ #define DISADJUST_FACTOR 0.03 /**
33
+ * In one adjustment cycle, if undo set or get
34
+ * operations proportion is more than 3% , means
35
+ * there are too many new item or need more new
36
+ * item in the window. This factor shows it.
37
+ */
38
+
39
+ /* get item from task window */
40
+ static ms_task_item_t *ms_get_cur_opt_item(ms_conn_t *c);
41
+ static ms_task_item_t *ms_get_next_get_item(ms_conn_t *c);
42
+ static ms_task_item_t *ms_get_next_set_item(ms_conn_t *c);
43
+ static ms_task_item_t *ms_get_random_overwrite_item(ms_conn_t *c);
44
+
45
+
46
+ /* select next operation to do */
47
+ static void ms_select_opt(ms_conn_t *c, ms_task_t *task);
48
+
49
+
50
+ /* set and get speed estimate for controlling and adjustment */
51
+ static bool ms_is_set_too_fast(ms_task_t *task);
52
+ static bool ms_is_get_too_fast(ms_task_t *task);
53
+ static void ms_kick_out_item(ms_task_item_t *item);
54
+
55
+
56
+ /* miss rate adjustment */
57
+ static bool ms_need_overwrite_item(ms_task_t *task);
58
+ static bool ms_adjust_opt(ms_conn_t *c, ms_task_t *task);
59
+
60
+
61
+ /* deal with data verification initialization */
62
+ static void ms_task_data_verify_init(ms_task_t *task);
63
+ static void ms_task_expire_verify_init(ms_task_t *task);
64
+
65
+
66
+ /* select a new task to do */
67
+ static ms_task_t *ms_get_task(ms_conn_t *c, bool warmup);
68
+
69
+
70
+ /* run the selected task */
71
+ static void ms_update_set_result(ms_conn_t *c, ms_task_item_t *item);
72
+ static void ms_update_stat_result(ms_conn_t *c);
73
+ static void ms_update_multi_get_result(ms_conn_t *c);
74
+ static void ms_update_single_get_result(ms_conn_t *c, ms_task_item_t *item);
75
+ static void ms_update_task_result(ms_conn_t *c);
76
+ static void ms_single_getset_task_sch(ms_conn_t *c);
77
+ static void ms_multi_getset_task_sch(ms_conn_t *c);
78
+ static void ms_send_signal(ms_sync_lock_t *sync_lock);
79
+ static void ms_warmup_server(ms_conn_t *c);
80
+ static int ms_run_getset_task(ms_conn_t *c);
81
+
82
+
83
+ /**
84
+ * used to get the current operation item(object)
85
+ *
86
+ * @param c, pointer of the concurrency
87
+ *
88
+ * @return ms_task_item_t*, current operating item
89
+ */
90
+ static ms_task_item_t *ms_get_cur_opt_item(ms_conn_t *c)
91
+ {
92
+ return c->curr_task.item;
93
+ }
94
+
95
+
96
+ /**
97
+ * used to get the next item to do get operation
98
+ *
99
+ * @param c, pointer of the concurrency
100
+ *
101
+ * @return ms_task_item_t*, the pointer of the next item to do
102
+ * get operation
103
+ */
104
+ static ms_task_item_t *ms_get_next_get_item(ms_conn_t *c)
105
+ {
106
+ ms_task_item_t *item= NULL;
107
+
108
+ if (c->set_cursor <= 0)
109
+ {
110
+ /* the first item in the window */
111
+ item= &c->item_win[0];
112
+ }
113
+ else if (c->set_cursor > 0 && c->set_cursor < (uint32_t)c->win_size)
114
+ {
115
+ /* random get one item set before */
116
+ item= &c->item_win[random() % (int64_t)c->set_cursor];
117
+ }
118
+ else
119
+ {
120
+ /* random get one item from the window */
121
+ item= &c->item_win[random() % c->win_size];
122
+ }
123
+
124
+ return item;
125
+ } /* ms_get_next_get_item */
126
+
127
+
128
+ /**
129
+ * used to get the next item to do set operation
130
+ *
131
+ * @param c, pointer of the concurrency
132
+ *
133
+ * @return ms_task_item_t*, the pointer of the next item to do
134
+ * set operation
135
+ */
136
+ static ms_task_item_t *ms_get_next_set_item(ms_conn_t *c)
137
+ {
138
+ /**
139
+ * when a set command successes, the cursor will plus 1. If set
140
+ * fails, the cursor doesn't change. it isn't necessary to
141
+ * increase the cursor here.
142
+ */
143
+ return &c->item_win[(int64_t)c->set_cursor % c->win_size];
144
+ }
145
+
146
+
147
+ /**
148
+ * If we need do overwrite, we could select a item set before.
149
+ * This function is used to get a item set before to do
150
+ * overwrite.
151
+ *
152
+ * @param c, pointer of the concurrency
153
+ *
154
+ * @return ms_task_item_t*, the pointer of the previous item of
155
+ * set operation
156
+ */
157
+ static ms_task_item_t *ms_get_random_overwrite_item(ms_conn_t *c)
158
+ {
159
+ return ms_get_next_get_item(c);
160
+ } /* ms_get_random_overwrite_item */
161
+
162
+ /**
163
+ * According to the proportion of operations(get or set), select
164
+ * an operation to do.
165
+ *
166
+ * @param c, pointer of the concurrency
167
+ * @param task, pointer of current task in the concurrency
168
+ */
169
+ static void ms_select_opt(ms_conn_t *c, ms_task_t *task)
170
+ {
171
+ double get_prop= ms_setting.cmd_distr[CMD_GET].cmd_prop;
172
+ double set_prop= ms_setting.cmd_distr[CMD_SET].cmd_prop;
173
+
174
+ /* update cycle operation number if necessary */
175
+ if ((task->cycle_undo_get == 0) || (task->cycle_undo_set == 0))
176
+ {
177
+ task->cycle_undo_get+= (int)(CMD_DISTR_ADJUST_CYCLE * get_prop);
178
+ task->cycle_undo_set+= (int)(CMD_DISTR_ADJUST_CYCLE * set_prop);
179
+ }
180
+
181
+ /**
182
+ * According to operation distribution to choose doing which
183
+ * operation. If it can't set new object to sever, just change
184
+ * to do get operation.
185
+ */
186
+ if ((set_prop > PROP_ERROR)
187
+ && ((double)task->get_opt * set_prop >= (double)task->set_opt
188
+ * get_prop))
189
+ {
190
+ task->cmd= CMD_SET;
191
+ task->item= ms_get_next_set_item(c);
192
+ }
193
+ else
194
+ {
195
+ task->cmd= CMD_GET;
196
+ task->item= ms_get_next_get_item(c);
197
+ }
198
+ } /* ms_select_opt */
199
+
200
+
201
+ /**
202
+ * used to judge whether the number of get operations done is
203
+ * more than expected number of get operations to do right now.
204
+ *
205
+ * @param task, pointer of current task in the concurrency
206
+ *
207
+ * @return bool, if get too fast, return true, else return false
208
+ */
209
+ static bool ms_is_get_too_fast(ms_task_t *task)
210
+ {
211
+ double get_prop= ms_setting.cmd_distr[CMD_GET].cmd_prop;
212
+ double set_prop= ms_setting.cmd_distr[CMD_SET].cmd_prop;
213
+
214
+ /* no get operation */
215
+ if (get_prop < PROP_ERROR)
216
+ {
217
+ return false;
218
+ }
219
+
220
+ int max_undo_set= (int)(set_prop / get_prop * (1.0 + DISADJUST_FACTOR))
221
+ * task->cycle_undo_get;
222
+
223
+ if (((double)task->get_opt * set_prop > (double)task->set_opt * get_prop)
224
+ && (task->cycle_undo_set > max_undo_set))
225
+ {
226
+ return true;
227
+ }
228
+
229
+ return false;
230
+ } /* ms_is_get_too_fast */
231
+
232
+
233
+ /**
234
+ * used to judge whether the number of set operations done is
235
+ * more than expected number of set operations to do right now.
236
+ *
237
+ * @param task, pointer of current task in the concurrency
238
+ *
239
+ * @return bool, if set too fast, return true, else return false
240
+ */
241
+ static bool ms_is_set_too_fast(ms_task_t *task)
242
+ {
243
+ double get_prop= ms_setting.cmd_distr[CMD_GET].cmd_prop;
244
+ double set_prop= ms_setting.cmd_distr[CMD_SET].cmd_prop;
245
+
246
+ /* no set operation */
247
+ if (set_prop < PROP_ERROR)
248
+ {
249
+ return false;
250
+ }
251
+
252
+ /* If it does set operation too fast, skip some */
253
+ int max_undo_get= (int)((get_prop / set_prop * (1.0 + DISADJUST_FACTOR))
254
+ * (double)task->cycle_undo_set);
255
+
256
+ if (((double)task->get_opt * set_prop < (double)task->set_opt * get_prop)
257
+ && (task->cycle_undo_get > max_undo_get))
258
+ {
259
+ return true;
260
+ }
261
+
262
+ return false;
263
+ } /* ms_is_set_too_fast */
264
+
265
+
266
+ /**
267
+ * kick out the old item in the window, and add a new item to
268
+ * overwrite the old item. When we don't want to do overwrite
269
+ * object, and the current item to do set operation is an old
270
+ * item, we could kick out the old item and add a new item. Then
271
+ * we can ensure we set new object every time.
272
+ *
273
+ * @param item, pointer of task item which includes the object
274
+ * information
275
+ */
276
+ static void ms_kick_out_item(ms_task_item_t *item)
277
+ {
278
+ /* allocate a new item */
279
+ item->key_prefix= ms_get_key_prefix();
280
+
281
+ item->key_suffix_offset++;
282
+ item->value_offset= INVALID_OFFSET; /* new item use invalid value offset */
283
+ item->client_time= 0;
284
+ } /* ms_kick_out_item */
285
+
286
+
287
+ /**
288
+ * used to judge whether we need overwrite object based on the
289
+ * options user specified
290
+ *
291
+ * @param task, pointer of current task in the concurrency
292
+ *
293
+ * @return bool, if need overwrite, return true, else return
294
+ * false
295
+ */
296
+ static bool ms_need_overwrite_item(ms_task_t *task)
297
+ {
298
+ ms_task_item_t *item= task->item;
299
+
300
+ assert(item != NULL);
301
+ assert(task->cmd == CMD_SET);
302
+
303
+ /**
304
+ * according to data overwrite percent to determine if do data
305
+ * overwrite.
306
+ */
307
+ if (task->overwrite_set < (double)task->set_opt
308
+ * ms_setting.overwrite_percent)
309
+ {
310
+ return true;
311
+ }
312
+
313
+ return false;
314
+ } /* ms_need_overwirte_item */
315
+
316
+
317
+ /**
318
+ * used to adjust operation. the function must be called after
319
+ * select operation. the function change get operation to set
320
+ * operation, or set operation to get operation based on the
321
+ * current case.
322
+ *
323
+ * @param c, pointer of the concurrency
324
+ * @param task, pointer of current task in the concurrency
325
+ *
326
+ * @return bool, if success, return true, else return false
327
+ */
328
+ static bool ms_adjust_opt(ms_conn_t *c, ms_task_t *task)
329
+ {
330
+ ms_task_item_t *item= task->item;
331
+
332
+ assert(item != NULL);
333
+
334
+ if (task->cmd == CMD_SET)
335
+ {
336
+ /* If did set operation too fast, skip some */
337
+ if (ms_is_set_too_fast(task))
338
+ {
339
+ /* get the item instead */
340
+ if (item->value_offset != INVALID_OFFSET)
341
+ {
342
+ task->cmd= CMD_GET;
343
+ return true;
344
+ }
345
+ }
346
+
347
+ /* If the current item is not a new item, kick it out */
348
+ if (item->value_offset != INVALID_OFFSET)
349
+ {
350
+ if (ms_need_overwrite_item(task))
351
+ {
352
+ /* overwrite */
353
+ task->overwrite_set++;
354
+ }
355
+ else
356
+ {
357
+ /* kick out the current item to do set operation */
358
+ ms_kick_out_item(item);
359
+ }
360
+ }
361
+ else /* it's a new item */
362
+ {
363
+ /* need overwrite */
364
+ if (ms_need_overwrite_item(task))
365
+ {
366
+ /**
367
+ * overwrite not use the item with current set cursor, revert
368
+ * set cursor.
369
+ */
370
+ c->set_cursor--;
371
+
372
+ item= ms_get_random_overwrite_item(c);
373
+ if (item->value_offset != INVALID_OFFSET)
374
+ {
375
+ task->item= item;
376
+ task->overwrite_set++;
377
+ }
378
+ else /* item is a new item */
379
+ {
380
+ /* select the item to run, and cancel overwrite */
381
+ task->item= item;
382
+ }
383
+ }
384
+ }
385
+ task->cmd= CMD_SET;
386
+ return true;
387
+ }
388
+ else
389
+ {
390
+ if (item->value_offset == INVALID_OFFSET)
391
+ {
392
+ task->cmd= CMD_SET;
393
+ return true;
394
+ }
395
+
396
+ /**
397
+ * If It does get operation too fast, it will change the
398
+ * operation to set.
399
+ */
400
+ if (ms_is_get_too_fast(task))
401
+ {
402
+ /* don't kick out the first item in the window */
403
+ if (! ms_is_set_too_fast(task))
404
+ {
405
+ ms_kick_out_item(item);
406
+ task->cmd= CMD_SET;
407
+ return true;
408
+ }
409
+ else
410
+ {
411
+ return false;
412
+ }
413
+ }
414
+
415
+ assert(item->value_offset != INVALID_OFFSET);
416
+
417
+ task->cmd= CMD_GET;
418
+ return true;
419
+ }
420
+ } /* ms_adjust_opt */
421
+
422
+
423
+ /**
424
+ * used to initialize the task which need verify data.
425
+ *
426
+ * @param task, pointer of current task in the concurrency
427
+ */
428
+ static void ms_task_data_verify_init(ms_task_t *task)
429
+ {
430
+ ms_task_item_t *item= task->item;
431
+
432
+ assert(item != NULL);
433
+ assert(task->cmd == CMD_GET);
434
+
435
+ /**
436
+ * according to data verification percent to determine if do
437
+ * data verification.
438
+ */
439
+ if (task->verified_get < (double)task->get_opt
440
+ * ms_setting.verify_percent)
441
+ {
442
+ /**
443
+ * currently it doesn't do verify, just increase the counter,
444
+ * and do verification next proper get command
445
+ */
446
+ if ((task->item->value_offset != INVALID_OFFSET)
447
+ && (item->exp_time == 0))
448
+ {
449
+ task->verify= true;
450
+ task->finish_verify= false;
451
+ task->verified_get++;
452
+ }
453
+ }
454
+ } /* ms_task_data_verify_init */
455
+
456
+
457
+ /**
458
+ * used to initialize the task which need verify expire time.
459
+ *
460
+ * @param task, pointer of current task in the concurrency
461
+ */
462
+ static void ms_task_expire_verify_init(ms_task_t *task)
463
+ {
464
+ ms_task_item_t *item= task->item;
465
+
466
+ assert(item != NULL);
467
+ assert(task->cmd == CMD_GET);
468
+ assert(item->exp_time > 0);
469
+
470
+ task->verify= true;
471
+ task->finish_verify= false;
472
+ } /* ms_task_expire_verify_init */
473
+
474
+
475
+ /**
476
+ * used to get one task, the function initializes the task
477
+ * structure.
478
+ *
479
+ * @param c, pointer of the concurrency
480
+ * @param warmup, whether it need warmup
481
+ *
482
+ * @return ms_task_t*, pointer of current task in the
483
+ * concurrency
484
+ */
485
+ static ms_task_t *ms_get_task(ms_conn_t *c, bool warmup)
486
+ {
487
+ ms_task_t *task= &c->curr_task;
488
+
489
+ while (1)
490
+ {
491
+ task->verify= false;
492
+ task->finish_verify= true;
493
+ task->get_miss= true;
494
+
495
+ if (warmup)
496
+ {
497
+ task->cmd= CMD_SET;
498
+ task->item= ms_get_next_set_item(c);
499
+
500
+ return task;
501
+ }
502
+
503
+ /* according to operation distribution to choose doing which operation */
504
+ ms_select_opt(c, task);
505
+
506
+ if (! ms_adjust_opt(c, task))
507
+ {
508
+ continue;
509
+ }
510
+
511
+ if ((ms_setting.verify_percent > 0) && (task->cmd == CMD_GET))
512
+ {
513
+ ms_task_data_verify_init(task);
514
+ }
515
+
516
+ if ((ms_setting.exp_ver_per > 0) && (task->cmd == CMD_GET)
517
+ && (task->item->exp_time > 0))
518
+ {
519
+ ms_task_expire_verify_init(task);
520
+ }
521
+
522
+ break;
523
+ }
524
+
525
+ /**
526
+ * Only update get and delete counter, set counter will be
527
+ * updated after set operation successes.
528
+ */
529
+ if (task->cmd == CMD_GET)
530
+ {
531
+ task->get_opt++;
532
+ task->cycle_undo_get--;
533
+ }
534
+
535
+ return task;
536
+ } /* ms_get_task */
537
+
538
+
539
+ /**
540
+ * send a signal to the main monitor thread
541
+ *
542
+ * @param sync_lock, pointer of the lock
543
+ */
544
+ static void ms_send_signal(ms_sync_lock_t *sync_lock)
545
+ {
546
+ pthread_mutex_lock(&sync_lock->lock);
547
+ sync_lock->count++;
548
+ pthread_cond_signal(&sync_lock->cond);
549
+ pthread_mutex_unlock(&sync_lock->lock);
550
+ } /* ms_send_signal */
551
+
552
+
553
+ /**
554
+ * If user only want to do get operation, but there is no object
555
+ * in server , so we use this function to warmup the server, and
556
+ * set some objects to server. It runs at the beginning of task.
557
+ *
558
+ * @param c, pointer of the concurrency
559
+ */
560
+ static void ms_warmup_server(ms_conn_t *c)
561
+ {
562
+ ms_task_t *task;
563
+ ms_task_item_t *item;
564
+
565
+ /**
566
+ * Extra one loop to get the last command returned state.
567
+ * Normally it gets the previous command returned state.
568
+ */
569
+ if ((c->remain_warmup_num >= 0)
570
+ && (c->remain_warmup_num != c->warmup_num))
571
+ {
572
+ item= ms_get_cur_opt_item(c);
573
+ /* only update the set command result state for data verification */
574
+ if ((c->precmd.cmd == CMD_SET) && (c->precmd.retstat == MCD_STORED))
575
+ {
576
+ item->value_offset= item->key_suffix_offset;
577
+ /* set success, update counter */
578
+ c->set_cursor++;
579
+ }
580
+ else if (c->precmd.cmd == CMD_SET && c->precmd.retstat != MCD_STORED)
581
+ {
582
+ printf("key: %" PRIx64 " didn't set success\n", item->key_prefix);
583
+ }
584
+ }
585
+
586
+ /* the last time don't run a task */
587
+ if (c->remain_warmup_num-- > 0)
588
+ {
589
+ /* operate next task item */
590
+ task= ms_get_task(c, true);
591
+ item= task->item;
592
+ ms_mcd_set(c, item);
593
+ }
594
+
595
+ /**
596
+ * finish warming up server, wait all connects initialize
597
+ * complete. Then all connects can start do task at the same
598
+ * time.
599
+ */
600
+ if (c->remain_warmup_num == -1)
601
+ {
602
+ ms_send_signal(&ms_global.warmup_lock);
603
+ c->remain_warmup_num--; /* never run the if branch */
604
+ }
605
+ } /* ms_warmup_server */
606
+
607
+
608
+ /**
609
+ * dispatch single get and set task
610
+ *
611
+ * @param c, pointer of the concurrency
612
+ */
613
+ static void ms_single_getset_task_sch(ms_conn_t *c)
614
+ {
615
+ ms_task_t *task;
616
+ ms_task_item_t *item;
617
+
618
+ /* the last time don't run a task */
619
+ if (c->remain_exec_num-- > 0)
620
+ {
621
+ task= ms_get_task(c, false);
622
+ item= task->item;
623
+ if (task->cmd == CMD_SET)
624
+ {
625
+ ms_mcd_set(c, item);
626
+ }
627
+ else if (task->cmd == CMD_GET)
628
+ {
629
+ assert(task->cmd == CMD_GET);
630
+ ms_mcd_get(c, item);
631
+ }
632
+ }
633
+ } /* ms_single_getset_task_sch */
634
+
635
+
636
+ /**
637
+ * dispatch multi-get and set task
638
+ *
639
+ * @param c, pointer of the concurrency
640
+ */
641
+ static void ms_multi_getset_task_sch(ms_conn_t *c)
642
+ {
643
+ ms_task_t *task;
644
+ ms_mlget_task_item_t *mlget_item;
645
+
646
+ while (1)
647
+ {
648
+ if (c->remain_exec_num-- > 0)
649
+ {
650
+ task= ms_get_task(c, false);
651
+ if (task->cmd == CMD_SET) /* just do it */
652
+ {
653
+ ms_mcd_set(c, task->item);
654
+ break;
655
+ }
656
+ else
657
+ {
658
+ assert(task->cmd == CMD_GET);
659
+ mlget_item= &c->mlget_task.mlget_item[c->mlget_task.mlget_num];
660
+ mlget_item->item= task->item;
661
+ mlget_item->verify= task->verify;
662
+ mlget_item->finish_verify= task->finish_verify;
663
+ mlget_item->get_miss= task->get_miss;
664
+ c->mlget_task.mlget_num++;
665
+
666
+ /* enough multi-get task items can be done */
667
+ if ((c->mlget_task.mlget_num >= ms_setting.mult_key_num)
668
+ || ((c->remain_exec_num == 0) && (c->mlget_task.mlget_num > 0)))
669
+ {
670
+ ms_mcd_mlget(c);
671
+ break;
672
+ }
673
+ }
674
+ }
675
+ else
676
+ {
677
+ if ((c->remain_exec_num <= 0) && (c->mlget_task.mlget_num > 0))
678
+ {
679
+ ms_mcd_mlget(c);
680
+ }
681
+ break;
682
+ }
683
+ }
684
+ } /* ms_multi_getset_task_sch */
685
+
686
+
687
+ /**
688
+ * calculate the difference value of two time points
689
+ *
690
+ * @param start_time, the start time
691
+ * @param end_time, the end time
692
+ *
693
+ * @return uint64_t, the difference value between start_time and end_time in us
694
+ */
695
+ int64_t ms_time_diff(struct timeval *start_time, struct timeval *end_time)
696
+ {
697
+ int64_t endtime= end_time->tv_sec * 1000000 + end_time->tv_usec;
698
+ int64_t starttime= start_time->tv_sec * 1000000 + start_time->tv_usec;
699
+
700
+ assert(endtime >= starttime);
701
+
702
+ return endtime - starttime;
703
+ } /* ms_time_diff */
704
+
705
+
706
+ /**
707
+ * after get the response from server for multi-get, the
708
+ * function update the state of the task and do data verify if
709
+ * necessary.
710
+ *
711
+ * @param c, pointer of the concurrency
712
+ */
713
+ static void ms_update_multi_get_result(ms_conn_t *c)
714
+ {
715
+ ms_mlget_task_item_t *mlget_item;
716
+ ms_task_item_t *item;
717
+ char *orignval= NULL;
718
+ char *orignkey= NULL;
719
+
720
+ if (c == NULL)
721
+ {
722
+ return;
723
+ }
724
+ assert(c != NULL);
725
+
726
+ for (int i= 0; i < c->mlget_task.mlget_num; i++)
727
+ {
728
+ mlget_item= &c->mlget_task.mlget_item[i];
729
+ item= mlget_item->item;
730
+ orignval= &ms_setting.char_block[item->value_offset];
731
+ orignkey= &ms_setting.char_block[item->key_suffix_offset];
732
+
733
+ /* update get miss counter */
734
+ if (mlget_item->get_miss)
735
+ {
736
+ atomic_add_size(&ms_stats.get_misses, 1);
737
+ }
738
+
739
+ /* get nothing from server for this task item */
740
+ if (mlget_item->verify && ! mlget_item->finish_verify)
741
+ {
742
+ /* verify expire time if necessary */
743
+ if (item->exp_time > 0)
744
+ {
745
+ struct timeval curr_time;
746
+ gettimeofday(&curr_time, NULL);
747
+
748
+ /* object doesn't expire but can't get it now */
749
+ if (curr_time.tv_sec - item->client_time
750
+ < item->exp_time - EXPIRE_TIME_ERROR)
751
+ {
752
+ atomic_add_size(&ms_stats.unexp_unget, 1);
753
+
754
+ if (ms_setting.verbose)
755
+ {
756
+ char set_time[64];
757
+ char cur_time[64];
758
+ strftime(set_time, 64, "%Y-%m-%d %H:%M:%S",
759
+ localtime(&item->client_time));
760
+ strftime(cur_time, 64, "%Y-%m-%d %H:%M:%S",
761
+ localtime(&curr_time.tv_sec));
762
+ fprintf(stderr,
763
+ "\n\t<%d expire time verification failed, object "
764
+ "doesn't expire but can't get it now\n"
765
+ "\tkey len: %d\n"
766
+ "\tkey: %" PRIx64 " %.*s\n"
767
+ "\tset time: %s current time: %s "
768
+ "diff time: %d expire time: %d\n"
769
+ "\texpected data len: %d\n"
770
+ "\texpected data: %.*s\n"
771
+ "\treceived data: \n",
772
+ c->sfd,
773
+ item->key_size,
774
+ item->key_prefix,
775
+ item->key_size - (int)KEY_PREFIX_SIZE,
776
+ orignkey,
777
+ set_time,
778
+ cur_time,
779
+ (int)(curr_time.tv_sec - item->client_time),
780
+ item->exp_time,
781
+ item->value_size,
782
+ item->value_size,
783
+ orignval);
784
+ fflush(stderr);
785
+ }
786
+ }
787
+ }
788
+ else
789
+ {
790
+ atomic_add_size(&ms_stats.vef_miss, 1);
791
+
792
+ if (ms_setting.verbose)
793
+ {
794
+ fprintf(stderr, "\n<%d data verification failed\n"
795
+ "\tkey len: %d\n"
796
+ "\tkey: %" PRIx64 " %.*s\n"
797
+ "\texpected data len: %d\n"
798
+ "\texpected data: %.*s\n"
799
+ "\treceived data: \n",
800
+ c->sfd, item->key_size, item->key_prefix,
801
+ item->key_size - (int)KEY_PREFIX_SIZE,
802
+ orignkey, item->value_size, item->value_size, orignval);
803
+ fflush(stderr);
804
+ }
805
+ }
806
+ }
807
+ }
808
+ c->mlget_task.mlget_num= 0;
809
+ c->mlget_task.value_index= INVALID_OFFSET;
810
+ } /* ms_update_multi_get_result */
811
+
812
+
813
+ /**
814
+ * after get the response from server for single get, the
815
+ * function update the state of the task and do data verify if
816
+ * necessary.
817
+ *
818
+ * @param c, pointer of the concurrency
819
+ * @param item, pointer of task item which includes the object
820
+ * information
821
+ */
822
+ static void ms_update_single_get_result(ms_conn_t *c, ms_task_item_t *item)
823
+ {
824
+ char *orignval= NULL;
825
+ char *orignkey= NULL;
826
+
827
+ if ((c == NULL) || (item == NULL))
828
+ {
829
+ return;
830
+ }
831
+ assert(c != NULL);
832
+ assert(item != NULL);
833
+
834
+ orignval= &ms_setting.char_block[item->value_offset];
835
+ orignkey= &ms_setting.char_block[item->key_suffix_offset];
836
+
837
+ /* update get miss counter */
838
+ if ((c->precmd.cmd == CMD_GET) && c->curr_task.get_miss)
839
+ {
840
+ atomic_add_size(&ms_stats.get_misses, 1);
841
+ }
842
+
843
+ /* get nothing from server for this task item */
844
+ if ((c->precmd.cmd == CMD_GET) && c->curr_task.verify
845
+ && ! c->curr_task.finish_verify)
846
+ {
847
+ /* verify expire time if necessary */
848
+ if (item->exp_time > 0)
849
+ {
850
+ struct timeval curr_time;
851
+ gettimeofday(&curr_time, NULL);
852
+
853
+ /* object doesn't expire but can't get it now */
854
+ if (curr_time.tv_sec - item->client_time
855
+ < item->exp_time - EXPIRE_TIME_ERROR)
856
+ {
857
+ atomic_add_size(&ms_stats.unexp_unget, 1);
858
+
859
+ if (ms_setting.verbose)
860
+ {
861
+ char set_time[64];
862
+ char cur_time[64];
863
+ strftime(set_time, 64, "%Y-%m-%d %H:%M:%S",
864
+ localtime(&item->client_time));
865
+ strftime(cur_time, 64, "%Y-%m-%d %H:%M:%S",
866
+ localtime(&curr_time.tv_sec));
867
+ fprintf(stderr,
868
+ "\n\t<%d expire time verification failed, object "
869
+ "doesn't expire but can't get it now\n"
870
+ "\tkey len: %d\n"
871
+ "\tkey: %" PRIx64 " %.*s\n"
872
+ "\tset time: %s current time: %s "
873
+ "diff time: %d expire time: %d\n"
874
+ "\texpected data len: %d\n"
875
+ "\texpected data: %.*s\n"
876
+ "\treceived data: \n",
877
+ c->sfd,
878
+ item->key_size,
879
+ item->key_prefix,
880
+ item->key_size - (int)KEY_PREFIX_SIZE,
881
+ orignkey,
882
+ set_time,
883
+ cur_time,
884
+ (int)(curr_time.tv_sec - item->client_time),
885
+ item->exp_time,
886
+ item->value_size,
887
+ item->value_size,
888
+ orignval);
889
+ fflush(stderr);
890
+ }
891
+ }
892
+ }
893
+ else
894
+ {
895
+ atomic_add_size(&ms_stats.vef_miss, 1);
896
+
897
+ if (ms_setting.verbose)
898
+ {
899
+ fprintf(stderr, "\n<%d data verification failed\n"
900
+ "\tkey len: %d\n"
901
+ "\tkey: %" PRIx64 " %.*s\n"
902
+ "\texpected data len: %d\n"
903
+ "\texpected data: %.*s\n"
904
+ "\treceived data: \n",
905
+ c->sfd, item->key_size, item->key_prefix,
906
+ item->key_size - (int)KEY_PREFIX_SIZE,
907
+ orignkey, item->value_size, item->value_size, orignval);
908
+ fflush(stderr);
909
+ }
910
+ }
911
+ }
912
+ } /* ms_update_single_get_result */
913
+
914
+
915
+ /**
916
+ * after get the response from server for set the function
917
+ * update the state of the task and do data verify if necessary.
918
+ *
919
+ * @param c, pointer of the concurrency
920
+ * @param item, pointer of task item which includes the object
921
+ * information
922
+ */
923
+ static void ms_update_set_result(ms_conn_t *c, ms_task_item_t *item)
924
+ {
925
+ if ((c == NULL) || (item == NULL))
926
+ {
927
+ return;
928
+ }
929
+ assert(c != NULL);
930
+ assert(item != NULL);
931
+
932
+ if (c->precmd.cmd == CMD_SET)
933
+ {
934
+ switch (c->precmd.retstat)
935
+ {
936
+ case MCD_STORED:
937
+ if (item->value_offset == INVALID_OFFSET)
938
+ {
939
+ /* first set with the same offset of key suffix */
940
+ item->value_offset= item->key_suffix_offset;
941
+ }
942
+ else
943
+ {
944
+ /* not first set, just increase the value offset */
945
+ item->value_offset+= 1;
946
+ }
947
+
948
+ /* set successes, update counter */
949
+ c->set_cursor++;
950
+ c->curr_task.set_opt++;
951
+ c->curr_task.cycle_undo_set--;
952
+ break;
953
+
954
+ case MCD_SERVER_ERROR:
955
+ default:
956
+ break;
957
+ } /* switch */
958
+ }
959
+ } /* ms_update_set_result */
960
+
961
+
962
+ /**
963
+ * update the response time result
964
+ *
965
+ * @param c, pointer of the concurrency
966
+ */
967
+ static void ms_update_stat_result(ms_conn_t *c)
968
+ {
969
+ bool get_miss= false;
970
+
971
+ if (c == NULL)
972
+ {
973
+ return;
974
+ }
975
+ assert(c != NULL);
976
+
977
+ gettimeofday(&c->end_time, NULL);
978
+ uint64_t time_diff= (uint64_t)ms_time_diff(&c->start_time, &c->end_time);
979
+
980
+ pthread_mutex_lock(&ms_statistic.stat_mutex);
981
+
982
+ switch (c->precmd.cmd)
983
+ {
984
+ case CMD_SET:
985
+ ms_record_event(&ms_statistic.set_stat, time_diff, false);
986
+ break;
987
+
988
+ case CMD_GET:
989
+ if (c->curr_task.get_miss)
990
+ {
991
+ get_miss= true;
992
+ }
993
+ ms_record_event(&ms_statistic.get_stat, time_diff, get_miss);
994
+ break;
995
+
996
+ default:
997
+ break;
998
+ } /* switch */
999
+
1000
+ ms_record_event(&ms_statistic.total_stat, time_diff, get_miss);
1001
+ pthread_mutex_unlock(&ms_statistic.stat_mutex);
1002
+ } /* ms_update_stat_result */
1003
+
1004
+
1005
+ /**
1006
+ * after get response from server for the current operation, and
1007
+ * before doing the next operation, update the state of the
1008
+ * current operation.
1009
+ *
1010
+ * @param c, pointer of the concurrency
1011
+ */
1012
+ static void ms_update_task_result(ms_conn_t *c)
1013
+ {
1014
+ ms_task_item_t *item;
1015
+
1016
+ if (c == NULL)
1017
+ {
1018
+ return;
1019
+ }
1020
+ assert(c != NULL);
1021
+
1022
+ item= ms_get_cur_opt_item(c);
1023
+ if (item == NULL)
1024
+ {
1025
+ return;
1026
+ }
1027
+ assert(item != NULL);
1028
+
1029
+ ms_update_set_result(c, item);
1030
+
1031
+ if ((ms_setting.stat_freq > 0)
1032
+ && ((c->precmd.cmd == CMD_SET) || (c->precmd.cmd == CMD_GET)))
1033
+ {
1034
+ ms_update_stat_result(c);
1035
+ }
1036
+
1037
+ /* update multi-get task item */
1038
+ if (((ms_setting.mult_key_num > 1)
1039
+ && (c->mlget_task.mlget_num >= ms_setting.mult_key_num))
1040
+ || ((c->remain_exec_num == 0) && (c->mlget_task.mlget_num > 0)))
1041
+ {
1042
+ ms_update_multi_get_result(c);
1043
+ }
1044
+ else
1045
+ {
1046
+ ms_update_single_get_result(c, item);
1047
+ }
1048
+ } /* ms_update_task_result */
1049
+
1050
+
1051
+ /**
1052
+ * run get and set operation
1053
+ *
1054
+ * @param c, pointer of the concurrency
1055
+ *
1056
+ * @return int, if success, return EXIT_SUCCESS, else return -1
1057
+ */
1058
+ static int ms_run_getset_task(ms_conn_t *c)
1059
+ {
1060
+ /**
1061
+ * extra one loop to get the last command return state. get the
1062
+ * last command return state.
1063
+ */
1064
+ if ((c->remain_exec_num >= 0)
1065
+ && (c->remain_exec_num != c->exec_num))
1066
+ {
1067
+ ms_update_task_result(c);
1068
+ }
1069
+
1070
+ /* multi-get */
1071
+ if (ms_setting.mult_key_num > 1)
1072
+ {
1073
+ /* operate next task item */
1074
+ ms_multi_getset_task_sch(c);
1075
+ }
1076
+ else
1077
+ {
1078
+ /* operate next task item */
1079
+ ms_single_getset_task_sch(c);
1080
+ }
1081
+
1082
+ /* no task to do, exit */
1083
+ if ((c->remain_exec_num == -1) || ms_global.time_out)
1084
+ {
1085
+ return -1;
1086
+ }
1087
+
1088
+ return EXIT_SUCCESS;
1089
+ } /* ms_run_getset_task */
1090
+
1091
+
1092
+ /**
1093
+ * the state machine call the function to execute task.
1094
+ *
1095
+ * @param c, pointer of the concurrency
1096
+ *
1097
+ * @return int, if success, return EXIT_SUCCESS, else return -1
1098
+ */
1099
+ int ms_exec_task(struct conn *c)
1100
+ {
1101
+ if (! ms_global.finish_warmup)
1102
+ {
1103
+ ms_warmup_server(c);
1104
+ }
1105
+ else
1106
+ {
1107
+ if (ms_run_getset_task(c) != 0)
1108
+ {
1109
+ return -1;
1110
+ }
1111
+ }
1112
+
1113
+ return EXIT_SUCCESS;
1114
+ } /* ms_exec_task */