libcouchbase 0.0.1

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 (561) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +18 -0
  3. data/.gitmodules +3 -0
  4. data/.rspec +1 -0
  5. data/.travis.yml +35 -0
  6. data/Gemfile +4 -0
  7. data/LICENSE +24 -0
  8. data/README.md +389 -0
  9. data/Rakefile +75 -0
  10. data/ext/README.md +6 -0
  11. data/ext/Rakefile +20 -0
  12. data/ext/libcouchbase/.gitignore +130 -0
  13. data/ext/libcouchbase/.travis.yml +19 -0
  14. data/ext/libcouchbase/CMakeLists.txt +429 -0
  15. data/ext/libcouchbase/CONTRIBUTING.md +124 -0
  16. data/ext/libcouchbase/LICENSE +202 -0
  17. data/ext/libcouchbase/README.markdown +163 -0
  18. data/ext/libcouchbase/RELEASE_NOTES.markdown +2691 -0
  19. data/ext/libcouchbase/cmake/Modules/ConfigureDtrace.cmake +27 -0
  20. data/ext/libcouchbase/cmake/Modules/CopyPDB.cmake +42 -0
  21. data/ext/libcouchbase/cmake/Modules/DistScript.cmake +17 -0
  22. data/ext/libcouchbase/cmake/Modules/DownloadLcbDep.cmake +20 -0
  23. data/ext/libcouchbase/cmake/Modules/FindCouchbaseHdrHistogram.cmake +15 -0
  24. data/ext/libcouchbase/cmake/Modules/FindCouchbaseLibev.cmake +73 -0
  25. data/ext/libcouchbase/cmake/Modules/FindCouchbaseLibevent.cmake +52 -0
  26. data/ext/libcouchbase/cmake/Modules/FindCouchbaseLibuv.cmake +56 -0
  27. data/ext/libcouchbase/cmake/Modules/FindCouchbaseSnappy.cmake +11 -0
  28. data/ext/libcouchbase/cmake/Modules/GenerateConfigDotH.cmake +29 -0
  29. data/ext/libcouchbase/cmake/Modules/GetLibcouchbaseFlags.cmake +133 -0
  30. data/ext/libcouchbase/cmake/Modules/GetPlatformCCInfo.cmake +45 -0
  31. data/ext/libcouchbase/cmake/Modules/GetVersionInfo.cmake +70 -0
  32. data/ext/libcouchbase/cmake/config-cmake.h.in +60 -0
  33. data/ext/libcouchbase/cmake/configure +357 -0
  34. data/ext/libcouchbase/cmake/defs.mk.in +8 -0
  35. data/ext/libcouchbase/cmake/dtrace-instr-link.pl +38 -0
  36. data/ext/libcouchbase/cmake/source_files.cmake +73 -0
  37. data/ext/libcouchbase/configure.pl +1 -0
  38. data/ext/libcouchbase/contrib/cJSON/cJSON.c +624 -0
  39. data/ext/libcouchbase/contrib/cJSON/cJSON.h +158 -0
  40. data/ext/libcouchbase/contrib/cbsasl/CMakeLists.txt +9 -0
  41. data/ext/libcouchbase/contrib/cbsasl/COPYING +202 -0
  42. data/ext/libcouchbase/contrib/cbsasl/include/cbsasl/cbsasl.h +217 -0
  43. data/ext/libcouchbase/contrib/cbsasl/src/client.c +205 -0
  44. data/ext/libcouchbase/contrib/cbsasl/src/common.c +46 -0
  45. data/ext/libcouchbase/contrib/cbsasl/src/cram-md5/hmac.c +67 -0
  46. data/ext/libcouchbase/contrib/cbsasl/src/cram-md5/hmac.h +33 -0
  47. data/ext/libcouchbase/contrib/cbsasl/src/cram-md5/md5.c +296 -0
  48. data/ext/libcouchbase/contrib/cbsasl/src/cram-md5/md5.h +45 -0
  49. data/ext/libcouchbase/contrib/cbsasl/src/hash.c +573 -0
  50. data/ext/libcouchbase/contrib/cbsasl/src/hash.h +15 -0
  51. data/ext/libcouchbase/contrib/cbsasl/src/util.h +31 -0
  52. data/ext/libcouchbase/contrib/cliopts/CMakeLists.txt +2 -0
  53. data/ext/libcouchbase/contrib/cliopts/cliopts.c +747 -0
  54. data/ext/libcouchbase/contrib/cliopts/cliopts.h +493 -0
  55. data/ext/libcouchbase/contrib/genhash/genhash.c +372 -0
  56. data/ext/libcouchbase/contrib/genhash/genhash.h +235 -0
  57. data/ext/libcouchbase/contrib/gtest-1.7.0/CHANGES +157 -0
  58. data/ext/libcouchbase/contrib/gtest-1.7.0/CMakeLists.txt +252 -0
  59. data/ext/libcouchbase/contrib/gtest-1.7.0/CONTRIBUTORS +37 -0
  60. data/ext/libcouchbase/contrib/gtest-1.7.0/LICENSE +28 -0
  61. data/ext/libcouchbase/contrib/gtest-1.7.0/MINIFY.sh +15 -0
  62. data/ext/libcouchbase/contrib/gtest-1.7.0/README +435 -0
  63. data/ext/libcouchbase/contrib/gtest-1.7.0/cmake/internal_utils.cmake +227 -0
  64. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/gtest-death-test.h +294 -0
  65. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/gtest-message.h +250 -0
  66. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/gtest-param-test.h +1421 -0
  67. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/gtest-param-test.h.pump +487 -0
  68. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/gtest-printers.h +855 -0
  69. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/gtest-spi.h +232 -0
  70. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/gtest-test-part.h +179 -0
  71. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/gtest-typed-test.h +259 -0
  72. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/gtest.h +2291 -0
  73. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/gtest_pred_impl.h +358 -0
  74. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/gtest_prod.h +58 -0
  75. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/internal/gtest-death-test-internal.h +319 -0
  76. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/internal/gtest-filepath.h +206 -0
  77. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/internal/gtest-internal.h +1158 -0
  78. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/internal/gtest-linked_ptr.h +233 -0
  79. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/internal/gtest-param-util-generated.h +5143 -0
  80. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/internal/gtest-param-util-generated.h.pump +301 -0
  81. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/internal/gtest-param-util.h +619 -0
  82. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/internal/gtest-port.h +1947 -0
  83. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/internal/gtest-string.h +167 -0
  84. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/internal/gtest-tuple.h +1012 -0
  85. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/internal/gtest-tuple.h.pump +339 -0
  86. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/internal/gtest-type-util.h +3331 -0
  87. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/internal/gtest-type-util.h.pump +297 -0
  88. data/ext/libcouchbase/contrib/gtest-1.7.0/src/gtest-all.cc +48 -0
  89. data/ext/libcouchbase/contrib/gtest-1.7.0/src/gtest-death-test.cc +1344 -0
  90. data/ext/libcouchbase/contrib/gtest-1.7.0/src/gtest-filepath.cc +382 -0
  91. data/ext/libcouchbase/contrib/gtest-1.7.0/src/gtest-internal-inl.h +1218 -0
  92. data/ext/libcouchbase/contrib/gtest-1.7.0/src/gtest-port.cc +805 -0
  93. data/ext/libcouchbase/contrib/gtest-1.7.0/src/gtest-printers.cc +363 -0
  94. data/ext/libcouchbase/contrib/gtest-1.7.0/src/gtest-test-part.cc +110 -0
  95. data/ext/libcouchbase/contrib/gtest-1.7.0/src/gtest-typed-test.cc +110 -0
  96. data/ext/libcouchbase/contrib/gtest-1.7.0/src/gtest.cc +5015 -0
  97. data/ext/libcouchbase/contrib/gtest-1.7.0/src/gtest_main.cc +38 -0
  98. data/ext/libcouchbase/contrib/http_parser/LICENSE-MIT +23 -0
  99. data/ext/libcouchbase/contrib/http_parser/README.md +178 -0
  100. data/ext/libcouchbase/contrib/http_parser/http_parser.c +2060 -0
  101. data/ext/libcouchbase/contrib/http_parser/http_parser.h +321 -0
  102. data/ext/libcouchbase/contrib/jsonsl/LICENSE +20 -0
  103. data/ext/libcouchbase/contrib/jsonsl/jsonsl.c +1452 -0
  104. data/ext/libcouchbase/contrib/jsonsl/jsonsl.h +971 -0
  105. data/ext/libcouchbase/contrib/lcb-jsoncpp/CMakeLists.txt +6 -0
  106. data/ext/libcouchbase/contrib/lcb-jsoncpp/LICENSE +55 -0
  107. data/ext/libcouchbase/contrib/lcb-jsoncpp/lcb-jsoncpp-forwards.h +255 -0
  108. data/ext/libcouchbase/contrib/lcb-jsoncpp/lcb-jsoncpp.cpp +4892 -0
  109. data/ext/libcouchbase/contrib/lcb-jsoncpp/lcb-jsoncpp.h +1961 -0
  110. data/ext/libcouchbase/contrib/snappy/CMakeLists.txt +8 -0
  111. data/ext/libcouchbase/contrib/snappy/COPYING +28 -0
  112. data/ext/libcouchbase/contrib/snappy/snappy-c.cc +90 -0
  113. data/ext/libcouchbase/contrib/snappy/snappy-c.h +138 -0
  114. data/ext/libcouchbase/contrib/snappy/snappy-internal.h +150 -0
  115. data/ext/libcouchbase/contrib/snappy/snappy-lcb-msvc.h +5 -0
  116. data/ext/libcouchbase/contrib/snappy/snappy-sinksource.cc +71 -0
  117. data/ext/libcouchbase/contrib/snappy/snappy-sinksource.h +137 -0
  118. data/ext/libcouchbase/contrib/snappy/snappy-stubs-internal.cc +42 -0
  119. data/ext/libcouchbase/contrib/snappy/snappy-stubs-internal.h +491 -0
  120. data/ext/libcouchbase/contrib/snappy/snappy-stubs-public.h +98 -0
  121. data/ext/libcouchbase/contrib/snappy/snappy.cc +1307 -0
  122. data/ext/libcouchbase/contrib/snappy/snappy.h +184 -0
  123. data/ext/libcouchbase/contrib/win32-defs/iocpdefs.h +133 -0
  124. data/ext/libcouchbase/contrib/win32-defs/mingwdefs.h +4396 -0
  125. data/ext/libcouchbase/contrib/win32-defs/win_stdint.h +258 -0
  126. data/ext/libcouchbase/example/CMakeLists.txt +37 -0
  127. data/ext/libcouchbase/example/README.markdown +47 -0
  128. data/ext/libcouchbase/example/db/db.c +167 -0
  129. data/ext/libcouchbase/example/db/vb.c +227 -0
  130. data/ext/libcouchbase/example/instancepool/main.cc +102 -0
  131. data/ext/libcouchbase/example/instancepool/pool.cc +102 -0
  132. data/ext/libcouchbase/example/instancepool/pool.h +69 -0
  133. data/ext/libcouchbase/example/libeventdirect/main.c +148 -0
  134. data/ext/libcouchbase/example/mcc/mcc.cc +246 -0
  135. data/ext/libcouchbase/example/minimal/minimal.c +130 -0
  136. data/ext/libcouchbase/example/observe/observe.c +146 -0
  137. data/ext/libcouchbase/example/subdoc/subdoc-multi.cc +132 -0
  138. data/ext/libcouchbase/example/subdoc/subdoc-simple.cc +191 -0
  139. data/ext/libcouchbase/example/tick/tick.c +119 -0
  140. data/ext/libcouchbase/example/views/views-example.cc +83 -0
  141. data/ext/libcouchbase/include/libcouchbase/_cxxwrap.h +150 -0
  142. data/ext/libcouchbase/include/libcouchbase/api-legacy.h +1689 -0
  143. data/ext/libcouchbase/include/libcouchbase/api3.h +2 -0
  144. data/ext/libcouchbase/include/libcouchbase/assert.h +44 -0
  145. data/ext/libcouchbase/include/libcouchbase/cbft.h +109 -0
  146. data/ext/libcouchbase/include/libcouchbase/cntl-private.h +356 -0
  147. data/ext/libcouchbase/include/libcouchbase/cntl.h +937 -0
  148. data/ext/libcouchbase/include/libcouchbase/configuration.h.in +23 -0
  149. data/ext/libcouchbase/include/libcouchbase/couchbase.h +3677 -0
  150. data/ext/libcouchbase/include/libcouchbase/deprecated.h +300 -0
  151. data/ext/libcouchbase/include/libcouchbase/error.h +595 -0
  152. data/ext/libcouchbase/include/libcouchbase/http.h +1 -0
  153. data/ext/libcouchbase/include/libcouchbase/iops.h +1050 -0
  154. data/ext/libcouchbase/include/libcouchbase/ixmgmt.h +263 -0
  155. data/ext/libcouchbase/include/libcouchbase/kvbuf.h +132 -0
  156. data/ext/libcouchbase/include/libcouchbase/n1ql.h +364 -0
  157. data/ext/libcouchbase/include/libcouchbase/pktfwd.h +270 -0
  158. data/ext/libcouchbase/include/libcouchbase/plugins/io/bsdio-inl.c +367 -0
  159. data/ext/libcouchbase/include/libcouchbase/plugins/io/wsaerr-inl.c +76 -0
  160. data/ext/libcouchbase/include/libcouchbase/plugins/io/wsaerr.h +199 -0
  161. data/ext/libcouchbase/include/libcouchbase/subdoc.h +312 -0
  162. data/ext/libcouchbase/include/libcouchbase/sysdefs.h +98 -0
  163. data/ext/libcouchbase/include/libcouchbase/vbucket.h +643 -0
  164. data/ext/libcouchbase/include/libcouchbase/views.h +298 -0
  165. data/ext/libcouchbase/include/libcouchbase/visibility.h +65 -0
  166. data/ext/libcouchbase/include/memcached/COPYING +30 -0
  167. data/ext/libcouchbase/include/memcached/README +10 -0
  168. data/ext/libcouchbase/include/memcached/protocol_binary.h +1916 -0
  169. data/ext/libcouchbase/include/memcached/vbucket.h +42 -0
  170. data/ext/libcouchbase/packaging/README +7 -0
  171. data/ext/libcouchbase/packaging/abicheck/.gitignore +4 -0
  172. data/ext/libcouchbase/packaging/abicheck/Makefile +17 -0
  173. data/ext/libcouchbase/packaging/abicheck/README.md +27 -0
  174. data/ext/libcouchbase/packaging/abicheck/template.xml +3 -0
  175. data/ext/libcouchbase/packaging/deb/compat +1 -0
  176. data/ext/libcouchbase/packaging/deb/control +73 -0
  177. data/ext/libcouchbase/packaging/deb/copyright +10 -0
  178. data/ext/libcouchbase/packaging/deb/libcouchbase-dev.docs +3 -0
  179. data/ext/libcouchbase/packaging/deb/package.mk +31 -0
  180. data/ext/libcouchbase/packaging/deb/rules +46 -0
  181. data/ext/libcouchbase/packaging/deb/source/format +1 -0
  182. data/ext/libcouchbase/packaging/distinfo/README +1 -0
  183. data/ext/libcouchbase/packaging/distinfo/distinfo.cmake.in +4 -0
  184. data/ext/libcouchbase/packaging/dllversion.rc.in +39 -0
  185. data/ext/libcouchbase/packaging/libcouchbase.pc.in +10 -0
  186. data/ext/libcouchbase/packaging/nuget/libcouchbase.autopkg +76 -0
  187. data/ext/libcouchbase/packaging/parse-git-describe.pl +166 -0
  188. data/ext/libcouchbase/packaging/rpm/libcouchbase.spec.in +108 -0
  189. data/ext/libcouchbase/packaging/rpm/package.mk +40 -0
  190. data/ext/libcouchbase/plugins/io/iocp/CMakeLists.txt +9 -0
  191. data/ext/libcouchbase/plugins/io/iocp/iocp_iops.c +466 -0
  192. data/ext/libcouchbase/plugins/io/iocp/iocp_iops.h +217 -0
  193. data/ext/libcouchbase/plugins/io/iocp/iocp_loop.c +295 -0
  194. data/ext/libcouchbase/plugins/io/iocp/iocp_timer.c +79 -0
  195. data/ext/libcouchbase/plugins/io/iocp/iocp_util.c +229 -0
  196. data/ext/libcouchbase/plugins/io/libev/CMakeLists.txt +29 -0
  197. data/ext/libcouchbase/plugins/io/libev/libev_io_opts.h +65 -0
  198. data/ext/libcouchbase/plugins/io/libev/plugin-libev.c +289 -0
  199. data/ext/libcouchbase/plugins/io/libevent/CMakeLists.txt +29 -0
  200. data/ext/libcouchbase/plugins/io/libevent/libevent_io_opts.h +67 -0
  201. data/ext/libcouchbase/plugins/io/libevent/plugin-libevent.c +292 -0
  202. data/ext/libcouchbase/plugins/io/libuv/CMakeLists.txt +42 -0
  203. data/ext/libcouchbase/plugins/io/libuv/libuv_compat.h +212 -0
  204. data/ext/libcouchbase/plugins/io/libuv/libuv_io_opts.h +118 -0
  205. data/ext/libcouchbase/plugins/io/libuv/plugin-internal.h +148 -0
  206. data/ext/libcouchbase/plugins/io/libuv/plugin-libuv.c +648 -0
  207. data/ext/libcouchbase/plugins/io/select/CMakeLists.txt +11 -0
  208. data/ext/libcouchbase/plugins/io/select/plugin-select.c +448 -0
  209. data/ext/libcouchbase/plugins/io/select/select_io_opts.h +39 -0
  210. data/ext/libcouchbase/src/README.md +103 -0
  211. data/ext/libcouchbase/src/aspend.h +106 -0
  212. data/ext/libcouchbase/src/auth.cc +74 -0
  213. data/ext/libcouchbase/src/auth.h +54 -0
  214. data/ext/libcouchbase/src/bootstrap.c +269 -0
  215. data/ext/libcouchbase/src/bootstrap.h +129 -0
  216. data/ext/libcouchbase/src/bucketconfig/bc_cccp.c +495 -0
  217. data/ext/libcouchbase/src/bucketconfig/bc_file.c +347 -0
  218. data/ext/libcouchbase/src/bucketconfig/bc_http.c +630 -0
  219. data/ext/libcouchbase/src/bucketconfig/bc_http.h +82 -0
  220. data/ext/libcouchbase/src/bucketconfig/bc_mcraw.c +150 -0
  221. data/ext/libcouchbase/src/bucketconfig/clconfig.h +681 -0
  222. data/ext/libcouchbase/src/bucketconfig/confmon.c +474 -0
  223. data/ext/libcouchbase/src/callbacks.c +378 -0
  224. data/ext/libcouchbase/src/cbft.cc +210 -0
  225. data/ext/libcouchbase/src/cntl.cc +847 -0
  226. data/ext/libcouchbase/src/config_static.h +159 -0
  227. data/ext/libcouchbase/src/connspec.cc +462 -0
  228. data/ext/libcouchbase/src/connspec.h +105 -0
  229. data/ext/libcouchbase/src/ctx-log-inl.h +27 -0
  230. data/ext/libcouchbase/src/dump.c +98 -0
  231. data/ext/libcouchbase/src/getconfig.c +100 -0
  232. data/ext/libcouchbase/src/gethrtime.c +109 -0
  233. data/ext/libcouchbase/src/handler.c +922 -0
  234. data/ext/libcouchbase/src/hashset.c +164 -0
  235. data/ext/libcouchbase/src/hashset.h +86 -0
  236. data/ext/libcouchbase/src/hashtable.c +75 -0
  237. data/ext/libcouchbase/src/hdr_timings.c +92 -0
  238. data/ext/libcouchbase/src/hostlist.cc +301 -0
  239. data/ext/libcouchbase/src/hostlist.h +171 -0
  240. data/ext/libcouchbase/src/http/http-priv.h +307 -0
  241. data/ext/libcouchbase/src/http/http.cc +633 -0
  242. data/ext/libcouchbase/src/http/http.h +34 -0
  243. data/ext/libcouchbase/src/http/http_io.cc +307 -0
  244. data/ext/libcouchbase/src/instance.cc +722 -0
  245. data/ext/libcouchbase/src/internal.h +244 -0
  246. data/ext/libcouchbase/src/iofactory.c +575 -0
  247. data/ext/libcouchbase/src/jsparse/parser.cc +519 -0
  248. data/ext/libcouchbase/src/jsparse/parser.h +173 -0
  249. data/ext/libcouchbase/src/lcbht/lcbht.c +282 -0
  250. data/ext/libcouchbase/src/lcbht/lcbht.h +199 -0
  251. data/ext/libcouchbase/src/lcbio/connect.c +557 -0
  252. data/ext/libcouchbase/src/lcbio/connect.h +364 -0
  253. data/ext/libcouchbase/src/lcbio/ctx.c +611 -0
  254. data/ext/libcouchbase/src/lcbio/ctx.h +405 -0
  255. data/ext/libcouchbase/src/lcbio/iotable.c +290 -0
  256. data/ext/libcouchbase/src/lcbio/iotable.h +84 -0
  257. data/ext/libcouchbase/src/lcbio/ioutils.c +350 -0
  258. data/ext/libcouchbase/src/lcbio/ioutils.h +203 -0
  259. data/ext/libcouchbase/src/lcbio/lcbio.h +51 -0
  260. data/ext/libcouchbase/src/lcbio/manager.c +584 -0
  261. data/ext/libcouchbase/src/lcbio/manager.h +156 -0
  262. data/ext/libcouchbase/src/lcbio/protoctx.c +84 -0
  263. data/ext/libcouchbase/src/lcbio/rw-inl.h +115 -0
  264. data/ext/libcouchbase/src/lcbio/ssl.h +149 -0
  265. data/ext/libcouchbase/src/lcbio/timer-ng.h +179 -0
  266. data/ext/libcouchbase/src/lcbio/timer.c +132 -0
  267. data/ext/libcouchbase/src/legacy.c +430 -0
  268. data/ext/libcouchbase/src/list.c +144 -0
  269. data/ext/libcouchbase/src/list.h +127 -0
  270. data/ext/libcouchbase/src/logging.c +244 -0
  271. data/ext/libcouchbase/src/logging.h +86 -0
  272. data/ext/libcouchbase/src/mc/compress.c +90 -0
  273. data/ext/libcouchbase/src/mc/compress.h +61 -0
  274. data/ext/libcouchbase/src/mc/forward.c +186 -0
  275. data/ext/libcouchbase/src/mc/forward.h +90 -0
  276. data/ext/libcouchbase/src/mc/iovcursor-inl.h +279 -0
  277. data/ext/libcouchbase/src/mc/iovcursor.h +66 -0
  278. data/ext/libcouchbase/src/mc/mcreq-flush-inl.h +111 -0
  279. data/ext/libcouchbase/src/mc/mcreq.c +954 -0
  280. data/ext/libcouchbase/src/mc/mcreq.h +977 -0
  281. data/ext/libcouchbase/src/mcserver/mcserver.c +784 -0
  282. data/ext/libcouchbase/src/mcserver/mcserver.h +121 -0
  283. data/ext/libcouchbase/src/mcserver/negotiate.c +656 -0
  284. data/ext/libcouchbase/src/mcserver/negotiate.h +119 -0
  285. data/ext/libcouchbase/src/n1ql/ixmgmt.cc +860 -0
  286. data/ext/libcouchbase/src/n1ql/n1ql-internal.h +22 -0
  287. data/ext/libcouchbase/src/n1ql/n1ql.cc +729 -0
  288. data/ext/libcouchbase/src/n1ql/params.cc +215 -0
  289. data/ext/libcouchbase/src/netbuf/netbuf-defs.h +89 -0
  290. data/ext/libcouchbase/src/netbuf/netbuf-mblock.h +235 -0
  291. data/ext/libcouchbase/src/netbuf/netbuf.c +929 -0
  292. data/ext/libcouchbase/src/netbuf/netbuf.h +452 -0
  293. data/ext/libcouchbase/src/newconfig.c +385 -0
  294. data/ext/libcouchbase/src/nodeinfo.cc +194 -0
  295. data/ext/libcouchbase/src/operations/cbflush.c +71 -0
  296. data/ext/libcouchbase/src/operations/counter.c +116 -0
  297. data/ext/libcouchbase/src/operations/durability-cas.c +224 -0
  298. data/ext/libcouchbase/src/operations/durability-seqno.c +157 -0
  299. data/ext/libcouchbase/src/operations/durability.c +668 -0
  300. data/ext/libcouchbase/src/operations/durability_internal.h +199 -0
  301. data/ext/libcouchbase/src/operations/get.c +409 -0
  302. data/ext/libcouchbase/src/operations/observe-seqno.c +96 -0
  303. data/ext/libcouchbase/src/operations/observe.c +340 -0
  304. data/ext/libcouchbase/src/operations/pktfwd.c +86 -0
  305. data/ext/libcouchbase/src/operations/remove.c +83 -0
  306. data/ext/libcouchbase/src/operations/stats.c +461 -0
  307. data/ext/libcouchbase/src/operations/store.c +360 -0
  308. data/ext/libcouchbase/src/operations/subdoc.cc +510 -0
  309. data/ext/libcouchbase/src/operations/touch.c +81 -0
  310. data/ext/libcouchbase/src/packetutils.c +60 -0
  311. data/ext/libcouchbase/src/packetutils.h +147 -0
  312. data/ext/libcouchbase/src/probes.d +211 -0
  313. data/ext/libcouchbase/src/rdb/bigalloc.c +225 -0
  314. data/ext/libcouchbase/src/rdb/bigalloc.h +73 -0
  315. data/ext/libcouchbase/src/rdb/chunkalloc.c +174 -0
  316. data/ext/libcouchbase/src/rdb/libcalloc.c +94 -0
  317. data/ext/libcouchbase/src/rdb/rope.c +419 -0
  318. data/ext/libcouchbase/src/rdb/rope.h +488 -0
  319. data/ext/libcouchbase/src/retrychk.c +113 -0
  320. data/ext/libcouchbase/src/retryq.c +424 -0
  321. data/ext/libcouchbase/src/retryq.h +157 -0
  322. data/ext/libcouchbase/src/ringbuffer.c +442 -0
  323. data/ext/libcouchbase/src/ringbuffer.h +100 -0
  324. data/ext/libcouchbase/src/settings.c +95 -0
  325. data/ext/libcouchbase/src/settings.h +188 -0
  326. data/ext/libcouchbase/src/simplestring.c +211 -0
  327. data/ext/libcouchbase/src/simplestring.h +228 -0
  328. data/ext/libcouchbase/src/sllist-inl.h +197 -0
  329. data/ext/libcouchbase/src/sllist.h +76 -0
  330. data/ext/libcouchbase/src/ssl/CMakeLists.txt +23 -0
  331. data/ext/libcouchbase/src/ssl/ssl_c.c +415 -0
  332. data/ext/libcouchbase/src/ssl/ssl_common.c +454 -0
  333. data/ext/libcouchbase/src/ssl/ssl_e.c +408 -0
  334. data/ext/libcouchbase/src/ssl/ssl_iot_common.h +180 -0
  335. data/ext/libcouchbase/src/ssobuf.h +82 -0
  336. data/ext/libcouchbase/src/strcodecs/base64.c +123 -0
  337. data/ext/libcouchbase/src/strcodecs/strcodecs.h +285 -0
  338. data/ext/libcouchbase/src/timings.c +208 -0
  339. data/ext/libcouchbase/src/trace.h +105 -0
  340. data/ext/libcouchbase/src/utilities.c +171 -0
  341. data/ext/libcouchbase/src/vbucket/CMakeLists.txt +2 -0
  342. data/ext/libcouchbase/src/vbucket/aliases.h +35 -0
  343. data/ext/libcouchbase/src/vbucket/crc32.h +83 -0
  344. data/ext/libcouchbase/src/vbucket/hash.h +30 -0
  345. data/ext/libcouchbase/src/vbucket/json-inl.h +112 -0
  346. data/ext/libcouchbase/src/vbucket/ketama.c +66 -0
  347. data/ext/libcouchbase/src/vbucket/rfc1321/global.h +32 -0
  348. data/ext/libcouchbase/src/vbucket/rfc1321/md5.h +35 -0
  349. data/ext/libcouchbase/src/vbucket/rfc1321/md5c-inl.h +335 -0
  350. data/ext/libcouchbase/src/vbucket/vbucket.c +1543 -0
  351. data/ext/libcouchbase/src/views/docreq.c +194 -0
  352. data/ext/libcouchbase/src/views/docreq.h +83 -0
  353. data/ext/libcouchbase/src/views/viewreq.c +358 -0
  354. data/ext/libcouchbase/src/views/viewreq.h +36 -0
  355. data/ext/libcouchbase/src/wait.c +161 -0
  356. data/ext/libcouchbase/tests/CMakeLists.txt +140 -0
  357. data/ext/libcouchbase/tests/basic/t_base64.cc +81 -0
  358. data/ext/libcouchbase/tests/basic/t_ccbc103.cc +95 -0
  359. data/ext/libcouchbase/tests/basic/t_connstr.cc +404 -0
  360. data/ext/libcouchbase/tests/basic/t_creds.cc +32 -0
  361. data/ext/libcouchbase/tests/basic/t_ctlcodes.cc +92 -0
  362. data/ext/libcouchbase/tests/basic/t_hashset.cc +262 -0
  363. data/ext/libcouchbase/tests/basic/t_host.cc +198 -0
  364. data/ext/libcouchbase/tests/basic/t_jsparse.cc +137 -0
  365. data/ext/libcouchbase/tests/basic/t_jsparse.h +589 -0
  366. data/ext/libcouchbase/tests/basic/t_list.cc +155 -0
  367. data/ext/libcouchbase/tests/basic/t_logger.cc +65 -0
  368. data/ext/libcouchbase/tests/basic/t_misc.cc +24 -0
  369. data/ext/libcouchbase/tests/basic/t_n1qlstrings.cc +18 -0
  370. data/ext/libcouchbase/tests/basic/t_netbuf.cc +446 -0
  371. data/ext/libcouchbase/tests/basic/t_packet.cc +222 -0
  372. data/ext/libcouchbase/tests/basic/t_ringbuffer.cc +278 -0
  373. data/ext/libcouchbase/tests/basic/t_slist.cc +429 -0
  374. data/ext/libcouchbase/tests/basic/t_strerror.cc +64 -0
  375. data/ext/libcouchbase/tests/basic/t_string.cc +112 -0
  376. data/ext/libcouchbase/tests/basic/t_urlencode.cc +132 -0
  377. data/ext/libcouchbase/tests/check-all.cc +608 -0
  378. data/ext/libcouchbase/tests/htparse/t_basic.cc +193 -0
  379. data/ext/libcouchbase/tests/ioserver/connection.cc +166 -0
  380. data/ext/libcouchbase/tests/ioserver/future.cc +50 -0
  381. data/ext/libcouchbase/tests/ioserver/ioserver.cc +104 -0
  382. data/ext/libcouchbase/tests/ioserver/ioserver.h +478 -0
  383. data/ext/libcouchbase/tests/ioserver/socket.cc +88 -0
  384. data/ext/libcouchbase/tests/ioserver/ssl_connection.cc +145 -0
  385. data/ext/libcouchbase/tests/ioserver/threads-pthreads.cc +119 -0
  386. data/ext/libcouchbase/tests/ioserver/threads-win32.cc +117 -0
  387. data/ext/libcouchbase/tests/ioserver/threads.h +66 -0
  388. data/ext/libcouchbase/tests/iotests/iotests.h +15 -0
  389. data/ext/libcouchbase/tests/iotests/mock-environment.cc +524 -0
  390. data/ext/libcouchbase/tests/iotests/mock-environment.h +385 -0
  391. data/ext/libcouchbase/tests/iotests/mock-unit-test.cc +67 -0
  392. data/ext/libcouchbase/tests/iotests/mock-unit-test.h +61 -0
  393. data/ext/libcouchbase/tests/iotests/serverparams.h +76 -0
  394. data/ext/libcouchbase/tests/iotests/t_arithmetic.cc +143 -0
  395. data/ext/libcouchbase/tests/iotests/t_behavior.cc +226 -0
  396. data/ext/libcouchbase/tests/iotests/t_configcache.cc +117 -0
  397. data/ext/libcouchbase/tests/iotests/t_confmon.cc +241 -0
  398. data/ext/libcouchbase/tests/iotests/t_durability.cc +1059 -0
  399. data/ext/libcouchbase/tests/iotests/t_forward.cc +110 -0
  400. data/ext/libcouchbase/tests/iotests/t_get.cc +512 -0
  401. data/ext/libcouchbase/tests/iotests/t_http.cc +438 -0
  402. data/ext/libcouchbase/tests/iotests/t_iops.cc +175 -0
  403. data/ext/libcouchbase/tests/iotests/t_lock.cc +275 -0
  404. data/ext/libcouchbase/tests/iotests/t_misc.cc +713 -0
  405. data/ext/libcouchbase/tests/iotests/t_mutate.cc +609 -0
  406. data/ext/libcouchbase/tests/iotests/t_n1ql.cc +270 -0
  407. data/ext/libcouchbase/tests/iotests/t_netfail.cc +654 -0
  408. data/ext/libcouchbase/tests/iotests/t_obseqno.cc +157 -0
  409. data/ext/libcouchbase/tests/iotests/t_regression.cc +321 -0
  410. data/ext/libcouchbase/tests/iotests/t_sched.cc +88 -0
  411. data/ext/libcouchbase/tests/iotests/t_serverops.cc +230 -0
  412. data/ext/libcouchbase/tests/iotests/t_smoke.cc +528 -0
  413. data/ext/libcouchbase/tests/iotests/t_subdoc.cc +822 -0
  414. data/ext/libcouchbase/tests/iotests/t_syncmode.cc +64 -0
  415. data/ext/libcouchbase/tests/iotests/t_views.cc +405 -0
  416. data/ext/libcouchbase/tests/iotests/testutil.cc +250 -0
  417. data/ext/libcouchbase/tests/iotests/testutil.h +163 -0
  418. data/ext/libcouchbase/tests/mc/mctest.h +119 -0
  419. data/ext/libcouchbase/tests/mc/pktmaker.h +101 -0
  420. data/ext/libcouchbase/tests/mc/t_alloc.cc +269 -0
  421. data/ext/libcouchbase/tests/mc/t_context.cc +100 -0
  422. data/ext/libcouchbase/tests/mc/t_flush.cc +185 -0
  423. data/ext/libcouchbase/tests/mc/t_forward.cc +239 -0
  424. data/ext/libcouchbase/tests/mc/t_ioflush.cc +102 -0
  425. data/ext/libcouchbase/tests/mc/t_iovcursor.cc +173 -0
  426. data/ext/libcouchbase/tests/mocksupport/procutil.c +305 -0
  427. data/ext/libcouchbase/tests/mocksupport/procutil.h +89 -0
  428. data/ext/libcouchbase/tests/mocksupport/server.c +391 -0
  429. data/ext/libcouchbase/tests/mocksupport/server.h +72 -0
  430. data/ext/libcouchbase/tests/mocksupport/timeout.c +69 -0
  431. data/ext/libcouchbase/tests/nonio_tests.cc +23 -0
  432. data/ext/libcouchbase/tests/rdb/rdbtest.h +133 -0
  433. data/ext/libcouchbase/tests/rdb/t_basic.cc +128 -0
  434. data/ext/libcouchbase/tests/rdb/t_bigalloc.cc +93 -0
  435. data/ext/libcouchbase/tests/rdb/t_refs.cc +112 -0
  436. data/ext/libcouchbase/tests/socktests/socktest.cc +347 -0
  437. data/ext/libcouchbase/tests/socktests/socktest.h +448 -0
  438. data/ext/libcouchbase/tests/socktests/t_basic.cc +143 -0
  439. data/ext/libcouchbase/tests/socktests/t_ctx.cc +73 -0
  440. data/ext/libcouchbase/tests/socktests/t_manager.cc +179 -0
  441. data/ext/libcouchbase/tests/socktests/t_putex.cc +256 -0
  442. data/ext/libcouchbase/tests/socktests/t_read.cc +187 -0
  443. data/ext/libcouchbase/tests/socktests/t_reentrant.cc +143 -0
  444. data/ext/libcouchbase/tests/socktests/t_ssl.cc +80 -0
  445. data/ext/libcouchbase/tests/socktests/t_write.cc +95 -0
  446. data/ext/libcouchbase/tests/start_mock.bat +15 -0
  447. data/ext/libcouchbase/tests/start_mock.sh +42 -0
  448. data/ext/libcouchbase/tests/unit_tests.cc +43 -0
  449. data/ext/libcouchbase/tests/vbucket/confdata/bad.json +101 -0
  450. data/ext/libcouchbase/tests/vbucket/confdata/full_25.json +363 -0
  451. data/ext/libcouchbase/tests/vbucket/confdata/memd_25.json +90 -0
  452. data/ext/libcouchbase/tests/vbucket/confdata/memd_30.json +1 -0
  453. data/ext/libcouchbase/tests/vbucket/confdata/memd_45.json +1 -0
  454. data/ext/libcouchbase/tests/vbucket/confdata/terse_25.json +291 -0
  455. data/ext/libcouchbase/tests/vbucket/confdata/terse_30.json +1 -0
  456. data/ext/libcouchbase/tests/vbucket/t_config.cc +341 -0
  457. data/ext/libcouchbase/tools/CMakeLists.txt +51 -0
  458. data/ext/libcouchbase/tools/cbc-handlers.h +462 -0
  459. data/ext/libcouchbase/tools/cbc-n1qlback.cc +439 -0
  460. data/ext/libcouchbase/tools/cbc-pillowfight.cc +822 -0
  461. data/ext/libcouchbase/tools/cbc.cc +1541 -0
  462. data/ext/libcouchbase/tools/common/histogram.cc +43 -0
  463. data/ext/libcouchbase/tools/common/histogram.h +23 -0
  464. data/ext/libcouchbase/tools/common/my_inttypes.h +22 -0
  465. data/ext/libcouchbase/tools/common/options.cc +420 -0
  466. data/ext/libcouchbase/tools/common/options.h +81 -0
  467. data/ext/libcouchbase/tools/docgen/docgen.h +469 -0
  468. data/ext/libcouchbase/tools/docgen/loc.h +210 -0
  469. data/ext/libcouchbase/tools/docgen/placeholders.h +211 -0
  470. data/ext/libcouchbase/tools/docgen/seqgen.h +94 -0
  471. data/lib/libcouchbase.rb +36 -0
  472. data/lib/libcouchbase/bucket.rb +819 -0
  473. data/lib/libcouchbase/callbacks.rb +72 -0
  474. data/lib/libcouchbase/connection.rb +790 -0
  475. data/lib/libcouchbase/design_docs.rb +86 -0
  476. data/lib/libcouchbase/error.rb +68 -0
  477. data/lib/libcouchbase/ext/libcouchbase.rb +1135 -0
  478. data/lib/libcouchbase/ext/libcouchbase/cmdbase.rb +23 -0
  479. data/lib/libcouchbase/ext/libcouchbase/cmdcounter.rb +36 -0
  480. data/lib/libcouchbase/ext/libcouchbase/cmdendure.rb +26 -0
  481. data/lib/libcouchbase/ext/libcouchbase/cmdfts.rb +24 -0
  482. data/lib/libcouchbase/ext/libcouchbase/cmdget.rb +30 -0
  483. data/lib/libcouchbase/ext/libcouchbase/cmdgetreplica.rb +49 -0
  484. data/lib/libcouchbase/ext/libcouchbase/cmdhttp.rb +58 -0
  485. data/lib/libcouchbase/ext/libcouchbase/cmdn1ql.rb +40 -0
  486. data/lib/libcouchbase/ext/libcouchbase/cmdobseqno.rb +33 -0
  487. data/lib/libcouchbase/ext/libcouchbase/cmdobserve.rb +30 -0
  488. data/lib/libcouchbase/ext/libcouchbase/cmdstore.rb +40 -0
  489. data/lib/libcouchbase/ext/libcouchbase/cmdstoredur.rb +45 -0
  490. data/lib/libcouchbase/ext/libcouchbase/cmdsubdoc.rb +49 -0
  491. data/lib/libcouchbase/ext/libcouchbase/cmdverbosity.rb +29 -0
  492. data/lib/libcouchbase/ext/libcouchbase/cmdviewquery.rb +61 -0
  493. data/lib/libcouchbase/ext/libcouchbase/contigbuf.rb +14 -0
  494. data/lib/libcouchbase/ext/libcouchbase/create_st.rb +15 -0
  495. data/lib/libcouchbase/ext/libcouchbase/create_st0.rb +23 -0
  496. data/lib/libcouchbase/ext/libcouchbase/create_st1.rb +26 -0
  497. data/lib/libcouchbase/ext/libcouchbase/create_st2.rb +32 -0
  498. data/lib/libcouchbase/ext/libcouchbase/create_st3.rb +26 -0
  499. data/lib/libcouchbase/ext/libcouchbase/crst_u.rb +20 -0
  500. data/lib/libcouchbase/ext/libcouchbase/durability_opts_st_v.rb +11 -0
  501. data/lib/libcouchbase/ext/libcouchbase/durability_opts_t.rb +14 -0
  502. data/lib/libcouchbase/ext/libcouchbase/durabilityopt_sv0.rb +63 -0
  503. data/lib/libcouchbase/ext/libcouchbase/enums.rb +991 -0
  504. data/lib/libcouchbase/ext/libcouchbase/fragbuf.rb +18 -0
  505. data/lib/libcouchbase/ext/libcouchbase/ftshandle.rb +7 -0
  506. data/lib/libcouchbase/ext/libcouchbase/histogram.rb +34 -0
  507. data/lib/libcouchbase/ext/libcouchbase/http_request_t.rb +7 -0
  508. data/lib/libcouchbase/ext/libcouchbase/keybuf.rb +20 -0
  509. data/lib/libcouchbase/ext/libcouchbase/multicmd_ctx.rb +30 -0
  510. data/lib/libcouchbase/ext/libcouchbase/mutation_token.rb +17 -0
  511. data/lib/libcouchbase/ext/libcouchbase/n1qlhandle.rb +7 -0
  512. data/lib/libcouchbase/ext/libcouchbase/n1qlparams.rb +7 -0
  513. data/lib/libcouchbase/ext/libcouchbase/respbase.rb +29 -0
  514. data/lib/libcouchbase/ext/libcouchbase/respcounter.rb +32 -0
  515. data/lib/libcouchbase/ext/libcouchbase/respendure.rb +49 -0
  516. data/lib/libcouchbase/ext/libcouchbase/respfts.rb +40 -0
  517. data/lib/libcouchbase/ext/libcouchbase/respget.rb +44 -0
  518. data/lib/libcouchbase/ext/libcouchbase/resphttp.rb +48 -0
  519. data/lib/libcouchbase/ext/libcouchbase/respmcversion.rb +38 -0
  520. data/lib/libcouchbase/ext/libcouchbase/respn1ql.rb +41 -0
  521. data/lib/libcouchbase/ext/libcouchbase/respobseqno.rb +52 -0
  522. data/lib/libcouchbase/ext/libcouchbase/respobserve.rb +41 -0
  523. data/lib/libcouchbase/ext/libcouchbase/respserverbase.rb +32 -0
  524. data/lib/libcouchbase/ext/libcouchbase/respstats.rb +38 -0
  525. data/lib/libcouchbase/ext/libcouchbase/respstore.rb +32 -0
  526. data/lib/libcouchbase/ext/libcouchbase/respstoredur.rb +38 -0
  527. data/lib/libcouchbase/ext/libcouchbase/respsubdoc.rb +35 -0
  528. data/lib/libcouchbase/ext/libcouchbase/respviewquery.rb +67 -0
  529. data/lib/libcouchbase/ext/libcouchbase/sdentry.rb +22 -0
  530. data/lib/libcouchbase/ext/libcouchbase/sdspec.rb +26 -0
  531. data/lib/libcouchbase/ext/libcouchbase/t.rb +7 -0
  532. data/lib/libcouchbase/ext/libcouchbase/valbuf.rb +22 -0
  533. data/lib/libcouchbase/ext/libcouchbase/valbuf_u_buf.rb +14 -0
  534. data/lib/libcouchbase/ext/libcouchbase/viewhandle.rb +7 -0
  535. data/lib/libcouchbase/ext/libcouchbase_iocp.rb +26 -0
  536. data/lib/libcouchbase/ext/libcouchbase_libuv.rb +18 -0
  537. data/lib/libcouchbase/ext/tasks.rb +87 -0
  538. data/lib/libcouchbase/n1ql.rb +73 -0
  539. data/lib/libcouchbase/query_full_text.rb +147 -0
  540. data/lib/libcouchbase/query_n1ql.rb +121 -0
  541. data/lib/libcouchbase/query_view.rb +129 -0
  542. data/lib/libcouchbase/results_fiber.rb +262 -0
  543. data/lib/libcouchbase/results_native.rb +211 -0
  544. data/lib/libcouchbase/version.rb +5 -0
  545. data/libcouchbase.gemspec +61 -0
  546. data/spec/bucket_spec.rb +270 -0
  547. data/spec/connection_spec.rb +277 -0
  548. data/spec/design_docs_spec.rb +23 -0
  549. data/spec/error_spec.rb +26 -0
  550. data/spec/fts_spec.rb +129 -0
  551. data/spec/n1ql_spec.rb +201 -0
  552. data/spec/results_libuv_spec.rb +229 -0
  553. data/spec/results_native_spec.rb +259 -0
  554. data/spec/seed/2016-10-25T043505Z/2016-10-25T043505Z-full/bucket-default/design.json +1 -0
  555. data/spec/seed/2016-10-25T043505Z/2016-10-25T043505Z-full/bucket-default/node-127.0.0.1%3A8091/data-0000.cbb +0 -0
  556. data/spec/seed/2016-10-25T043505Z/2016-10-25T043505Z-full/bucket-default/node-127.0.0.1%3A8091/failover.json +1 -0
  557. data/spec/seed/2016-10-25T043505Z/2016-10-25T043505Z-full/bucket-default/node-127.0.0.1%3A8091/meta.json +1 -0
  558. data/spec/seed/2016-10-25T043505Z/2016-10-25T043505Z-full/bucket-default/node-127.0.0.1%3A8091/seqno.json +1 -0
  559. data/spec/seed/2016-10-25T043505Z/2016-10-25T043505Z-full/bucket-default/node-127.0.0.1%3A8091/snapshot_markers.json +1 -0
  560. data/spec/view_spec.rb +195 -0
  561. metadata +775 -0
@@ -0,0 +1,452 @@
1
+ /* -*- Mode: C; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */
2
+ /*
3
+ * Copyright 2014 Couchbase, Inc.
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+
18
+ #ifndef NETBUF_H
19
+ #define NETBUF_H
20
+
21
+ #ifdef __cplusplus
22
+ extern "C" {
23
+ #endif
24
+
25
+ /**
26
+ * @file
27
+ * @brief Netbuf write buffers
28
+ */
29
+
30
+ /**
31
+ * @defgroup netbufs Netbufs
32
+ *
33
+ * # Introduction
34
+ *
35
+ * ## GOALS
36
+ *
37
+ * 1. provide a simple buffer allocation API
38
+ * From a logic perspective it's simplest to deal with a straight
39
+ * contiguous buffer per packet.
40
+ *
41
+ * 2. provide an efficient way of sending multiple contiguous packets. This
42
+ * will reduce IOV fragmentation and reduce the number of trips to the
43
+ * I/O plugin for multiple writes. Currently this is done very efficiently
44
+ * with the ringbuffer - however this comes at the cost of copying all
45
+ * request data to the ringbuffer itself. Our aim is to reduce the
46
+ * number of copies while still maintaining a packed buffer.
47
+ *
48
+ * 3. Allow a pluggable method by which user-provided data can be plugged
49
+ * into the span/cursor/flush architecture.
50
+ *
51
+ * @addtogroup netbufs
52
+ * @{
53
+ */
54
+
55
+ #include "sllist.h"
56
+ #include "netbuf-defs.h"
57
+ #include "netbuf-mblock.h"
58
+
59
+ /**
60
+ * @brief Structure representing a buffer within netbufs
61
+ *
62
+ * @note It is recommended that you maintain the individual fields in your
63
+ * own structure and then re-create them as needed. The span structure is 16
64
+ * bytes on 64 bit systems, but can be reduced to 12 if needed. Additionally,
65
+ * you may already have the 'size' field stored/calculated elsewhere.
66
+ */
67
+ typedef struct {
68
+ /** @private Parent block */
69
+ nb_MBLOCK *parent;
70
+
71
+ /** @private Offset from root at which this buffer begins */
72
+ nb_SIZE offset;
73
+
74
+ /** write-once: Allocation size */
75
+ nb_SIZE size;
76
+ } nb_SPAN;
77
+
78
+ #define NETBUF_INVALID_OFFSET (nb_SIZE)-1
79
+
80
+ /**
81
+ * Creates a span from a buffer _not_ owned by netbufs.
82
+ * @param span the span to initialize
83
+ * @param buf the buffer
84
+ * @param len the length of the buffer
85
+ */
86
+ #define CREATE_STANDALONE_SPAN(span, buf, len) \
87
+ (span)->parent = (nb_MBLOCK *) (void *)buf; \
88
+ (span)->offset = NETBUF_INVALID_OFFSET; \
89
+ (span)->size = len;
90
+
91
+ /** @private */
92
+ typedef struct {
93
+ sllist_node slnode;
94
+ char *base;
95
+ nb_SIZE len;
96
+ /* Extra 4 bytes here. WHAT WE DO!!! */
97
+ } nb_SNDQELEM;
98
+
99
+ /** @private */
100
+ typedef struct {
101
+ /** Linked list of pending spans to send */
102
+ sllist_root pending;
103
+
104
+ /**
105
+ * List of PDUs to be flushed. A PDU is comprised of one or more IOVs
106
+ * (or even a subsection thereof)
107
+ */
108
+ sllist_root pdus;
109
+
110
+ /** The last window which was part of the previous fill call */
111
+ nb_SNDQELEM *last_requested;
112
+
113
+ /**
114
+ * Number of bytes enqueued in the 'last request' element. This is needed
115
+ * because it is possible for the last element to grow in length during
116
+ * a subsequent flush.
117
+ */
118
+ nb_SIZE last_offset;
119
+
120
+ /** Offset from last PDU which was partially flushed */
121
+ nb_SIZE pdu_offset;
122
+
123
+ /** Pool of elements to utilize */
124
+ nb_MBPOOL elempool;
125
+ } nb_SENDQ;
126
+
127
+ struct netbuf_st {
128
+ /** Send Queue */
129
+ nb_SENDQ sendq;
130
+
131
+ /** Pool for variable-size data */
132
+ nb_MBPOOL datapool;
133
+
134
+ nb_SETTINGS settings;
135
+ };
136
+
137
+ /**
138
+ * Quick way to get the span from a buffer, when the buffer is *known* to
139
+ * be standalone (i.e. CREATE_STANDALONE_SPAN()
140
+ * @param span The span from which to extract the buffer
141
+ * @return a pointer to the buffer
142
+ */
143
+ #define SPAN_SABUFFER_NC(span) ((char *)(span)->parent)
144
+
145
+ /**
146
+ * Quick way to get the span from a buffer when the buffer is known *not*
147
+ * to be standalone
148
+ * @param span The span from which to extract the buffer
149
+ * @return A pointer to a buffer
150
+ */
151
+ #define SPAN_MBUFFER_NC(span) ((span)->parent->root + (span)->offset)
152
+
153
+ /**
154
+ * @brief Retrieves a pointer to the buffer related to this span.
155
+ * @param span the span from which to extract the buffer
156
+ * @return a pointer to the buffer.
157
+ *
158
+ * @see SPAN_SABUFFER_NC
159
+ * @see SPAN_MBUFFER_NC
160
+ */
161
+ #define SPAN_BUFFER(span) \
162
+ (((span)->offset == NETBUF_INVALID_OFFSET) ? SPAN_SABUFFER_NC(span) : SPAN_MBUFFER_NC(span))
163
+
164
+ /**
165
+ * @brief allocate a span
166
+ *
167
+ * Reserve a contiguous region of memory, in-order for a given span. The
168
+ * span will be reserved from the last block to be flushed to the network.
169
+ *
170
+ * The contents of the span are guaranteed to be contiguous (though not aligned)
171
+ * and are available via the SPAN_BUFFER macro.
172
+ *
173
+ * @return 0 if successful, -1 on error
174
+ */
175
+ int
176
+ netbuf_mblock_reserve(nb_MGR *mgr, nb_SPAN *span);
177
+
178
+ /**
179
+ * @brief release a span
180
+ *
181
+ * Release a span previously allocated via reserve_span. It is assumed that the
182
+ * contents of the span have either:
183
+ *
184
+ * 1. been successfully sent to the network
185
+ * 2. have just been scheduled (and are being removed due to error handling)
186
+ * 3. have been partially sent to a connection which is being closed.
187
+ *
188
+ * @param mgr the manager in which this span is reserved
189
+ * @param span the span
190
+ */
191
+ void
192
+ netbuf_mblock_release(nb_MGR *mgr, nb_SPAN *span);
193
+
194
+ /**
195
+ * @brief Enqueue a span for serialization
196
+ *
197
+ * Schedules an IOV to be placed inside the send queue. The storage of the
198
+ * underlying buffer must not be freed or otherwise modified until it has
199
+ * been sent.
200
+ *
201
+ * With the current usage model, flush status is implicitly completed once
202
+ * a response has arrived.
203
+ *
204
+ * Note that you may create the IOV from a SPAN object like so:
205
+ * @code{.c}
206
+ * iov->iov_len = span->size;
207
+ * iov->iov_base = SPAN_BUFFER(span);
208
+ * @endcode
209
+ */
210
+ void
211
+ netbuf_enqueue(nb_MGR *mgr, const nb_IOV *bufinfo);
212
+
213
+ void
214
+ netbuf_enqueue_span(nb_MGR *mgr, nb_SPAN *span);
215
+
216
+ /**
217
+ * Gets the number of IOV structures required to flush the entire contents of
218
+ * all buffers.
219
+ */
220
+ unsigned int
221
+ netbuf_get_niov(nb_MGR *mgr);
222
+
223
+ /**
224
+ * @brief
225
+ * Populates an iovec structure for flushing a set of bytes from the various
226
+ * blocks.
227
+ *
228
+ * You may call this function mutltiple times, so long as each call to
229
+ * start_flush is eventually mapped with a call to end_flush.
230
+ *
231
+ * @code{.c}
232
+ * netbuf_start_flush(mgr, iov1, niov1);
233
+ * netbuf_start_flush(mgr, iov2, niov2);
234
+ * ...
235
+ * netbuf_end_flush(mgr, nbytes1);
236
+ * netbuf_end_flush(mgr, nbytes2);
237
+ * @endcode
238
+ *
239
+ * Additionally, only the LAST end_flush call may be supplied an nflushed
240
+ * parameter which is smaller than the size returned by start_flush. If the
241
+ * entire contents of the `iovs` structure cannot be flushed immediately and
242
+ * you do not wish to persist it until such a time that it may be flushed, then
243
+ * netbuf_reset_flush() should be called. See that functions' documentation
244
+ * for more details.
245
+ *
246
+ * This function may be thought of advancing a virtual cursor which is mapped
247
+ * to a send queue. Each time this function is called the cursor is advanced
248
+ * by the number of bytes that the library expects you to flush (i.e. the return
249
+ * value of this function). Typically the cursor is never rewound and any
250
+ * operation that advances the cursor places the burden on the user to
251
+ * actually flush the data contained within the IOV objects.
252
+ * The netbuf_end_flush() function merely has the task of releasing any memory
253
+ * used for mapping of already-flushed data.
254
+ *
255
+ * From a different perspective, each call to netbuf_start_flush() establishes
256
+ * a contract between the library and the user: The library guarantees that
257
+ * this specific region (referred to within the IOVs) will not be flushed by
258
+ * any other subsystem (i.e. nothing else will try to flush the same data).
259
+ * The user guarantees that the data will eventually be flushed, and that the
260
+ * data will be flushed in the order it was received via start_flush().
261
+ *
262
+ *
263
+ * @param mgr the manager object
264
+ * @param iovs an array of iovec structures
265
+ * @param niov the number of iovec structures allocated.
266
+ * @param[out] nused how many IOVs are actually required
267
+ *
268
+ * @return the number of bytes which can be flushed in this IOV. If the
269
+ * return value is 0 then there are no more bytes to flush.
270
+ *
271
+ * Note that the return value is limited by the number of IOV structures
272
+ * provided and should not be taken as an indicator of how many bytes are
273
+ * used overall.
274
+ */
275
+ nb_SIZE
276
+ netbuf_start_flush(nb_MGR *mgr, nb_IOV *iovs, int niov, int *nused);
277
+
278
+ /**
279
+ * @brief Indicate that a flush has completed.
280
+ *
281
+ * Indicate that a number of bytes have been flushed. This should be called after
282
+ * the data retrieved by get_flushing_iov has been flushed to the TCP buffers.
283
+ *
284
+ * @param mgr the manager object
285
+ * @param nflushed how much data in bytes was flushed to the network.
286
+ */
287
+ void
288
+ netbuf_end_flush(nb_MGR *mgr, nb_SIZE nflushed);
289
+
290
+ /**
291
+ * Reset the flush context for the buffer. This should be called only when the
292
+ * following is true:
293
+ *
294
+ * (1) There is only a single open call to netbuf_start_flush
295
+ * (2) The last call to end_flush did not pass all the bytes which were to
296
+ * be flushed.
297
+ *
298
+ * In this case, the next call to start_flush() will return an IOV which begins
299
+ * where the last end_flush() finished, rather than the last start_flush().
300
+ * As a consequence it means that the previous IOV populated with start_flush
301
+ * is no longer valid and start_flush should be called again.
302
+ */
303
+ #define netbuf_reset_flush(mgr) do { \
304
+ (mgr)->sendq.last_requested = NULL; \
305
+ (mgr)->sendq.last_offset = 0; \
306
+ } while (0);
307
+
308
+ /**
309
+ * Informational function to get the total size of all data in the
310
+ * buffers. This traverses all blocks, so call this for debugging only.
311
+ */
312
+ nb_SIZE
313
+ netbuf_get_size(const nb_MGR *mgr);
314
+
315
+ /**
316
+ * Get the maximum size of a span which can be satisfied without using an
317
+ * additional block.
318
+ *
319
+ * @param mgr
320
+ *
321
+ * @param allow_wrap
322
+ * Whether to take into consideration wrapping. If this is true then the span
323
+ * size will allow wrapping. If disabled, then only the packed size will be
324
+ * available. Consider:
325
+ * <pre>
326
+ * [ ooooooo{S:10}xxxxxxxxx{C:10}ooooo{A:5} ]
327
+ * </pre>
328
+ * If wrapping is allowed, then the maximum span size will be 10, from 0..10
329
+ * but the last 5 bytes at the end will be lost for the duration of the block.
330
+ * If wrapping is not allowed then the maximum span size will be 5.
331
+ *
332
+ * @return
333
+ * the maximum span size without requiring additional blocks.
334
+ */
335
+ nb_SIZE
336
+ netbuf_mblock_get_next_size(const nb_MGR *mgr, int allow_wrap);
337
+
338
+ /**
339
+ * @brief Initializes an nb_MGR structure
340
+ * @param mgr the manager to initialize
341
+ * @param settings
342
+ */
343
+ void
344
+ netbuf_init(nb_MGR *mgr, const nb_SETTINGS *settings);
345
+
346
+ /**
347
+ * @brief Frees up any allocated resources for a given manager
348
+ * @param mgr the manager for which to release resources
349
+ */
350
+ void
351
+ netbuf_cleanup(nb_MGR *mgr);
352
+
353
+ /**
354
+ * Populates the settings structure with the default settings. This structure
355
+ * may then be modified or tuned and passed to netbuf_init()
356
+ */
357
+ void
358
+ netbuf_default_settings(nb_SETTINGS *settings);
359
+
360
+ /**
361
+ * Dump the internal structure of the manager to the screen. Useful for
362
+ * debugging.
363
+ */
364
+ void
365
+ netbuf_dump_status(nb_MGR *mgr, FILE *fp);
366
+
367
+
368
+ /**
369
+ * Mark a PDU as being enqueued. This should be called whenever the final IOV
370
+ * for a given PDU has just been enqueued.
371
+ *
372
+ * The PDU itself must remain valid and is assumed to contain an 'slnode'
373
+ * structure which will point to the next PDU. The PDU will later be removed
374
+ * from the queue when 'end_flush' has been called including its range.
375
+ *
376
+ * @param mgr The manager
377
+ *
378
+ * @param pdu An opaque pointer
379
+ *
380
+ * @param lloff The offset from the pdu pointer at which the slist_node
381
+ * structure may be found.
382
+ */
383
+ void
384
+ netbuf_pdu_enqueue(nb_MGR *mgr, void *pdu, nb_SIZE lloff);
385
+
386
+
387
+ /**
388
+ * This callback is invoked during 'end_flush2'.
389
+ *
390
+ * @param pdu The PDU pointer enqueued via netbuf_pdu_enqueue()
391
+ *
392
+ * @param remaining A hint passed to the callback indicating how many bytes
393
+ * remain on the stream. IFF remaining is greater than the size of the
394
+ * PDU the callback may change internal state within the packet to mark
395
+ * it as flushed.
396
+ *
397
+ * XXX:
398
+ * If nremaining < pdusize then it <b>must</b> be ignored. The value
399
+ * may have been previously passed to the same callback during a
400
+ * prior iteration.
401
+ *
402
+ * This is done by design in order to avoid forcing each PDU to maintain
403
+ * a variable indicating "How much was flushed".
404
+ *
405
+ * @param arg A pointer passed to the start_flush call; used to correlate any
406
+ * data common to the queue itself.
407
+ *
408
+ * @return The size of the PDU. This will be used to determine future calls
409
+ * to the callback for subsequent PDUs.
410
+ *
411
+ * If size <= remaining then this PDU will be popped off the PDU queue
412
+ * and is deemed to be no longer utilized by the send queue (and may
413
+ * be released from the mblock allocator; if it's being used).
414
+ *
415
+ * If size > remaining then no further callbacks will be invoked on
416
+ * the relevant PDUs.
417
+ */
418
+ typedef nb_SIZE (*nb_getsize_fn)(void *pdu, nb_SIZE remaining, void *arg);
419
+
420
+ void
421
+ netbuf_end_flush2(nb_MGR *mgr,
422
+ unsigned int nflushed,
423
+ nb_getsize_fn callback,
424
+ nb_SIZE lloff, void *arg);
425
+
426
+
427
+ /**
428
+ * Ensures that the given internal structures of the manager are not allocated
429
+ * or otherwise in use by other systems. This is useful for testing to ensure
430
+ * that we wouldn't accidentally think everything is OK.
431
+ *
432
+ * Because resources are released at the block level, we might have had blocks
433
+ * which were partially allocated.
434
+ *
435
+ * This also checks the PDU and send queues as well.
436
+ */
437
+ int
438
+ netbuf_is_clean(nb_MGR *mgr);
439
+
440
+ /**
441
+ * Determines if there is any data to be flushed to the network
442
+ */
443
+ int
444
+ netbuf_has_flushdata(nb_MGR *mgr);
445
+
446
+ /**@}*/
447
+
448
+ #ifdef __cplusplus
449
+ }
450
+ #endif
451
+
452
+ #endif /* LCB_PACKET_H */
@@ -0,0 +1,385 @@
1
+ /* -*- Mode: C; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */
2
+ /*
3
+ * Copyright 2011-2013 Couchbase, Inc.
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+
18
+ #include "internal.h"
19
+ #include "packetutils.h"
20
+ #include "bucketconfig/clconfig.h"
21
+ #include "vbucket/aliases.h"
22
+ #include "sllist-inl.h"
23
+
24
+ #define LOGARGS(instance, lvl) (instance)->settings, "newconfig", LCB_LOG_##lvl, __FILE__, __LINE__
25
+ #define LOG(instance, lvlbase, msg) lcb_log(instance->settings, "newconfig", LCB_LOG_##lvlbase, __FILE__, __LINE__, msg)
26
+
27
+ #define SERVER_FMT "%s:%s (%p)"
28
+ #define SERVER_ARGS(s) (s)->curhost->host, (s)->curhost->port, (void *)s
29
+
30
+ typedef struct lcb_GUESSVB_st {
31
+ time_t last_update; /**< Last time this vBucket was heuristically set */
32
+ char newix; /**< New index, heuristically determined */
33
+ char oldix; /**< Original index, according to map */
34
+ char used; /**< Flag indicating whether or not this entry has been used */
35
+ } lcb_GUESSVB;
36
+
37
+ /* Ignore configuration updates for heuristically guessed vBuckets for a
38
+ * maximum amount of [n] seconds */
39
+ #define MAX_KEEP_GUESS 20
40
+
41
+ static int
42
+ should_keep_guess(lcb_GUESSVB *guess, lcbvb_VBUCKET *vb)
43
+ {
44
+ if (guess->newix == guess->oldix) {
45
+ /* Heuristic position is the same as starting position */
46
+ return 0;
47
+ }
48
+ if (vb->servers[0] != guess->oldix) {
49
+ /* Previous master changed */
50
+ return 0;
51
+ }
52
+
53
+ if (time(NULL) - guess->last_update > MAX_KEEP_GUESS) {
54
+ /* Last usage too old */
55
+ return 0;
56
+ }
57
+
58
+ return 1;
59
+ }
60
+
61
+ void
62
+ lcb_vbguess_newconfig(lcb_t instance, lcbvb_CONFIG *cfg, lcb_GUESSVB *guesses)
63
+ {
64
+ unsigned ii;
65
+
66
+ if (!guesses) {
67
+ return;
68
+ }
69
+
70
+ for (ii = 0; ii < cfg->nvb; ii++) {
71
+ lcb_GUESSVB *guess = guesses + ii;
72
+ lcbvb_VBUCKET *vb = cfg->vbuckets + ii;
73
+
74
+ if (!guess->used) {
75
+ continue;
76
+ }
77
+
78
+ /* IF: Heuristically learned a new index, _and_ the old index (which is
79
+ * known to be bad) is the same index stated by the new config */
80
+ if (should_keep_guess(guess, vb)) {
81
+ lcb_log(LOGARGS(instance, TRACE), "Keeping heuristically guessed index. VBID=%d. Current=%d. Old=%d.", ii, guess->newix, guess->oldix);
82
+ vb->servers[0] = guess->newix;
83
+ } else {
84
+ /* We don't reassign to the guess structure here. The idea is that
85
+ * we will simply use the new config. If this gives us problems, the
86
+ * config will re-learn again. */
87
+ lcb_log(LOGARGS(instance, TRACE), "Ignoring heuristically guessed index. VBID=%d. Current=%d. Old=%d. New=%d", ii, guess->newix, guess->oldix, vb->servers[0]);
88
+ guess->used = 0;
89
+ }
90
+ }
91
+ }
92
+
93
+ int
94
+ lcb_vbguess_remap(lcb_t instance, int vbid, int bad)
95
+ {
96
+
97
+ if (LCBT_SETTING(instance, vb_noguess)) {
98
+ int newix = lcbvb_nmv_remap_ex(LCBT_VBCONFIG(instance), vbid, bad, 0);
99
+ if (newix > -1 && newix != bad) {
100
+ lcb_log(LOGARGS(instance, TRACE), "Got new index from ffmap. VBID=%d. Old=%d. New=%d", vbid, bad, newix);
101
+ }
102
+ return newix;
103
+
104
+ } else {
105
+ lcb_GUESSVB *guesses = instance->vbguess;
106
+ lcb_GUESSVB *guess = guesses + vbid;
107
+ int newix = lcbvb_nmv_remap_ex(LCBT_VBCONFIG(instance), vbid, bad, 1);
108
+ if (!guesses) {
109
+ guesses = instance->vbguess = calloc(
110
+ LCBT_VBCONFIG(instance)->nvb, sizeof *guesses);
111
+ }
112
+ if (newix > -1 && newix != bad) {
113
+ guess->newix = newix;
114
+ guess->oldix = bad;
115
+ guess->used = 1;
116
+ guess->last_update = time(NULL);
117
+ lcb_log(LOGARGS(instance, TRACE), "Guessed new heuristic index VBID=%d. Old=%d. New=%d", vbid, bad, newix);
118
+ }
119
+ return newix;
120
+ }
121
+ }
122
+
123
+ /**
124
+ * Finds the index of an older server using the current config.
125
+ *
126
+ * This function is used to help reuse the server structures for memcached
127
+ * packets.
128
+ *
129
+ * @param oldconfig The old configuration. This is the configuration the
130
+ * old server is bound to
131
+ * @param newconfig The new configuration. This will be inspected for new
132
+ * nodes which may have been added, and ones which may have been removed.
133
+ * @param server The server to match
134
+ * @return The new index, or -1 if the current server is not present in the new
135
+ * config.
136
+ */
137
+ static int
138
+ find_new_data_index(lcbvb_CONFIG *oldconfig, lcbvb_CONFIG* newconfig,
139
+ mc_SERVER *server)
140
+ {
141
+ size_t ii;
142
+ const char *old_datahost = lcbvb_get_hostport(oldconfig,
143
+ server->pipeline.index, LCBVB_SVCTYPE_DATA, LCBVB_SVCMODE_PLAIN);
144
+
145
+ if (!old_datahost) {
146
+ /* Old server had no data service */
147
+ return -1;
148
+ }
149
+
150
+ for (ii = 0; ii < LCBVB_NSERVERS(newconfig); ii++) {
151
+ const char *new_datahost = lcbvb_get_hostport(newconfig, ii,
152
+ LCBVB_SVCTYPE_DATA, LCBVB_SVCMODE_PLAIN);
153
+ if (new_datahost && strcmp(new_datahost, old_datahost) == 0) {
154
+ return ii;
155
+ }
156
+ }
157
+ return -1;
158
+ }
159
+
160
+ static void
161
+ log_vbdiff(lcb_t instance, lcbvb_CONFIGDIFF *diff)
162
+ {
163
+ char **curserver;
164
+ lcb_log(LOGARGS(instance, INFO), "Config Diff: [ vBuckets Modified=%d ], [Sequence Changed=%d]", diff->n_vb_changes, diff->sequence_changed);
165
+ if (diff->servers_added) {
166
+ for (curserver = diff->servers_added; *curserver; curserver++) {
167
+ lcb_log(LOGARGS(instance, INFO), "Detected server %s added", *curserver);
168
+ }
169
+ }
170
+ if (diff->servers_removed) {
171
+ for (curserver = diff->servers_removed; *curserver; curserver++) {
172
+ lcb_log(LOGARGS(instance, INFO), "Detected server %s removed", *curserver);
173
+ }
174
+ }
175
+ }
176
+
177
+ /**
178
+ * This callback is invoked for packet relocation twice. It tries to relocate
179
+ * commands to their destination server. Some commands may not be relocated
180
+ * either because they have no explicit "Relocation Information" (i.e. no
181
+ * specific vbucket) or because the command is tied to a specific server (i.e.
182
+ * CMD_STAT).
183
+ *
184
+ * Note that `KEEP_PACKET` here doesn't mean to "Save" the packet, but rather
185
+ * to keep the packet in the current queue (so that if the server ends up
186
+ * being removed, the command will fail); rather than being relocated to
187
+ * another server.
188
+ */
189
+ static int
190
+ iterwipe_cb(mc_CMDQUEUE *cq, mc_PIPELINE *oldpl, mc_PACKET *oldpkt, void *arg)
191
+ {
192
+ protocol_binary_request_header hdr;
193
+ mc_SERVER *srv = (mc_SERVER *)oldpl;
194
+ mc_PIPELINE *newpl;
195
+ mc_PACKET *newpkt;
196
+ int newix;
197
+
198
+ (void)arg;
199
+
200
+ mcreq_read_hdr(oldpkt, &hdr);
201
+
202
+ if (!lcb_should_retry(srv->settings, oldpkt, LCB_MAX_ERROR)) {
203
+ return MCREQ_KEEP_PACKET;
204
+ }
205
+
206
+ if (LCBVB_DISTTYPE(cq->config) == LCBVB_DIST_VBUCKET) {
207
+ newix = lcbvb_vbmaster(cq->config, ntohs(hdr.request.vbucket));
208
+
209
+ } else {
210
+ const void *key = NULL;
211
+ lcb_SIZE nkey = 0;
212
+ int tmpid;
213
+
214
+ /* XXX: We ignore hashkey. This is going away soon, and is probably
215
+ * better than simply failing the items. */
216
+ mcreq_get_key(oldpkt, &key, &nkey);
217
+ lcbvb_map_key(cq->config, key, nkey, &tmpid, &newix);
218
+ }
219
+
220
+ if (newix < 0 || newix > (int)cq->npipelines-1) {
221
+ return MCREQ_KEEP_PACKET;
222
+ }
223
+
224
+
225
+ newpl = cq->pipelines[newix];
226
+ if (newpl == oldpl || newpl == NULL) {
227
+ return MCREQ_KEEP_PACKET;
228
+ }
229
+
230
+ lcb_log(LOGARGS((lcb_t)cq->cqdata, DEBUG), "Remapped packet %p (SEQ=%u) from "SERVER_FMT " to " SERVER_FMT,
231
+ (void*)oldpkt, oldpkt->opaque, SERVER_ARGS((mc_SERVER*)oldpl), SERVER_ARGS((mc_SERVER*)newpl));
232
+
233
+ /** Otherwise, copy over the packet and find the new vBucket to map to */
234
+ newpkt = mcreq_renew_packet(oldpkt);
235
+ newpkt->flags &= ~MCREQ_STATE_FLAGS;
236
+ mcreq_reenqueue_packet(newpl, newpkt);
237
+ mcreq_packet_handled(oldpl, oldpkt);
238
+ return MCREQ_REMOVE_PACKET;
239
+ }
240
+
241
+ static int
242
+ replace_config(lcb_t instance, lcbvb_CONFIG *oldconfig, lcbvb_CONFIG *newconfig)
243
+ {
244
+ mc_CMDQUEUE *cq = &instance->cmdq;
245
+ mc_PIPELINE **ppold, **ppnew;
246
+ unsigned ii, nold, nnew;
247
+
248
+ assert(LCBT_VBCONFIG(instance) == newconfig);
249
+
250
+ nnew = LCBVB_NSERVERS(newconfig);
251
+ ppnew = calloc(nnew, sizeof(*ppnew));
252
+ ppold = mcreq_queue_take_pipelines(cq, &nold);
253
+
254
+ /**
255
+ * Determine which existing servers are still part of the new cluster config
256
+ * and place it inside the new list.
257
+ */
258
+ for (ii = 0; ii < nold; ii++) {
259
+ mc_SERVER *cur = (mc_SERVER *)ppold[ii];
260
+ int newix = find_new_data_index(oldconfig, newconfig, cur);
261
+ if (newix > -1) {
262
+ cur->pipeline.index = newix;
263
+ ppnew[newix] = &cur->pipeline;
264
+ ppold[ii] = NULL;
265
+ lcb_log(LOGARGS(instance, INFO), "Reusing server "SERVER_FMT". OldIndex=%d. NewIndex=%d", SERVER_ARGS(cur), ii, newix);
266
+ }
267
+ }
268
+
269
+ /**
270
+ * Once we've moved the kept servers to the new list, allocate new mc_SERVER
271
+ * structures for slots that don't have an existing mc_SERVER. We must do
272
+ * this before add_pipelines() is called, so that there are no holes inside
273
+ * ppnew
274
+ */
275
+ for (ii = 0; ii < nnew; ii++) {
276
+ if (!ppnew[ii]) {
277
+ ppnew[ii] = (mc_PIPELINE *)mcserver_alloc(instance, ii);
278
+ ppnew[ii]->index = ii;
279
+ }
280
+ }
281
+
282
+ /**
283
+ * Once we have all the server structures in place for the new config,
284
+ * transfer the new config along with the new list over to the CQ structure.
285
+ */
286
+ mcreq_queue_add_pipelines(cq, ppnew, nnew, newconfig);
287
+ for (ii = 0; ii < nnew; ii++) {
288
+ mcreq_iterwipe(cq, ppnew[ii], iterwipe_cb, NULL);
289
+ }
290
+
291
+ /**
292
+ * Go through all the servers that are to be removed and relocate commands
293
+ * from their queues into the new queues
294
+ */
295
+ for (ii = 0; ii < nold; ii++) {
296
+ if (!ppold[ii]) {
297
+ continue;
298
+ }
299
+
300
+ mcreq_iterwipe(cq, ppold[ii], iterwipe_cb, NULL);
301
+ mcserver_fail_chain((mc_SERVER *)ppold[ii], LCB_MAP_CHANGED);
302
+ mcserver_close((mc_SERVER *)ppold[ii]);
303
+ }
304
+
305
+ for (ii = 0; ii < nnew; ii++) {
306
+ if (mcserver_has_pending((mc_SERVER*)ppnew[ii])) {
307
+ ppnew[ii]->flush_start(ppnew[ii]);
308
+ }
309
+ }
310
+
311
+ free(ppnew);
312
+ free(ppold);
313
+ return LCB_CONFIGURATION_CHANGED;
314
+ }
315
+
316
+ void lcb_update_vbconfig(lcb_t instance, clconfig_info *config)
317
+ {
318
+ lcb_size_t ii;
319
+ int change_status;
320
+ clconfig_info *old_config;
321
+ mc_CMDQUEUE *q = &instance->cmdq;
322
+
323
+ old_config = instance->cur_configinfo;
324
+ instance->cur_configinfo = config;
325
+ lcb_clconfig_incref(config);
326
+ q->config = instance->cur_configinfo->vbc;
327
+ q->cqdata = instance;
328
+
329
+ if (old_config) {
330
+ lcbvb_CONFIGDIFF *diff = lcbvb_compare(old_config->vbc, config->vbc);
331
+
332
+ if (diff) {
333
+ log_vbdiff(instance, diff);
334
+ lcbvb_free_diff(diff);
335
+ }
336
+
337
+ /* Apply the vb guesses */
338
+ lcb_vbguess_newconfig(instance, config->vbc, instance->vbguess);
339
+
340
+ change_status = replace_config(instance, old_config->vbc, config->vbc);
341
+ if (change_status == -1) {
342
+ LOG(instance, ERR, "Couldn't replace config");
343
+ return;
344
+ }
345
+ lcb_clconfig_decref(old_config);
346
+ } else {
347
+ unsigned nservers;
348
+ mc_PIPELINE **servers;
349
+ nservers = VB_NSERVERS(config->vbc);
350
+ if ((servers = malloc(sizeof(*servers) * nservers)) == NULL) {
351
+ assert(servers);
352
+ lcb_log(LOGARGS(instance, FATAL), "Couldn't allocate memory for new server list! (n=%u)", nservers);
353
+ return;
354
+ }
355
+
356
+ for (ii = 0; ii < nservers; ii++) {
357
+ mc_SERVER *srv;
358
+ if ((srv = mcserver_alloc(instance, ii)) == NULL) {
359
+ assert(srv);
360
+ lcb_log(LOGARGS(instance, FATAL), "Couldn't allocate memory for server instance!");
361
+ return;
362
+ }
363
+ servers[ii] = &srv->pipeline;
364
+ }
365
+
366
+ mcreq_queue_add_pipelines(q, servers, nservers, config->vbc);
367
+ change_status = LCB_CONFIGURATION_NEW;
368
+ free(servers);
369
+ }
370
+
371
+ /* Update the list of nodes here for server list */
372
+ hostlist_clear(instance->ht_nodes);
373
+ for (ii = 0; ii < LCBVB_NSERVERS(config->vbc); ++ii) {
374
+ const char *hp = lcbvb_get_hostport(config->vbc, ii,
375
+ LCBVB_SVCTYPE_MGMT, LCBVB_SVCMODE_PLAIN);
376
+ if (hp) {
377
+ hostlist_add_stringz(instance->ht_nodes, hp, LCB_CONFIG_HTTP_PORT);
378
+ }
379
+ }
380
+
381
+ instance->callbacks.configuration(instance, change_status);
382
+ lcb_maybe_breakout(instance);
383
+ }
384
+
385
+