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,784 @@
1
+ /* -*- Mode: C; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */
2
+ /*
3
+ * Copyright 2011-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
+ #include "internal.h"
19
+ #include "logging.h"
20
+ #include "vbucket/aliases.h"
21
+ #include "settings.h"
22
+ #include "negotiate.h"
23
+ #include "bucketconfig/clconfig.h"
24
+ #include "mc/mcreq-flush-inl.h"
25
+ #include <lcbio/ssl.h>
26
+ #include "ctx-log-inl.h"
27
+
28
+ #define LOGARGS(c, lvl) (c)->settings, "server", LCB_LOG_##lvl, __FILE__, __LINE__
29
+ #define LOGFMT "<%s:%s> (SRV=%p,IX=%d) "
30
+ #define LOGID(server) get_ctx_host(server->connctx), get_ctx_port(server->connctx), (void*)server, server->pipeline.index
31
+ #define MCREQ_MAXIOV 32
32
+ #define LCBCONN_UNWANT(conn, flags) (conn)->want &= ~(flags)
33
+
34
+ typedef enum {
35
+ /* There are no known errored commands on this server */
36
+ S_CLEAN,
37
+
38
+ /* In the process of draining remaining commands to be flushed. The commands
39
+ * being drained may have already been rescheduled to another server or
40
+ * placed inside the error queue, but are pending being flushed. This will
41
+ * only happen in completion-style I/O plugins. When this state is in effect,
42
+ * subsequent attempts to connect will be blocked until all commands have
43
+ * been properly drained.
44
+ */
45
+ S_ERRDRAIN,
46
+
47
+ /* The server object has been closed, either because it has been removed
48
+ * from the cluster or because the related lcb_t has been destroyed.
49
+ */
50
+ S_CLOSED
51
+ } mcserver_STATE;
52
+
53
+ static int check_closed(mc_SERVER *);
54
+ static void start_errored_ctx(mc_SERVER *server, mcserver_STATE next_state);
55
+ static void finalize_errored_ctx(mc_SERVER *server);
56
+ static void on_error(lcbio_CTX *ctx, lcb_error_t err);
57
+ static void server_socket_failed(mc_SERVER *server, lcb_error_t err);
58
+
59
+ static void
60
+ on_flush_ready(lcbio_CTX *ctx)
61
+ {
62
+ mc_SERVER *server = lcbio_ctx_data(ctx);
63
+ nb_IOV iov[MCREQ_MAXIOV];
64
+ int ready;
65
+
66
+ do {
67
+ int niov = 0;
68
+ unsigned nb;
69
+ nb = mcreq_flush_iov_fill(&server->pipeline, iov, MCREQ_MAXIOV, &niov);
70
+ if (!nb) {
71
+ return;
72
+ }
73
+ ready = lcbio_ctx_put_ex(ctx, (lcb_IOV *)iov, niov, nb);
74
+ } while (ready);
75
+ lcbio_ctx_wwant(ctx);
76
+ }
77
+
78
+ static void
79
+ on_flush_done(lcbio_CTX *ctx, unsigned expected, unsigned actual)
80
+ {
81
+ mc_SERVER *server = lcbio_ctx_data(ctx);
82
+ lcb_U64 now = 0;
83
+ if (server->settings->readj_ts_wait) {
84
+ now = gethrtime();
85
+ }
86
+
87
+ mcreq_flush_done_ex(&server->pipeline, actual, expected, now);
88
+ check_closed(server);
89
+ }
90
+
91
+ void
92
+ mcserver_flush(mc_SERVER *server)
93
+ {
94
+ /** Call into the wwant stuff.. */
95
+ if (!server->connctx->rdwant) {
96
+ lcbio_ctx_rwant(server->connctx, 24);
97
+ }
98
+
99
+ lcbio_ctx_wwant(server->connctx);
100
+ lcbio_ctx_schedule(server->connctx);
101
+
102
+ if (!lcbio_timer_armed(server->io_timer)) {
103
+ /**
104
+ * XXX: Maybe use get_next_timeout(), although here we can assume
105
+ * that a command was just scheduled
106
+ */
107
+ lcbio_timer_rearm(server->io_timer, MCSERVER_TIMEOUT(server));
108
+ }
109
+ }
110
+
111
+ LIBCOUCHBASE_API
112
+ void
113
+ lcb_sched_flush(lcb_t instance)
114
+ {
115
+ unsigned ii;
116
+ for (ii = 0; ii < LCBT_NSERVERS(instance); ii++) {
117
+ mc_SERVER *server = LCBT_GET_SERVER(instance, ii);
118
+
119
+ if (!mcserver_has_pending(server)) {
120
+ continue;
121
+ }
122
+ server->pipeline.flush_start(&server->pipeline);
123
+ }
124
+ }
125
+
126
+ /**
127
+ * Invoked when get a NOT_MY_VBUCKET response. If the response contains a JSON
128
+ * payload then we refresh the configuration with it.
129
+ *
130
+ * This function returns 1 if the operation was successfully rescheduled;
131
+ * otherwise it returns 0. If it returns 0 then we give the error back to the
132
+ * user.
133
+ */
134
+ static int
135
+ handle_nmv(mc_SERVER *oldsrv, packet_info *resinfo, mc_PACKET *oldpkt)
136
+ {
137
+ mc_PACKET *newpkt;
138
+ protocol_binary_request_header hdr;
139
+ lcb_error_t err = LCB_ERROR;
140
+ lcb_t instance = oldsrv->instance;
141
+ lcb_U16 vbid;
142
+ clconfig_provider *cccp = lcb_confmon_get_provider(instance->confmon,
143
+ LCB_CLCONFIG_CCCP);
144
+
145
+ mcreq_read_hdr(oldpkt, &hdr);
146
+ vbid = ntohs(hdr.request.vbucket);
147
+ lcb_log(LOGARGS(oldsrv, WARN), LOGFMT "NOT_MY_VBUCKET. Packet=%p (S=%u). VBID=%u", LOGID(oldsrv), (void*)oldpkt, oldpkt->opaque, vbid);
148
+
149
+ /* Notify of new map */
150
+ lcb_vbguess_remap(instance, vbid, oldsrv->pipeline.index);
151
+
152
+ if (PACKET_NBODY(resinfo) && cccp->enabled) {
153
+ lcb_string s;
154
+
155
+ lcb_string_init(&s);
156
+ lcb_string_append(&s, PACKET_VALUE(resinfo), PACKET_NVALUE(resinfo));
157
+ err = lcb_cccp_update(cccp, mcserver_get_host(oldsrv), &s);
158
+ lcb_string_release(&s);
159
+ }
160
+
161
+ if (err != LCB_SUCCESS) {
162
+ int bs_options;
163
+ if (instance->cur_configinfo->origin == LCB_CLCONFIG_CCCP) {
164
+ /**
165
+ * XXX: Not enough to see if cccp was enabled, since cccp might
166
+ * be requested by a user, but would still not actually be active
167
+ * for clusters < 2.5 If our current config is from CCCP
168
+ * then we can be fairly certain that CCCP is indeed working.
169
+ *
170
+ * For this reason, we don't use if (cccp->enabled) {...}
171
+ */
172
+ bs_options = LCB_BS_REFRESH_THROTTLE;
173
+ } else {
174
+ bs_options = LCB_BS_REFRESH_ALWAYS;
175
+ }
176
+ lcb_bootstrap_common(instance, bs_options);
177
+ }
178
+
179
+ if (!lcb_should_retry(oldsrv->settings, oldpkt, LCB_NOT_MY_VBUCKET)) {
180
+ return 0;
181
+ }
182
+
183
+ /** Reschedule the packet again .. */
184
+ newpkt = mcreq_renew_packet(oldpkt);
185
+ newpkt->flags &= ~MCREQ_STATE_FLAGS;
186
+ lcb_retryq_nmvadd(instance->retryq, (mc_EXPACKET*)newpkt);
187
+ return 1;
188
+ }
189
+
190
+ #define PKT_READ_COMPLETE 1
191
+ #define PKT_READ_PARTIAL 0
192
+
193
+ /* This function is called within a loop to process a single packet.
194
+ *
195
+ * If a full packet is available, it will process the packet and return
196
+ * PKT_READ_COMPLETE, resulting in the `on_read()` function calling this
197
+ * function in a loop.
198
+ *
199
+ * When a complete packet is not available, PKT_READ_PARTIAL will be returned
200
+ * and the `on_read()` loop will exit, scheduling any required pending I/O.
201
+ */
202
+ static int
203
+ try_read(lcbio_CTX *ctx, mc_SERVER *server, rdb_IOROPE *ior)
204
+ {
205
+ packet_info info_s, *info = &info_s;
206
+ mc_PACKET *request;
207
+ mc_PIPELINE *pl = &server->pipeline;
208
+ unsigned pktsize = 24, is_last = 1;
209
+
210
+ #define RETURN_NEED_MORE(n) \
211
+ if (mcserver_has_pending(server)) { \
212
+ lcbio_ctx_rwant(ctx, n); \
213
+ } \
214
+ return PKT_READ_PARTIAL; \
215
+
216
+ #define DO_ASSIGN_PAYLOAD() \
217
+ rdb_consumed(ior, sizeof(info->res.bytes)); \
218
+ if (PACKET_NBODY(info)) { \
219
+ info->payload = rdb_get_consolidated(ior, PACKET_NBODY(info)); \
220
+ } {
221
+
222
+ #define DO_SWALLOW_PAYLOAD() \
223
+ } if (PACKET_NBODY(info)) { \
224
+ rdb_consumed(ior, PACKET_NBODY(info)); \
225
+ }
226
+
227
+ if (rdb_get_nused(ior) < pktsize) {
228
+ RETURN_NEED_MORE(pktsize)
229
+ }
230
+
231
+ /* copy bytes into the info structure */
232
+ rdb_copyread(ior, info->res.bytes, sizeof info->res.bytes);
233
+
234
+ pktsize += PACKET_NBODY(info);
235
+ if (rdb_get_nused(ior) < pktsize) {
236
+ RETURN_NEED_MORE(pktsize);
237
+ }
238
+
239
+ /* Find the packet */
240
+ if (PACKET_OPCODE(info) == PROTOCOL_BINARY_CMD_STAT && PACKET_NKEY(info) != 0) {
241
+ is_last = 0;
242
+ request = mcreq_pipeline_find(pl, PACKET_OPAQUE(info));
243
+ } else {
244
+ is_last = 1;
245
+ request = mcreq_pipeline_remove(pl, PACKET_OPAQUE(info));
246
+ }
247
+
248
+ if (!request) {
249
+ lcb_log(LOGARGS(server, WARN), LOGFMT "Found stale packet (OP=0x%x, RC=0x%x, SEQ=%u)", LOGID(server), PACKET_OPCODE(info), PACKET_STATUS(info), PACKET_OPAQUE(info));
250
+ rdb_consumed(ior, pktsize);
251
+ return PKT_READ_COMPLETE;
252
+ }
253
+
254
+ if (PACKET_STATUS(info) == PROTOCOL_BINARY_RESPONSE_NOT_MY_VBUCKET) {
255
+ /* consume the header */
256
+ DO_ASSIGN_PAYLOAD()
257
+ if (!handle_nmv(server, info, request)) {
258
+ mcreq_dispatch_response(pl, request, info, LCB_NOT_MY_VBUCKET);
259
+ }
260
+ DO_SWALLOW_PAYLOAD()
261
+ goto GT_DONE;
262
+ }
263
+
264
+ /* Figure out if the request is 'ufwd' or not */
265
+ if (!(request->flags & MCREQ_F_UFWD)) {
266
+ DO_ASSIGN_PAYLOAD();
267
+ info->bufh = rdb_get_first_segment(ior);
268
+ mcreq_dispatch_response(pl, request, info, LCB_SUCCESS);
269
+ DO_SWALLOW_PAYLOAD()
270
+
271
+ } else {
272
+ /* figure out how many buffers we want to use as an upper limit for the
273
+ * IOV arrays. Currently we'll keep it simple and ensure the entire
274
+ * response is contiguous. */
275
+ lcb_PKTFWDRESP resp = { 0 };
276
+ rdb_ROPESEG *segs;
277
+ nb_IOV iov;
278
+
279
+ rdb_consolidate(ior, pktsize);
280
+ rdb_refread_ex(ior, &iov, &segs, 1, pktsize);
281
+
282
+ resp.bufs = &segs;
283
+ resp.iovs = (lcb_IOV*)&iov;
284
+ resp.nitems = 1;
285
+ resp.header = info->res.bytes;
286
+ server->instance->callbacks.pktfwd(
287
+ server->instance, MCREQ_PKT_COOKIE(request), LCB_SUCCESS, &resp);
288
+ rdb_consumed(ior, pktsize);
289
+ }
290
+
291
+ GT_DONE:
292
+ if (is_last) {
293
+ mcreq_packet_handled(pl, request);
294
+ }
295
+ return PKT_READ_COMPLETE;
296
+ }
297
+
298
+ static void
299
+ on_read(lcbio_CTX *ctx, unsigned nb)
300
+ {
301
+ int rv;
302
+ mc_SERVER *server = lcbio_ctx_data(ctx);
303
+ rdb_IOROPE *ior = &ctx->ior;
304
+
305
+ if (check_closed(server)) {
306
+ return;
307
+ }
308
+
309
+ while ((rv = try_read(ctx, server, ior)) == PKT_READ_COMPLETE);
310
+ lcbio_ctx_schedule(ctx);
311
+ lcb_maybe_breakout(server->instance);
312
+
313
+ (void)nb;
314
+ }
315
+
316
+ LCB_INTERNAL_API
317
+ int
318
+ mcserver_has_pending(mc_SERVER *server)
319
+ {
320
+ return !SLLIST_IS_EMPTY(&server->pipeline.requests);
321
+ }
322
+
323
+ static void flush_noop(mc_PIPELINE *pipeline) {
324
+ (void)pipeline;
325
+ }
326
+ static void server_connect(mc_SERVER *server);
327
+
328
+ typedef enum {
329
+ REFRESH_ALWAYS,
330
+ REFRESH_ONFAILED,
331
+ REFRESH_NEVER
332
+ } mc_REFRESHPOLICY;
333
+
334
+ static int
335
+ maybe_retry(mc_PIPELINE *pipeline, mc_PACKET *pkt, lcb_error_t err)
336
+ {
337
+ mc_SERVER *srv = (mc_SERVER *)pipeline;
338
+ mc_PACKET *newpkt;
339
+ lcb_t instance = pipeline->parent->cqdata;
340
+ lcbvb_DISTMODE dist_t = lcbvb_get_distmode(pipeline->parent->config);
341
+
342
+ if (dist_t != LCBVB_DIST_VBUCKET) {
343
+ /** memcached bucket */
344
+ return 0;
345
+ }
346
+ if (!lcb_should_retry(srv->settings, pkt, err)) {
347
+ return 0;
348
+ }
349
+
350
+ newpkt = mcreq_renew_packet(pkt);
351
+ newpkt->flags &= ~MCREQ_STATE_FLAGS;
352
+ lcb_retryq_add(instance->retryq, (mc_EXPACKET *)newpkt, err);
353
+ return 1;
354
+ }
355
+
356
+ static void
357
+ fail_callback(mc_PIPELINE *pipeline, mc_PACKET *pkt, lcb_error_t err, void *arg)
358
+ {
359
+ int rv;
360
+ mc_SERVER *server = (mc_SERVER *)pipeline;
361
+ packet_info info;
362
+ protocol_binary_request_header hdr;
363
+ protocol_binary_response_header *res = &info.res;
364
+
365
+ if (maybe_retry(pipeline, pkt, err)) {
366
+ return;
367
+ }
368
+
369
+ if (err == LCB_AUTH_ERROR) {
370
+ /* In-situ auth errors are actually dead servers. Let's provide this
371
+ * as the actual error code. */
372
+ err = LCB_MAP_CHANGED;
373
+ }
374
+
375
+ if (err == LCB_ETIMEDOUT) {
376
+ lcb_error_t tmperr = lcb_retryq_origerr(pkt);
377
+ if (tmperr != LCB_SUCCESS) {
378
+ err = tmperr;
379
+ }
380
+ }
381
+
382
+ memset(&info, 0, sizeof(info));
383
+ memcpy(hdr.bytes, SPAN_BUFFER(&pkt->kh_span), sizeof(hdr.bytes));
384
+
385
+ res->response.status = ntohs(PROTOCOL_BINARY_RESPONSE_EINVAL);
386
+ res->response.opcode = hdr.request.opcode;
387
+ res->response.opaque = hdr.request.opaque;
388
+
389
+ lcb_log(LOGARGS(server, WARN), LOGFMT "Failing command (pkt=%p, opaque=%lu, opcode=0x%x) with error 0x%x", LOGID(server), (void*)pkt, (unsigned long)pkt->opaque, hdr.request.opcode, err);
390
+ rv = mcreq_dispatch_response(pipeline, pkt, &info, err);
391
+ lcb_assert(rv == 0);
392
+ (void)arg;
393
+ }
394
+
395
+ static int
396
+ purge_single_server(mc_SERVER *server, lcb_error_t error,
397
+ hrtime_t thresh, hrtime_t *next, int policy)
398
+ {
399
+ unsigned affected;
400
+ mc_PIPELINE *pl = &server->pipeline;
401
+
402
+ if (thresh) {
403
+ affected = mcreq_pipeline_timeout(
404
+ pl, error, fail_callback, NULL, thresh, next);
405
+
406
+ } else {
407
+ mcreq_pipeline_fail(pl, error, fail_callback, NULL);
408
+ affected = -1;
409
+ }
410
+
411
+ if (policy == REFRESH_NEVER) {
412
+ return affected;
413
+ }
414
+
415
+ if (affected || policy == REFRESH_ALWAYS) {
416
+ lcb_bootstrap_common(server->instance,
417
+ LCB_BS_REFRESH_THROTTLE|LCB_BS_REFRESH_INCRERR);
418
+ }
419
+ return affected;
420
+ }
421
+
422
+ static void flush_errdrain(mc_PIPELINE *pipeline)
423
+ {
424
+ /* Called when we are draining errors. */
425
+ mc_SERVER *server = (mc_SERVER *)pipeline;
426
+ if (!lcbio_timer_armed(server->io_timer)) {
427
+ lcbio_timer_rearm(server->io_timer, MCSERVER_TIMEOUT(server));
428
+ }
429
+ }
430
+
431
+ void
432
+ mcserver_fail_chain(mc_SERVER *server, lcb_error_t err)
433
+ {
434
+ purge_single_server(server, err, 0, NULL, REFRESH_NEVER);
435
+ }
436
+
437
+
438
+ static uint32_t
439
+ get_next_timeout(mc_SERVER *server)
440
+ {
441
+ hrtime_t now, expiry, diff;
442
+ mc_PACKET *pkt = mcreq_first_packet(&server->pipeline);
443
+
444
+ if (!pkt) {
445
+ return MCSERVER_TIMEOUT(server);
446
+ }
447
+
448
+ now = gethrtime();
449
+ expiry = MCREQ_PKT_RDATA(pkt)->start + LCB_US2NS(MCSERVER_TIMEOUT(server));
450
+ if (expiry <= now) {
451
+ diff = 0;
452
+ } else {
453
+ diff = expiry - now;
454
+ }
455
+
456
+ return LCB_NS2US(diff);
457
+ }
458
+
459
+ static void
460
+ timeout_server(void *arg)
461
+ {
462
+ mc_SERVER *server = arg;
463
+ hrtime_t now, min_valid, next_ns = 0;
464
+ uint32_t next_us;
465
+ int npurged;
466
+
467
+ now = gethrtime();
468
+ min_valid = now - LCB_US2NS(MCSERVER_TIMEOUT(server));
469
+ npurged = purge_single_server(server,
470
+ LCB_ETIMEDOUT, min_valid, &next_ns, REFRESH_ONFAILED);
471
+ if (npurged) {
472
+ lcb_log(LOGARGS(server, ERROR), LOGFMT "Server timed out. Some commands have failed", LOGID(server));
473
+ }
474
+
475
+ next_us = get_next_timeout(server);
476
+ lcb_log(LOGARGS(server, DEBUG), LOGFMT "Scheduling next timeout for %u ms", LOGID(server), next_us / 1000);
477
+ lcbio_timer_rearm(server->io_timer, next_us);
478
+ lcb_maybe_breakout(server->instance);
479
+ }
480
+
481
+ static int
482
+ maybe_retry_timeout_connection(mc_SERVER *server, lcb_error_t err)
483
+ {
484
+ lcb_U32 next_tmo;
485
+ if (err != LCB_ETIMEDOUT) {
486
+ return 0; /* not a timeout */
487
+ }
488
+ if (!server->settings->readj_ts_wait) {
489
+ return 0; /* normal timeout behavior */
490
+ }
491
+ if (!mcserver_has_pending(server)) {
492
+ return 0; /* nothing pending */
493
+ }
494
+
495
+ next_tmo = get_next_timeout(server);
496
+ if (next_tmo < MCSERVER_TIMEOUT(server) / 2) {
497
+ /* Ideally we'd have a fuzz interval to shave off the actual timeout,
498
+ * since there will inevitably be some time taken off the next timeout */
499
+ return 0;
500
+ }
501
+
502
+ lcb_log(LOGARGS(server, INFO), LOGFMT "Retrying connection. Assuming timeout because of stalled event loop", LOGID(server));
503
+ server_connect(server);
504
+ return 1;
505
+ }
506
+
507
+ static void
508
+ on_connected(lcbio_SOCKET *sock, void *data, lcb_error_t err, lcbio_OSERR syserr)
509
+ {
510
+ mc_SERVER *server = data;
511
+ lcbio_CTXPROCS procs;
512
+ uint32_t tmo;
513
+ mc_pSESSINFO sessinfo = NULL;
514
+ LCBIO_CONNREQ_CLEAR(&server->connreq);
515
+
516
+ if (err != LCB_SUCCESS) {
517
+ lcb_log(LOGARGS(server, ERR), LOGFMT "Got error for connection! (OS=%d)", LOGID(server), syserr);
518
+ if (maybe_retry_timeout_connection(server, err)) {
519
+ return;
520
+ }
521
+ server_socket_failed(server, err);
522
+ return;
523
+ }
524
+
525
+ lcb_assert(sock);
526
+
527
+ /** Do we need sasl? */
528
+ sessinfo = mc_sess_get(sock);
529
+ if (sessinfo == NULL) {
530
+ mc_pSESSREQ sreq;
531
+ lcb_log(LOGARGS(server, TRACE), "<%s:%s> (SRV=%p) Session not yet negotiated. Negotiating", server->curhost->host, server->curhost->port, (void*)server);
532
+ sreq = mc_sessreq_start(sock, server->settings, MCSERVER_TIMEOUT(server),
533
+ on_connected, data);
534
+ LCBIO_CONNREQ_MKGENERIC(&server->connreq, sreq, mc_sessreq_cancel);
535
+ return;
536
+ } else {
537
+ server->compsupport = mc_sess_chkfeature(sessinfo,
538
+ PROTOCOL_BINARY_FEATURE_DATATYPE);
539
+ server->mutation_tokens = mc_sess_chkfeature(sessinfo,
540
+ PROTOCOL_BINARY_FEATURE_MUTATION_SEQNO);
541
+ }
542
+
543
+ procs.cb_err = on_error;
544
+ procs.cb_read = on_read;
545
+ procs.cb_flush_done = on_flush_done;
546
+ procs.cb_flush_ready = on_flush_ready;
547
+ server->connctx = lcbio_ctx_new(sock, server, &procs);
548
+ server->connctx->subsys = "memcached";
549
+ server->pipeline.flush_start = (mcreq_flushstart_fn)mcserver_flush;
550
+
551
+ tmo = get_next_timeout(server);
552
+ lcb_log(LOGARGS(server, DEBUG), LOGFMT "Setting initial timeout=%ums", LOGID(server), tmo/1000);
553
+ lcbio_timer_rearm(server->io_timer, get_next_timeout(server));
554
+ mcserver_flush(server);
555
+ }
556
+
557
+ static void
558
+ server_connect(mc_SERVER *server)
559
+ {
560
+ lcbio_pMGRREQ mr;
561
+ mr = lcbio_mgr_get(server->instance->memd_sockpool, server->curhost,
562
+ MCSERVER_TIMEOUT(server), on_connected, server);
563
+ LCBIO_CONNREQ_MKPOOLED(&server->connreq, mr);
564
+ server->pipeline.flush_start = flush_noop;
565
+ server->state = S_CLEAN;
566
+ }
567
+
568
+ static void
569
+ buf_done_cb(mc_PIPELINE *pl, const void *cookie, void *kbuf, void *vbuf)
570
+ {
571
+ mc_SERVER *server = (mc_SERVER*)pl;
572
+ server->instance->callbacks.pktflushed(server->instance, cookie);
573
+ (void)kbuf; (void)vbuf;
574
+ }
575
+
576
+ mc_SERVER *
577
+ mcserver_alloc(lcb_t instance, int ix)
578
+ {
579
+ mc_SERVER *ret;
580
+ lcbvb_SVCMODE mode;
581
+ const char *datahost;
582
+
583
+ ret = calloc(1, sizeof(*ret));
584
+ if (!ret) {
585
+ return ret;
586
+ }
587
+
588
+ ret->instance = instance;
589
+ ret->settings = instance->settings;
590
+ ret->curhost = calloc(1, sizeof(*ret->curhost));
591
+ mode = ret->settings->sslopts & LCB_SSL_ENABLED
592
+ ? LCBVB_SVCMODE_SSL : LCBVB_SVCMODE_PLAIN;
593
+
594
+ lcb_settings_ref(ret->settings);
595
+ mcreq_pipeline_init(&ret->pipeline);
596
+ ret->pipeline.flush_start = (mcreq_flushstart_fn)server_connect;
597
+ ret->pipeline.buf_done_callback = buf_done_cb;
598
+
599
+ datahost = lcbvb_get_hostport(
600
+ LCBT_VBCONFIG(instance), ix, LCBVB_SVCTYPE_DATA, mode);
601
+ if (datahost) {
602
+ lcb_host_parsez(ret->curhost, datahost, LCB_CONFIG_MCD_PORT);
603
+ }
604
+ ret->io_timer = lcbio_timer_new(instance->iotable, ret, timeout_server);
605
+ return ret;
606
+ }
607
+
608
+ static void
609
+ server_free(mc_SERVER *server)
610
+ {
611
+ mcreq_pipeline_cleanup(&server->pipeline);
612
+
613
+ if (server->io_timer) {
614
+ lcbio_timer_destroy(server->io_timer);
615
+ }
616
+
617
+ free(server->curhost);
618
+ lcb_settings_unref(server->settings);
619
+ free(server);
620
+ }
621
+
622
+ static void
623
+ close_cb(lcbio_SOCKET *sock, int reusable, void *arg)
624
+ {
625
+ lcbio_ref(sock);
626
+ lcbio_mgr_discard(sock);
627
+ (void)reusable;(void)arg;
628
+ }
629
+
630
+
631
+ /**Marks any unflushed data inside this server as being already flushed. This
632
+ * should be done within error handling. If subsequent data is flushed on this
633
+ * pipeline to the same connection, the results are undefined. */
634
+ static void
635
+ release_unflushed_packets(mc_SERVER *server)
636
+ {
637
+ unsigned toflush;
638
+ nb_IOV iov;
639
+ mc_PIPELINE *pl = &server->pipeline;
640
+ while ((toflush = mcreq_flush_iov_fill(pl, &iov, 1, NULL))) {
641
+ mcreq_flush_done(pl, toflush, toflush);
642
+ }
643
+ }
644
+
645
+ static void
646
+ on_error(lcbio_CTX *ctx, lcb_error_t err)
647
+ {
648
+ mc_SERVER *server = lcbio_ctx_data(ctx);
649
+ lcb_log(LOGARGS(server, WARN), LOGFMT "Got socket error 0x%x", LOGID(server), err);
650
+ if (check_closed(server)) {
651
+ return;
652
+ }
653
+ server_socket_failed(server, err);
654
+ }
655
+
656
+ /**Handle a socket error. This function will close the current connection
657
+ * and trigger a failout of any pending commands.
658
+ * This function triggers a configuration refresh */
659
+ static void
660
+ server_socket_failed(mc_SERVER *server, lcb_error_t err)
661
+ {
662
+ if (check_closed(server)) {
663
+ return;
664
+ }
665
+
666
+ purge_single_server(server, err, 0, NULL, REFRESH_ALWAYS);
667
+ lcb_maybe_breakout(server->instance);
668
+ start_errored_ctx(server, S_ERRDRAIN);
669
+ }
670
+
671
+ void
672
+ mcserver_close(mc_SERVER *server)
673
+ {
674
+ /* Should never be called twice */
675
+ lcb_assert(server->state != S_CLOSED);
676
+ start_errored_ctx(server, S_CLOSED);
677
+ }
678
+
679
+ /**
680
+ * Call to signal an error or similar on the current socket.
681
+ * @param server The server
682
+ * @param next_state The next state (S_CLOSED or S_ERRDRAIN)
683
+ */
684
+ static void
685
+ start_errored_ctx(mc_SERVER *server, mcserver_STATE next_state)
686
+ {
687
+ lcbio_CTX *ctx = server->connctx;
688
+
689
+ server->state = next_state;
690
+ /* Cancel any pending connection attempt? */
691
+ lcbio_connreq_cancel(&server->connreq);
692
+
693
+ /* If the server is being destroyed, silence the timer */
694
+ if (next_state == S_CLOSED && server->io_timer != NULL) {
695
+ lcbio_timer_destroy(server->io_timer);
696
+ server->io_timer = NULL;
697
+ }
698
+
699
+ if (ctx == NULL) {
700
+ if (next_state == S_CLOSED) {
701
+ server_free(server);
702
+ return;
703
+ } else {
704
+ /* Not closed but don't have a current context */
705
+ server->pipeline.flush_start = (mcreq_flushstart_fn)server_connect;
706
+ if (mcserver_has_pending(server)) {
707
+ if (!lcbio_timer_armed(server->io_timer)) {
708
+ /* TODO: Maybe throttle reconnection attempts? */
709
+ lcbio_timer_rearm(server->io_timer, MCSERVER_TIMEOUT(server));
710
+ }
711
+ server_connect(server);
712
+ }
713
+ }
714
+
715
+ } else {
716
+ if (ctx->npending) {
717
+ /* Have pending items? */
718
+
719
+ /* Flush any remaining events */
720
+ lcbio_ctx_schedule(ctx);
721
+
722
+ /* Close the socket not to leak resources */
723
+ lcbio_shutdown(lcbio_ctx_sock(ctx));
724
+ if (next_state == S_ERRDRAIN) {
725
+ server->pipeline.flush_start = (mcreq_flushstart_fn)flush_errdrain;
726
+ }
727
+ } else {
728
+ finalize_errored_ctx(server);
729
+ }
730
+ }
731
+ }
732
+
733
+ /**
734
+ * This function actually finalizes a ctx which has an error on it. If the
735
+ * ctx has pending operations remaining then this function returns immediately.
736
+ * Otherwise this will either reinitialize the connection or free the server
737
+ * object depending on the actual object state (i.e. if it was closed or
738
+ * simply errored).
739
+ */
740
+ static void
741
+ finalize_errored_ctx(mc_SERVER *server)
742
+ {
743
+ if (server->connctx->npending) {
744
+ return;
745
+ }
746
+
747
+ lcb_log(LOGARGS(server, DEBUG), LOGFMT "Finalizing ctx %p", LOGID(server), (void*)server->connctx);
748
+
749
+ /* Always close the existing context. */
750
+ lcbio_ctx_close(server->connctx, close_cb, NULL);
751
+ server->connctx = NULL;
752
+
753
+ /* And pretend to flush any outstanding data. There's nothing pending! */
754
+ release_unflushed_packets(server);
755
+
756
+ if (server->state == S_CLOSED) {
757
+ /* If the server is closed, time to free it */
758
+ server_free(server);
759
+ } else {
760
+ /* Otherwise, cycle the state back to CLEAN and reinit
761
+ * the connection */
762
+ server->state = S_CLEAN;
763
+ server->pipeline.flush_start = (mcreq_flushstart_fn)server_connect;
764
+ server_connect(server);
765
+ }
766
+ }
767
+
768
+ /**
769
+ * This little function checks to see if the server struct is still valid, or
770
+ * whether it should just be cleaned once no pending I/O remainds.
771
+ *
772
+ * If this function returns false then the server is still valid; otherwise it
773
+ * is invalid and must not be used further.
774
+ */
775
+ static int
776
+ check_closed(mc_SERVER *server)
777
+ {
778
+ if (server->state == S_CLEAN) {
779
+ return 0;
780
+ }
781
+ lcb_log(LOGARGS(server, INFO), LOGFMT "Got handler after close. Checking pending calls (pending=%u)", LOGID(server), server->connctx->npending);
782
+ finalize_errored_ctx(server);
783
+ return 1;
784
+ }