nutcracker 0.2.3 → 0.2.4.beta1

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 (296) hide show
  1. data/README.md +53 -5
  2. data/Rakefile +14 -19
  3. data/bin/nutcracker +6 -1
  4. data/ext/nutcracker/ChangeLog +9 -0
  5. data/ext/nutcracker/LICENSE +0 -0
  6. data/ext/nutcracker/Makefile +643 -0
  7. data/ext/nutcracker/Makefile.am +0 -0
  8. data/ext/nutcracker/Makefile.in +66 -149
  9. data/ext/nutcracker/NOTICE +0 -0
  10. data/ext/nutcracker/README.md +13 -11
  11. data/ext/nutcracker/aclocal.m4 +112 -201
  12. data/ext/nutcracker/autom4te.cache/output.0 +18664 -0
  13. data/ext/nutcracker/autom4te.cache/output.1 +18664 -0
  14. data/ext/nutcracker/autom4te.cache/output.2 +18664 -0
  15. data/ext/nutcracker/autom4te.cache/requests +494 -0
  16. data/ext/nutcracker/autom4te.cache/traces.0 +2415 -0
  17. data/ext/nutcracker/autom4te.cache/traces.1 +945 -0
  18. data/ext/nutcracker/autom4te.cache/traces.2 +2415 -0
  19. data/ext/nutcracker/conf/nutcracker.leaf.yml +0 -0
  20. data/ext/nutcracker/conf/nutcracker.root.yml +0 -0
  21. data/ext/nutcracker/conf/nutcracker.yml +0 -0
  22. data/ext/nutcracker/config.h +332 -0
  23. data/ext/nutcracker/config.h.in +15 -0
  24. data/ext/nutcracker/config.log +2684 -0
  25. data/ext/nutcracker/config.status +2317 -0
  26. data/ext/nutcracker/config/config.guess +23 -84
  27. data/ext/nutcracker/config/config.sub +23 -93
  28. data/ext/nutcracker/config/depcomp +35 -81
  29. data/ext/nutcracker/config/install-sh +109 -122
  30. data/ext/nutcracker/config/ltmain.sh +1053 -721
  31. data/ext/nutcracker/config/missing +20 -29
  32. data/ext/nutcracker/configure +2122 -2320
  33. data/ext/nutcracker/configure.ac +35 -3
  34. data/ext/nutcracker/contrib/Makefile +494 -0
  35. data/ext/nutcracker/contrib/Makefile.am +0 -0
  36. data/ext/nutcracker/contrib/Makefile.in +41 -107
  37. data/ext/nutcracker/contrib/yaml-0.1.4.tar.gz +0 -0
  38. data/ext/nutcracker/contrib/yaml-0.1.4/Makefile +736 -0
  39. data/ext/nutcracker/contrib/yaml-0.1.4/autom4te.cache/output.0 +13102 -0
  40. data/ext/nutcracker/contrib/yaml-0.1.4/autom4te.cache/output.1 +13085 -0
  41. data/ext/nutcracker/contrib/yaml-0.1.4/autom4te.cache/output.2 +13085 -0
  42. data/ext/nutcracker/contrib/yaml-0.1.4/autom4te.cache/requests +476 -0
  43. data/ext/nutcracker/contrib/yaml-0.1.4/autom4te.cache/traces.0 +2339 -0
  44. data/ext/nutcracker/contrib/yaml-0.1.4/autom4te.cache/traces.1 +545 -0
  45. data/ext/nutcracker/contrib/yaml-0.1.4/autom4te.cache/traces.2 +2339 -0
  46. data/ext/nutcracker/contrib/yaml-0.1.4/config.h +81 -0
  47. data/ext/nutcracker/contrib/yaml-0.1.4/config.h.in~ +80 -0
  48. data/ext/nutcracker/contrib/yaml-0.1.4/config.log +688 -0
  49. data/ext/nutcracker/contrib/yaml-0.1.4/config.status +2032 -0
  50. data/ext/nutcracker/contrib/yaml-0.1.4/doc/html/annotated.html +51 -0
  51. data/ext/nutcracker/contrib/yaml-0.1.4/doc/html/bc_s.png +0 -0
  52. data/ext/nutcracker/contrib/yaml-0.1.4/doc/html/classes.html +41 -0
  53. data/ext/nutcracker/contrib/yaml-0.1.4/doc/html/closed.png +0 -0
  54. data/ext/nutcracker/contrib/yaml-0.1.4/doc/html/doxygen.css +656 -0
  55. data/ext/nutcracker/contrib/yaml-0.1.4/doc/html/doxygen.png +0 -0
  56. data/ext/nutcracker/contrib/yaml-0.1.4/doc/html/files.html +40 -0
  57. data/ext/nutcracker/contrib/yaml-0.1.4/doc/html/functions.html +91 -0
  58. data/ext/nutcracker/contrib/yaml-0.1.4/doc/html/functions_0x62.html +84 -0
  59. data/ext/nutcracker/contrib/yaml-0.1.4/doc/html/functions_0x63.html +87 -0
  60. data/ext/nutcracker/contrib/yaml-0.1.4/doc/html/functions_0x64.html +83 -0
  61. data/ext/nutcracker/contrib/yaml-0.1.4/doc/html/functions_0x65.html +110 -0
  62. data/ext/nutcracker/contrib/yaml-0.1.4/doc/html/functions_0x66.html +79 -0
  63. data/ext/nutcracker/contrib/yaml-0.1.4/doc/html/functions_0x68.html +80 -0
  64. data/ext/nutcracker/contrib/yaml-0.1.4/doc/html/functions_0x69.html +92 -0
  65. data/ext/nutcracker/contrib/yaml-0.1.4/doc/html/functions_0x6b.html +71 -0
  66. data/ext/nutcracker/contrib/yaml-0.1.4/doc/html/functions_0x6c.html +88 -0
  67. data/ext/nutcracker/contrib/yaml-0.1.4/doc/html/functions_0x6d.html +96 -0
  68. data/ext/nutcracker/contrib/yaml-0.1.4/doc/html/functions_0x6e.html +71 -0
  69. data/ext/nutcracker/contrib/yaml-0.1.4/doc/html/functions_0x6f.html +80 -0
  70. data/ext/nutcracker/contrib/yaml-0.1.4/doc/html/functions_0x70.html +100 -0
  71. data/ext/nutcracker/contrib/yaml-0.1.4/doc/html/functions_0x71.html +71 -0
  72. data/ext/nutcracker/contrib/yaml-0.1.4/doc/html/functions_0x72.html +87 -0
  73. data/ext/nutcracker/contrib/yaml-0.1.4/doc/html/functions_0x73.html +163 -0
  74. data/ext/nutcracker/contrib/yaml-0.1.4/doc/html/functions_0x74.html +115 -0
  75. data/ext/nutcracker/contrib/yaml-0.1.4/doc/html/functions_0x75.html +71 -0
  76. data/ext/nutcracker/contrib/yaml-0.1.4/doc/html/functions_0x76.html +80 -0
  77. data/ext/nutcracker/contrib/yaml-0.1.4/doc/html/functions_0x77.html +77 -0
  78. data/ext/nutcracker/contrib/yaml-0.1.4/doc/html/functions_vars.html +91 -0
  79. data/ext/nutcracker/contrib/yaml-0.1.4/doc/html/functions_vars_0x62.html +84 -0
  80. data/ext/nutcracker/contrib/yaml-0.1.4/doc/html/functions_vars_0x63.html +87 -0
  81. data/ext/nutcracker/contrib/yaml-0.1.4/doc/html/functions_vars_0x64.html +83 -0
  82. data/ext/nutcracker/contrib/yaml-0.1.4/doc/html/functions_vars_0x65.html +110 -0
  83. data/ext/nutcracker/contrib/yaml-0.1.4/doc/html/functions_vars_0x66.html +79 -0
  84. data/ext/nutcracker/contrib/yaml-0.1.4/doc/html/functions_vars_0x68.html +80 -0
  85. data/ext/nutcracker/contrib/yaml-0.1.4/doc/html/functions_vars_0x69.html +92 -0
  86. data/ext/nutcracker/contrib/yaml-0.1.4/doc/html/functions_vars_0x6b.html +71 -0
  87. data/ext/nutcracker/contrib/yaml-0.1.4/doc/html/functions_vars_0x6c.html +88 -0
  88. data/ext/nutcracker/contrib/yaml-0.1.4/doc/html/functions_vars_0x6d.html +96 -0
  89. data/ext/nutcracker/contrib/yaml-0.1.4/doc/html/functions_vars_0x6e.html +71 -0
  90. data/ext/nutcracker/contrib/yaml-0.1.4/doc/html/functions_vars_0x6f.html +80 -0
  91. data/ext/nutcracker/contrib/yaml-0.1.4/doc/html/functions_vars_0x70.html +100 -0
  92. data/ext/nutcracker/contrib/yaml-0.1.4/doc/html/functions_vars_0x71.html +71 -0
  93. data/ext/nutcracker/contrib/yaml-0.1.4/doc/html/functions_vars_0x72.html +87 -0
  94. data/ext/nutcracker/contrib/yaml-0.1.4/doc/html/functions_vars_0x73.html +163 -0
  95. data/ext/nutcracker/contrib/yaml-0.1.4/doc/html/functions_vars_0x74.html +115 -0
  96. data/ext/nutcracker/contrib/yaml-0.1.4/doc/html/functions_vars_0x75.html +71 -0
  97. data/ext/nutcracker/contrib/yaml-0.1.4/doc/html/functions_vars_0x76.html +80 -0
  98. data/ext/nutcracker/contrib/yaml-0.1.4/doc/html/functions_vars_0x77.html +77 -0
  99. data/ext/nutcracker/contrib/yaml-0.1.4/doc/html/globals.html +667 -0
  100. data/ext/nutcracker/contrib/yaml-0.1.4/doc/html/globals_defs.html +81 -0
  101. data/ext/nutcracker/contrib/yaml-0.1.4/doc/html/globals_enum.html +78 -0
  102. data/ext/nutcracker/contrib/yaml-0.1.4/doc/html/globals_eval.html +373 -0
  103. data/ext/nutcracker/contrib/yaml-0.1.4/doc/html/globals_func.html +196 -0
  104. data/ext/nutcracker/contrib/yaml-0.1.4/doc/html/globals_type.html +126 -0
  105. data/ext/nutcracker/contrib/yaml-0.1.4/doc/html/group__basic.html +320 -0
  106. data/ext/nutcracker/contrib/yaml-0.1.4/doc/html/group__emitter.html +819 -0
  107. data/ext/nutcracker/contrib/yaml-0.1.4/doc/html/group__events.html +664 -0
  108. data/ext/nutcracker/contrib/yaml-0.1.4/doc/html/group__export.html +60 -0
  109. data/ext/nutcracker/contrib/yaml-0.1.4/doc/html/group__nodes.html +795 -0
  110. data/ext/nutcracker/contrib/yaml-0.1.4/doc/html/group__parser.html +606 -0
  111. data/ext/nutcracker/contrib/yaml-0.1.4/doc/html/group__styles.html +222 -0
  112. data/ext/nutcracker/contrib/yaml-0.1.4/doc/html/group__tokens.html +246 -0
  113. data/ext/nutcracker/contrib/yaml-0.1.4/doc/html/group__version.html +106 -0
  114. data/ext/nutcracker/contrib/yaml-0.1.4/doc/html/index.html +31 -0
  115. data/ext/nutcracker/contrib/yaml-0.1.4/doc/html/modules.html +42 -0
  116. data/ext/nutcracker/contrib/yaml-0.1.4/doc/html/nav_f.png +0 -0
  117. data/ext/nutcracker/contrib/yaml-0.1.4/doc/html/nav_h.png +0 -0
  118. data/ext/nutcracker/contrib/yaml-0.1.4/doc/html/open.png +0 -0
  119. data/ext/nutcracker/contrib/yaml-0.1.4/doc/html/structyaml__alias__data__s.html +108 -0
  120. data/ext/nutcracker/contrib/yaml-0.1.4/doc/html/structyaml__document__s.html +235 -0
  121. data/ext/nutcracker/contrib/yaml-0.1.4/doc/html/structyaml__emitter__s.html +1300 -0
  122. data/ext/nutcracker/contrib/yaml-0.1.4/doc/html/structyaml__event__s.html +496 -0
  123. data/ext/nutcracker/contrib/yaml-0.1.4/doc/html/structyaml__mark__s.html +108 -0
  124. data/ext/nutcracker/contrib/yaml-0.1.4/doc/html/structyaml__node__pair__s.html +91 -0
  125. data/ext/nutcracker/contrib/yaml-0.1.4/doc/html/structyaml__node__s.html +420 -0
  126. data/ext/nutcracker/contrib/yaml-0.1.4/doc/html/structyaml__parser__s.html +1229 -0
  127. data/ext/nutcracker/contrib/yaml-0.1.4/doc/html/structyaml__simple__key__s.html +97 -0
  128. data/ext/nutcracker/contrib/yaml-0.1.4/doc/html/structyaml__tag__directive__s.html +91 -0
  129. data/ext/nutcracker/contrib/yaml-0.1.4/doc/html/structyaml__token__s.html +413 -0
  130. data/ext/nutcracker/contrib/yaml-0.1.4/doc/html/structyaml__version__directive__s.html +91 -0
  131. data/ext/nutcracker/contrib/yaml-0.1.4/doc/html/tab_a.png +0 -0
  132. data/ext/nutcracker/contrib/yaml-0.1.4/doc/html/tab_b.png +0 -0
  133. data/ext/nutcracker/contrib/yaml-0.1.4/doc/html/tab_h.png +0 -0
  134. data/ext/nutcracker/contrib/yaml-0.1.4/doc/html/tab_s.png +0 -0
  135. data/ext/nutcracker/contrib/yaml-0.1.4/doc/html/tabs.css +59 -0
  136. data/ext/nutcracker/contrib/yaml-0.1.4/doc/html/yaml_8h.html +525 -0
  137. data/ext/nutcracker/contrib/yaml-0.1.4/include/Makefile.am +17 -0
  138. data/ext/nutcracker/contrib/yaml-0.1.4/include/Makefile.in +470 -0
  139. data/ext/nutcracker/contrib/yaml-0.1.4/libtool +8890 -0
  140. data/ext/nutcracker/contrib/yaml-0.1.4/src/Makefile +484 -0
  141. data/ext/nutcracker/contrib/yaml-0.1.4/src/api.lo +12 -0
  142. data/ext/nutcracker/contrib/yaml-0.1.4/src/api.o +0 -0
  143. data/ext/nutcracker/contrib/yaml-0.1.4/src/dumper.lo +12 -0
  144. data/ext/nutcracker/contrib/yaml-0.1.4/src/dumper.o +0 -0
  145. data/ext/nutcracker/contrib/yaml-0.1.4/src/emitter.lo +12 -0
  146. data/ext/nutcracker/contrib/yaml-0.1.4/src/emitter.o +0 -0
  147. data/ext/nutcracker/contrib/yaml-0.1.4/src/libyaml.la +41 -0
  148. data/ext/nutcracker/contrib/yaml-0.1.4/src/loader.lo +12 -0
  149. data/ext/nutcracker/contrib/yaml-0.1.4/src/loader.o +0 -0
  150. data/ext/nutcracker/contrib/yaml-0.1.4/src/parser.lo +12 -0
  151. data/ext/nutcracker/contrib/yaml-0.1.4/src/parser.o +0 -0
  152. data/ext/nutcracker/contrib/yaml-0.1.4/src/reader.lo +12 -0
  153. data/ext/nutcracker/contrib/yaml-0.1.4/src/reader.o +0 -0
  154. data/ext/nutcracker/contrib/yaml-0.1.4/src/scanner.lo +12 -0
  155. data/ext/nutcracker/contrib/yaml-0.1.4/src/scanner.o +0 -0
  156. data/ext/nutcracker/contrib/yaml-0.1.4/src/writer.lo +12 -0
  157. data/ext/nutcracker/contrib/yaml-0.1.4/src/writer.o +0 -0
  158. data/ext/nutcracker/contrib/yaml-0.1.4/stamp-h1 +1 -0
  159. data/ext/nutcracker/contrib/yaml-0.1.4/tests/Makefile +675 -0
  160. data/ext/nutcracker/contrib/yaml-0.1.4/tests/example-deconstructor +0 -0
  161. data/ext/nutcracker/contrib/yaml-0.1.4/tests/example-deconstructor-alt +0 -0
  162. data/ext/nutcracker/contrib/yaml-0.1.4/tests/example-deconstructor-alt.o +0 -0
  163. data/ext/nutcracker/contrib/yaml-0.1.4/tests/example-deconstructor.o +0 -0
  164. data/ext/nutcracker/contrib/yaml-0.1.4/tests/example-reformatter +0 -0
  165. data/ext/nutcracker/contrib/yaml-0.1.4/tests/example-reformatter-alt +0 -0
  166. data/ext/nutcracker/contrib/yaml-0.1.4/tests/example-reformatter-alt.o +0 -0
  167. data/ext/nutcracker/contrib/yaml-0.1.4/tests/example-reformatter.o +0 -0
  168. data/ext/nutcracker/contrib/yaml-0.1.4/tests/run-dumper +0 -0
  169. data/ext/nutcracker/contrib/yaml-0.1.4/tests/run-dumper.o +0 -0
  170. data/ext/nutcracker/contrib/yaml-0.1.4/tests/run-emitter +0 -0
  171. data/ext/nutcracker/contrib/yaml-0.1.4/tests/run-emitter.o +0 -0
  172. data/ext/nutcracker/contrib/yaml-0.1.4/tests/run-loader +0 -0
  173. data/ext/nutcracker/contrib/yaml-0.1.4/tests/run-loader.o +0 -0
  174. data/ext/nutcracker/contrib/yaml-0.1.4/tests/run-parser +0 -0
  175. data/ext/nutcracker/contrib/yaml-0.1.4/tests/run-parser.o +0 -0
  176. data/ext/nutcracker/contrib/yaml-0.1.4/tests/run-scanner +0 -0
  177. data/ext/nutcracker/contrib/yaml-0.1.4/tests/run-scanner.o +0 -0
  178. data/ext/nutcracker/contrib/yaml-0.1.4/yaml-0.1.pc +10 -0
  179. data/ext/nutcracker/contrib/yaml-0.1.4/yaml-0.1.pc.in +10 -0
  180. data/ext/nutcracker/extconf.rb +0 -5
  181. data/ext/nutcracker/libtool +9403 -0
  182. data/ext/nutcracker/m4/libtool.m4 +553 -492
  183. data/ext/nutcracker/m4/ltoptions.m4 +7 -6
  184. data/ext/nutcracker/m4/ltversion.m4 +5 -5
  185. data/ext/nutcracker/m4/lt~obsolete.m4 +9 -3
  186. data/ext/nutcracker/notes/c-styleguide.txt +0 -0
  187. data/ext/nutcracker/notes/debug.txt +0 -0
  188. data/ext/nutcracker/notes/memcache.txt +0 -0
  189. data/ext/nutcracker/notes/recommendation.md +21 -2
  190. data/ext/nutcracker/notes/redis.md +9 -9
  191. data/ext/nutcracker/notes/socket.txt +0 -0
  192. data/ext/nutcracker/scripts/nutcracker.init +0 -0
  193. data/ext/nutcracker/scripts/nutcracker.spec +0 -0
  194. data/ext/nutcracker/scripts/redis-check.py +0 -0
  195. data/ext/nutcracker/scripts/redis-check.sh +9 -0
  196. data/ext/nutcracker/src/Makefile +647 -0
  197. data/ext/nutcracker/src/Makefile.am +1 -1
  198. data/ext/nutcracker/src/Makefile.in +74 -153
  199. data/ext/nutcracker/src/hashkit/Makefile +476 -0
  200. data/ext/nutcracker/src/hashkit/Makefile.am +1 -0
  201. data/ext/nutcracker/src/hashkit/Makefile.in +39 -64
  202. data/ext/nutcracker/src/hashkit/libhashkit.a +0 -0
  203. data/ext/nutcracker/src/hashkit/nc_crc16.c +66 -0
  204. data/ext/nutcracker/src/hashkit/nc_crc16.o +0 -0
  205. data/ext/nutcracker/src/hashkit/nc_crc32.c +0 -0
  206. data/ext/nutcracker/src/hashkit/nc_crc32.o +0 -0
  207. data/ext/nutcracker/src/hashkit/nc_fnv.c +0 -0
  208. data/ext/nutcracker/src/hashkit/nc_fnv.o +0 -0
  209. data/ext/nutcracker/src/hashkit/nc_hashkit.h +2 -0
  210. data/ext/nutcracker/src/hashkit/nc_hsieh.c +0 -0
  211. data/ext/nutcracker/src/hashkit/nc_hsieh.o +0 -0
  212. data/ext/nutcracker/src/hashkit/nc_jenkins.c +0 -0
  213. data/ext/nutcracker/src/hashkit/nc_jenkins.o +0 -0
  214. data/ext/nutcracker/src/hashkit/nc_ketama.c +0 -0
  215. data/ext/nutcracker/src/hashkit/nc_ketama.o +0 -0
  216. data/ext/nutcracker/src/hashkit/nc_md5.c +0 -0
  217. data/ext/nutcracker/src/hashkit/nc_md5.o +0 -0
  218. data/ext/nutcracker/src/hashkit/nc_modula.c +18 -6
  219. data/ext/nutcracker/src/hashkit/nc_modula.o +0 -0
  220. data/ext/nutcracker/src/hashkit/nc_murmur.c +0 -0
  221. data/ext/nutcracker/src/hashkit/nc_murmur.o +0 -0
  222. data/ext/nutcracker/src/hashkit/nc_one_at_a_time.c +0 -0
  223. data/ext/nutcracker/src/hashkit/nc_one_at_a_time.o +0 -0
  224. data/ext/nutcracker/src/hashkit/nc_random.c +0 -0
  225. data/ext/nutcracker/src/hashkit/nc_random.o +0 -0
  226. data/ext/nutcracker/src/nc.c +0 -0
  227. data/ext/nutcracker/src/nc.o +0 -0
  228. data/ext/nutcracker/src/nc_array.c +0 -0
  229. data/ext/nutcracker/src/nc_array.h +0 -0
  230. data/ext/nutcracker/src/nc_array.o +0 -0
  231. data/ext/nutcracker/src/nc_client.c +0 -0
  232. data/ext/nutcracker/src/nc_client.h +0 -0
  233. data/ext/nutcracker/src/nc_client.o +0 -0
  234. data/ext/nutcracker/src/nc_conf.c +14 -35
  235. data/ext/nutcracker/src/nc_conf.h +1 -1
  236. data/ext/nutcracker/src/nc_conf.o +0 -0
  237. data/ext/nutcracker/src/nc_connection.c +0 -0
  238. data/ext/nutcracker/src/nc_connection.h +0 -0
  239. data/ext/nutcracker/src/nc_connection.o +0 -0
  240. data/ext/nutcracker/src/nc_core.c +29 -26
  241. data/ext/nutcracker/src/nc_core.h +13 -5
  242. data/ext/nutcracker/src/nc_core.o +0 -0
  243. data/ext/nutcracker/src/{nc_event.c → nc_epoll.c} +94 -30
  244. data/ext/nutcracker/src/nc_epoll.o +0 -0
  245. data/ext/nutcracker/src/nc_event.h +33 -13
  246. data/ext/nutcracker/src/nc_kqueue.c +296 -0
  247. data/ext/nutcracker/src/nc_kqueue.o +0 -0
  248. data/ext/nutcracker/src/nc_log.c +0 -0
  249. data/ext/nutcracker/src/nc_log.h +0 -0
  250. data/ext/nutcracker/src/nc_log.o +0 -0
  251. data/ext/nutcracker/src/nc_mbuf.c +0 -0
  252. data/ext/nutcracker/src/nc_mbuf.h +0 -0
  253. data/ext/nutcracker/src/nc_mbuf.o +0 -0
  254. data/ext/nutcracker/src/nc_message.c +0 -0
  255. data/ext/nutcracker/src/nc_message.h +2 -0
  256. data/ext/nutcracker/src/nc_message.o +0 -0
  257. data/ext/nutcracker/src/nc_proxy.c +8 -8
  258. data/ext/nutcracker/src/nc_proxy.h +0 -0
  259. data/ext/nutcracker/src/nc_proxy.o +0 -0
  260. data/ext/nutcracker/src/nc_queue.h +0 -0
  261. data/ext/nutcracker/src/nc_rbtree.c +0 -0
  262. data/ext/nutcracker/src/nc_rbtree.h +0 -0
  263. data/ext/nutcracker/src/nc_rbtree.o +0 -0
  264. data/ext/nutcracker/src/nc_request.c +3 -3
  265. data/ext/nutcracker/src/nc_request.o +0 -0
  266. data/ext/nutcracker/src/nc_response.c +4 -6
  267. data/ext/nutcracker/src/nc_response.o +0 -0
  268. data/ext/nutcracker/src/nc_server.c +14 -12
  269. data/ext/nutcracker/src/nc_server.h +0 -0
  270. data/ext/nutcracker/src/nc_server.o +0 -0
  271. data/ext/nutcracker/src/nc_signal.c +0 -0
  272. data/ext/nutcracker/src/nc_signal.h +0 -0
  273. data/ext/nutcracker/src/nc_signal.o +0 -0
  274. data/ext/nutcracker/src/nc_stats.c +16 -21
  275. data/ext/nutcracker/src/nc_stats.h +3 -4
  276. data/ext/nutcracker/src/nc_stats.o +0 -0
  277. data/ext/nutcracker/src/nc_string.c +0 -0
  278. data/ext/nutcracker/src/nc_string.h +0 -0
  279. data/ext/nutcracker/src/nc_string.o +0 -0
  280. data/ext/nutcracker/src/nc_util.c +16 -0
  281. data/ext/nutcracker/src/nc_util.h +1 -0
  282. data/ext/nutcracker/src/nc_util.o +0 -0
  283. data/ext/nutcracker/src/nutcracker +0 -0
  284. data/ext/nutcracker/src/proto/Makefile +454 -0
  285. data/ext/nutcracker/src/proto/Makefile.am +0 -0
  286. data/ext/nutcracker/src/proto/Makefile.in +32 -60
  287. data/ext/nutcracker/src/proto/libproto.a +0 -0
  288. data/ext/nutcracker/src/proto/nc_memcache.c +0 -0
  289. data/ext/nutcracker/src/proto/nc_memcache.o +0 -0
  290. data/ext/nutcracker/src/proto/nc_proto.h +0 -0
  291. data/ext/nutcracker/src/proto/nc_redis.c +17 -4
  292. data/ext/nutcracker/src/proto/nc_redis.o +0 -0
  293. data/ext/nutcracker/stamp-h1 +1 -0
  294. data/lib/nutcracker.rb +64 -2
  295. data/lib/nutcracker/version.rb +1 -1
  296. metadata +237 -9
File without changes
File without changes
File without changes
File without changes
Binary file
File without changes
File without changes
Binary file
File without changes
File without changes
Binary file
@@ -1109,14 +1109,6 @@ conf_pre_validate(struct conf *cf)
1109
1109
  return NC_OK;
1110
1110
  }
1111
1111
 
1112
- static int
1113
- conf_server_pname_cmp(const void *t1, const void *t2)
1114
- {
1115
- const struct conf_server *s1 = t1, *s2 = t2;
1116
-
1117
- return string_compare(&s1->pname, &s2->pname);
1118
- }
1119
-
1120
1112
  static int
1121
1113
  conf_server_name_cmp(const void *t1, const void *t2)
1122
1114
  {
@@ -1156,27 +1148,10 @@ conf_validate_server(struct conf *cf, struct conf_pool *cp)
1156
1148
 
1157
1149
  /*
1158
1150
  * Disallow duplicate servers - servers with identical "host:port:weight"
1159
- * or "name" combination are considered as duplicates
1151
+ * or "name" combination are considered as duplicates. When server name
1152
+ * is configured, we only check for duplicate "name" and not for duplicate
1153
+ * "host:port:weight"
1160
1154
  */
1161
- array_sort(&cp->server, conf_server_pname_cmp);
1162
- for (valid = true, i = 0; i < nserver - 1; i++) {
1163
- struct conf_server *cs1, *cs2;
1164
-
1165
- cs1 = array_get(&cp->server, i);
1166
- cs2 = array_get(&cp->server, i + 1);
1167
-
1168
- if (string_compare(&cs1->pname, &cs2->pname) == 0) {
1169
- log_error("conf: pool '%.*s' has servers with same name '%.*s'",
1170
- cp->name.len, cp->name.data, cs1->pname.len,
1171
- cs1->pname.data);
1172
- valid = false;
1173
- break;
1174
- }
1175
- }
1176
- if (!valid) {
1177
- return NC_ERROR;
1178
- }
1179
-
1180
1155
  array_sort(&cp->server, conf_server_name_cmp);
1181
1156
  for (valid = true, i = 0; i < nserver - 1; i++) {
1182
1157
  struct conf_server *cs1, *cs2;
@@ -1497,7 +1472,7 @@ conf_add_server(struct conf *cf, struct command *cmd, void *conf)
1497
1472
  struct conf_server *field;
1498
1473
  uint8_t *p, *q, *start;
1499
1474
  uint8_t *pname, *addr, *port, *weight, *name;
1500
- uint32_t k, pnamelen, addrlen, portlen, weightlen, namelen;
1475
+ uint32_t k, delimlen, pnamelen, addrlen, portlen, weightlen, namelen;
1501
1476
  struct string address;
1502
1477
  char delim[] = " ::";
1503
1478
 
@@ -1514,7 +1489,7 @@ conf_add_server(struct conf *cf, struct command *cmd, void *conf)
1514
1489
 
1515
1490
  value = array_top(&cf->arg);
1516
1491
 
1517
- /* parse "hostname:port:weight [name]" from the end */
1492
+ /* parse "hostname:port:weight [name]" or "/path/unix_socket:weight [name]" from the end */
1518
1493
  p = value->data + value->len - 1;
1519
1494
  start = value->data;
1520
1495
  addr = NULL;
@@ -1526,6 +1501,8 @@ conf_add_server(struct conf *cf, struct command *cmd, void *conf)
1526
1501
  name = NULL;
1527
1502
  namelen = 0;
1528
1503
 
1504
+ delimlen = value->data[0] == '/' ? 2 : 3;
1505
+
1529
1506
  for (k = 0; k < sizeof(delim); k++) {
1530
1507
  q = nc_strrchr(p, start, delim[k]);
1531
1508
  if (q == NULL) {
@@ -1562,8 +1539,8 @@ conf_add_server(struct conf *cf, struct command *cmd, void *conf)
1562
1539
  p = q - 1;
1563
1540
  }
1564
1541
 
1565
- if (k != 3) {
1566
- return "has an invalid \"hostname:port:weight [name]\" format string";
1542
+ if (k != delimlen) {
1543
+ return "has an invalid \"hostname:port:weight [name]\"or \"/path/unix_socket:weight [name]\" format string";
1567
1544
  }
1568
1545
 
1569
1546
  pname = value->data;
@@ -1582,9 +1559,11 @@ conf_add_server(struct conf *cf, struct command *cmd, void *conf)
1582
1559
  return "has an invalid weight in \"hostname:port:weight [name]\" format string";
1583
1560
  }
1584
1561
 
1585
- field->port = nc_atoi(port, portlen);
1586
- if (field->port < 0 || !nc_valid_port(field->port)) {
1587
- return "has an invalid port in \"hostname:port:weight [name]\" format string";
1562
+ if (value->data[0] != '/') {
1563
+ field->port = nc_atoi(port, portlen);
1564
+ if (field->port < 0 || !nc_valid_port(field->port)) {
1565
+ return "has an invalid port in \"hostname:port:weight [name]\" format string";
1566
+ }
1588
1567
  }
1589
1568
 
1590
1569
  if (name == NULL) {
@@ -120,7 +120,7 @@ char *conf_set_string(struct conf *cf, struct command *cmd, void *conf);
120
120
  char *conf_set_listen(struct conf *cf, struct command *cmd, void *conf);
121
121
  char *conf_add_server(struct conf *cf, struct command *cmd, void *conf);
122
122
  char *conf_set_num(struct conf *cf, struct command *cmd, void *conf);
123
- char * conf_set_bool(struct conf *cf, struct command *cmd, void *conf);
123
+ char *conf_set_bool(struct conf *cf, struct command *cmd, void *conf);
124
124
  char *conf_set_hash(struct conf *cf, struct command *cmd, void *conf);
125
125
  char *conf_set_distribution(struct conf *cf, struct command *cmd, void *conf);
126
126
  char *conf_set_hashtag(struct conf *cf, struct command *cmd, void *conf);
Binary file
File without changes
File without changes
Binary file
@@ -17,9 +17,6 @@
17
17
 
18
18
  #include <stdlib.h>
19
19
  #include <unistd.h>
20
-
21
- #include <sys/epoll.h>
22
-
23
20
  #include <nc_core.h>
24
21
  #include <nc_event.h>
25
22
  #include <nc_conf.h>
@@ -28,6 +25,10 @@
28
25
 
29
26
  static uint32_t ctx_id; /* context generation */
30
27
 
28
+ /* function prototype for use in core_ctx_create() */
29
+ static void
30
+ core_core(void *arg, uint32_t evflags);
31
+
31
32
  static struct context *
32
33
  core_ctx_create(struct instance *nci)
33
34
  {
@@ -41,12 +42,10 @@ core_ctx_create(struct instance *nci)
41
42
  ctx->id = ++ctx_id;
42
43
  ctx->cf = NULL;
43
44
  ctx->stats = NULL;
45
+ ctx->evb = NULL;
44
46
  array_null(&ctx->pool);
45
- ctx->ep = -1;
46
- ctx->nevent = EVENT_SIZE_HINT;
47
47
  ctx->max_timeout = nci->stats_interval;
48
48
  ctx->timeout = ctx->max_timeout;
49
- ctx->event = NULL;
50
49
 
51
50
  /* parse and create configuration */
52
51
  ctx->cf = conf_create(nci->conf_filename);
@@ -74,8 +73,8 @@ core_ctx_create(struct instance *nci)
74
73
  }
75
74
 
76
75
  /* initialize event handling for client, proxy and server */
77
- status = event_init(ctx, EVENT_SIZE_HINT);
78
- if (status != NC_OK) {
76
+ ctx->evb = evbase_create(NC_EVENT_SIZE, &core_core);
77
+ if (ctx->evb == NULL) {
79
78
  stats_destroy(ctx->stats);
80
79
  server_pool_deinit(&ctx->pool);
81
80
  conf_destroy(ctx->cf);
@@ -87,7 +86,7 @@ core_ctx_create(struct instance *nci)
87
86
  status = server_pool_preconnect(ctx);
88
87
  if (status != NC_OK) {
89
88
  server_pool_disconnect(ctx);
90
- event_deinit(ctx);
89
+ evbase_destroy(ctx->evb);
91
90
  stats_destroy(ctx->stats);
92
91
  server_pool_deinit(&ctx->pool);
93
92
  conf_destroy(ctx->cf);
@@ -99,7 +98,7 @@ core_ctx_create(struct instance *nci)
99
98
  status = proxy_init(ctx);
100
99
  if (status != NC_OK) {
101
100
  server_pool_disconnect(ctx);
102
- event_deinit(ctx);
101
+ evbase_destroy(ctx->evb);
103
102
  stats_destroy(ctx->stats);
104
103
  server_pool_deinit(&ctx->pool);
105
104
  conf_destroy(ctx->cf);
@@ -118,7 +117,7 @@ core_ctx_destroy(struct context *ctx)
118
117
  log_debug(LOG_VVERB, "destroy ctx %p id %"PRIu32"", ctx, ctx->id);
119
118
  proxy_deinit(ctx);
120
119
  server_pool_disconnect(ctx);
121
- event_deinit(ctx);
120
+ evbase_destroy(ctx->evb);
122
121
  stats_destroy(ctx->stats);
123
122
  server_pool_deinit(&ctx->pool);
124
123
  conf_destroy(ctx->cf);
@@ -206,9 +205,9 @@ core_close(struct context *ctx, struct conn *conn)
206
205
  conn->eof, conn->done, conn->recv_bytes, conn->send_bytes,
207
206
  conn->err ? ':' : ' ', conn->err ? strerror(conn->err) : "");
208
207
 
209
- status = event_del_conn(ctx->ep, conn);
208
+ status = event_del_conn(ctx->evb, conn);
210
209
  if (status < 0) {
211
- log_warn("event del conn e %d %c %d failed, ignored: %s", ctx->ep,
210
+ log_warn("event del conn %c %d failed, ignored: %s",
212
211
  type, conn->sd, strerror(errno));
213
212
  }
214
213
 
@@ -277,23 +276,33 @@ core_timeout(struct context *ctx)
277
276
  }
278
277
 
279
278
  static void
280
- core_core(struct context *ctx, struct conn *conn, uint32_t events)
279
+ core_core(void *arg, uint32_t evflags)
281
280
  {
282
281
  rstatus_t status;
282
+ struct conn *conn = (struct conn *) arg;
283
+ struct context *ctx;
283
284
 
284
- log_debug(LOG_VVERB, "event %04"PRIX32" on %c %d", events,
285
+
286
+
287
+ if ((conn->proxy) || (conn->client)) {
288
+ ctx = ((struct server_pool *) (conn -> owner)) -> ctx;
289
+ } else {
290
+ ctx = ((struct server_pool *) (((struct server *) (conn -> owner)) -> owner )) -> ctx;
291
+ }
292
+
293
+ log_debug(LOG_VVERB, "event %04"PRIX32" on %c %d", evflags,
285
294
  conn->client ? 'c' : (conn->proxy ? 'p' : 's'), conn->sd);
286
295
 
287
- conn->events = events;
296
+ conn->events = evflags;
288
297
 
289
298
  /* error takes precedence over read | write */
290
- if (events & EPOLLERR) {
299
+ if (evflags & EV_ERR) {
291
300
  core_error(ctx, conn);
292
301
  return;
293
302
  }
294
303
 
295
304
  /* read takes precedence over write */
296
- if (events & (EPOLLIN | EPOLLHUP)) {
305
+ if (evflags & EV_READ) {
297
306
  status = core_recv(ctx, conn);
298
307
  if (status != NC_OK || conn->done || conn->err) {
299
308
  core_close(ctx, conn);
@@ -301,7 +310,7 @@ core_core(struct context *ctx, struct conn *conn, uint32_t events)
301
310
  }
302
311
  }
303
312
 
304
- if (events & EPOLLOUT) {
313
+ if (evflags & EV_WRITE) {
305
314
  status = core_send(ctx, conn);
306
315
  if (status != NC_OK || conn->done || conn->err) {
307
316
  core_close(ctx, conn);
@@ -315,17 +324,11 @@ core_loop(struct context *ctx)
315
324
  {
316
325
  int i, nsd;
317
326
 
318
- nsd = event_wait(ctx->ep, ctx->event, ctx->nevent, ctx->timeout);
327
+ nsd = event_wait(ctx->evb, ctx->timeout);
319
328
  if (nsd < 0) {
320
329
  return nsd;
321
330
  }
322
331
 
323
- for (i = 0; i < nsd; i++) {
324
- struct epoll_event *ev = &ctx->event[i];
325
-
326
- core_core(ctx, ev->data.ptr, ev->events);
327
- }
328
-
329
332
  core_timeout(ctx);
330
333
 
331
334
  stats_swap(ctx->stats);
@@ -40,10 +40,20 @@
40
40
  # define NC_STATS 0
41
41
  #endif
42
42
 
43
+ #ifdef HAVE_EPOLL
44
+ #define NC_HAVE_EPOLL 1
45
+ #elif HAVE_KQUEUE
46
+ #define NC_HAVE_KQUEUE 1
47
+ #endif
48
+
43
49
  #ifdef HAVE_LITTLE_ENDIAN
44
50
  # define NC_LITTLE_ENDIAN 1
45
51
  #endif
46
52
 
53
+ #ifdef HAVE_BACKTRACE
54
+ #define NC_HAVE_BACKTRACE 1
55
+ #endif
56
+
47
57
  #define NC_OK 0
48
58
  #define NC_ERROR -1
49
59
  #define NC_EAGAIN -2
@@ -101,14 +111,12 @@ struct context {
101
111
  struct stats *stats; /* stats */
102
112
 
103
113
  struct array pool; /* server_pool[] */
104
-
105
- int ep; /* epoll device */
106
- int nevent; /* # epoll event */
114
+ struct evbase *evb;
107
115
  int max_timeout; /* epoll wait max timeout in msec */
108
- int timeout; /* epoll wait timeout in msec */
109
- struct epoll_event *event; /* epoll event */
116
+ int timeout;
110
117
  };
111
118
 
119
+
112
120
  struct instance {
113
121
  struct context *ctx; /* active context */
114
122
  int log_level; /* log level */
Binary file
@@ -16,66 +16,86 @@
16
16
  */
17
17
 
18
18
  #include <unistd.h>
19
- #include <sys/epoll.h>
20
-
21
19
  #include <nc_core.h>
22
20
  #include <nc_event.h>
23
21
 
24
- int
25
- event_init(struct context *ctx, int size)
22
+ #ifdef NC_HAVE_EPOLL
23
+ #include <sys/epoll.h>
24
+
25
+ struct evbase *
26
+ evbase_create(int nevent, void (*callback_fp)(void *, uint32_t))
26
27
  {
28
+
29
+ struct evbase *evb;
27
30
  int status, ep;
28
31
  struct epoll_event *event;
29
32
 
30
- ASSERT(ctx->ep < 0);
31
- ASSERT(ctx->nevent != 0);
32
- ASSERT(ctx->event == NULL);
33
+ if (nevent <= 0) {
34
+ log_error("nevent has to be positive %d", nevent);
35
+ return NULL;
36
+ }
33
37
 
34
- ep = epoll_create(size);
38
+ ep = epoll_create(nevent);
35
39
  if (ep < 0) {
36
- log_error("epoll create of size %d failed: %s", size, strerror(errno));
37
- return -1;
40
+ log_error("epoll create of size %d failed: %s", nevent, strerror(errno));
41
+ return NULL;
38
42
  }
39
43
 
40
- event = nc_calloc(ctx->nevent, sizeof(*ctx->event));
44
+ event = nc_calloc(nevent, sizeof(*event));
41
45
  if (event == NULL) {
42
46
  status = close(ep);
43
47
  if (status < 0) {
44
48
  log_error("close e %d failed, ignored: %s", ep, strerror(errno));
45
49
  }
46
- return -1;
50
+ return NULL;
47
51
  }
48
52
 
49
- ctx->ep = ep;
50
- ctx->event = event;
53
+ evb = nc_alloc(sizeof(*evb));
54
+ if (evb == NULL) {
55
+ nc_free(event);
56
+ status = close(ep);
57
+ if (status < 0) {
58
+ log_error("close e %d failed, ignored: %s", ep, strerror(errno));
59
+ }
60
+ return NULL;
51
61
 
52
- log_debug(LOG_INFO, "e %d with nevent %d timeout %d", ctx->ep,
53
- ctx->nevent, ctx->timeout);
62
+ }
54
63
 
55
- return 0;
64
+ evb->nevent = nevent;
65
+ evb->ep = ep;
66
+ evb->event = event;
67
+ evb->callback_fp = callback_fp;
68
+
69
+ log_debug(LOG_INFO, "e %d with nevent %d", evb->ep,
70
+ evb->nevent);
71
+
72
+ return evb;
56
73
  }
57
74
 
58
75
  void
59
- event_deinit(struct context *ctx)
76
+ evbase_destroy(struct evbase *evb)
60
77
  {
61
78
  int status;
62
79
 
63
- ASSERT(ctx->ep >= 0);
80
+ if (evb == NULL) return;
64
81
 
65
- nc_free(ctx->event);
82
+ ASSERT(evb->ep >= 0);
66
83
 
67
- status = close(ctx->ep);
84
+ nc_free(evb->event);
85
+
86
+ status = close(evb->ep);
68
87
  if (status < 0) {
69
- log_error("close e %d failed, ignored: %s", ctx->ep, strerror(errno));
88
+ log_error("close e %d failed, ignored: %s", evb->ep, strerror(errno));
70
89
  }
71
- ctx->ep = -1;
90
+ nc_free(evb);
72
91
  }
73
92
 
74
93
  int
75
- event_add_out(int ep, struct conn *c)
94
+ event_add_out(struct evbase *evb, struct conn *c)
76
95
  {
77
96
  int status;
78
97
  struct epoll_event event;
98
+ int ep = evb->ep;
79
99
 
80
100
  ASSERT(ep > 0);
81
101
  ASSERT(c != NULL);
@@ -101,10 +121,11 @@ event_add_out(int ep, struct conn *c)
101
121
  }
102
122
 
103
123
  int
104
- event_del_out(int ep, struct conn *c)
124
+ event_del_out(struct evbase *evb, struct conn *c)
105
125
  {
106
126
  int status;
107
127
  struct epoll_event event;
128
+ int ep = evb->ep;
108
129
 
109
130
  ASSERT(ep > 0);
110
131
  ASSERT(c != NULL);
@@ -130,10 +151,11 @@ event_del_out(int ep, struct conn *c)
130
151
  }
131
152
 
132
153
  int
133
- event_add_conn(int ep, struct conn *c)
154
+ event_add_conn(struct evbase *evb, struct conn *c)
134
155
  {
135
156
  int status;
136
157
  struct epoll_event event;
158
+ int ep = evb->ep;
137
159
 
138
160
  ASSERT(ep > 0);
139
161
  ASSERT(c != NULL);
@@ -155,9 +177,10 @@ event_add_conn(int ep, struct conn *c)
155
177
  }
156
178
 
157
179
  int
158
- event_del_conn(int ep, struct conn *c)
180
+ event_del_conn(struct evbase *evb, struct conn *c)
159
181
  {
160
182
  int status;
183
+ int ep = evb->ep;
161
184
 
162
185
  ASSERT(ep > 0);
163
186
  ASSERT(c != NULL);
@@ -176,9 +199,14 @@ event_del_conn(int ep, struct conn *c)
176
199
  }
177
200
 
178
201
  int
179
- event_wait(int ep, struct epoll_event *event, int nevent, int timeout)
202
+ event_wait(struct evbase *evb, int timeout)
180
203
  {
181
- int nsd;
204
+ int nsd, i;
205
+ uint32_t evflags = 0;
206
+ int ep = evb->ep;
207
+ struct epoll_event *event = evb->event;
208
+ int nevent = evb->nevent;
209
+ void (*callback_fp)(void *, uint32_t) = evb->callback_fp;
182
210
 
183
211
  ASSERT(ep > 0);
184
212
  ASSERT(event != NULL);
@@ -187,6 +215,22 @@ event_wait(int ep, struct epoll_event *event, int nevent, int timeout)
187
215
  for (;;) {
188
216
  nsd = epoll_wait(ep, event, nevent, timeout);
189
217
  if (nsd > 0) {
218
+ for (i = 0; i < nsd; i++) {
219
+ struct epoll_event *ev = &evb->event[i];
220
+
221
+ evflags = 0;
222
+ if (ev->events & EPOLLERR)
223
+ evflags |= EV_ERR;
224
+
225
+ if (ev->events & EPOLLIN)
226
+ evflags |= EV_READ;
227
+
228
+ if (ev->events & EPOLLOUT)
229
+ evflags |= EV_WRITE;
230
+
231
+ if (callback_fp != NULL)
232
+ (*callback_fp)((void *) ev->data.ptr, evflags);
233
+ }
190
234
  return nsd;
191
235
  }
192
236
 
@@ -209,6 +253,26 @@ event_wait(int ep, struct epoll_event *event, int nevent, int timeout)
209
253
 
210
254
  return -1;
211
255
  }
212
-
213
256
  NOT_REACHED();
214
257
  }
258
+
259
+ int
260
+ event_add_st(struct evbase *evb, int fd)
261
+ {
262
+ int status;
263
+ struct epoll_event ev;
264
+
265
+ ev.data.fd = fd;
266
+ ev.events = EPOLLIN;
267
+
268
+ status = epoll_ctl(evb->ep, EPOLL_CTL_ADD, fd, &ev);
269
+ if (status < 0) {
270
+ log_error("epoll ctl on e %d sd %d failed: %s", evb->ep, fd,
271
+ strerror(errno));
272
+ return status;
273
+ }
274
+
275
+ return status;
276
+ }
277
+
278
+ #endif /* NC_HAVE_EPOLL */