mt-libcouchbase 1.4.0

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 (707) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +22 -0
  3. data/.gitmodules +3 -0
  4. data/.rspec +1 -0
  5. data/.travis.yml +38 -0
  6. data/Gemfile +4 -0
  7. data/LICENSE +24 -0
  8. data/README.md +445 -0
  9. data/Rakefile +76 -0
  10. data/ext/README.md +6 -0
  11. data/ext/Rakefile +19 -0
  12. data/ext/libcouchbase/.gitignore +132 -0
  13. data/ext/libcouchbase/CMakeLists.txt +455 -0
  14. data/ext/libcouchbase/CONTRIBUTING.md +105 -0
  15. data/ext/libcouchbase/LICENSE +202 -0
  16. data/ext/libcouchbase/README.markdown +195 -0
  17. data/ext/libcouchbase/RELEASE_NOTES.markdown +3523 -0
  18. data/ext/libcouchbase/cmake/Modules/ConfigureDtrace.cmake +52 -0
  19. data/ext/libcouchbase/cmake/Modules/CopyPDB.cmake +42 -0
  20. data/ext/libcouchbase/cmake/Modules/DistScript.cmake +17 -0
  21. data/ext/libcouchbase/cmake/Modules/DownloadLcbDep.cmake +18 -0
  22. data/ext/libcouchbase/cmake/Modules/FindCouchbaseHdrHistogram.cmake +15 -0
  23. data/ext/libcouchbase/cmake/Modules/FindCouchbaseLibev.cmake +73 -0
  24. data/ext/libcouchbase/cmake/Modules/FindCouchbaseLibevent.cmake +54 -0
  25. data/ext/libcouchbase/cmake/Modules/FindCouchbaseLibuv.cmake +57 -0
  26. data/ext/libcouchbase/cmake/Modules/FindProfiler.cmake +16 -0
  27. data/ext/libcouchbase/cmake/Modules/GenerateConfigDotH.cmake +49 -0
  28. data/ext/libcouchbase/cmake/Modules/GetLibcouchbaseFlags.cmake +142 -0
  29. data/ext/libcouchbase/cmake/Modules/GetPlatformCCInfo.cmake +45 -0
  30. data/ext/libcouchbase/cmake/Modules/GetVersionInfo.cmake +70 -0
  31. data/ext/libcouchbase/cmake/config-cmake.h.in +80 -0
  32. data/ext/libcouchbase/cmake/configure +355 -0
  33. data/ext/libcouchbase/cmake/defs.mk.in +6 -0
  34. data/ext/libcouchbase/cmake/dtrace-instr-link.pl +51 -0
  35. data/ext/libcouchbase/cmake/libcouchbase.stp.in +829 -0
  36. data/ext/libcouchbase/cmake/source_files.cmake +104 -0
  37. data/ext/libcouchbase/contrib/cJSON/cJSON.c +1022 -0
  38. data/ext/libcouchbase/contrib/cJSON/cJSON.h +158 -0
  39. data/ext/libcouchbase/contrib/cbsasl/CMakeLists.txt +25 -0
  40. data/ext/libcouchbase/contrib/cbsasl/COPYING +202 -0
  41. data/ext/libcouchbase/contrib/cbsasl/include/cbsasl/cbsasl.h +259 -0
  42. data/ext/libcouchbase/contrib/cbsasl/src/client.c +419 -0
  43. data/ext/libcouchbase/contrib/cbsasl/src/common.c +50 -0
  44. data/ext/libcouchbase/contrib/cbsasl/src/cram-md5/hmac.c +67 -0
  45. data/ext/libcouchbase/contrib/cbsasl/src/cram-md5/hmac.h +33 -0
  46. data/ext/libcouchbase/contrib/cbsasl/src/cram-md5/md5.c +296 -0
  47. data/ext/libcouchbase/contrib/cbsasl/src/cram-md5/md5.h +45 -0
  48. data/ext/libcouchbase/contrib/cbsasl/src/hash.c +573 -0
  49. data/ext/libcouchbase/contrib/cbsasl/src/hash.h +15 -0
  50. data/ext/libcouchbase/contrib/cbsasl/src/scram-sha/scram_utils.c +500 -0
  51. data/ext/libcouchbase/contrib/cbsasl/src/scram-sha/scram_utils.h +99 -0
  52. data/ext/libcouchbase/contrib/cbsasl/src/util.h +31 -0
  53. data/ext/libcouchbase/contrib/cliopts/CMakeLists.txt +2 -0
  54. data/ext/libcouchbase/contrib/cliopts/cliopts.c +938 -0
  55. data/ext/libcouchbase/contrib/cliopts/cliopts.h +610 -0
  56. data/ext/libcouchbase/contrib/genhash/genhash.c +371 -0
  57. data/ext/libcouchbase/contrib/genhash/genhash.h +241 -0
  58. data/ext/libcouchbase/contrib/gtest-1.7.0/CHANGES +157 -0
  59. data/ext/libcouchbase/contrib/gtest-1.7.0/CMakeLists.txt +252 -0
  60. data/ext/libcouchbase/contrib/gtest-1.7.0/CONTRIBUTORS +37 -0
  61. data/ext/libcouchbase/contrib/gtest-1.7.0/LICENSE +28 -0
  62. data/ext/libcouchbase/contrib/gtest-1.7.0/MINIFY.sh +15 -0
  63. data/ext/libcouchbase/contrib/gtest-1.7.0/README +435 -0
  64. data/ext/libcouchbase/contrib/gtest-1.7.0/cmake/internal_utils.cmake +227 -0
  65. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/gtest-death-test.h +294 -0
  66. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/gtest-message.h +250 -0
  67. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/gtest-param-test.h +1421 -0
  68. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/gtest-param-test.h.pump +487 -0
  69. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/gtest-printers.h +855 -0
  70. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/gtest-spi.h +232 -0
  71. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/gtest-test-part.h +179 -0
  72. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/gtest-typed-test.h +259 -0
  73. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/gtest.h +2291 -0
  74. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/gtest_pred_impl.h +358 -0
  75. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/gtest_prod.h +58 -0
  76. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/internal/gtest-death-test-internal.h +319 -0
  77. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/internal/gtest-filepath.h +206 -0
  78. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/internal/gtest-internal.h +1158 -0
  79. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/internal/gtest-linked_ptr.h +233 -0
  80. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/internal/gtest-param-util-generated.h +5143 -0
  81. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/internal/gtest-param-util-generated.h.pump +301 -0
  82. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/internal/gtest-param-util.h +619 -0
  83. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/internal/gtest-port.h +1947 -0
  84. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/internal/gtest-string.h +167 -0
  85. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/internal/gtest-tuple.h +1012 -0
  86. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/internal/gtest-tuple.h.pump +339 -0
  87. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/internal/gtest-type-util.h +3331 -0
  88. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/internal/gtest-type-util.h.pump +297 -0
  89. data/ext/libcouchbase/contrib/gtest-1.7.0/src/gtest-all.cc +48 -0
  90. data/ext/libcouchbase/contrib/gtest-1.7.0/src/gtest-death-test.cc +1344 -0
  91. data/ext/libcouchbase/contrib/gtest-1.7.0/src/gtest-filepath.cc +382 -0
  92. data/ext/libcouchbase/contrib/gtest-1.7.0/src/gtest-internal-inl.h +1218 -0
  93. data/ext/libcouchbase/contrib/gtest-1.7.0/src/gtest-port.cc +805 -0
  94. data/ext/libcouchbase/contrib/gtest-1.7.0/src/gtest-printers.cc +363 -0
  95. data/ext/libcouchbase/contrib/gtest-1.7.0/src/gtest-test-part.cc +110 -0
  96. data/ext/libcouchbase/contrib/gtest-1.7.0/src/gtest-typed-test.cc +110 -0
  97. data/ext/libcouchbase/contrib/gtest-1.7.0/src/gtest.cc +5015 -0
  98. data/ext/libcouchbase/contrib/gtest-1.7.0/src/gtest_main.cc +38 -0
  99. data/ext/libcouchbase/contrib/http_parser/LICENSE-MIT +23 -0
  100. data/ext/libcouchbase/contrib/http_parser/README.md +178 -0
  101. data/ext/libcouchbase/contrib/http_parser/http_parser.c +2060 -0
  102. data/ext/libcouchbase/contrib/http_parser/http_parser.h +321 -0
  103. data/ext/libcouchbase/contrib/jsonsl/LICENSE +20 -0
  104. data/ext/libcouchbase/contrib/jsonsl/jsonsl.c +1452 -0
  105. data/ext/libcouchbase/contrib/jsonsl/jsonsl.h +971 -0
  106. data/ext/libcouchbase/contrib/lcb-jsoncpp/CMakeLists.txt +6 -0
  107. data/ext/libcouchbase/contrib/lcb-jsoncpp/LICENSE +55 -0
  108. data/ext/libcouchbase/contrib/lcb-jsoncpp/lcb-jsoncpp-forwards.h +255 -0
  109. data/ext/libcouchbase/contrib/lcb-jsoncpp/lcb-jsoncpp.cpp +4893 -0
  110. data/ext/libcouchbase/contrib/lcb-jsoncpp/lcb-jsoncpp.h +1961 -0
  111. data/ext/libcouchbase/contrib/snappy/CMakeLists.txt +7 -0
  112. data/ext/libcouchbase/contrib/snappy/COPYING +28 -0
  113. data/ext/libcouchbase/contrib/snappy/snappy-c.cc +90 -0
  114. data/ext/libcouchbase/contrib/snappy/snappy-c.h +138 -0
  115. data/ext/libcouchbase/contrib/snappy/snappy-internal.h +150 -0
  116. data/ext/libcouchbase/contrib/snappy/snappy-lcb-msvc.h +5 -0
  117. data/ext/libcouchbase/contrib/snappy/snappy-sinksource.cc +75 -0
  118. data/ext/libcouchbase/contrib/snappy/snappy-sinksource.h +137 -0
  119. data/ext/libcouchbase/contrib/snappy/snappy-stubs-internal.cc +42 -0
  120. data/ext/libcouchbase/contrib/snappy/snappy-stubs-internal.h +491 -0
  121. data/ext/libcouchbase/contrib/snappy/snappy-stubs-public.h +100 -0
  122. data/ext/libcouchbase/contrib/snappy/snappy.cc +1312 -0
  123. data/ext/libcouchbase/contrib/snappy/snappy.h +184 -0
  124. data/ext/libcouchbase/contrib/win32-defs/iocpdefs.h +133 -0
  125. data/ext/libcouchbase/contrib/win32-defs/mingwdefs.h +4396 -0
  126. data/ext/libcouchbase/contrib/win32-defs/win_stdint.h +258 -0
  127. data/ext/libcouchbase/doc/Doxyfile +2495 -0
  128. data/ext/libcouchbase/doc/DoxygenLayout.xml +109 -0
  129. data/ext/libcouchbase/doc/Makefile +44 -0
  130. data/ext/libcouchbase/doc/apiattr.h +117 -0
  131. data/ext/libcouchbase/doc/cbc-n1qlback.markdown +88 -0
  132. data/ext/libcouchbase/doc/cbc-pillowfight.markdown +296 -0
  133. data/ext/libcouchbase/doc/cbc-subdoc.markdown +299 -0
  134. data/ext/libcouchbase/doc/cbc.markdown +763 -0
  135. data/ext/libcouchbase/doc/cbcrc.markdown +52 -0
  136. data/ext/libcouchbase/doc/common-additional-options.markdown +82 -0
  137. data/ext/libcouchbase/doc/common-options.markdown +71 -0
  138. data/ext/libcouchbase/doc/environment.h +93 -0
  139. data/ext/libcouchbase/doc/example/threads.c +77 -0
  140. data/ext/libcouchbase/doc/footer.html +22 -0
  141. data/ext/libcouchbase/doc/genman.sh +25 -0
  142. data/ext/libcouchbase/doc/header.html +52 -0
  143. data/ext/libcouchbase/doc/intro.h +130 -0
  144. data/ext/libcouchbase/doc/mainpage.h +136 -0
  145. data/ext/libcouchbase/doc/man/cbc-admin.1 +1 -0
  146. data/ext/libcouchbase/doc/man/cbc-bucket-create.1 +1 -0
  147. data/ext/libcouchbase/doc/man/cbc-bucket-delete.1 +1 -0
  148. data/ext/libcouchbase/doc/man/cbc-cat.1 +1 -0
  149. data/ext/libcouchbase/doc/man/cbc-connstr.1 +1 -0
  150. data/ext/libcouchbase/doc/man/cbc-cp.1 +1 -0
  151. data/ext/libcouchbase/doc/man/cbc-create.1 +1 -0
  152. data/ext/libcouchbase/doc/man/cbc-decr.1 +1 -0
  153. data/ext/libcouchbase/doc/man/cbc-flush.1 +1 -0
  154. data/ext/libcouchbase/doc/man/cbc-hash.1 +1 -0
  155. data/ext/libcouchbase/doc/man/cbc-incr.1 +1 -0
  156. data/ext/libcouchbase/doc/man/cbc-lock.1 +1 -0
  157. data/ext/libcouchbase/doc/man/cbc-mcflush.1 +1 -0
  158. data/ext/libcouchbase/doc/man/cbc-mcversion.1 +1 -0
  159. data/ext/libcouchbase/doc/man/cbc-n1ql.1 +1 -0
  160. data/ext/libcouchbase/doc/man/cbc-n1qlback.1 +198 -0
  161. data/ext/libcouchbase/doc/man/cbc-observe.1 +1 -0
  162. data/ext/libcouchbase/doc/man/cbc-pillowfight.1 +499 -0
  163. data/ext/libcouchbase/doc/man/cbc-ping.1 +1 -0
  164. data/ext/libcouchbase/doc/man/cbc-rm.1 +1 -0
  165. data/ext/libcouchbase/doc/man/cbc-role-list.1 +1 -0
  166. data/ext/libcouchbase/doc/man/cbc-stats.1 +1 -0
  167. data/ext/libcouchbase/doc/man/cbc-subdoc.1 +494 -0
  168. data/ext/libcouchbase/doc/man/cbc-unlock.1 +1 -0
  169. data/ext/libcouchbase/doc/man/cbc-user-delete.1 +1 -0
  170. data/ext/libcouchbase/doc/man/cbc-user-list.1 +1 -0
  171. data/ext/libcouchbase/doc/man/cbc-user-upsert.1 +1 -0
  172. data/ext/libcouchbase/doc/man/cbc-verbosity.1 +1 -0
  173. data/ext/libcouchbase/doc/man/cbc-version.1 +1 -0
  174. data/ext/libcouchbase/doc/man/cbc-view.1 +1 -0
  175. data/ext/libcouchbase/doc/man/cbc-watch.1 +1 -0
  176. data/ext/libcouchbase/doc/man/cbc.1 +1035 -0
  177. data/ext/libcouchbase/doc/man/cbcrc.4 +71 -0
  178. data/ext/libcouchbase/doc/style.css +1162 -0
  179. data/ext/libcouchbase/example/CMakeLists.txt +52 -0
  180. data/ext/libcouchbase/example/README.markdown +47 -0
  181. data/ext/libcouchbase/example/analytics/.gitignore +1 -0
  182. data/ext/libcouchbase/example/analytics/analytics.c +158 -0
  183. data/ext/libcouchbase/example/analytics/build-queries.rb +34 -0
  184. data/ext/libcouchbase/example/analytics/cJSON.c +1 -0
  185. data/ext/libcouchbase/example/analytics/cJSON.h +1 -0
  186. data/ext/libcouchbase/example/analytics/queries/00-show-dataverse.json +5 -0
  187. data/ext/libcouchbase/example/analytics/queries/01-setup-dataset-breweries.json +6 -0
  188. data/ext/libcouchbase/example/analytics/queries/02-setup-dataset-beers.json +6 -0
  189. data/ext/libcouchbase/example/analytics/queries/03-initiate-shadow.json +6 -0
  190. data/ext/libcouchbase/example/analytics/queries/04-list-datasets.json +7 -0
  191. data/ext/libcouchbase/example/analytics/queries/05-count-breweries.json +5 -0
  192. data/ext/libcouchbase/example/analytics/queries/06-first-brewery.json +6 -0
  193. data/ext/libcouchbase/example/analytics/queries/07-key-based-lookup.json +6 -0
  194. data/ext/libcouchbase/example/analytics/queries/08-exact-match-lookup.json +7 -0
  195. data/ext/libcouchbase/example/analytics/queries/09-exact-match-lookup-different-shape.json +6 -0
  196. data/ext/libcouchbase/example/analytics/queries/10-other-query-filters.json +6 -0
  197. data/ext/libcouchbase/example/analytics/queries/11-equijoin.json +9 -0
  198. data/ext/libcouchbase/example/analytics/queries/12-equijoin-select-star.json +10 -0
  199. data/ext/libcouchbase/example/analytics/queries/13-ansi-join.json +8 -0
  200. data/ext/libcouchbase/example/analytics/queries/14-join-select-values.json +8 -0
  201. data/ext/libcouchbase/example/analytics/queries/15-nested-outer-join.json +7 -0
  202. data/ext/libcouchbase/example/analytics/queries/16-theta-join.json +8 -0
  203. data/ext/libcouchbase/example/analytics/queries/17-existential-quantification.json +9 -0
  204. data/ext/libcouchbase/example/analytics/queries/18-universal-quantification.json +7 -0
  205. data/ext/libcouchbase/example/analytics/queries/19-simple-aggregation.json +6 -0
  206. data/ext/libcouchbase/example/analytics/queries/20-simple-aggregation-unwrapped-value.json +6 -0
  207. data/ext/libcouchbase/example/analytics/queries/21-simple-aggregation-explicit.json +6 -0
  208. data/ext/libcouchbase/example/analytics/queries/22-grouping-and-aggregation.json +6 -0
  209. data/ext/libcouchbase/example/analytics/queries/23-grouping-and-aggregation-with-hint.json +7 -0
  210. data/ext/libcouchbase/example/analytics/queries/24-grouping-and-limits.json +7 -0
  211. data/ext/libcouchbase/example/analytics/queries/25-named-parameters.json +7 -0
  212. data/ext/libcouchbase/example/analytics/queries/26-positional-parameters.json +7 -0
  213. data/ext/libcouchbase/example/analytics/queries.h +113 -0
  214. data/ext/libcouchbase/example/crypto/.gitignore +2 -0
  215. data/ext/libcouchbase/example/crypto/Makefile +13 -0
  216. data/ext/libcouchbase/example/crypto/common_provider.c +26 -0
  217. data/ext/libcouchbase/example/crypto/common_provider.h +33 -0
  218. data/ext/libcouchbase/example/crypto/openssl_symmetric_decrypt.c +144 -0
  219. data/ext/libcouchbase/example/crypto/openssl_symmetric_encrypt.c +146 -0
  220. data/ext/libcouchbase/example/crypto/openssl_symmetric_provider.c +271 -0
  221. data/ext/libcouchbase/example/crypto/openssl_symmetric_provider.h +29 -0
  222. data/ext/libcouchbase/example/db/db.c +171 -0
  223. data/ext/libcouchbase/example/db/vb.c +227 -0
  224. data/ext/libcouchbase/example/fts/.gitignore +1 -0
  225. data/ext/libcouchbase/example/fts/build-queries.rb +33 -0
  226. data/ext/libcouchbase/example/fts/fts.c +142 -0
  227. data/ext/libcouchbase/example/fts/queries/00-simple-text-query.json +12 -0
  228. data/ext/libcouchbase/example/fts/queries/01-simple-text-query-on-non-default-index.json +9 -0
  229. data/ext/libcouchbase/example/fts/queries/02-simple-text-query-on-stored-field.json +13 -0
  230. data/ext/libcouchbase/example/fts/queries/03-match-query-with-facet.json +19 -0
  231. data/ext/libcouchbase/example/fts/queries/04-docid-query.json +11 -0
  232. data/ext/libcouchbase/example/fts/queries/05-unanalyzed-term-query-with-fuzziness-level-of-0.json +13 -0
  233. data/ext/libcouchbase/example/fts/queries/06-unanalyzed-term-query-with-fuzziness-level-of-2.json +14 -0
  234. data/ext/libcouchbase/example/fts/queries/07-match-phrase-query.json +13 -0
  235. data/ext/libcouchbase/example/fts/queries/08-phrase-query.json +16 -0
  236. data/ext/libcouchbase/example/fts/queries/09-query-string-query.json +9 -0
  237. data/ext/libcouchbase/example/fts/queries/10-conjunction-query.json +21 -0
  238. data/ext/libcouchbase/example/fts/queries/11-wild-card-query.json +13 -0
  239. data/ext/libcouchbase/example/fts/queries/12-numeric-range-query.json +11 -0
  240. data/ext/libcouchbase/example/fts/queries/13-regexp-query.json +13 -0
  241. data/ext/libcouchbase/example/fts/queries.h +61 -0
  242. data/ext/libcouchbase/example/instancepool/main.cc +112 -0
  243. data/ext/libcouchbase/example/instancepool/pool.cc +102 -0
  244. data/ext/libcouchbase/example/instancepool/pool.h +69 -0
  245. data/ext/libcouchbase/example/libeventdirect/main.c +222 -0
  246. data/ext/libcouchbase/example/mcc/mcc.cc +246 -0
  247. data/ext/libcouchbase/example/minimal/.gitignore +1 -0
  248. data/ext/libcouchbase/example/minimal/minimal.c +132 -0
  249. data/ext/libcouchbase/example/minimal/query.c +185 -0
  250. data/ext/libcouchbase/example/observe/durability.c +102 -0
  251. data/ext/libcouchbase/example/observe/observe.c +159 -0
  252. data/ext/libcouchbase/example/subdoc/subdoc-multi.cc +143 -0
  253. data/ext/libcouchbase/example/subdoc/subdoc-simple.cc +201 -0
  254. data/ext/libcouchbase/example/subdoc/subdoc-xattrs.c +286 -0
  255. data/ext/libcouchbase/example/tick/tick.c +119 -0
  256. data/ext/libcouchbase/example/tracing/.gitignore +2 -0
  257. data/ext/libcouchbase/example/tracing/Makefile +8 -0
  258. data/ext/libcouchbase/example/tracing/cJSON.c +1 -0
  259. data/ext/libcouchbase/example/tracing/cJSON.h +1 -0
  260. data/ext/libcouchbase/example/tracing/tracing.c +439 -0
  261. data/ext/libcouchbase/example/tracing/views.c +444 -0
  262. data/ext/libcouchbase/example/users/README +48 -0
  263. data/ext/libcouchbase/example/users/users.c +147 -0
  264. data/ext/libcouchbase/example/views/views-example.cc +83 -0
  265. data/ext/libcouchbase/include/libcouchbase/_cxxwrap.h +150 -0
  266. data/ext/libcouchbase/include/libcouchbase/api-legacy.h +1689 -0
  267. data/ext/libcouchbase/include/libcouchbase/api3.h +2 -0
  268. data/ext/libcouchbase/include/libcouchbase/assert.h +44 -0
  269. data/ext/libcouchbase/include/libcouchbase/auth.h +297 -0
  270. data/ext/libcouchbase/include/libcouchbase/cbft.h +151 -0
  271. data/ext/libcouchbase/include/libcouchbase/cntl-private.h +319 -0
  272. data/ext/libcouchbase/include/libcouchbase/cntl.h +1418 -0
  273. data/ext/libcouchbase/include/libcouchbase/configuration.h.in +29 -0
  274. data/ext/libcouchbase/include/libcouchbase/couchbase.h +4089 -0
  275. data/ext/libcouchbase/include/libcouchbase/crypto.h +306 -0
  276. data/ext/libcouchbase/include/libcouchbase/deprecated.h +312 -0
  277. data/ext/libcouchbase/include/libcouchbase/error.h +680 -0
  278. data/ext/libcouchbase/include/libcouchbase/http.h +1 -0
  279. data/ext/libcouchbase/include/libcouchbase/iops.h +1053 -0
  280. data/ext/libcouchbase/include/libcouchbase/ixmgmt.h +263 -0
  281. data/ext/libcouchbase/include/libcouchbase/kvbuf.h +137 -0
  282. data/ext/libcouchbase/include/libcouchbase/metrics.h +79 -0
  283. data/ext/libcouchbase/include/libcouchbase/n1ql.h +539 -0
  284. data/ext/libcouchbase/include/libcouchbase/pktfwd.h +270 -0
  285. data/ext/libcouchbase/include/libcouchbase/plugins/io/bsdio-inl.c +370 -0
  286. data/ext/libcouchbase/include/libcouchbase/plugins/io/wsaerr-inl.c +76 -0
  287. data/ext/libcouchbase/include/libcouchbase/plugins/io/wsaerr.h +199 -0
  288. data/ext/libcouchbase/include/libcouchbase/subdoc.h +347 -0
  289. data/ext/libcouchbase/include/libcouchbase/sysdefs.h +98 -0
  290. data/ext/libcouchbase/include/libcouchbase/tracing.h +437 -0
  291. data/ext/libcouchbase/include/libcouchbase/vbucket.h +680 -0
  292. data/ext/libcouchbase/include/libcouchbase/views.h +357 -0
  293. data/ext/libcouchbase/include/libcouchbase/visibility.h +66 -0
  294. data/ext/libcouchbase/include/memcached/COPYING +30 -0
  295. data/ext/libcouchbase/include/memcached/README +10 -0
  296. data/ext/libcouchbase/include/memcached/protocol_binary.h +885 -0
  297. data/ext/libcouchbase/packaging/README +7 -0
  298. data/ext/libcouchbase/packaging/abicheck/.gitignore +4 -0
  299. data/ext/libcouchbase/packaging/abicheck/Makefile +17 -0
  300. data/ext/libcouchbase/packaging/abicheck/README.md +27 -0
  301. data/ext/libcouchbase/packaging/abicheck/template.xml +3 -0
  302. data/ext/libcouchbase/packaging/deb/compat +1 -0
  303. data/ext/libcouchbase/packaging/deb/control +72 -0
  304. data/ext/libcouchbase/packaging/deb/copyright +10 -0
  305. data/ext/libcouchbase/packaging/deb/libcouchbase-dev.docs +3 -0
  306. data/ext/libcouchbase/packaging/deb/package.mk +31 -0
  307. data/ext/libcouchbase/packaging/deb/rules +46 -0
  308. data/ext/libcouchbase/packaging/deb/source/format +1 -0
  309. data/ext/libcouchbase/packaging/distinfo/README +1 -0
  310. data/ext/libcouchbase/packaging/distinfo/distinfo.cmake.in +4 -0
  311. data/ext/libcouchbase/packaging/dllversion.rc.in +39 -0
  312. data/ext/libcouchbase/packaging/libcouchbase.pc.in +10 -0
  313. data/ext/libcouchbase/packaging/nuget/libcouchbase.autopkg +76 -0
  314. data/ext/libcouchbase/packaging/parse-git-describe.pl +166 -0
  315. data/ext/libcouchbase/packaging/rpm/libcouchbase.spec.in +101 -0
  316. data/ext/libcouchbase/packaging/rpm/package.mk +40 -0
  317. data/ext/libcouchbase/plugins/io/iocp/CMakeLists.txt +9 -0
  318. data/ext/libcouchbase/plugins/io/iocp/iocp_iops.c +467 -0
  319. data/ext/libcouchbase/plugins/io/iocp/iocp_iops.h +217 -0
  320. data/ext/libcouchbase/plugins/io/iocp/iocp_loop.c +295 -0
  321. data/ext/libcouchbase/plugins/io/iocp/iocp_timer.c +79 -0
  322. data/ext/libcouchbase/plugins/io/iocp/iocp_util.c +229 -0
  323. data/ext/libcouchbase/plugins/io/libev/CMakeLists.txt +31 -0
  324. data/ext/libcouchbase/plugins/io/libev/libev_io_opts.h +66 -0
  325. data/ext/libcouchbase/plugins/io/libev/plugin-libev.c +289 -0
  326. data/ext/libcouchbase/plugins/io/libevent/CMakeLists.txt +31 -0
  327. data/ext/libcouchbase/plugins/io/libevent/libevent_io_opts.h +67 -0
  328. data/ext/libcouchbase/plugins/io/libevent/plugin-libevent.c +292 -0
  329. data/ext/libcouchbase/plugins/io/libuv/CMakeLists.txt +44 -0
  330. data/ext/libcouchbase/plugins/io/libuv/libuv_compat.h +218 -0
  331. data/ext/libcouchbase/plugins/io/libuv/libuv_io_opts.h +118 -0
  332. data/ext/libcouchbase/plugins/io/libuv/plugin-internal.h +155 -0
  333. data/ext/libcouchbase/plugins/io/libuv/plugin-libuv.c +709 -0
  334. data/ext/libcouchbase/plugins/io/select/CMakeLists.txt +13 -0
  335. data/ext/libcouchbase/plugins/io/select/plugin-select.c +451 -0
  336. data/ext/libcouchbase/plugins/io/select/select_io_opts.h +39 -0
  337. data/ext/libcouchbase/src/README.md +101 -0
  338. data/ext/libcouchbase/src/aspend.h +105 -0
  339. data/ext/libcouchbase/src/auth-priv.h +85 -0
  340. data/ext/libcouchbase/src/auth.cc +146 -0
  341. data/ext/libcouchbase/src/bootstrap.cc +263 -0
  342. data/ext/libcouchbase/src/bootstrap.h +149 -0
  343. data/ext/libcouchbase/src/bucketconfig/bc_cccp.cc +450 -0
  344. data/ext/libcouchbase/src/bucketconfig/bc_file.cc +281 -0
  345. data/ext/libcouchbase/src/bucketconfig/bc_http.cc +527 -0
  346. data/ext/libcouchbase/src/bucketconfig/bc_http.h +107 -0
  347. data/ext/libcouchbase/src/bucketconfig/bc_static.cc +150 -0
  348. data/ext/libcouchbase/src/bucketconfig/clconfig.h +700 -0
  349. data/ext/libcouchbase/src/bucketconfig/confmon.cc +403 -0
  350. data/ext/libcouchbase/src/callbacks.c +380 -0
  351. data/ext/libcouchbase/src/cbft.cc +253 -0
  352. data/ext/libcouchbase/src/cntl.cc +1057 -0
  353. data/ext/libcouchbase/src/config_static.h +176 -0
  354. data/ext/libcouchbase/src/connspec.cc +555 -0
  355. data/ext/libcouchbase/src/connspec.h +155 -0
  356. data/ext/libcouchbase/src/crypto.cc +399 -0
  357. data/ext/libcouchbase/src/ctx-log-inl.h +44 -0
  358. data/ext/libcouchbase/src/dns-srv.cc +146 -0
  359. data/ext/libcouchbase/src/dump.cc +103 -0
  360. data/ext/libcouchbase/src/errmap.cc +173 -0
  361. data/ext/libcouchbase/src/errmap.h +271 -0
  362. data/ext/libcouchbase/src/getconfig.cc +72 -0
  363. data/ext/libcouchbase/src/gethrtime.c +109 -0
  364. data/ext/libcouchbase/src/handler.cc +1101 -0
  365. data/ext/libcouchbase/src/hashtable.c +75 -0
  366. data/ext/libcouchbase/src/hdr_timings.c +92 -0
  367. data/ext/libcouchbase/src/hostlist.cc +293 -0
  368. data/ext/libcouchbase/src/hostlist.h +160 -0
  369. data/ext/libcouchbase/src/http/http-priv.h +326 -0
  370. data/ext/libcouchbase/src/http/http.cc +672 -0
  371. data/ext/libcouchbase/src/http/http.h +1 -0
  372. data/ext/libcouchbase/src/http/http_io.cc +316 -0
  373. data/ext/libcouchbase/src/instance.cc +917 -0
  374. data/ext/libcouchbase/src/internal.h +285 -0
  375. data/ext/libcouchbase/src/iofactory.c +575 -0
  376. data/ext/libcouchbase/src/jsparse/parser.cc +445 -0
  377. data/ext/libcouchbase/src/jsparse/parser.h +159 -0
  378. data/ext/libcouchbase/src/lcbht/lcbht.cc +177 -0
  379. data/ext/libcouchbase/src/lcbht/lcbht.h +210 -0
  380. data/ext/libcouchbase/src/lcbio/connect.cc +603 -0
  381. data/ext/libcouchbase/src/lcbio/connect.h +400 -0
  382. data/ext/libcouchbase/src/lcbio/ctx.c +658 -0
  383. data/ext/libcouchbase/src/lcbio/ctx.h +405 -0
  384. data/ext/libcouchbase/src/lcbio/iotable.c +290 -0
  385. data/ext/libcouchbase/src/lcbio/iotable.h +169 -0
  386. data/ext/libcouchbase/src/lcbio/ioutils.cc +356 -0
  387. data/ext/libcouchbase/src/lcbio/ioutils.h +144 -0
  388. data/ext/libcouchbase/src/lcbio/lcbio.h +51 -0
  389. data/ext/libcouchbase/src/lcbio/manager.cc +579 -0
  390. data/ext/libcouchbase/src/lcbio/manager.h +195 -0
  391. data/ext/libcouchbase/src/lcbio/protoctx.c +84 -0
  392. data/ext/libcouchbase/src/lcbio/rw-inl.h +137 -0
  393. data/ext/libcouchbase/src/lcbio/ssl.h +159 -0
  394. data/ext/libcouchbase/src/lcbio/timer-cxx.h +87 -0
  395. data/ext/libcouchbase/src/lcbio/timer-ng.h +179 -0
  396. data/ext/libcouchbase/src/lcbio/timer.c +132 -0
  397. data/ext/libcouchbase/src/legacy.c +431 -0
  398. data/ext/libcouchbase/src/list.c +144 -0
  399. data/ext/libcouchbase/src/list.h +127 -0
  400. data/ext/libcouchbase/src/logging.c +244 -0
  401. data/ext/libcouchbase/src/logging.h +88 -0
  402. data/ext/libcouchbase/src/mc/compress.cc +171 -0
  403. data/ext/libcouchbase/src/mc/compress.h +56 -0
  404. data/ext/libcouchbase/src/mc/forward.c +186 -0
  405. data/ext/libcouchbase/src/mc/forward.h +90 -0
  406. data/ext/libcouchbase/src/mc/iovcursor-inl.h +279 -0
  407. data/ext/libcouchbase/src/mc/iovcursor.h +66 -0
  408. data/ext/libcouchbase/src/mc/mcreq-flush-inl.h +115 -0
  409. data/ext/libcouchbase/src/mc/mcreq.c +983 -0
  410. data/ext/libcouchbase/src/mc/mcreq.h +1015 -0
  411. data/ext/libcouchbase/src/mcserver/mcserver.cc +1055 -0
  412. data/ext/libcouchbase/src/mcserver/mcserver.h +221 -0
  413. data/ext/libcouchbase/src/mcserver/negotiate.cc +757 -0
  414. data/ext/libcouchbase/src/mcserver/negotiate.h +128 -0
  415. data/ext/libcouchbase/src/mctx-helper.h +62 -0
  416. data/ext/libcouchbase/src/metrics.cc +132 -0
  417. data/ext/libcouchbase/src/n1ql/ixmgmt.cc +857 -0
  418. data/ext/libcouchbase/src/n1ql/n1ql-internal.h +22 -0
  419. data/ext/libcouchbase/src/n1ql/n1ql.cc +830 -0
  420. data/ext/libcouchbase/src/n1ql/params.cc +260 -0
  421. data/ext/libcouchbase/src/netbuf/netbuf-defs.h +89 -0
  422. data/ext/libcouchbase/src/netbuf/netbuf-mblock.h +235 -0
  423. data/ext/libcouchbase/src/netbuf/netbuf.c +929 -0
  424. data/ext/libcouchbase/src/netbuf/netbuf.h +452 -0
  425. data/ext/libcouchbase/src/newconfig.cc +365 -0
  426. data/ext/libcouchbase/src/nodeinfo.cc +184 -0
  427. data/ext/libcouchbase/src/operations/cbflush.cc +63 -0
  428. data/ext/libcouchbase/src/operations/counter.cc +117 -0
  429. data/ext/libcouchbase/src/operations/durability-cas.cc +251 -0
  430. data/ext/libcouchbase/src/operations/durability-seqno.cc +170 -0
  431. data/ext/libcouchbase/src/operations/durability.cc +668 -0
  432. data/ext/libcouchbase/src/operations/durability_internal.h +306 -0
  433. data/ext/libcouchbase/src/operations/get.cc +409 -0
  434. data/ext/libcouchbase/src/operations/observe-seqno.cc +94 -0
  435. data/ext/libcouchbase/src/operations/observe.cc +367 -0
  436. data/ext/libcouchbase/src/operations/ping.cc +496 -0
  437. data/ext/libcouchbase/src/operations/pktfwd.cc +86 -0
  438. data/ext/libcouchbase/src/operations/remove.cc +84 -0
  439. data/ext/libcouchbase/src/operations/stats.cc +459 -0
  440. data/ext/libcouchbase/src/operations/store.cc +358 -0
  441. data/ext/libcouchbase/src/operations/subdoc.cc +614 -0
  442. data/ext/libcouchbase/src/operations/touch.cc +84 -0
  443. data/ext/libcouchbase/src/packetutils.h +388 -0
  444. data/ext/libcouchbase/src/probes.d +182 -0
  445. data/ext/libcouchbase/src/rdb/bigalloc.c +225 -0
  446. data/ext/libcouchbase/src/rdb/bigalloc.h +73 -0
  447. data/ext/libcouchbase/src/rdb/chunkalloc.c +174 -0
  448. data/ext/libcouchbase/src/rdb/libcalloc.c +94 -0
  449. data/ext/libcouchbase/src/rdb/rope.c +419 -0
  450. data/ext/libcouchbase/src/rdb/rope.h +488 -0
  451. data/ext/libcouchbase/src/retrychk.cc +113 -0
  452. data/ext/libcouchbase/src/retryq.cc +458 -0
  453. data/ext/libcouchbase/src/retryq.h +170 -0
  454. data/ext/libcouchbase/src/ringbuffer.c +442 -0
  455. data/ext/libcouchbase/src/ringbuffer.h +100 -0
  456. data/ext/libcouchbase/src/rnd.cc +61 -0
  457. data/ext/libcouchbase/src/rnd.h +39 -0
  458. data/ext/libcouchbase/src/settings.c +125 -0
  459. data/ext/libcouchbase/src/settings.h +273 -0
  460. data/ext/libcouchbase/src/sllist-inl.h +197 -0
  461. data/ext/libcouchbase/src/sllist.h +76 -0
  462. data/ext/libcouchbase/src/ssl/CMakeLists.txt +11 -0
  463. data/ext/libcouchbase/src/ssl/ssl_c.c +442 -0
  464. data/ext/libcouchbase/src/ssl/ssl_common.c +478 -0
  465. data/ext/libcouchbase/src/ssl/ssl_e.c +421 -0
  466. data/ext/libcouchbase/src/ssl/ssl_iot_common.h +182 -0
  467. data/ext/libcouchbase/src/strcodecs/base64.c +307 -0
  468. data/ext/libcouchbase/src/strcodecs/strcodecs.h +302 -0
  469. data/ext/libcouchbase/src/timings.c +207 -0
  470. data/ext/libcouchbase/src/trace.h +117 -0
  471. data/ext/libcouchbase/src/tracing/span.cc +421 -0
  472. data/ext/libcouchbase/src/tracing/threshold_logging_tracer.cc +213 -0
  473. data/ext/libcouchbase/src/tracing/tracer.cc +53 -0
  474. data/ext/libcouchbase/src/tracing/tracing-internal.h +198 -0
  475. data/ext/libcouchbase/src/utilities.c +176 -0
  476. data/ext/libcouchbase/src/vbucket/CMakeLists.txt +2 -0
  477. data/ext/libcouchbase/src/vbucket/aliases.h +35 -0
  478. data/ext/libcouchbase/src/vbucket/crc32.h +83 -0
  479. data/ext/libcouchbase/src/vbucket/hash.h +30 -0
  480. data/ext/libcouchbase/src/vbucket/json-inl.h +112 -0
  481. data/ext/libcouchbase/src/vbucket/ketama.c +66 -0
  482. data/ext/libcouchbase/src/vbucket/rfc1321/global.h +32 -0
  483. data/ext/libcouchbase/src/vbucket/rfc1321/md5.h +35 -0
  484. data/ext/libcouchbase/src/vbucket/rfc1321/md5c-inl.h +335 -0
  485. data/ext/libcouchbase/src/vbucket/vbucket.c +1735 -0
  486. data/ext/libcouchbase/src/views/docreq.cc +213 -0
  487. data/ext/libcouchbase/src/views/docreq.h +94 -0
  488. data/ext/libcouchbase/src/views/viewreq.cc +381 -0
  489. data/ext/libcouchbase/src/views/viewreq.h +87 -0
  490. data/ext/libcouchbase/src/wait.cc +156 -0
  491. data/ext/libcouchbase/tests/CMakeLists.txt +149 -0
  492. data/ext/libcouchbase/tests/basic/t_base64.cc +109 -0
  493. data/ext/libcouchbase/tests/basic/t_ccbc103.cc +95 -0
  494. data/ext/libcouchbase/tests/basic/t_connstr.cc +456 -0
  495. data/ext/libcouchbase/tests/basic/t_creds.cc +96 -0
  496. data/ext/libcouchbase/tests/basic/t_ctlcodes.cc +92 -0
  497. data/ext/libcouchbase/tests/basic/t_host.cc +210 -0
  498. data/ext/libcouchbase/tests/basic/t_jsparse.cc +82 -0
  499. data/ext/libcouchbase/tests/basic/t_jsparse.h +589 -0
  500. data/ext/libcouchbase/tests/basic/t_list.cc +155 -0
  501. data/ext/libcouchbase/tests/basic/t_logger.cc +65 -0
  502. data/ext/libcouchbase/tests/basic/t_misc.cc +24 -0
  503. data/ext/libcouchbase/tests/basic/t_n1qlstrings.cc +17 -0
  504. data/ext/libcouchbase/tests/basic/t_netbuf.cc +446 -0
  505. data/ext/libcouchbase/tests/basic/t_packet.cc +215 -0
  506. data/ext/libcouchbase/tests/basic/t_ringbuffer.cc +278 -0
  507. data/ext/libcouchbase/tests/basic/t_scram.cc +514 -0
  508. data/ext/libcouchbase/tests/basic/t_slist.cc +429 -0
  509. data/ext/libcouchbase/tests/basic/t_strerror.cc +64 -0
  510. data/ext/libcouchbase/tests/basic/t_urlencode.cc +132 -0
  511. data/ext/libcouchbase/tests/check-all.cc +612 -0
  512. data/ext/libcouchbase/tests/htparse/t_basic.cc +173 -0
  513. data/ext/libcouchbase/tests/ioserver/connection.cc +166 -0
  514. data/ext/libcouchbase/tests/ioserver/future.cc +50 -0
  515. data/ext/libcouchbase/tests/ioserver/ioserver.cc +117 -0
  516. data/ext/libcouchbase/tests/ioserver/ioserver.h +478 -0
  517. data/ext/libcouchbase/tests/ioserver/socket.cc +88 -0
  518. data/ext/libcouchbase/tests/ioserver/ssl_connection.cc +145 -0
  519. data/ext/libcouchbase/tests/ioserver/threads-pthreads.cc +119 -0
  520. data/ext/libcouchbase/tests/ioserver/threads-win32.cc +117 -0
  521. data/ext/libcouchbase/tests/ioserver/threads.h +66 -0
  522. data/ext/libcouchbase/tests/iotests/iotests.h +15 -0
  523. data/ext/libcouchbase/tests/iotests/mock-environment.cc +632 -0
  524. data/ext/libcouchbase/tests/iotests/mock-environment.h +480 -0
  525. data/ext/libcouchbase/tests/iotests/mock-unit-test.cc +67 -0
  526. data/ext/libcouchbase/tests/iotests/mock-unit-test.h +61 -0
  527. data/ext/libcouchbase/tests/iotests/serverparams.h +76 -0
  528. data/ext/libcouchbase/tests/iotests/t_arithmetic.cc +143 -0
  529. data/ext/libcouchbase/tests/iotests/t_behavior.cc +220 -0
  530. data/ext/libcouchbase/tests/iotests/t_configcache.cc +117 -0
  531. data/ext/libcouchbase/tests/iotests/t_confmon.cc +223 -0
  532. data/ext/libcouchbase/tests/iotests/t_durability.cc +1108 -0
  533. data/ext/libcouchbase/tests/iotests/t_eerrs.cc +121 -0
  534. data/ext/libcouchbase/tests/iotests/t_errmap.cc +181 -0
  535. data/ext/libcouchbase/tests/iotests/t_forward.cc +118 -0
  536. data/ext/libcouchbase/tests/iotests/t_get.cc +512 -0
  537. data/ext/libcouchbase/tests/iotests/t_http.cc +438 -0
  538. data/ext/libcouchbase/tests/iotests/t_iops.cc +175 -0
  539. data/ext/libcouchbase/tests/iotests/t_lock.cc +274 -0
  540. data/ext/libcouchbase/tests/iotests/t_misc.cc +777 -0
  541. data/ext/libcouchbase/tests/iotests/t_mutate.cc +609 -0
  542. data/ext/libcouchbase/tests/iotests/t_n1ql.cc +270 -0
  543. data/ext/libcouchbase/tests/iotests/t_netfail.cc +778 -0
  544. data/ext/libcouchbase/tests/iotests/t_obseqno.cc +156 -0
  545. data/ext/libcouchbase/tests/iotests/t_regression.cc +321 -0
  546. data/ext/libcouchbase/tests/iotests/t_sched.cc +87 -0
  547. data/ext/libcouchbase/tests/iotests/t_serverops.cc +231 -0
  548. data/ext/libcouchbase/tests/iotests/t_smoke.cc +528 -0
  549. data/ext/libcouchbase/tests/iotests/t_snappy.cc +316 -0
  550. data/ext/libcouchbase/tests/iotests/t_subdoc.cc +857 -0
  551. data/ext/libcouchbase/tests/iotests/t_syncmode.cc +64 -0
  552. data/ext/libcouchbase/tests/iotests/t_views.cc +417 -0
  553. data/ext/libcouchbase/tests/iotests/testutil.cc +251 -0
  554. data/ext/libcouchbase/tests/iotests/testutil.h +163 -0
  555. data/ext/libcouchbase/tests/mc/mctest.h +119 -0
  556. data/ext/libcouchbase/tests/mc/pktmaker.h +101 -0
  557. data/ext/libcouchbase/tests/mc/t_alloc.cc +269 -0
  558. data/ext/libcouchbase/tests/mc/t_context.cc +100 -0
  559. data/ext/libcouchbase/tests/mc/t_flush.cc +185 -0
  560. data/ext/libcouchbase/tests/mc/t_forward.cc +239 -0
  561. data/ext/libcouchbase/tests/mc/t_ioflush.cc +102 -0
  562. data/ext/libcouchbase/tests/mc/t_iovcursor.cc +173 -0
  563. data/ext/libcouchbase/tests/mocksupport/procutil.c +305 -0
  564. data/ext/libcouchbase/tests/mocksupport/procutil.h +89 -0
  565. data/ext/libcouchbase/tests/mocksupport/server.c +391 -0
  566. data/ext/libcouchbase/tests/mocksupport/server.h +72 -0
  567. data/ext/libcouchbase/tests/mocksupport/timeout.c +69 -0
  568. data/ext/libcouchbase/tests/nonio_tests.cc +23 -0
  569. data/ext/libcouchbase/tests/rdb/rdbtest.h +133 -0
  570. data/ext/libcouchbase/tests/rdb/t_basic.cc +128 -0
  571. data/ext/libcouchbase/tests/rdb/t_bigalloc.cc +93 -0
  572. data/ext/libcouchbase/tests/rdb/t_refs.cc +112 -0
  573. data/ext/libcouchbase/tests/socktests/socktest.cc +344 -0
  574. data/ext/libcouchbase/tests/socktests/socktest.h +447 -0
  575. data/ext/libcouchbase/tests/socktests/t_basic.cc +143 -0
  576. data/ext/libcouchbase/tests/socktests/t_ctx.cc +73 -0
  577. data/ext/libcouchbase/tests/socktests/t_manager.cc +159 -0
  578. data/ext/libcouchbase/tests/socktests/t_putex.cc +256 -0
  579. data/ext/libcouchbase/tests/socktests/t_read.cc +187 -0
  580. data/ext/libcouchbase/tests/socktests/t_reentrant.cc +143 -0
  581. data/ext/libcouchbase/tests/socktests/t_ssl.cc +80 -0
  582. data/ext/libcouchbase/tests/socktests/t_write.cc +95 -0
  583. data/ext/libcouchbase/tests/start_mock.bat +15 -0
  584. data/ext/libcouchbase/tests/start_mock.sh +42 -0
  585. data/ext/libcouchbase/tests/unit_tests.cc +43 -0
  586. data/ext/libcouchbase/tests/vbucket/confdata/bad.json +101 -0
  587. data/ext/libcouchbase/tests/vbucket/confdata/full_25.json +363 -0
  588. data/ext/libcouchbase/tests/vbucket/confdata/ketama_expected.json +2562 -0
  589. data/ext/libcouchbase/tests/vbucket/confdata/map_node_present_nodesext_missing_nodes.json +94 -0
  590. data/ext/libcouchbase/tests/vbucket/confdata/memd_25.json +90 -0
  591. data/ext/libcouchbase/tests/vbucket/confdata/memd_30.json +1 -0
  592. data/ext/libcouchbase/tests/vbucket/confdata/memd_45.json +1 -0
  593. data/ext/libcouchbase/tests/vbucket/confdata/memd_ketama_config.json +31 -0
  594. data/ext/libcouchbase/tests/vbucket/confdata/terse_25.json +291 -0
  595. data/ext/libcouchbase/tests/vbucket/confdata/terse_30.json +1 -0
  596. data/ext/libcouchbase/tests/vbucket/t_config.cc +386 -0
  597. data/ext/libcouchbase/tools/CMakeLists.txt +80 -0
  598. data/ext/libcouchbase/tools/cbc-handlers.h +636 -0
  599. data/ext/libcouchbase/tools/cbc-n1qlback.cc +496 -0
  600. data/ext/libcouchbase/tools/cbc-pillowfight.cc +1230 -0
  601. data/ext/libcouchbase/tools/cbc-proxy.cc +534 -0
  602. data/ext/libcouchbase/tools/cbc-subdoc.cc +825 -0
  603. data/ext/libcouchbase/tools/cbc.cc +1928 -0
  604. data/ext/libcouchbase/tools/common/histogram.cc +44 -0
  605. data/ext/libcouchbase/tools/common/histogram.h +23 -0
  606. data/ext/libcouchbase/tools/common/options.cc +451 -0
  607. data/ext/libcouchbase/tools/common/options.h +90 -0
  608. data/ext/libcouchbase/tools/docgen/docgen.h +495 -0
  609. data/ext/libcouchbase/tools/docgen/loc.h +211 -0
  610. data/ext/libcouchbase/tools/docgen/placeholders.h +211 -0
  611. data/ext/libcouchbase/tools/docgen/seqgen.h +122 -0
  612. data/ext/libcouchbase/tools/extract-packets.rb +110 -0
  613. data/ext/libcouchbase/tools/linenoise/linenoise.c +1199 -0
  614. data/ext/libcouchbase/tools/linenoise/linenoise.h +73 -0
  615. data/lib/mt-libcouchbase/bucket.rb +825 -0
  616. data/lib/mt-libcouchbase/callbacks.rb +69 -0
  617. data/lib/mt-libcouchbase/connection.rb +896 -0
  618. data/lib/mt-libcouchbase/design_docs.rb +92 -0
  619. data/lib/mt-libcouchbase/error.rb +68 -0
  620. data/lib/mt-libcouchbase/ext/mt-libcouchbase/cmdbase.rb +23 -0
  621. data/lib/mt-libcouchbase/ext/mt-libcouchbase/cmdcounter.rb +36 -0
  622. data/lib/mt-libcouchbase/ext/mt-libcouchbase/cmdendure.rb +26 -0
  623. data/lib/mt-libcouchbase/ext/mt-libcouchbase/cmdfts.rb +24 -0
  624. data/lib/mt-libcouchbase/ext/mt-libcouchbase/cmdget.rb +30 -0
  625. data/lib/mt-libcouchbase/ext/mt-libcouchbase/cmdgetreplica.rb +49 -0
  626. data/lib/mt-libcouchbase/ext/mt-libcouchbase/cmdhttp.rb +58 -0
  627. data/lib/mt-libcouchbase/ext/mt-libcouchbase/cmdn1ql.rb +40 -0
  628. data/lib/mt-libcouchbase/ext/mt-libcouchbase/cmdobseqno.rb +33 -0
  629. data/lib/mt-libcouchbase/ext/mt-libcouchbase/cmdobserve.rb +30 -0
  630. data/lib/mt-libcouchbase/ext/mt-libcouchbase/cmdstore.rb +40 -0
  631. data/lib/mt-libcouchbase/ext/mt-libcouchbase/cmdstoredur.rb +45 -0
  632. data/lib/mt-libcouchbase/ext/mt-libcouchbase/cmdsubdoc.rb +61 -0
  633. data/lib/mt-libcouchbase/ext/mt-libcouchbase/cmdverbosity.rb +29 -0
  634. data/lib/mt-libcouchbase/ext/mt-libcouchbase/cmdviewquery.rb +61 -0
  635. data/lib/mt-libcouchbase/ext/mt-libcouchbase/contigbuf.rb +14 -0
  636. data/lib/mt-libcouchbase/ext/mt-libcouchbase/create_st.rb +15 -0
  637. data/lib/mt-libcouchbase/ext/mt-libcouchbase/create_st0.rb +23 -0
  638. data/lib/mt-libcouchbase/ext/mt-libcouchbase/create_st1.rb +26 -0
  639. data/lib/mt-libcouchbase/ext/mt-libcouchbase/create_st2.rb +32 -0
  640. data/lib/mt-libcouchbase/ext/mt-libcouchbase/create_st3.rb +26 -0
  641. data/lib/mt-libcouchbase/ext/mt-libcouchbase/crst_u.rb +20 -0
  642. data/lib/mt-libcouchbase/ext/mt-libcouchbase/durability_opts_st_v.rb +11 -0
  643. data/lib/mt-libcouchbase/ext/mt-libcouchbase/durability_opts_t.rb +14 -0
  644. data/lib/mt-libcouchbase/ext/mt-libcouchbase/durabilityopt_sv0.rb +63 -0
  645. data/lib/mt-libcouchbase/ext/mt-libcouchbase/enums.rb +1007 -0
  646. data/lib/mt-libcouchbase/ext/mt-libcouchbase/fragbuf.rb +18 -0
  647. data/lib/mt-libcouchbase/ext/mt-libcouchbase/ftshandle.rb +7 -0
  648. data/lib/mt-libcouchbase/ext/mt-libcouchbase/histogram.rb +34 -0
  649. data/lib/mt-libcouchbase/ext/mt-libcouchbase/http_request_t.rb +7 -0
  650. data/lib/mt-libcouchbase/ext/mt-libcouchbase/keybuf.rb +20 -0
  651. data/lib/mt-libcouchbase/ext/mt-libcouchbase/multicmd_ctx.rb +30 -0
  652. data/lib/mt-libcouchbase/ext/mt-libcouchbase/mutation_token.rb +17 -0
  653. data/lib/mt-libcouchbase/ext/mt-libcouchbase/n1qlhandle.rb +7 -0
  654. data/lib/mt-libcouchbase/ext/mt-libcouchbase/n1qlparams.rb +7 -0
  655. data/lib/mt-libcouchbase/ext/mt-libcouchbase/respbase.rb +29 -0
  656. data/lib/mt-libcouchbase/ext/mt-libcouchbase/respcounter.rb +32 -0
  657. data/lib/mt-libcouchbase/ext/mt-libcouchbase/respendure.rb +49 -0
  658. data/lib/mt-libcouchbase/ext/mt-libcouchbase/respfts.rb +40 -0
  659. data/lib/mt-libcouchbase/ext/mt-libcouchbase/respget.rb +44 -0
  660. data/lib/mt-libcouchbase/ext/mt-libcouchbase/resphttp.rb +48 -0
  661. data/lib/mt-libcouchbase/ext/mt-libcouchbase/respmcversion.rb +38 -0
  662. data/lib/mt-libcouchbase/ext/mt-libcouchbase/respn1ql.rb +41 -0
  663. data/lib/mt-libcouchbase/ext/mt-libcouchbase/respobseqno.rb +52 -0
  664. data/lib/mt-libcouchbase/ext/mt-libcouchbase/respobserve.rb +41 -0
  665. data/lib/mt-libcouchbase/ext/mt-libcouchbase/respserverbase.rb +32 -0
  666. data/lib/mt-libcouchbase/ext/mt-libcouchbase/respstats.rb +38 -0
  667. data/lib/mt-libcouchbase/ext/mt-libcouchbase/respstore.rb +32 -0
  668. data/lib/mt-libcouchbase/ext/mt-libcouchbase/respstoredur.rb +38 -0
  669. data/lib/mt-libcouchbase/ext/mt-libcouchbase/respsubdoc.rb +35 -0
  670. data/lib/mt-libcouchbase/ext/mt-libcouchbase/respviewquery.rb +67 -0
  671. data/lib/mt-libcouchbase/ext/mt-libcouchbase/sdentry.rb +22 -0
  672. data/lib/mt-libcouchbase/ext/mt-libcouchbase/sdspec.rb +31 -0
  673. data/lib/mt-libcouchbase/ext/mt-libcouchbase/t.rb +7 -0
  674. data/lib/mt-libcouchbase/ext/mt-libcouchbase/valbuf.rb +22 -0
  675. data/lib/mt-libcouchbase/ext/mt-libcouchbase/valbuf_u_buf.rb +14 -0
  676. data/lib/mt-libcouchbase/ext/mt-libcouchbase/viewhandle.rb +7 -0
  677. data/lib/mt-libcouchbase/ext/mt-libcouchbase.rb +1175 -0
  678. data/lib/mt-libcouchbase/ext/mt-libcouchbase_libuv.rb +22 -0
  679. data/lib/mt-libcouchbase/ext/tasks.rb +39 -0
  680. data/lib/mt-libcouchbase/n1ql.rb +80 -0
  681. data/lib/mt-libcouchbase/query_full_text.rb +147 -0
  682. data/lib/mt-libcouchbase/query_n1ql.rb +123 -0
  683. data/lib/mt-libcouchbase/query_view.rb +135 -0
  684. data/lib/mt-libcouchbase/results_fiber.rb +281 -0
  685. data/lib/mt-libcouchbase/results_native.rb +220 -0
  686. data/lib/mt-libcouchbase/subdoc_request.rb +139 -0
  687. data/lib/mt-libcouchbase/version.rb +5 -0
  688. data/lib/mt-libcouchbase.rb +40 -0
  689. data/mt-libcouchbase.gemspec +68 -0
  690. data/spec/bucket_spec.rb +290 -0
  691. data/spec/connection_spec.rb +257 -0
  692. data/spec/design_docs_spec.rb +31 -0
  693. data/spec/error_spec.rb +26 -0
  694. data/spec/fts_spec.rb +135 -0
  695. data/spec/n1ql_spec.rb +260 -0
  696. data/spec/results_libuv_spec.rb +244 -0
  697. data/spec/results_native_spec.rb +259 -0
  698. data/spec/seed/2016-10-25T043505Z/2016-10-25T043505Z-full/bucket-default/design.json +1 -0
  699. data/spec/seed/2016-10-25T043505Z/2016-10-25T043505Z-full/bucket-default/node-127.0.0.1%3A8091/data-0000.cbb +0 -0
  700. data/spec/seed/2016-10-25T043505Z/2016-10-25T043505Z-full/bucket-default/node-127.0.0.1%3A8091/failover.json +1 -0
  701. data/spec/seed/2016-10-25T043505Z/2016-10-25T043505Z-full/bucket-default/node-127.0.0.1%3A8091/meta.json +1 -0
  702. data/spec/seed/2016-10-25T043505Z/2016-10-25T043505Z-full/bucket-default/node-127.0.0.1%3A8091/seqno.json +1 -0
  703. data/spec/seed/2016-10-25T043505Z/2016-10-25T043505Z-full/bucket-default/node-127.0.0.1%3A8091/snapshot_markers.json +1 -0
  704. data/spec/subdoc_spec.rb +192 -0
  705. data/spec/view_spec.rb +201 -0
  706. data/windows_build.md +36 -0
  707. metadata +873 -0
@@ -0,0 +1,1055 @@
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 LOGARGS_T(lvl) LOGARGS(this, lvl)
30
+
31
+ #define LOGFMT CTX_LOGFMT_PRE ",SRV=%p,IX=%d) "
32
+ #define PKTFMT "OP=0x%x, RC=0x%x, SEQ=%u"
33
+ #define PKTARGS(pkt) (pkt).opcode(), (pkt).status(), (pkt).opaque()
34
+
35
+ #define LOGID(server) CTX_LOGID(server->connctx), (void *)server, server->index
36
+ #define LOGID_T() LOGID(this)
37
+
38
+ #define MCREQ_MAXIOV 32
39
+ #define LCBCONN_UNWANT(conn, flags) (conn)->want &= ~(flags)
40
+
41
+ using namespace lcb;
42
+
43
+ static void on_error(lcbio_CTX *ctx, lcb_error_t err);
44
+
45
+ static void
46
+ on_flush_ready(lcbio_CTX *ctx)
47
+ {
48
+ Server *server = Server::get(ctx);
49
+ nb_IOV iov[MCREQ_MAXIOV] = {};
50
+ int ready;
51
+
52
+ do {
53
+ int niov = 0;
54
+ unsigned nb;
55
+ nb = mcreq_flush_iov_fill(server, iov, MCREQ_MAXIOV, &niov);
56
+ if (!nb) {
57
+ return;
58
+ }
59
+ #ifdef LCB_DUMP_PACKETS
60
+ {
61
+ char *b64 = NULL;
62
+ int nb64 = 0;
63
+ lcb_base64_encode_iov((lcb_IOV *)iov, niov, nb, &b64, &nb64);
64
+ lcb_log(LOGARGS(server, TRACE), LOGFMT "pkt,snd,fill: size=%d, %.*s", LOGID(server), nb64, nb64, b64);
65
+ free(b64);
66
+ }
67
+ #endif
68
+ ready = lcbio_ctx_put_ex(ctx, (lcb_IOV *)iov, niov, nb);
69
+ } while (ready);
70
+ lcbio_ctx_wwant(ctx);
71
+ }
72
+
73
+ static void
74
+ on_flush_done(lcbio_CTX *ctx, unsigned expected, unsigned actual)
75
+ {
76
+ Server *server = Server::get(ctx);
77
+ lcb_U64 now = 0;
78
+ if (server->settings->readj_ts_wait) {
79
+ now = gethrtime();
80
+ }
81
+
82
+ #ifdef LCB_DUMP_PACKETS
83
+ lcb_log(LOGARGS(server, TRACE), LOGFMT "pkt,snd,flush: expected=%u, actual=%u", LOGID(server), expected, actual);
84
+ #endif
85
+ mcreq_flush_done_ex(server, actual, expected, now);
86
+ server->check_closed();
87
+ }
88
+
89
+ void
90
+ Server::flush()
91
+ {
92
+ /** Call into the wwant stuff.. */
93
+ if (!connctx->rdwant) {
94
+ lcbio_ctx_rwant(connctx, 24);
95
+ }
96
+
97
+ lcbio_ctx_wwant(connctx);
98
+ lcbio_ctx_schedule(connctx);
99
+
100
+ if (!lcbio_timer_armed(io_timer)) {
101
+ /**
102
+ * XXX: Maybe use get_next_timeout(), although here we can assume
103
+ * that a command was just scheduled
104
+ */
105
+ lcbio_timer_rearm(io_timer, default_timeout());
106
+ }
107
+ }
108
+
109
+ LIBCOUCHBASE_API
110
+ void
111
+ lcb_sched_flush(lcb_t instance)
112
+ {
113
+ for (size_t ii = 0; ii < LCBT_NSERVERS(instance); ii++) {
114
+ Server *server = instance->get_server(ii);
115
+
116
+ if (!server->has_pending()) {
117
+ continue;
118
+ }
119
+ server->flush_start(server);
120
+ }
121
+ }
122
+
123
+ /**
124
+ * Invoked when get a NOT_MY_VBUCKET response. If the response contains a JSON
125
+ * payload then we refresh the configuration with it.
126
+ *
127
+ * This function returns 1 if the operation was successfully rescheduled;
128
+ * otherwise it returns 0. If it returns 0 then we give the error back to the
129
+ * user.
130
+ */
131
+ bool
132
+ Server::handle_nmv(MemcachedResponse& resinfo, mc_PACKET *oldpkt)
133
+ {
134
+ protocol_binary_request_header hdr;
135
+ lcb_error_t err = LCB_ERROR;
136
+ lcb_U16 vbid;
137
+ lcb::clconfig::Provider *cccp =
138
+ instance->confmon->get_provider(lcb::clconfig::CLCONFIG_CCCP);
139
+
140
+ MC_INCR_METRIC(this, packets_nmv, 1);
141
+
142
+ mcreq_read_hdr(oldpkt, &hdr);
143
+ vbid = ntohs(hdr.request.vbucket);
144
+ lcb_log(LOGARGS_T(WARN), LOGFMT "NOT_MY_VBUCKET. Packet=%p (S=%u). VBID=%u", LOGID_T(), (void*)oldpkt, oldpkt->opaque, vbid);
145
+
146
+ /* Notify of new map */
147
+ lcb_vbguess_remap(instance, vbid, index);
148
+
149
+ if (resinfo.vallen() && cccp->enabled) {
150
+ std::string s(resinfo.value(), resinfo.vallen());
151
+ err = lcb::clconfig::cccp_update(cccp, curhost->host, s.c_str());
152
+ }
153
+
154
+ if (err != LCB_SUCCESS) {
155
+ int bs_options;
156
+ if (instance->cur_configinfo->get_origin() == lcb::clconfig::CLCONFIG_CCCP) {
157
+ /**
158
+ * XXX: Not enough to see if cccp was enabled, since cccp might
159
+ * be requested by a user, but would still not actually be active
160
+ * for clusters < 2.5 If our current config is from CCCP
161
+ * then we can be fairly certain that CCCP is indeed working.
162
+ *
163
+ * For this reason, we don't use if (cccp->enabled) {...}
164
+ */
165
+ bs_options = BS_REFRESH_THROTTLE;
166
+ } else {
167
+ bs_options = BS_REFRESH_ALWAYS;
168
+ }
169
+ instance->bootstrap(bs_options);
170
+ }
171
+
172
+ if (!lcb_should_retry(settings, oldpkt, LCB_NOT_MY_VBUCKET)) {
173
+ return false;
174
+ }
175
+
176
+ /** Reschedule the packet again .. */
177
+ mc_PACKET *newpkt = mcreq_renew_packet(oldpkt);
178
+ newpkt->flags &= ~MCREQ_STATE_FLAGS;
179
+ instance->retryq->nmvadd((mc_EXPACKET*)newpkt);
180
+ return true;
181
+ }
182
+
183
+ /**
184
+ * Determine if this is an error code that we can pass to the user, or can
185
+ * otherwise handle "innately"
186
+ */
187
+ static bool is_fastpath_error(uint16_t rc) {
188
+ switch (rc) {
189
+ case PROTOCOL_BINARY_RESPONSE_SUCCESS:
190
+ case PROTOCOL_BINARY_RESPONSE_KEY_ENOENT:
191
+ case PROTOCOL_BINARY_RESPONSE_KEY_EEXISTS:
192
+ case PROTOCOL_BINARY_RESPONSE_E2BIG:
193
+ case PROTOCOL_BINARY_RESPONSE_NOT_STORED:
194
+ case PROTOCOL_BINARY_RESPONSE_DELTA_BADVAL:
195
+ case PROTOCOL_BINARY_RESPONSE_ERANGE:
196
+ case PROTOCOL_BINARY_RESPONSE_NOT_SUPPORTED:
197
+ case PROTOCOL_BINARY_RESPONSE_UNKNOWN_COMMAND:
198
+ case PROTOCOL_BINARY_RESPONSE_ETMPFAIL:
199
+ case PROTOCOL_BINARY_RESPONSE_ENOMEM:
200
+ case PROTOCOL_BINARY_RESPONSE_SUBDOC_PATH_ENOENT:
201
+ case PROTOCOL_BINARY_RESPONSE_SUBDOC_PATH_EEXISTS:
202
+ case PROTOCOL_BINARY_RESPONSE_SUBDOC_PATH_MISMATCH:
203
+ case PROTOCOL_BINARY_RESPONSE_SUBDOC_PATH_EINVAL:
204
+ case PROTOCOL_BINARY_RESPONSE_SUBDOC_PATH_E2BIG:
205
+ case PROTOCOL_BINARY_RESPONSE_SUBDOC_VALUE_CANTINSERT:
206
+ case PROTOCOL_BINARY_RESPONSE_SUBDOC_VALUE_ETOODEEP:
207
+ case PROTOCOL_BINARY_RESPONSE_SUBDOC_DOC_NOTJSON:
208
+ case PROTOCOL_BINARY_RESPONSE_SUBDOC_NUM_ERANGE:
209
+ case PROTOCOL_BINARY_RESPONSE_SUBDOC_DELTA_ERANGE:
210
+ case PROTOCOL_BINARY_RESPONSE_SUBDOC_INVALID_COMBO:
211
+ case PROTOCOL_BINARY_RESPONSE_SUBDOC_MULTI_PATH_FAILURE:
212
+ case PROTOCOL_BINARY_RESPONSE_SUBDOC_SUCCESS_DELETED:
213
+ case PROTOCOL_BINARY_RESPONSE_SUBDOC_XATTR_INVALID_FLAG_COMBO:
214
+ case PROTOCOL_BINARY_RESPONSE_SUBDOC_XATTR_INVALID_KEY_COMBO:
215
+ case PROTOCOL_BINARY_RESPONSE_SUBDOC_XATTR_UNKNOWN_MACRO:
216
+ case PROTOCOL_BINARY_RESPONSE_SUBDOC_XATTR_UNKNOWN_VATTR:
217
+ case PROTOCOL_BINARY_RESPONSE_SUBDOC_XATTR_CANT_MODIFY_VATTR:
218
+ case PROTOCOL_BINARY_RESPONSE_SUBDOC_MULTI_PATH_FAILURE_DELETED:
219
+ case PROTOCOL_BINARY_RESPONSE_SUBDOC_INVALID_XATTR_ORDER:
220
+ case PROTOCOL_BINARY_RESPONSE_EACCESS:
221
+ return true;
222
+ default:
223
+ if (rc >= 0xc0 && rc <= 0xcc) {
224
+ // other subdoc?
225
+ return true;
226
+ } else {
227
+ return false;
228
+ }
229
+ break;
230
+ }
231
+ }
232
+
233
+ #define ERRMAP_HANDLE_CONTINUE 0
234
+ #define ERRMAP_HANDLE_DISCONN 1
235
+ #define ERRMAP_HANDLE_RETRY 2
236
+
237
+ /**
238
+ * Handle an unknown memcached error
239
+ *
240
+ * @param mcresp Response which contains the unknown error
241
+ * @param[out] newerr more user-friendly based on error map attributes
242
+ *
243
+ * @return true if this function handled the error specially (by disconnecting)
244
+ * or false if normal handling should continue.
245
+ */
246
+ int Server::handle_unknown_error(const mc_PACKET *request,
247
+ const MemcachedResponse& mcresp,
248
+ lcb_error_t& newerr) {
249
+
250
+ if (!settings->errmap->isLoaded() || !settings->use_errmap) {
251
+ // If there's no error map, just return false
252
+ return ERRMAP_HANDLE_CONTINUE;
253
+ }
254
+
255
+ // Look up the error map definition for this error
256
+ const errmap::Error& err = settings->errmap->getError(mcresp.status());
257
+
258
+ if (!err.isValid() || err.hasAttribute(errmap::SPECIAL_HANDLING)) {
259
+ lcb_log(LOGARGS_T(ERR), LOGFMT "Received error not in error map or requires special handling! " PKTFMT, LOGID_T(), PKTARGS(mcresp));
260
+ lcbio_ctx_senderr(connctx, LCB_PROTOCOL_ERROR);
261
+ return ERRMAP_HANDLE_DISCONN;
262
+ } else {
263
+ lcb_log(LOGARGS_T(WARN), LOGFMT "Received server error %s (0x%x) on packet: " PKTFMT, LOGID_T(), err.shortname.c_str(), err.code, PKTARGS(mcresp));
264
+ }
265
+
266
+ if (err.hasAttribute(errmap::FETCH_CONFIG)) {
267
+ instance->bootstrap(BS_REFRESH_THROTTLE);
268
+ }
269
+
270
+ if (err.hasAttribute(errmap::TEMPORARY)) {
271
+ newerr = LCB_GENERIC_TMPERR;
272
+ }
273
+
274
+ if (err.hasAttribute(errmap::CONSTRAINT_FAILURE)) {
275
+ newerr = LCB_GENERIC_CONSTRAINT_ERR;
276
+ }
277
+
278
+ if (err.hasAttribute(errmap::AUTH)) {
279
+ newerr = LCB_AUTH_ERROR;
280
+ }
281
+
282
+ if (err.hasAttribute(errmap::SUBDOC) && newerr == LCB_SUCCESS) {
283
+ newerr = LCB_GENERIC_SUBDOCERR;
284
+ }
285
+
286
+ /* TODO: remove masking LOCKED in 3.0 release */
287
+ if (err.hasAttribute(errmap::ITEM_LOCKED)) {
288
+ switch (mcresp.opcode()) {
289
+ case PROTOCOL_BINARY_CMD_SET:
290
+ case PROTOCOL_BINARY_CMD_REPLACE:
291
+ case PROTOCOL_BINARY_CMD_DELETE:
292
+ newerr = LCB_KEY_EEXISTS;
293
+ break;
294
+ default:
295
+ newerr = LCB_ETMPFAIL;
296
+ }
297
+ }
298
+
299
+ int rv = 0;
300
+
301
+ if (err.hasAttribute(errmap::AUTO_RETRY)) {
302
+ errmap::RetrySpec *spec = err.getRetrySpec();
303
+
304
+ mc_PACKET *newpkt = mcreq_renew_packet(request);
305
+ newpkt->flags &= ~MCREQ_STATE_FLAGS;
306
+ instance->retryq->add((mc_EXPACKET *)newpkt, newerr ? newerr : LCB_ERROR, spec);
307
+ rv |= ERRMAP_HANDLE_RETRY;
308
+ }
309
+
310
+ if (err.hasAttribute(errmap::CONN_STATE_INVALIDATED)) {
311
+ if (newerr != LCB_SUCCESS) {
312
+ newerr = LCB_ERROR;
313
+ }
314
+ lcbio_ctx_senderr(connctx, newerr);
315
+ rv |= ERRMAP_HANDLE_DISCONN;
316
+ }
317
+
318
+ return rv;
319
+
320
+ }
321
+
322
+ /* This function is called within a loop to process a single packet.
323
+ *
324
+ * If a full packet is available, it will process the packet and return
325
+ * PKT_READ_COMPLETE, resulting in the `on_read()` function calling this
326
+ * function in a loop.
327
+ *
328
+ * When a complete packet is not available, PKT_READ_PARTIAL will be returned
329
+ * and the `on_read()` loop will exit, scheduling any required pending I/O.
330
+ */
331
+ Server::ReadState
332
+ Server::try_read(lcbio_CTX *ctx, rdb_IOROPE *ior)
333
+ {
334
+ MemcachedResponse mcresp;
335
+ mc_PACKET *request;
336
+ unsigned pktsize = 24, is_last = 1;
337
+
338
+ #define RETURN_NEED_MORE(n) \
339
+ if (has_pending()) { \
340
+ lcbio_ctx_rwant(ctx, n); \
341
+ } \
342
+ return PKT_READ_PARTIAL; \
343
+
344
+ #define DO_ASSIGN_PAYLOAD() \
345
+ rdb_consumed(ior, mcresp.hdrsize()); \
346
+ if (mcresp.bodylen()) { \
347
+ mcresp.payload = rdb_get_consolidated(ior, mcresp.bodylen()); \
348
+ } {
349
+
350
+ #define DO_SWALLOW_PAYLOAD() \
351
+ } if (mcresp.bodylen()) { \
352
+ rdb_consumed(ior, mcresp.bodylen()); \
353
+ }
354
+
355
+ if (rdb_get_nused(ior) < pktsize) {
356
+ RETURN_NEED_MORE(pktsize)
357
+ }
358
+
359
+ MC_INCR_METRIC(this, packets_read, 1);
360
+
361
+ /* copy bytes into the info structure */
362
+ rdb_copyread(ior, mcresp.hdrbytes(), mcresp.hdrsize());
363
+
364
+ pktsize += mcresp.bodylen();
365
+ if (rdb_get_nused(ior) < pktsize) {
366
+ RETURN_NEED_MORE(pktsize);
367
+ }
368
+
369
+ /* Find the packet */
370
+ if (mcresp.opcode() == PROTOCOL_BINARY_CMD_STAT && mcresp.keylen() != 0) {
371
+ is_last = 0;
372
+ request = mcreq_pipeline_find(this, mcresp.opaque());
373
+ } else {
374
+ is_last = 1;
375
+ request = mcreq_pipeline_remove(this, mcresp.opaque());
376
+ }
377
+
378
+ if (!request) {
379
+ MC_INCR_METRIC(this, packets_ownerless, 1);
380
+ lcb_log(LOGARGS_T(DEBUG), LOGFMT "Server sent us reply for a timed-out command. (OP=0x%x, RC=0x%x, SEQ=%u)", LOGID_T(), mcresp.opcode(), mcresp.status(), mcresp.opaque());
381
+ rdb_consumed(ior, pktsize);
382
+ return PKT_READ_COMPLETE;
383
+ }
384
+
385
+ lcb_error_t err_override = LCB_SUCCESS;
386
+ ReadState rdstate = PKT_READ_COMPLETE;
387
+ int unknown_err_rv;
388
+
389
+ /* Check if the status code is one which must be handled carefully by the
390
+ * client */
391
+ if (is_fastpath_error(mcresp.status())) {
392
+ // Nothing here!
393
+ } else if (mcresp.status() == PROTOCOL_BINARY_RESPONSE_NOT_MY_VBUCKET) {
394
+ /* consume the header */
395
+ DO_ASSIGN_PAYLOAD()
396
+ if (!handle_nmv(mcresp, request)) {
397
+ mcreq_dispatch_response(this, request, &mcresp, LCB_NOT_MY_VBUCKET);
398
+ }
399
+ DO_SWALLOW_PAYLOAD()
400
+ goto GT_DONE;
401
+ } else if ((unknown_err_rv =
402
+ handle_unknown_error(request, mcresp, err_override)) !=
403
+ ERRMAP_HANDLE_CONTINUE) {
404
+ DO_ASSIGN_PAYLOAD()
405
+ if (!(unknown_err_rv & ERRMAP_HANDLE_RETRY)) {
406
+ mcreq_dispatch_response(this, request, &mcresp, err_override);
407
+ }
408
+ DO_SWALLOW_PAYLOAD()
409
+ if (unknown_err_rv & ERRMAP_HANDLE_DISCONN) {
410
+ rdstate = PKT_READ_ABORT;
411
+ }
412
+ goto GT_DONE;
413
+ }
414
+
415
+ /* Figure out if the request is 'ufwd' or not */
416
+ if (!(request->flags & MCREQ_F_UFWD)) {
417
+ DO_ASSIGN_PAYLOAD();
418
+ mcresp.bufh = rdb_get_first_segment(ior);
419
+ mcreq_dispatch_response(this, request, &mcresp, err_override);
420
+ DO_SWALLOW_PAYLOAD()
421
+
422
+ } else {
423
+ /* figure out how many buffers we want to use as an upper limit for the
424
+ * IOV arrays. Currently we'll keep it simple and ensure the entire
425
+ * response is contiguous. */
426
+ lcb_PKTFWDRESP resp = { 0 }; /* TODO: next ABI version should include is_last flag */
427
+ rdb_ROPESEG *segs;
428
+ nb_IOV iov;
429
+
430
+ rdb_consolidate(ior, pktsize);
431
+ rdb_refread_ex(ior, &iov, &segs, 1, pktsize);
432
+
433
+ resp.bufs = &segs;
434
+ resp.iovs = (lcb_IOV*)&iov;
435
+ resp.nitems = 1;
436
+ resp.header = mcresp.hdrbytes();
437
+ instance->callbacks.pktfwd(
438
+ instance, MCREQ_PKT_COOKIE(request), LCB_SUCCESS, &resp);
439
+ rdb_consumed(ior, pktsize);
440
+ }
441
+
442
+ GT_DONE:
443
+ if (is_last) {
444
+ mcreq_packet_handled(this, request);
445
+ }
446
+ return rdstate;
447
+ }
448
+
449
+ static void
450
+ on_read(lcbio_CTX *ctx, unsigned)
451
+ {
452
+ Server *server = Server::get(ctx);
453
+ rdb_IOROPE *ior = &ctx->ior;
454
+
455
+ if (server->check_closed()) {
456
+ return;
457
+ }
458
+
459
+ Server::ReadState rv;
460
+ while ((rv = server->try_read(ctx, ior)) == Server::PKT_READ_COMPLETE);
461
+ lcbio_ctx_schedule(ctx);
462
+ lcb_maybe_breakout(server->instance);
463
+ }
464
+
465
+ static void flush_noop(mc_PIPELINE *pipeline) {
466
+ (void)pipeline;
467
+ }
468
+
469
+ static void server_connect(Server *server) {
470
+ server->connect();
471
+ }
472
+
473
+ bool
474
+ Server::maybe_retry_packet(mc_PACKET *pkt, lcb_error_t err)
475
+ {
476
+ lcbvb_DISTMODE dist_t = lcbvb_get_distmode(parent->config);
477
+
478
+ if (dist_t != LCBVB_DIST_VBUCKET) {
479
+ /** memcached bucket */
480
+ return false;
481
+ }
482
+ if (!lcb_should_retry(settings, pkt, err)) {
483
+ return false;
484
+ }
485
+
486
+ mc_PACKET *newpkt = mcreq_renew_packet(pkt);
487
+ newpkt->flags &= ~MCREQ_STATE_FLAGS;
488
+ // TODO: Load the 4th argument from the error map
489
+ instance->retryq->add((mc_EXPACKET *)newpkt, err, NULL);
490
+ return true;
491
+ }
492
+
493
+ static void
494
+ fail_callback(mc_PIPELINE *pipeline, mc_PACKET *pkt, lcb_error_t err, void *) {
495
+ static_cast<Server*>(pipeline)->purge_single(pkt, err);
496
+ }
497
+
498
+ static const char *opcode_name(uint8_t code)
499
+ {
500
+ switch (code) {
501
+ case PROTOCOL_BINARY_CMD_GET:
502
+ return "get";
503
+ case PROTOCOL_BINARY_CMD_SET:
504
+ return "set";
505
+ case PROTOCOL_BINARY_CMD_ADD:
506
+ return "add";
507
+ case PROTOCOL_BINARY_CMD_REPLACE:
508
+ return "replace";
509
+ case PROTOCOL_BINARY_CMD_DELETE:
510
+ return "delete";
511
+ case PROTOCOL_BINARY_CMD_INCREMENT:
512
+ return "incr";
513
+ case PROTOCOL_BINARY_CMD_DECREMENT:
514
+ return "decr";
515
+ case PROTOCOL_BINARY_CMD_FLUSH:
516
+ return "flush";
517
+ case PROTOCOL_BINARY_CMD_GETQ:
518
+ return "getq";
519
+ case PROTOCOL_BINARY_CMD_NOOP:
520
+ return "noop";
521
+ case PROTOCOL_BINARY_CMD_VERSION:
522
+ return "version";
523
+ case PROTOCOL_BINARY_CMD_APPEND:
524
+ return "append";
525
+ case PROTOCOL_BINARY_CMD_PREPEND:
526
+ return "prepend";
527
+ case PROTOCOL_BINARY_CMD_STAT:
528
+ return "stat";
529
+ case PROTOCOL_BINARY_CMD_VERBOSITY:
530
+ return "verbosity";
531
+ case PROTOCOL_BINARY_CMD_TOUCH:
532
+ return "touch";
533
+ case PROTOCOL_BINARY_CMD_GAT:
534
+ return "gat";
535
+ case PROTOCOL_BINARY_CMD_HELLO:
536
+ return "hello";
537
+ case PROTOCOL_BINARY_CMD_SASL_LIST_MECHS:
538
+ return "sasl_list_mechs";
539
+ case PROTOCOL_BINARY_CMD_SASL_AUTH:
540
+ return "sasl_auth";
541
+ case PROTOCOL_BINARY_CMD_SASL_STEP:
542
+ return "sasl_step";
543
+ case PROTOCOL_BINARY_CMD_GET_REPLICA:
544
+ return "get_replica";
545
+ case PROTOCOL_BINARY_CMD_SELECT_BUCKET:
546
+ return "select_bucket";
547
+ case PROTOCOL_BINARY_CMD_OBSERVE_SEQNO:
548
+ return "observe_seqno";
549
+ case PROTOCOL_BINARY_CMD_OBSERVE:
550
+ return "observe";
551
+ case PROTOCOL_BINARY_CMD_GET_LOCKED:
552
+ return "get_locked";
553
+ case PROTOCOL_BINARY_CMD_UNLOCK_KEY:
554
+ return "unlock_key";
555
+ case PROTOCOL_BINARY_CMD_GET_CLUSTER_CONFIG:
556
+ return "get_cluster_config";
557
+ case PROTOCOL_BINARY_CMD_SUBDOC_GET:
558
+ return "subdoc_get";
559
+ case PROTOCOL_BINARY_CMD_SUBDOC_EXISTS:
560
+ return "subdoc_exists";
561
+ case PROTOCOL_BINARY_CMD_SUBDOC_DICT_ADD:
562
+ return "subdoc_dict_add";
563
+ case PROTOCOL_BINARY_CMD_SUBDOC_DICT_UPSERT:
564
+ return "subdoc_dict_upsert";
565
+ case PROTOCOL_BINARY_CMD_SUBDOC_DELETE:
566
+ return "subdoc_delete";
567
+ case PROTOCOL_BINARY_CMD_SUBDOC_REPLACE:
568
+ return "subdoc_replace";
569
+ case PROTOCOL_BINARY_CMD_SUBDOC_ARRAY_PUSH_LAST:
570
+ return "subdoc_array_push_last";
571
+ case PROTOCOL_BINARY_CMD_SUBDOC_ARRAY_PUSH_FIRST:
572
+ return "subdoc_array_push_first";
573
+ case PROTOCOL_BINARY_CMD_SUBDOC_ARRAY_INSERT:
574
+ return "subdoc_array_insert";
575
+ case PROTOCOL_BINARY_CMD_SUBDOC_ARRAY_ADD_UNIQUE:
576
+ return "subdoc_array_add_unique";
577
+ case PROTOCOL_BINARY_CMD_SUBDOC_COUNTER:
578
+ return "subdoc_counter";
579
+ case PROTOCOL_BINARY_CMD_SUBDOC_MULTI_LOOKUP:
580
+ return "subdoc_multi_lookup";
581
+ case PROTOCOL_BINARY_CMD_SUBDOC_MULTI_MUTATION:
582
+ return "subdoc_multi_mutation";
583
+ case PROTOCOL_BINARY_CMD_SUBDOC_GET_COUNT:
584
+ return "subdoc_get_count";
585
+ case PROTOCOL_BINARY_CMD_GET_ERROR_MAP:
586
+ return "get_error_map";
587
+ default:
588
+ return "unknown";
589
+ }
590
+ }
591
+
592
+ void Server::purge_single(mc_PACKET *pkt, lcb_error_t err) {
593
+ if (maybe_retry_packet(pkt, err)) {
594
+ return;
595
+ }
596
+
597
+ if (err == LCB_AUTH_ERROR) {
598
+ /* In-situ auth errors are actually dead servers. Let's provide this
599
+ * as the actual error code. */
600
+ err = LCB_MAP_CHANGED;
601
+ }
602
+
603
+ if (err == LCB_ETIMEDOUT) {
604
+ lcb_error_t tmperr = lcb::RetryQueue::error_for(pkt);
605
+ if (tmperr != LCB_SUCCESS) {
606
+ err = tmperr;
607
+ }
608
+ }
609
+
610
+ protocol_binary_request_header hdr;
611
+ memcpy(hdr.bytes, SPAN_BUFFER(&pkt->kh_span), sizeof(hdr.bytes));
612
+ MemcachedResponse resp(protocol_binary_command(hdr.request.opcode),
613
+ hdr.request.opaque,
614
+ PROTOCOL_BINARY_RESPONSE_EINVAL);
615
+
616
+ #ifdef LCB_TRACING
617
+ lcbtrace_span_set_orphaned(MCREQ_PKT_RDATA(pkt)->span, true);
618
+ #endif
619
+ if (err == LCB_ETIMEDOUT && settings->use_tracing) {
620
+ Json::Value info;
621
+
622
+ char opid[30] = {};
623
+ snprintf(opid, sizeof(opid), "kv:%s", opcode_name(hdr.request.opcode));
624
+ info["s"] = opid;
625
+ info["b"] = settings->bucket;
626
+ info["t"] = settings->operation_timeout;
627
+
628
+ const lcb_host_t &remote = get_host();
629
+ std::string rhost;
630
+ if (remote.ipv6) {
631
+ rhost.append("[").append(remote.host).append("]:").append(remote.port);
632
+ } else {
633
+ rhost.append(remote.host).append(":").append(remote.port);
634
+ }
635
+ info["r"] = rhost.c_str();
636
+
637
+ if (connctx) {
638
+ char local_id[54] = {};
639
+ snprintf(local_id, sizeof(local_id), "%016" PRIx64 "/%016" PRIx64 "/%x",
640
+ (lcb_U64)settings->iid, connctx->sock->id, (int)pkt->opaque);
641
+ info["i"] = local_id;
642
+ info["l"] = lcbio__inet_ntop(&connctx->sock->info->sa_local).c_str();
643
+ }
644
+ std::string msg(Json::FastWriter().write(info));
645
+ if (msg.size() > 1) {
646
+ lcb_log(LOGARGS(instance, WARN), "Failing command with error %s: %.*s",
647
+ lcb_strerror_short(err), (int)(msg.size() - 1), msg.c_str());
648
+ }
649
+ } else {
650
+ lcb_log(LOGARGS_T(WARN), LOGFMT "Failing command (pkt=%p, opaque=%lu, opcode=0x%x) with error %s", LOGID_T(), (void*)pkt, (unsigned long)pkt->opaque, hdr.request.opcode, lcb_strerror_short(err));
651
+ }
652
+ int rv = mcreq_dispatch_response(this, pkt, &resp, err);
653
+ lcb_assert(rv == 0);
654
+ }
655
+
656
+ int
657
+ Server::purge(lcb_error_t error, hrtime_t thresh, hrtime_t *next,
658
+ RefreshPolicy policy)
659
+ {
660
+ unsigned affected;
661
+
662
+ if (thresh) {
663
+ affected = mcreq_pipeline_timeout(
664
+ this, error, fail_callback, NULL, thresh, next);
665
+
666
+ } else {
667
+ mcreq_pipeline_fail(this, error, fail_callback, NULL);
668
+ affected = -1;
669
+ }
670
+
671
+ MC_INCR_METRIC(this, packets_errored, affected);
672
+ if (policy == REFRESH_NEVER) {
673
+ return affected;
674
+ }
675
+
676
+ if (affected || policy == REFRESH_ALWAYS) {
677
+ instance->bootstrap(BS_REFRESH_THROTTLE|BS_REFRESH_INCRERR);
678
+ }
679
+ return affected;
680
+ }
681
+
682
+ static void flush_errdrain(mc_PIPELINE *pipeline)
683
+ {
684
+ /* Called when we are draining errors. */
685
+ Server *server = (Server *)pipeline;
686
+ if (!lcbio_timer_armed(server->io_timer)) {
687
+ lcbio_timer_rearm(server->io_timer, server->default_timeout());
688
+ }
689
+ }
690
+
691
+ uint32_t
692
+ Server::next_timeout() const
693
+ {
694
+ hrtime_t now, expiry, diff;
695
+ mc_PACKET *pkt = mcreq_first_packet(this);
696
+
697
+ if (!pkt) {
698
+ return default_timeout();
699
+ }
700
+
701
+ now = gethrtime();
702
+ expiry = MCREQ_PKT_RDATA(pkt)->start + LCB_US2NS(default_timeout());
703
+ if (expiry <= now) {
704
+ diff = 0;
705
+ } else {
706
+ diff = expiry - now;
707
+ }
708
+
709
+ return LCB_NS2US(diff);
710
+ }
711
+
712
+ static void
713
+ timeout_server(void *arg)
714
+ {
715
+ reinterpret_cast<Server*>(arg)->io_timeout();
716
+ }
717
+
718
+ void Server::io_timeout()
719
+ {
720
+ hrtime_t now = gethrtime();
721
+ hrtime_t min_valid = now - LCB_US2NS(default_timeout());
722
+
723
+ hrtime_t next_ns;
724
+ int npurged = purge(LCB_ETIMEDOUT, min_valid, &next_ns,
725
+ Server::REFRESH_ONFAILED);
726
+ if (npurged) {
727
+ MC_INCR_METRIC(this, packets_timeout, npurged);
728
+ lcb_log(LOGARGS_T(DEBUG), LOGFMT "Server timed out. Some commands have failed", LOGID_T());
729
+ }
730
+
731
+ uint32_t next_us = next_timeout();
732
+ lcb_log(LOGARGS_T(TRACE), LOGFMT "Scheduling next timeout for %u ms. This is not an error", LOGID_T(), next_us / 1000);
733
+ lcbio_timer_rearm(io_timer, next_us);
734
+ lcb_maybe_breakout(instance);
735
+ }
736
+
737
+ bool
738
+ Server::maybe_reconnect_on_fake_timeout(lcb_error_t err)
739
+ {
740
+ if (err != LCB_ETIMEDOUT) {
741
+ return false; /* not a timeout */
742
+ }
743
+ if (!settings->readj_ts_wait) {
744
+ return false; /* normal timeout behavior */
745
+ }
746
+ if (!has_pending()) {
747
+ return false; /* nothing pending */
748
+ }
749
+
750
+ uint32_t next_tmo = next_timeout();
751
+ if (next_tmo < default_timeout() / 2) {
752
+ /* Ideally we'd have a fuzz interval to shave off the actual timeout,
753
+ * since there will inevitably be some time taken off the next timeout */
754
+ return false;
755
+ }
756
+
757
+ lcb_log(LOGARGS_T(INFO), LOGFMT "Retrying connection. Assuming timeout because of stalled event loop", LOGID_T());
758
+ connect();
759
+ return true;
760
+ }
761
+
762
+ static void
763
+ on_connected(lcbio_SOCKET *sock, void *data, lcb_error_t err, lcbio_OSERR syserr)
764
+ {
765
+ Server *server = reinterpret_cast<Server*>(data);
766
+ server->handle_connected(sock, err, syserr);
767
+ }
768
+
769
+ static void mcserver_flush(Server *s) { s->flush(); }
770
+
771
+ void
772
+ Server::handle_connected(lcbio_SOCKET *sock, lcb_error_t err, lcbio_OSERR syserr)
773
+ {
774
+ connreq = NULL;
775
+
776
+ if (err != LCB_SUCCESS) {
777
+ lcb_log(LOGARGS_T(ERR), LOGFMT "Connection attempt failed. Received %s from libcouchbase, received %d from operating system", LOGID_T(), lcb_strerror_short(err), syserr);
778
+ MC_INCR_METRIC(this, iometrics.io_error, 1);
779
+ if (!maybe_reconnect_on_fake_timeout(err)) {
780
+ socket_failed(err);
781
+ }
782
+ return;
783
+ }
784
+
785
+ lcb_assert(sock);
786
+ if (metrics) {
787
+ lcbio_set_metrics(sock, &metrics->iometrics);
788
+ }
789
+
790
+ /** Do we need sasl? */
791
+ SessionInfo* sessinfo = SessionInfo::get(sock);
792
+ if (sessinfo == NULL) {
793
+ lcb_log(LOGARGS_T(TRACE), "<%s:%s> (SRV=%p) Session not yet negotiated. Negotiating", curhost->host, curhost->port, (void*)this);
794
+ connreq = SessionRequest::start(
795
+ sock, settings, default_timeout(), on_connected, this);
796
+ return;
797
+ } else {
798
+ jsonsupport = sessinfo->has_feature(PROTOCOL_BINARY_FEATURE_JSON);
799
+ compsupport = sessinfo->has_feature(PROTOCOL_BINARY_FEATURE_SNAPPY);
800
+ mutation_tokens = sessinfo->has_feature(PROTOCOL_BINARY_FEATURE_MUTATION_SEQNO);
801
+ }
802
+
803
+ lcbio_CTXPROCS procs;
804
+ procs.cb_err = on_error;
805
+ procs.cb_read = on_read;
806
+ procs.cb_flush_done = on_flush_done;
807
+ procs.cb_flush_ready = on_flush_ready;
808
+ connctx = lcbio_ctx_new(sock, this, &procs);
809
+ connctx->subsys = "memcached";
810
+ sock->service = LCBIO_SERVICE_KV;
811
+ flush_start = (mcreq_flushstart_fn)mcserver_flush;
812
+
813
+ uint32_t tmo = next_timeout();
814
+ lcbio_timer_rearm(io_timer, tmo);
815
+ flush();
816
+ }
817
+
818
+ void
819
+ Server::connect()
820
+ {
821
+ connreq = instance->memd_sockpool->get(*curhost,
822
+ default_timeout(), on_connected, this);
823
+ flush_start = flush_noop;
824
+ state = Server::S_CLEAN;
825
+ }
826
+
827
+ static void
828
+ buf_done_cb(mc_PIPELINE *pl, const void *cookie, void *, void *)
829
+ {
830
+ Server *server = static_cast<Server*>(pl);
831
+ server->instance->callbacks.pktflushed(server->instance, cookie);
832
+ }
833
+
834
+ Server::Server(lcb_t instance_, int ix)
835
+ : mc_PIPELINE(), state(S_CLEAN),
836
+ io_timer(lcbio_timer_new(instance_->iotable, this, timeout_server)),
837
+ instance(instance_),
838
+ settings(lcb_settings_ref2(instance_->settings)),
839
+ compsupport(0),
840
+ jsonsupport(0),
841
+ mutation_tokens(0),
842
+ connctx(NULL),
843
+ curhost(new lcb_host_t())
844
+ {
845
+ mcreq_pipeline_init(this);
846
+ flush_start = (mcreq_flushstart_fn)server_connect;
847
+ buf_done_callback = buf_done_cb;
848
+ index = ix;
849
+
850
+ std::memset(&connreq, 0, sizeof connreq);
851
+ std::memset(curhost, 0, sizeof *curhost);
852
+
853
+ const char *datahost = lcbvb_get_hostport(
854
+ LCBT_VBCONFIG(instance), ix,
855
+ LCBVB_SVCTYPE_DATA, LCBT_SETTING_SVCMODE(instance));
856
+ if (datahost) {
857
+ lcb_host_parsez(curhost, datahost, LCB_CONFIG_MCD_PORT);
858
+ }
859
+
860
+ if (settings->metrics) {
861
+ /** Allocate / reinitialize the metrics here */
862
+ metrics = lcb_metrics_getserver(settings->metrics, curhost->host, curhost->port, 1);
863
+ lcb_metrics_reset_pipeline_gauges(metrics);
864
+ }
865
+ }
866
+
867
+ Server::Server()
868
+ : state(S_TEMPORARY),
869
+ io_timer(NULL), instance(NULL), settings(NULL), compsupport(0), jsonsupport(0),
870
+ mutation_tokens(0), connctx(NULL), connreq(NULL), curhost(NULL)
871
+ {
872
+ }
873
+
874
+ Server::~Server() {
875
+ if (state == S_TEMPORARY) {
876
+ return;
877
+ }
878
+
879
+ if (this->instance) {
880
+ unsigned ii;
881
+ mc_CMDQUEUE *cmdq = &this->instance->cmdq;
882
+ for (ii = 0; ii < cmdq->npipelines; ii++) {
883
+ lcb::Server *server = static_cast<lcb::Server*>(cmdq->pipelines[ii]);
884
+ if (server == this) {
885
+ cmdq->pipelines[ii] = NULL;
886
+ break;
887
+ }
888
+ }
889
+ }
890
+ this->instance = NULL;
891
+ mcreq_pipeline_cleanup(this);
892
+
893
+ if (io_timer) {
894
+ lcbio_timer_destroy(io_timer);
895
+ }
896
+
897
+ delete curhost;
898
+ lcb_settings_unref(settings);
899
+ }
900
+
901
+ static void
902
+ close_cb(lcbio_SOCKET *sock, int, void *)
903
+ {
904
+ lcbio_ref(sock);
905
+ lcb::io::Pool::discard(sock);
906
+ }
907
+
908
+ static void
909
+ on_error(lcbio_CTX *ctx, lcb_error_t err)
910
+ {
911
+ Server *server = Server::get(ctx);
912
+ lcb_log(LOGARGS(server, WARN), LOGFMT "Got socket error %s", LOGID(server), lcb_strerror_short(err));
913
+ if (server->check_closed()) {
914
+ return;
915
+ }
916
+ server->socket_failed(err);
917
+ }
918
+
919
+ /**Handle a socket error. This function will close the current connection
920
+ * and trigger a failout of any pending commands.
921
+ * This function triggers a configuration refresh */
922
+ void
923
+ Server::socket_failed(lcb_error_t err)
924
+ {
925
+ if (check_closed()) {
926
+ return;
927
+ }
928
+
929
+ purge(err, 0, NULL, REFRESH_ALWAYS);
930
+ lcb_maybe_breakout(instance);
931
+ start_errored_ctx(S_ERRDRAIN);
932
+ }
933
+
934
+ void
935
+ Server::close()
936
+ {
937
+ /* Should never be called twice */
938
+ lcb_assert(state != Server::S_CLOSED);
939
+ start_errored_ctx(S_CLOSED);
940
+ }
941
+
942
+ /**
943
+ * Call to signal an error or similar on the current socket.
944
+ * @param server The server
945
+ * @param next_state The next state (S_CLOSED or S_ERRDRAIN)
946
+ */
947
+ void
948
+ Server::start_errored_ctx(State next_state)
949
+ {
950
+ lcbio_CTX *ctx = connctx;
951
+
952
+ state = next_state;
953
+ /* Cancel any pending connection attempt? */
954
+ lcb::io::ConnectionRequest::cancel(&connreq);
955
+
956
+ /* If the server is being destroyed, silence the timer */
957
+ if (next_state == Server::S_CLOSED && io_timer != NULL) {
958
+ lcbio_timer_destroy(io_timer);
959
+ io_timer = NULL;
960
+ }
961
+
962
+ if (ctx == NULL) {
963
+ if (next_state == Server::S_CLOSED) {
964
+ delete this;
965
+ return;
966
+ } else {
967
+ /* Not closed but don't have a current context */
968
+ if (has_pending()) {
969
+ if (!lcbio_timer_armed(io_timer)) {
970
+ /* TODO: Maybe throttle reconnection attempts? */
971
+ lcbio_timer_rearm(io_timer, default_timeout());
972
+ }
973
+ connect();
974
+ } else {
975
+ // Connect once someone actually wants a connection.
976
+ flush_start = (mcreq_flushstart_fn)server_connect;
977
+ }
978
+ }
979
+
980
+ } else {
981
+ if (ctx->npending) {
982
+ /* Have pending items? */
983
+
984
+ /* Flush any remaining events */
985
+ lcbio_ctx_schedule(ctx);
986
+
987
+ /* Close the socket not to leak resources */
988
+ lcbio_shutdown(lcbio_ctx_sock(ctx));
989
+ if (next_state == Server::S_ERRDRAIN) {
990
+ flush_start = (mcreq_flushstart_fn)flush_errdrain;
991
+ }
992
+ } else {
993
+ finalize_errored_ctx();
994
+ }
995
+ }
996
+ }
997
+
998
+ /**
999
+ * This function actually finalizes a ctx which has an error on it. If the
1000
+ * ctx has pending operations remaining then this function returns immediately.
1001
+ * Otherwise this will either reinitialize the connection or free the server
1002
+ * object depending on the actual object state (i.e. if it was closed or
1003
+ * simply errored).
1004
+ */
1005
+ void
1006
+ Server::finalize_errored_ctx()
1007
+ {
1008
+ if (connctx->npending) {
1009
+ return;
1010
+ }
1011
+
1012
+ lcb_log(LOGARGS_T(DEBUG), LOGFMT "Finalizing context", LOGID_T());
1013
+
1014
+ /* Always close the existing context. */
1015
+ lcbio_ctx_close(connctx, close_cb, NULL);
1016
+ connctx = NULL;
1017
+
1018
+ /**Marks any unflushed data inside this server as being already flushed. This
1019
+ * should be done within error handling. If subsequent data is flushed on this
1020
+ * pipeline to the same connection, the results are undefined. */
1021
+
1022
+ unsigned toflush;
1023
+ nb_IOV iov;
1024
+ while ((toflush = mcreq_flush_iov_fill(this, &iov, 1, NULL))) {
1025
+ mcreq_flush_done(this, toflush, toflush);
1026
+ }
1027
+
1028
+ if (state == Server::S_CLOSED) {
1029
+ /* If the server is closed, time to free it */
1030
+ delete this;
1031
+ } else {
1032
+ /* Otherwise, cycle the state back to CLEAN and reinit
1033
+ * the connection */
1034
+ state = Server::S_CLEAN;
1035
+ connect();
1036
+ }
1037
+ }
1038
+
1039
+ /**
1040
+ * This little function checks to see if the server struct is still valid, or
1041
+ * whether it should just be cleaned once no pending I/O remainds.
1042
+ *
1043
+ * If this function returns false then the server is still valid; otherwise it
1044
+ * is invalid and must not be used further.
1045
+ */
1046
+ bool
1047
+ Server::check_closed()
1048
+ {
1049
+ if (state == Server::S_CLEAN) {
1050
+ return false;
1051
+ }
1052
+ lcb_log(LOGARGS_T(INFO), LOGFMT "Got handler after close. Checking pending calls (pending=%u)", LOGID_T(), connctx->npending);
1053
+ finalize_errored_ctx();
1054
+ return 1;
1055
+ }