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.
- checksums.yaml +7 -0
- data/.gitignore +22 -0
- data/.gitmodules +3 -0
- data/.rspec +1 -0
- data/.travis.yml +38 -0
- data/Gemfile +4 -0
- data/LICENSE +24 -0
- data/README.md +445 -0
- data/Rakefile +76 -0
- data/ext/README.md +6 -0
- data/ext/Rakefile +19 -0
- data/ext/libcouchbase/.gitignore +132 -0
- data/ext/libcouchbase/CMakeLists.txt +455 -0
- data/ext/libcouchbase/CONTRIBUTING.md +105 -0
- data/ext/libcouchbase/LICENSE +202 -0
- data/ext/libcouchbase/README.markdown +195 -0
- data/ext/libcouchbase/RELEASE_NOTES.markdown +3523 -0
- data/ext/libcouchbase/cmake/Modules/ConfigureDtrace.cmake +52 -0
- data/ext/libcouchbase/cmake/Modules/CopyPDB.cmake +42 -0
- data/ext/libcouchbase/cmake/Modules/DistScript.cmake +17 -0
- data/ext/libcouchbase/cmake/Modules/DownloadLcbDep.cmake +18 -0
- data/ext/libcouchbase/cmake/Modules/FindCouchbaseHdrHistogram.cmake +15 -0
- data/ext/libcouchbase/cmake/Modules/FindCouchbaseLibev.cmake +73 -0
- data/ext/libcouchbase/cmake/Modules/FindCouchbaseLibevent.cmake +54 -0
- data/ext/libcouchbase/cmake/Modules/FindCouchbaseLibuv.cmake +57 -0
- data/ext/libcouchbase/cmake/Modules/FindProfiler.cmake +16 -0
- data/ext/libcouchbase/cmake/Modules/GenerateConfigDotH.cmake +49 -0
- data/ext/libcouchbase/cmake/Modules/GetLibcouchbaseFlags.cmake +142 -0
- data/ext/libcouchbase/cmake/Modules/GetPlatformCCInfo.cmake +45 -0
- data/ext/libcouchbase/cmake/Modules/GetVersionInfo.cmake +70 -0
- data/ext/libcouchbase/cmake/config-cmake.h.in +80 -0
- data/ext/libcouchbase/cmake/configure +355 -0
- data/ext/libcouchbase/cmake/defs.mk.in +6 -0
- data/ext/libcouchbase/cmake/dtrace-instr-link.pl +51 -0
- data/ext/libcouchbase/cmake/libcouchbase.stp.in +829 -0
- data/ext/libcouchbase/cmake/source_files.cmake +104 -0
- data/ext/libcouchbase/contrib/cJSON/cJSON.c +1022 -0
- data/ext/libcouchbase/contrib/cJSON/cJSON.h +158 -0
- data/ext/libcouchbase/contrib/cbsasl/CMakeLists.txt +25 -0
- data/ext/libcouchbase/contrib/cbsasl/COPYING +202 -0
- data/ext/libcouchbase/contrib/cbsasl/include/cbsasl/cbsasl.h +259 -0
- data/ext/libcouchbase/contrib/cbsasl/src/client.c +419 -0
- data/ext/libcouchbase/contrib/cbsasl/src/common.c +50 -0
- data/ext/libcouchbase/contrib/cbsasl/src/cram-md5/hmac.c +67 -0
- data/ext/libcouchbase/contrib/cbsasl/src/cram-md5/hmac.h +33 -0
- data/ext/libcouchbase/contrib/cbsasl/src/cram-md5/md5.c +296 -0
- data/ext/libcouchbase/contrib/cbsasl/src/cram-md5/md5.h +45 -0
- data/ext/libcouchbase/contrib/cbsasl/src/hash.c +573 -0
- data/ext/libcouchbase/contrib/cbsasl/src/hash.h +15 -0
- data/ext/libcouchbase/contrib/cbsasl/src/scram-sha/scram_utils.c +500 -0
- data/ext/libcouchbase/contrib/cbsasl/src/scram-sha/scram_utils.h +99 -0
- data/ext/libcouchbase/contrib/cbsasl/src/util.h +31 -0
- data/ext/libcouchbase/contrib/cliopts/CMakeLists.txt +2 -0
- data/ext/libcouchbase/contrib/cliopts/cliopts.c +938 -0
- data/ext/libcouchbase/contrib/cliopts/cliopts.h +610 -0
- data/ext/libcouchbase/contrib/genhash/genhash.c +371 -0
- data/ext/libcouchbase/contrib/genhash/genhash.h +241 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/CHANGES +157 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/CMakeLists.txt +252 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/CONTRIBUTORS +37 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/LICENSE +28 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/MINIFY.sh +15 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/README +435 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/cmake/internal_utils.cmake +227 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/gtest-death-test.h +294 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/gtest-message.h +250 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/gtest-param-test.h +1421 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/gtest-param-test.h.pump +487 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/gtest-printers.h +855 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/gtest-spi.h +232 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/gtest-test-part.h +179 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/gtest-typed-test.h +259 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/gtest.h +2291 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/gtest_pred_impl.h +358 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/gtest_prod.h +58 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/internal/gtest-death-test-internal.h +319 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/internal/gtest-filepath.h +206 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/internal/gtest-internal.h +1158 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/internal/gtest-linked_ptr.h +233 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/internal/gtest-param-util-generated.h +5143 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/internal/gtest-param-util-generated.h.pump +301 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/internal/gtest-param-util.h +619 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/internal/gtest-port.h +1947 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/internal/gtest-string.h +167 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/internal/gtest-tuple.h +1012 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/internal/gtest-tuple.h.pump +339 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/internal/gtest-type-util.h +3331 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/internal/gtest-type-util.h.pump +297 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/src/gtest-all.cc +48 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/src/gtest-death-test.cc +1344 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/src/gtest-filepath.cc +382 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/src/gtest-internal-inl.h +1218 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/src/gtest-port.cc +805 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/src/gtest-printers.cc +363 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/src/gtest-test-part.cc +110 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/src/gtest-typed-test.cc +110 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/src/gtest.cc +5015 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/src/gtest_main.cc +38 -0
- data/ext/libcouchbase/contrib/http_parser/LICENSE-MIT +23 -0
- data/ext/libcouchbase/contrib/http_parser/README.md +178 -0
- data/ext/libcouchbase/contrib/http_parser/http_parser.c +2060 -0
- data/ext/libcouchbase/contrib/http_parser/http_parser.h +321 -0
- data/ext/libcouchbase/contrib/jsonsl/LICENSE +20 -0
- data/ext/libcouchbase/contrib/jsonsl/jsonsl.c +1452 -0
- data/ext/libcouchbase/contrib/jsonsl/jsonsl.h +971 -0
- data/ext/libcouchbase/contrib/lcb-jsoncpp/CMakeLists.txt +6 -0
- data/ext/libcouchbase/contrib/lcb-jsoncpp/LICENSE +55 -0
- data/ext/libcouchbase/contrib/lcb-jsoncpp/lcb-jsoncpp-forwards.h +255 -0
- data/ext/libcouchbase/contrib/lcb-jsoncpp/lcb-jsoncpp.cpp +4893 -0
- data/ext/libcouchbase/contrib/lcb-jsoncpp/lcb-jsoncpp.h +1961 -0
- data/ext/libcouchbase/contrib/snappy/CMakeLists.txt +7 -0
- data/ext/libcouchbase/contrib/snappy/COPYING +28 -0
- data/ext/libcouchbase/contrib/snappy/snappy-c.cc +90 -0
- data/ext/libcouchbase/contrib/snappy/snappy-c.h +138 -0
- data/ext/libcouchbase/contrib/snappy/snappy-internal.h +150 -0
- data/ext/libcouchbase/contrib/snappy/snappy-lcb-msvc.h +5 -0
- data/ext/libcouchbase/contrib/snappy/snappy-sinksource.cc +75 -0
- data/ext/libcouchbase/contrib/snappy/snappy-sinksource.h +137 -0
- data/ext/libcouchbase/contrib/snappy/snappy-stubs-internal.cc +42 -0
- data/ext/libcouchbase/contrib/snappy/snappy-stubs-internal.h +491 -0
- data/ext/libcouchbase/contrib/snappy/snappy-stubs-public.h +100 -0
- data/ext/libcouchbase/contrib/snappy/snappy.cc +1312 -0
- data/ext/libcouchbase/contrib/snappy/snappy.h +184 -0
- data/ext/libcouchbase/contrib/win32-defs/iocpdefs.h +133 -0
- data/ext/libcouchbase/contrib/win32-defs/mingwdefs.h +4396 -0
- data/ext/libcouchbase/contrib/win32-defs/win_stdint.h +258 -0
- data/ext/libcouchbase/doc/Doxyfile +2495 -0
- data/ext/libcouchbase/doc/DoxygenLayout.xml +109 -0
- data/ext/libcouchbase/doc/Makefile +44 -0
- data/ext/libcouchbase/doc/apiattr.h +117 -0
- data/ext/libcouchbase/doc/cbc-n1qlback.markdown +88 -0
- data/ext/libcouchbase/doc/cbc-pillowfight.markdown +296 -0
- data/ext/libcouchbase/doc/cbc-subdoc.markdown +299 -0
- data/ext/libcouchbase/doc/cbc.markdown +763 -0
- data/ext/libcouchbase/doc/cbcrc.markdown +52 -0
- data/ext/libcouchbase/doc/common-additional-options.markdown +82 -0
- data/ext/libcouchbase/doc/common-options.markdown +71 -0
- data/ext/libcouchbase/doc/environment.h +93 -0
- data/ext/libcouchbase/doc/example/threads.c +77 -0
- data/ext/libcouchbase/doc/footer.html +22 -0
- data/ext/libcouchbase/doc/genman.sh +25 -0
- data/ext/libcouchbase/doc/header.html +52 -0
- data/ext/libcouchbase/doc/intro.h +130 -0
- data/ext/libcouchbase/doc/mainpage.h +136 -0
- data/ext/libcouchbase/doc/man/cbc-admin.1 +1 -0
- data/ext/libcouchbase/doc/man/cbc-bucket-create.1 +1 -0
- data/ext/libcouchbase/doc/man/cbc-bucket-delete.1 +1 -0
- data/ext/libcouchbase/doc/man/cbc-cat.1 +1 -0
- data/ext/libcouchbase/doc/man/cbc-connstr.1 +1 -0
- data/ext/libcouchbase/doc/man/cbc-cp.1 +1 -0
- data/ext/libcouchbase/doc/man/cbc-create.1 +1 -0
- data/ext/libcouchbase/doc/man/cbc-decr.1 +1 -0
- data/ext/libcouchbase/doc/man/cbc-flush.1 +1 -0
- data/ext/libcouchbase/doc/man/cbc-hash.1 +1 -0
- data/ext/libcouchbase/doc/man/cbc-incr.1 +1 -0
- data/ext/libcouchbase/doc/man/cbc-lock.1 +1 -0
- data/ext/libcouchbase/doc/man/cbc-mcflush.1 +1 -0
- data/ext/libcouchbase/doc/man/cbc-mcversion.1 +1 -0
- data/ext/libcouchbase/doc/man/cbc-n1ql.1 +1 -0
- data/ext/libcouchbase/doc/man/cbc-n1qlback.1 +198 -0
- data/ext/libcouchbase/doc/man/cbc-observe.1 +1 -0
- data/ext/libcouchbase/doc/man/cbc-pillowfight.1 +499 -0
- data/ext/libcouchbase/doc/man/cbc-ping.1 +1 -0
- data/ext/libcouchbase/doc/man/cbc-rm.1 +1 -0
- data/ext/libcouchbase/doc/man/cbc-role-list.1 +1 -0
- data/ext/libcouchbase/doc/man/cbc-stats.1 +1 -0
- data/ext/libcouchbase/doc/man/cbc-subdoc.1 +494 -0
- data/ext/libcouchbase/doc/man/cbc-unlock.1 +1 -0
- data/ext/libcouchbase/doc/man/cbc-user-delete.1 +1 -0
- data/ext/libcouchbase/doc/man/cbc-user-list.1 +1 -0
- data/ext/libcouchbase/doc/man/cbc-user-upsert.1 +1 -0
- data/ext/libcouchbase/doc/man/cbc-verbosity.1 +1 -0
- data/ext/libcouchbase/doc/man/cbc-version.1 +1 -0
- data/ext/libcouchbase/doc/man/cbc-view.1 +1 -0
- data/ext/libcouchbase/doc/man/cbc-watch.1 +1 -0
- data/ext/libcouchbase/doc/man/cbc.1 +1035 -0
- data/ext/libcouchbase/doc/man/cbcrc.4 +71 -0
- data/ext/libcouchbase/doc/style.css +1162 -0
- data/ext/libcouchbase/example/CMakeLists.txt +52 -0
- data/ext/libcouchbase/example/README.markdown +47 -0
- data/ext/libcouchbase/example/analytics/.gitignore +1 -0
- data/ext/libcouchbase/example/analytics/analytics.c +158 -0
- data/ext/libcouchbase/example/analytics/build-queries.rb +34 -0
- data/ext/libcouchbase/example/analytics/cJSON.c +1 -0
- data/ext/libcouchbase/example/analytics/cJSON.h +1 -0
- data/ext/libcouchbase/example/analytics/queries/00-show-dataverse.json +5 -0
- data/ext/libcouchbase/example/analytics/queries/01-setup-dataset-breweries.json +6 -0
- data/ext/libcouchbase/example/analytics/queries/02-setup-dataset-beers.json +6 -0
- data/ext/libcouchbase/example/analytics/queries/03-initiate-shadow.json +6 -0
- data/ext/libcouchbase/example/analytics/queries/04-list-datasets.json +7 -0
- data/ext/libcouchbase/example/analytics/queries/05-count-breweries.json +5 -0
- data/ext/libcouchbase/example/analytics/queries/06-first-brewery.json +6 -0
- data/ext/libcouchbase/example/analytics/queries/07-key-based-lookup.json +6 -0
- data/ext/libcouchbase/example/analytics/queries/08-exact-match-lookup.json +7 -0
- data/ext/libcouchbase/example/analytics/queries/09-exact-match-lookup-different-shape.json +6 -0
- data/ext/libcouchbase/example/analytics/queries/10-other-query-filters.json +6 -0
- data/ext/libcouchbase/example/analytics/queries/11-equijoin.json +9 -0
- data/ext/libcouchbase/example/analytics/queries/12-equijoin-select-star.json +10 -0
- data/ext/libcouchbase/example/analytics/queries/13-ansi-join.json +8 -0
- data/ext/libcouchbase/example/analytics/queries/14-join-select-values.json +8 -0
- data/ext/libcouchbase/example/analytics/queries/15-nested-outer-join.json +7 -0
- data/ext/libcouchbase/example/analytics/queries/16-theta-join.json +8 -0
- data/ext/libcouchbase/example/analytics/queries/17-existential-quantification.json +9 -0
- data/ext/libcouchbase/example/analytics/queries/18-universal-quantification.json +7 -0
- data/ext/libcouchbase/example/analytics/queries/19-simple-aggregation.json +6 -0
- data/ext/libcouchbase/example/analytics/queries/20-simple-aggregation-unwrapped-value.json +6 -0
- data/ext/libcouchbase/example/analytics/queries/21-simple-aggregation-explicit.json +6 -0
- data/ext/libcouchbase/example/analytics/queries/22-grouping-and-aggregation.json +6 -0
- data/ext/libcouchbase/example/analytics/queries/23-grouping-and-aggregation-with-hint.json +7 -0
- data/ext/libcouchbase/example/analytics/queries/24-grouping-and-limits.json +7 -0
- data/ext/libcouchbase/example/analytics/queries/25-named-parameters.json +7 -0
- data/ext/libcouchbase/example/analytics/queries/26-positional-parameters.json +7 -0
- data/ext/libcouchbase/example/analytics/queries.h +113 -0
- data/ext/libcouchbase/example/crypto/.gitignore +2 -0
- data/ext/libcouchbase/example/crypto/Makefile +13 -0
- data/ext/libcouchbase/example/crypto/common_provider.c +26 -0
- data/ext/libcouchbase/example/crypto/common_provider.h +33 -0
- data/ext/libcouchbase/example/crypto/openssl_symmetric_decrypt.c +144 -0
- data/ext/libcouchbase/example/crypto/openssl_symmetric_encrypt.c +146 -0
- data/ext/libcouchbase/example/crypto/openssl_symmetric_provider.c +271 -0
- data/ext/libcouchbase/example/crypto/openssl_symmetric_provider.h +29 -0
- data/ext/libcouchbase/example/db/db.c +171 -0
- data/ext/libcouchbase/example/db/vb.c +227 -0
- data/ext/libcouchbase/example/fts/.gitignore +1 -0
- data/ext/libcouchbase/example/fts/build-queries.rb +33 -0
- data/ext/libcouchbase/example/fts/fts.c +142 -0
- data/ext/libcouchbase/example/fts/queries/00-simple-text-query.json +12 -0
- data/ext/libcouchbase/example/fts/queries/01-simple-text-query-on-non-default-index.json +9 -0
- data/ext/libcouchbase/example/fts/queries/02-simple-text-query-on-stored-field.json +13 -0
- data/ext/libcouchbase/example/fts/queries/03-match-query-with-facet.json +19 -0
- data/ext/libcouchbase/example/fts/queries/04-docid-query.json +11 -0
- data/ext/libcouchbase/example/fts/queries/05-unanalyzed-term-query-with-fuzziness-level-of-0.json +13 -0
- data/ext/libcouchbase/example/fts/queries/06-unanalyzed-term-query-with-fuzziness-level-of-2.json +14 -0
- data/ext/libcouchbase/example/fts/queries/07-match-phrase-query.json +13 -0
- data/ext/libcouchbase/example/fts/queries/08-phrase-query.json +16 -0
- data/ext/libcouchbase/example/fts/queries/09-query-string-query.json +9 -0
- data/ext/libcouchbase/example/fts/queries/10-conjunction-query.json +21 -0
- data/ext/libcouchbase/example/fts/queries/11-wild-card-query.json +13 -0
- data/ext/libcouchbase/example/fts/queries/12-numeric-range-query.json +11 -0
- data/ext/libcouchbase/example/fts/queries/13-regexp-query.json +13 -0
- data/ext/libcouchbase/example/fts/queries.h +61 -0
- data/ext/libcouchbase/example/instancepool/main.cc +112 -0
- data/ext/libcouchbase/example/instancepool/pool.cc +102 -0
- data/ext/libcouchbase/example/instancepool/pool.h +69 -0
- data/ext/libcouchbase/example/libeventdirect/main.c +222 -0
- data/ext/libcouchbase/example/mcc/mcc.cc +246 -0
- data/ext/libcouchbase/example/minimal/.gitignore +1 -0
- data/ext/libcouchbase/example/minimal/minimal.c +132 -0
- data/ext/libcouchbase/example/minimal/query.c +185 -0
- data/ext/libcouchbase/example/observe/durability.c +102 -0
- data/ext/libcouchbase/example/observe/observe.c +159 -0
- data/ext/libcouchbase/example/subdoc/subdoc-multi.cc +143 -0
- data/ext/libcouchbase/example/subdoc/subdoc-simple.cc +201 -0
- data/ext/libcouchbase/example/subdoc/subdoc-xattrs.c +286 -0
- data/ext/libcouchbase/example/tick/tick.c +119 -0
- data/ext/libcouchbase/example/tracing/.gitignore +2 -0
- data/ext/libcouchbase/example/tracing/Makefile +8 -0
- data/ext/libcouchbase/example/tracing/cJSON.c +1 -0
- data/ext/libcouchbase/example/tracing/cJSON.h +1 -0
- data/ext/libcouchbase/example/tracing/tracing.c +439 -0
- data/ext/libcouchbase/example/tracing/views.c +444 -0
- data/ext/libcouchbase/example/users/README +48 -0
- data/ext/libcouchbase/example/users/users.c +147 -0
- data/ext/libcouchbase/example/views/views-example.cc +83 -0
- data/ext/libcouchbase/include/libcouchbase/_cxxwrap.h +150 -0
- data/ext/libcouchbase/include/libcouchbase/api-legacy.h +1689 -0
- data/ext/libcouchbase/include/libcouchbase/api3.h +2 -0
- data/ext/libcouchbase/include/libcouchbase/assert.h +44 -0
- data/ext/libcouchbase/include/libcouchbase/auth.h +297 -0
- data/ext/libcouchbase/include/libcouchbase/cbft.h +151 -0
- data/ext/libcouchbase/include/libcouchbase/cntl-private.h +319 -0
- data/ext/libcouchbase/include/libcouchbase/cntl.h +1418 -0
- data/ext/libcouchbase/include/libcouchbase/configuration.h.in +29 -0
- data/ext/libcouchbase/include/libcouchbase/couchbase.h +4089 -0
- data/ext/libcouchbase/include/libcouchbase/crypto.h +306 -0
- data/ext/libcouchbase/include/libcouchbase/deprecated.h +312 -0
- data/ext/libcouchbase/include/libcouchbase/error.h +680 -0
- data/ext/libcouchbase/include/libcouchbase/http.h +1 -0
- data/ext/libcouchbase/include/libcouchbase/iops.h +1053 -0
- data/ext/libcouchbase/include/libcouchbase/ixmgmt.h +263 -0
- data/ext/libcouchbase/include/libcouchbase/kvbuf.h +137 -0
- data/ext/libcouchbase/include/libcouchbase/metrics.h +79 -0
- data/ext/libcouchbase/include/libcouchbase/n1ql.h +539 -0
- data/ext/libcouchbase/include/libcouchbase/pktfwd.h +270 -0
- data/ext/libcouchbase/include/libcouchbase/plugins/io/bsdio-inl.c +370 -0
- data/ext/libcouchbase/include/libcouchbase/plugins/io/wsaerr-inl.c +76 -0
- data/ext/libcouchbase/include/libcouchbase/plugins/io/wsaerr.h +199 -0
- data/ext/libcouchbase/include/libcouchbase/subdoc.h +347 -0
- data/ext/libcouchbase/include/libcouchbase/sysdefs.h +98 -0
- data/ext/libcouchbase/include/libcouchbase/tracing.h +437 -0
- data/ext/libcouchbase/include/libcouchbase/vbucket.h +680 -0
- data/ext/libcouchbase/include/libcouchbase/views.h +357 -0
- data/ext/libcouchbase/include/libcouchbase/visibility.h +66 -0
- data/ext/libcouchbase/include/memcached/COPYING +30 -0
- data/ext/libcouchbase/include/memcached/README +10 -0
- data/ext/libcouchbase/include/memcached/protocol_binary.h +885 -0
- data/ext/libcouchbase/packaging/README +7 -0
- data/ext/libcouchbase/packaging/abicheck/.gitignore +4 -0
- data/ext/libcouchbase/packaging/abicheck/Makefile +17 -0
- data/ext/libcouchbase/packaging/abicheck/README.md +27 -0
- data/ext/libcouchbase/packaging/abicheck/template.xml +3 -0
- data/ext/libcouchbase/packaging/deb/compat +1 -0
- data/ext/libcouchbase/packaging/deb/control +72 -0
- data/ext/libcouchbase/packaging/deb/copyright +10 -0
- data/ext/libcouchbase/packaging/deb/libcouchbase-dev.docs +3 -0
- data/ext/libcouchbase/packaging/deb/package.mk +31 -0
- data/ext/libcouchbase/packaging/deb/rules +46 -0
- data/ext/libcouchbase/packaging/deb/source/format +1 -0
- data/ext/libcouchbase/packaging/distinfo/README +1 -0
- data/ext/libcouchbase/packaging/distinfo/distinfo.cmake.in +4 -0
- data/ext/libcouchbase/packaging/dllversion.rc.in +39 -0
- data/ext/libcouchbase/packaging/libcouchbase.pc.in +10 -0
- data/ext/libcouchbase/packaging/nuget/libcouchbase.autopkg +76 -0
- data/ext/libcouchbase/packaging/parse-git-describe.pl +166 -0
- data/ext/libcouchbase/packaging/rpm/libcouchbase.spec.in +101 -0
- data/ext/libcouchbase/packaging/rpm/package.mk +40 -0
- data/ext/libcouchbase/plugins/io/iocp/CMakeLists.txt +9 -0
- data/ext/libcouchbase/plugins/io/iocp/iocp_iops.c +467 -0
- data/ext/libcouchbase/plugins/io/iocp/iocp_iops.h +217 -0
- data/ext/libcouchbase/plugins/io/iocp/iocp_loop.c +295 -0
- data/ext/libcouchbase/plugins/io/iocp/iocp_timer.c +79 -0
- data/ext/libcouchbase/plugins/io/iocp/iocp_util.c +229 -0
- data/ext/libcouchbase/plugins/io/libev/CMakeLists.txt +31 -0
- data/ext/libcouchbase/plugins/io/libev/libev_io_opts.h +66 -0
- data/ext/libcouchbase/plugins/io/libev/plugin-libev.c +289 -0
- data/ext/libcouchbase/plugins/io/libevent/CMakeLists.txt +31 -0
- data/ext/libcouchbase/plugins/io/libevent/libevent_io_opts.h +67 -0
- data/ext/libcouchbase/plugins/io/libevent/plugin-libevent.c +292 -0
- data/ext/libcouchbase/plugins/io/libuv/CMakeLists.txt +44 -0
- data/ext/libcouchbase/plugins/io/libuv/libuv_compat.h +218 -0
- data/ext/libcouchbase/plugins/io/libuv/libuv_io_opts.h +118 -0
- data/ext/libcouchbase/plugins/io/libuv/plugin-internal.h +155 -0
- data/ext/libcouchbase/plugins/io/libuv/plugin-libuv.c +709 -0
- data/ext/libcouchbase/plugins/io/select/CMakeLists.txt +13 -0
- data/ext/libcouchbase/plugins/io/select/plugin-select.c +451 -0
- data/ext/libcouchbase/plugins/io/select/select_io_opts.h +39 -0
- data/ext/libcouchbase/src/README.md +101 -0
- data/ext/libcouchbase/src/aspend.h +105 -0
- data/ext/libcouchbase/src/auth-priv.h +85 -0
- data/ext/libcouchbase/src/auth.cc +146 -0
- data/ext/libcouchbase/src/bootstrap.cc +263 -0
- data/ext/libcouchbase/src/bootstrap.h +149 -0
- data/ext/libcouchbase/src/bucketconfig/bc_cccp.cc +450 -0
- data/ext/libcouchbase/src/bucketconfig/bc_file.cc +281 -0
- data/ext/libcouchbase/src/bucketconfig/bc_http.cc +527 -0
- data/ext/libcouchbase/src/bucketconfig/bc_http.h +107 -0
- data/ext/libcouchbase/src/bucketconfig/bc_static.cc +150 -0
- data/ext/libcouchbase/src/bucketconfig/clconfig.h +700 -0
- data/ext/libcouchbase/src/bucketconfig/confmon.cc +403 -0
- data/ext/libcouchbase/src/callbacks.c +380 -0
- data/ext/libcouchbase/src/cbft.cc +253 -0
- data/ext/libcouchbase/src/cntl.cc +1057 -0
- data/ext/libcouchbase/src/config_static.h +176 -0
- data/ext/libcouchbase/src/connspec.cc +555 -0
- data/ext/libcouchbase/src/connspec.h +155 -0
- data/ext/libcouchbase/src/crypto.cc +399 -0
- data/ext/libcouchbase/src/ctx-log-inl.h +44 -0
- data/ext/libcouchbase/src/dns-srv.cc +146 -0
- data/ext/libcouchbase/src/dump.cc +103 -0
- data/ext/libcouchbase/src/errmap.cc +173 -0
- data/ext/libcouchbase/src/errmap.h +271 -0
- data/ext/libcouchbase/src/getconfig.cc +72 -0
- data/ext/libcouchbase/src/gethrtime.c +109 -0
- data/ext/libcouchbase/src/handler.cc +1101 -0
- data/ext/libcouchbase/src/hashtable.c +75 -0
- data/ext/libcouchbase/src/hdr_timings.c +92 -0
- data/ext/libcouchbase/src/hostlist.cc +293 -0
- data/ext/libcouchbase/src/hostlist.h +160 -0
- data/ext/libcouchbase/src/http/http-priv.h +326 -0
- data/ext/libcouchbase/src/http/http.cc +672 -0
- data/ext/libcouchbase/src/http/http.h +1 -0
- data/ext/libcouchbase/src/http/http_io.cc +316 -0
- data/ext/libcouchbase/src/instance.cc +917 -0
- data/ext/libcouchbase/src/internal.h +285 -0
- data/ext/libcouchbase/src/iofactory.c +575 -0
- data/ext/libcouchbase/src/jsparse/parser.cc +445 -0
- data/ext/libcouchbase/src/jsparse/parser.h +159 -0
- data/ext/libcouchbase/src/lcbht/lcbht.cc +177 -0
- data/ext/libcouchbase/src/lcbht/lcbht.h +210 -0
- data/ext/libcouchbase/src/lcbio/connect.cc +603 -0
- data/ext/libcouchbase/src/lcbio/connect.h +400 -0
- data/ext/libcouchbase/src/lcbio/ctx.c +658 -0
- data/ext/libcouchbase/src/lcbio/ctx.h +405 -0
- data/ext/libcouchbase/src/lcbio/iotable.c +290 -0
- data/ext/libcouchbase/src/lcbio/iotable.h +169 -0
- data/ext/libcouchbase/src/lcbio/ioutils.cc +356 -0
- data/ext/libcouchbase/src/lcbio/ioutils.h +144 -0
- data/ext/libcouchbase/src/lcbio/lcbio.h +51 -0
- data/ext/libcouchbase/src/lcbio/manager.cc +579 -0
- data/ext/libcouchbase/src/lcbio/manager.h +195 -0
- data/ext/libcouchbase/src/lcbio/protoctx.c +84 -0
- data/ext/libcouchbase/src/lcbio/rw-inl.h +137 -0
- data/ext/libcouchbase/src/lcbio/ssl.h +159 -0
- data/ext/libcouchbase/src/lcbio/timer-cxx.h +87 -0
- data/ext/libcouchbase/src/lcbio/timer-ng.h +179 -0
- data/ext/libcouchbase/src/lcbio/timer.c +132 -0
- data/ext/libcouchbase/src/legacy.c +431 -0
- data/ext/libcouchbase/src/list.c +144 -0
- data/ext/libcouchbase/src/list.h +127 -0
- data/ext/libcouchbase/src/logging.c +244 -0
- data/ext/libcouchbase/src/logging.h +88 -0
- data/ext/libcouchbase/src/mc/compress.cc +171 -0
- data/ext/libcouchbase/src/mc/compress.h +56 -0
- data/ext/libcouchbase/src/mc/forward.c +186 -0
- data/ext/libcouchbase/src/mc/forward.h +90 -0
- data/ext/libcouchbase/src/mc/iovcursor-inl.h +279 -0
- data/ext/libcouchbase/src/mc/iovcursor.h +66 -0
- data/ext/libcouchbase/src/mc/mcreq-flush-inl.h +115 -0
- data/ext/libcouchbase/src/mc/mcreq.c +983 -0
- data/ext/libcouchbase/src/mc/mcreq.h +1015 -0
- data/ext/libcouchbase/src/mcserver/mcserver.cc +1055 -0
- data/ext/libcouchbase/src/mcserver/mcserver.h +221 -0
- data/ext/libcouchbase/src/mcserver/negotiate.cc +757 -0
- data/ext/libcouchbase/src/mcserver/negotiate.h +128 -0
- data/ext/libcouchbase/src/mctx-helper.h +62 -0
- data/ext/libcouchbase/src/metrics.cc +132 -0
- data/ext/libcouchbase/src/n1ql/ixmgmt.cc +857 -0
- data/ext/libcouchbase/src/n1ql/n1ql-internal.h +22 -0
- data/ext/libcouchbase/src/n1ql/n1ql.cc +830 -0
- data/ext/libcouchbase/src/n1ql/params.cc +260 -0
- data/ext/libcouchbase/src/netbuf/netbuf-defs.h +89 -0
- data/ext/libcouchbase/src/netbuf/netbuf-mblock.h +235 -0
- data/ext/libcouchbase/src/netbuf/netbuf.c +929 -0
- data/ext/libcouchbase/src/netbuf/netbuf.h +452 -0
- data/ext/libcouchbase/src/newconfig.cc +365 -0
- data/ext/libcouchbase/src/nodeinfo.cc +184 -0
- data/ext/libcouchbase/src/operations/cbflush.cc +63 -0
- data/ext/libcouchbase/src/operations/counter.cc +117 -0
- data/ext/libcouchbase/src/operations/durability-cas.cc +251 -0
- data/ext/libcouchbase/src/operations/durability-seqno.cc +170 -0
- data/ext/libcouchbase/src/operations/durability.cc +668 -0
- data/ext/libcouchbase/src/operations/durability_internal.h +306 -0
- data/ext/libcouchbase/src/operations/get.cc +409 -0
- data/ext/libcouchbase/src/operations/observe-seqno.cc +94 -0
- data/ext/libcouchbase/src/operations/observe.cc +367 -0
- data/ext/libcouchbase/src/operations/ping.cc +496 -0
- data/ext/libcouchbase/src/operations/pktfwd.cc +86 -0
- data/ext/libcouchbase/src/operations/remove.cc +84 -0
- data/ext/libcouchbase/src/operations/stats.cc +459 -0
- data/ext/libcouchbase/src/operations/store.cc +358 -0
- data/ext/libcouchbase/src/operations/subdoc.cc +614 -0
- data/ext/libcouchbase/src/operations/touch.cc +84 -0
- data/ext/libcouchbase/src/packetutils.h +388 -0
- data/ext/libcouchbase/src/probes.d +182 -0
- data/ext/libcouchbase/src/rdb/bigalloc.c +225 -0
- data/ext/libcouchbase/src/rdb/bigalloc.h +73 -0
- data/ext/libcouchbase/src/rdb/chunkalloc.c +174 -0
- data/ext/libcouchbase/src/rdb/libcalloc.c +94 -0
- data/ext/libcouchbase/src/rdb/rope.c +419 -0
- data/ext/libcouchbase/src/rdb/rope.h +488 -0
- data/ext/libcouchbase/src/retrychk.cc +113 -0
- data/ext/libcouchbase/src/retryq.cc +458 -0
- data/ext/libcouchbase/src/retryq.h +170 -0
- data/ext/libcouchbase/src/ringbuffer.c +442 -0
- data/ext/libcouchbase/src/ringbuffer.h +100 -0
- data/ext/libcouchbase/src/rnd.cc +61 -0
- data/ext/libcouchbase/src/rnd.h +39 -0
- data/ext/libcouchbase/src/settings.c +125 -0
- data/ext/libcouchbase/src/settings.h +273 -0
- data/ext/libcouchbase/src/sllist-inl.h +197 -0
- data/ext/libcouchbase/src/sllist.h +76 -0
- data/ext/libcouchbase/src/ssl/CMakeLists.txt +11 -0
- data/ext/libcouchbase/src/ssl/ssl_c.c +442 -0
- data/ext/libcouchbase/src/ssl/ssl_common.c +478 -0
- data/ext/libcouchbase/src/ssl/ssl_e.c +421 -0
- data/ext/libcouchbase/src/ssl/ssl_iot_common.h +182 -0
- data/ext/libcouchbase/src/strcodecs/base64.c +307 -0
- data/ext/libcouchbase/src/strcodecs/strcodecs.h +302 -0
- data/ext/libcouchbase/src/timings.c +207 -0
- data/ext/libcouchbase/src/trace.h +117 -0
- data/ext/libcouchbase/src/tracing/span.cc +421 -0
- data/ext/libcouchbase/src/tracing/threshold_logging_tracer.cc +213 -0
- data/ext/libcouchbase/src/tracing/tracer.cc +53 -0
- data/ext/libcouchbase/src/tracing/tracing-internal.h +198 -0
- data/ext/libcouchbase/src/utilities.c +176 -0
- data/ext/libcouchbase/src/vbucket/CMakeLists.txt +2 -0
- data/ext/libcouchbase/src/vbucket/aliases.h +35 -0
- data/ext/libcouchbase/src/vbucket/crc32.h +83 -0
- data/ext/libcouchbase/src/vbucket/hash.h +30 -0
- data/ext/libcouchbase/src/vbucket/json-inl.h +112 -0
- data/ext/libcouchbase/src/vbucket/ketama.c +66 -0
- data/ext/libcouchbase/src/vbucket/rfc1321/global.h +32 -0
- data/ext/libcouchbase/src/vbucket/rfc1321/md5.h +35 -0
- data/ext/libcouchbase/src/vbucket/rfc1321/md5c-inl.h +335 -0
- data/ext/libcouchbase/src/vbucket/vbucket.c +1735 -0
- data/ext/libcouchbase/src/views/docreq.cc +213 -0
- data/ext/libcouchbase/src/views/docreq.h +94 -0
- data/ext/libcouchbase/src/views/viewreq.cc +381 -0
- data/ext/libcouchbase/src/views/viewreq.h +87 -0
- data/ext/libcouchbase/src/wait.cc +156 -0
- data/ext/libcouchbase/tests/CMakeLists.txt +149 -0
- data/ext/libcouchbase/tests/basic/t_base64.cc +109 -0
- data/ext/libcouchbase/tests/basic/t_ccbc103.cc +95 -0
- data/ext/libcouchbase/tests/basic/t_connstr.cc +456 -0
- data/ext/libcouchbase/tests/basic/t_creds.cc +96 -0
- data/ext/libcouchbase/tests/basic/t_ctlcodes.cc +92 -0
- data/ext/libcouchbase/tests/basic/t_host.cc +210 -0
- data/ext/libcouchbase/tests/basic/t_jsparse.cc +82 -0
- data/ext/libcouchbase/tests/basic/t_jsparse.h +589 -0
- data/ext/libcouchbase/tests/basic/t_list.cc +155 -0
- data/ext/libcouchbase/tests/basic/t_logger.cc +65 -0
- data/ext/libcouchbase/tests/basic/t_misc.cc +24 -0
- data/ext/libcouchbase/tests/basic/t_n1qlstrings.cc +17 -0
- data/ext/libcouchbase/tests/basic/t_netbuf.cc +446 -0
- data/ext/libcouchbase/tests/basic/t_packet.cc +215 -0
- data/ext/libcouchbase/tests/basic/t_ringbuffer.cc +278 -0
- data/ext/libcouchbase/tests/basic/t_scram.cc +514 -0
- data/ext/libcouchbase/tests/basic/t_slist.cc +429 -0
- data/ext/libcouchbase/tests/basic/t_strerror.cc +64 -0
- data/ext/libcouchbase/tests/basic/t_urlencode.cc +132 -0
- data/ext/libcouchbase/tests/check-all.cc +612 -0
- data/ext/libcouchbase/tests/htparse/t_basic.cc +173 -0
- data/ext/libcouchbase/tests/ioserver/connection.cc +166 -0
- data/ext/libcouchbase/tests/ioserver/future.cc +50 -0
- data/ext/libcouchbase/tests/ioserver/ioserver.cc +117 -0
- data/ext/libcouchbase/tests/ioserver/ioserver.h +478 -0
- data/ext/libcouchbase/tests/ioserver/socket.cc +88 -0
- data/ext/libcouchbase/tests/ioserver/ssl_connection.cc +145 -0
- data/ext/libcouchbase/tests/ioserver/threads-pthreads.cc +119 -0
- data/ext/libcouchbase/tests/ioserver/threads-win32.cc +117 -0
- data/ext/libcouchbase/tests/ioserver/threads.h +66 -0
- data/ext/libcouchbase/tests/iotests/iotests.h +15 -0
- data/ext/libcouchbase/tests/iotests/mock-environment.cc +632 -0
- data/ext/libcouchbase/tests/iotests/mock-environment.h +480 -0
- data/ext/libcouchbase/tests/iotests/mock-unit-test.cc +67 -0
- data/ext/libcouchbase/tests/iotests/mock-unit-test.h +61 -0
- data/ext/libcouchbase/tests/iotests/serverparams.h +76 -0
- data/ext/libcouchbase/tests/iotests/t_arithmetic.cc +143 -0
- data/ext/libcouchbase/tests/iotests/t_behavior.cc +220 -0
- data/ext/libcouchbase/tests/iotests/t_configcache.cc +117 -0
- data/ext/libcouchbase/tests/iotests/t_confmon.cc +223 -0
- data/ext/libcouchbase/tests/iotests/t_durability.cc +1108 -0
- data/ext/libcouchbase/tests/iotests/t_eerrs.cc +121 -0
- data/ext/libcouchbase/tests/iotests/t_errmap.cc +181 -0
- data/ext/libcouchbase/tests/iotests/t_forward.cc +118 -0
- data/ext/libcouchbase/tests/iotests/t_get.cc +512 -0
- data/ext/libcouchbase/tests/iotests/t_http.cc +438 -0
- data/ext/libcouchbase/tests/iotests/t_iops.cc +175 -0
- data/ext/libcouchbase/tests/iotests/t_lock.cc +274 -0
- data/ext/libcouchbase/tests/iotests/t_misc.cc +777 -0
- data/ext/libcouchbase/tests/iotests/t_mutate.cc +609 -0
- data/ext/libcouchbase/tests/iotests/t_n1ql.cc +270 -0
- data/ext/libcouchbase/tests/iotests/t_netfail.cc +778 -0
- data/ext/libcouchbase/tests/iotests/t_obseqno.cc +156 -0
- data/ext/libcouchbase/tests/iotests/t_regression.cc +321 -0
- data/ext/libcouchbase/tests/iotests/t_sched.cc +87 -0
- data/ext/libcouchbase/tests/iotests/t_serverops.cc +231 -0
- data/ext/libcouchbase/tests/iotests/t_smoke.cc +528 -0
- data/ext/libcouchbase/tests/iotests/t_snappy.cc +316 -0
- data/ext/libcouchbase/tests/iotests/t_subdoc.cc +857 -0
- data/ext/libcouchbase/tests/iotests/t_syncmode.cc +64 -0
- data/ext/libcouchbase/tests/iotests/t_views.cc +417 -0
- data/ext/libcouchbase/tests/iotests/testutil.cc +251 -0
- data/ext/libcouchbase/tests/iotests/testutil.h +163 -0
- data/ext/libcouchbase/tests/mc/mctest.h +119 -0
- data/ext/libcouchbase/tests/mc/pktmaker.h +101 -0
- data/ext/libcouchbase/tests/mc/t_alloc.cc +269 -0
- data/ext/libcouchbase/tests/mc/t_context.cc +100 -0
- data/ext/libcouchbase/tests/mc/t_flush.cc +185 -0
- data/ext/libcouchbase/tests/mc/t_forward.cc +239 -0
- data/ext/libcouchbase/tests/mc/t_ioflush.cc +102 -0
- data/ext/libcouchbase/tests/mc/t_iovcursor.cc +173 -0
- data/ext/libcouchbase/tests/mocksupport/procutil.c +305 -0
- data/ext/libcouchbase/tests/mocksupport/procutil.h +89 -0
- data/ext/libcouchbase/tests/mocksupport/server.c +391 -0
- data/ext/libcouchbase/tests/mocksupport/server.h +72 -0
- data/ext/libcouchbase/tests/mocksupport/timeout.c +69 -0
- data/ext/libcouchbase/tests/nonio_tests.cc +23 -0
- data/ext/libcouchbase/tests/rdb/rdbtest.h +133 -0
- data/ext/libcouchbase/tests/rdb/t_basic.cc +128 -0
- data/ext/libcouchbase/tests/rdb/t_bigalloc.cc +93 -0
- data/ext/libcouchbase/tests/rdb/t_refs.cc +112 -0
- data/ext/libcouchbase/tests/socktests/socktest.cc +344 -0
- data/ext/libcouchbase/tests/socktests/socktest.h +447 -0
- data/ext/libcouchbase/tests/socktests/t_basic.cc +143 -0
- data/ext/libcouchbase/tests/socktests/t_ctx.cc +73 -0
- data/ext/libcouchbase/tests/socktests/t_manager.cc +159 -0
- data/ext/libcouchbase/tests/socktests/t_putex.cc +256 -0
- data/ext/libcouchbase/tests/socktests/t_read.cc +187 -0
- data/ext/libcouchbase/tests/socktests/t_reentrant.cc +143 -0
- data/ext/libcouchbase/tests/socktests/t_ssl.cc +80 -0
- data/ext/libcouchbase/tests/socktests/t_write.cc +95 -0
- data/ext/libcouchbase/tests/start_mock.bat +15 -0
- data/ext/libcouchbase/tests/start_mock.sh +42 -0
- data/ext/libcouchbase/tests/unit_tests.cc +43 -0
- data/ext/libcouchbase/tests/vbucket/confdata/bad.json +101 -0
- data/ext/libcouchbase/tests/vbucket/confdata/full_25.json +363 -0
- data/ext/libcouchbase/tests/vbucket/confdata/ketama_expected.json +2562 -0
- data/ext/libcouchbase/tests/vbucket/confdata/map_node_present_nodesext_missing_nodes.json +94 -0
- data/ext/libcouchbase/tests/vbucket/confdata/memd_25.json +90 -0
- data/ext/libcouchbase/tests/vbucket/confdata/memd_30.json +1 -0
- data/ext/libcouchbase/tests/vbucket/confdata/memd_45.json +1 -0
- data/ext/libcouchbase/tests/vbucket/confdata/memd_ketama_config.json +31 -0
- data/ext/libcouchbase/tests/vbucket/confdata/terse_25.json +291 -0
- data/ext/libcouchbase/tests/vbucket/confdata/terse_30.json +1 -0
- data/ext/libcouchbase/tests/vbucket/t_config.cc +386 -0
- data/ext/libcouchbase/tools/CMakeLists.txt +80 -0
- data/ext/libcouchbase/tools/cbc-handlers.h +636 -0
- data/ext/libcouchbase/tools/cbc-n1qlback.cc +496 -0
- data/ext/libcouchbase/tools/cbc-pillowfight.cc +1230 -0
- data/ext/libcouchbase/tools/cbc-proxy.cc +534 -0
- data/ext/libcouchbase/tools/cbc-subdoc.cc +825 -0
- data/ext/libcouchbase/tools/cbc.cc +1928 -0
- data/ext/libcouchbase/tools/common/histogram.cc +44 -0
- data/ext/libcouchbase/tools/common/histogram.h +23 -0
- data/ext/libcouchbase/tools/common/options.cc +451 -0
- data/ext/libcouchbase/tools/common/options.h +90 -0
- data/ext/libcouchbase/tools/docgen/docgen.h +495 -0
- data/ext/libcouchbase/tools/docgen/loc.h +211 -0
- data/ext/libcouchbase/tools/docgen/placeholders.h +211 -0
- data/ext/libcouchbase/tools/docgen/seqgen.h +122 -0
- data/ext/libcouchbase/tools/extract-packets.rb +110 -0
- data/ext/libcouchbase/tools/linenoise/linenoise.c +1199 -0
- data/ext/libcouchbase/tools/linenoise/linenoise.h +73 -0
- data/lib/mt-libcouchbase/bucket.rb +825 -0
- data/lib/mt-libcouchbase/callbacks.rb +69 -0
- data/lib/mt-libcouchbase/connection.rb +896 -0
- data/lib/mt-libcouchbase/design_docs.rb +92 -0
- data/lib/mt-libcouchbase/error.rb +68 -0
- data/lib/mt-libcouchbase/ext/mt-libcouchbase/cmdbase.rb +23 -0
- data/lib/mt-libcouchbase/ext/mt-libcouchbase/cmdcounter.rb +36 -0
- data/lib/mt-libcouchbase/ext/mt-libcouchbase/cmdendure.rb +26 -0
- data/lib/mt-libcouchbase/ext/mt-libcouchbase/cmdfts.rb +24 -0
- data/lib/mt-libcouchbase/ext/mt-libcouchbase/cmdget.rb +30 -0
- data/lib/mt-libcouchbase/ext/mt-libcouchbase/cmdgetreplica.rb +49 -0
- data/lib/mt-libcouchbase/ext/mt-libcouchbase/cmdhttp.rb +58 -0
- data/lib/mt-libcouchbase/ext/mt-libcouchbase/cmdn1ql.rb +40 -0
- data/lib/mt-libcouchbase/ext/mt-libcouchbase/cmdobseqno.rb +33 -0
- data/lib/mt-libcouchbase/ext/mt-libcouchbase/cmdobserve.rb +30 -0
- data/lib/mt-libcouchbase/ext/mt-libcouchbase/cmdstore.rb +40 -0
- data/lib/mt-libcouchbase/ext/mt-libcouchbase/cmdstoredur.rb +45 -0
- data/lib/mt-libcouchbase/ext/mt-libcouchbase/cmdsubdoc.rb +61 -0
- data/lib/mt-libcouchbase/ext/mt-libcouchbase/cmdverbosity.rb +29 -0
- data/lib/mt-libcouchbase/ext/mt-libcouchbase/cmdviewquery.rb +61 -0
- data/lib/mt-libcouchbase/ext/mt-libcouchbase/contigbuf.rb +14 -0
- data/lib/mt-libcouchbase/ext/mt-libcouchbase/create_st.rb +15 -0
- data/lib/mt-libcouchbase/ext/mt-libcouchbase/create_st0.rb +23 -0
- data/lib/mt-libcouchbase/ext/mt-libcouchbase/create_st1.rb +26 -0
- data/lib/mt-libcouchbase/ext/mt-libcouchbase/create_st2.rb +32 -0
- data/lib/mt-libcouchbase/ext/mt-libcouchbase/create_st3.rb +26 -0
- data/lib/mt-libcouchbase/ext/mt-libcouchbase/crst_u.rb +20 -0
- data/lib/mt-libcouchbase/ext/mt-libcouchbase/durability_opts_st_v.rb +11 -0
- data/lib/mt-libcouchbase/ext/mt-libcouchbase/durability_opts_t.rb +14 -0
- data/lib/mt-libcouchbase/ext/mt-libcouchbase/durabilityopt_sv0.rb +63 -0
- data/lib/mt-libcouchbase/ext/mt-libcouchbase/enums.rb +1007 -0
- data/lib/mt-libcouchbase/ext/mt-libcouchbase/fragbuf.rb +18 -0
- data/lib/mt-libcouchbase/ext/mt-libcouchbase/ftshandle.rb +7 -0
- data/lib/mt-libcouchbase/ext/mt-libcouchbase/histogram.rb +34 -0
- data/lib/mt-libcouchbase/ext/mt-libcouchbase/http_request_t.rb +7 -0
- data/lib/mt-libcouchbase/ext/mt-libcouchbase/keybuf.rb +20 -0
- data/lib/mt-libcouchbase/ext/mt-libcouchbase/multicmd_ctx.rb +30 -0
- data/lib/mt-libcouchbase/ext/mt-libcouchbase/mutation_token.rb +17 -0
- data/lib/mt-libcouchbase/ext/mt-libcouchbase/n1qlhandle.rb +7 -0
- data/lib/mt-libcouchbase/ext/mt-libcouchbase/n1qlparams.rb +7 -0
- data/lib/mt-libcouchbase/ext/mt-libcouchbase/respbase.rb +29 -0
- data/lib/mt-libcouchbase/ext/mt-libcouchbase/respcounter.rb +32 -0
- data/lib/mt-libcouchbase/ext/mt-libcouchbase/respendure.rb +49 -0
- data/lib/mt-libcouchbase/ext/mt-libcouchbase/respfts.rb +40 -0
- data/lib/mt-libcouchbase/ext/mt-libcouchbase/respget.rb +44 -0
- data/lib/mt-libcouchbase/ext/mt-libcouchbase/resphttp.rb +48 -0
- data/lib/mt-libcouchbase/ext/mt-libcouchbase/respmcversion.rb +38 -0
- data/lib/mt-libcouchbase/ext/mt-libcouchbase/respn1ql.rb +41 -0
- data/lib/mt-libcouchbase/ext/mt-libcouchbase/respobseqno.rb +52 -0
- data/lib/mt-libcouchbase/ext/mt-libcouchbase/respobserve.rb +41 -0
- data/lib/mt-libcouchbase/ext/mt-libcouchbase/respserverbase.rb +32 -0
- data/lib/mt-libcouchbase/ext/mt-libcouchbase/respstats.rb +38 -0
- data/lib/mt-libcouchbase/ext/mt-libcouchbase/respstore.rb +32 -0
- data/lib/mt-libcouchbase/ext/mt-libcouchbase/respstoredur.rb +38 -0
- data/lib/mt-libcouchbase/ext/mt-libcouchbase/respsubdoc.rb +35 -0
- data/lib/mt-libcouchbase/ext/mt-libcouchbase/respviewquery.rb +67 -0
- data/lib/mt-libcouchbase/ext/mt-libcouchbase/sdentry.rb +22 -0
- data/lib/mt-libcouchbase/ext/mt-libcouchbase/sdspec.rb +31 -0
- data/lib/mt-libcouchbase/ext/mt-libcouchbase/t.rb +7 -0
- data/lib/mt-libcouchbase/ext/mt-libcouchbase/valbuf.rb +22 -0
- data/lib/mt-libcouchbase/ext/mt-libcouchbase/valbuf_u_buf.rb +14 -0
- data/lib/mt-libcouchbase/ext/mt-libcouchbase/viewhandle.rb +7 -0
- data/lib/mt-libcouchbase/ext/mt-libcouchbase.rb +1175 -0
- data/lib/mt-libcouchbase/ext/mt-libcouchbase_libuv.rb +22 -0
- data/lib/mt-libcouchbase/ext/tasks.rb +39 -0
- data/lib/mt-libcouchbase/n1ql.rb +80 -0
- data/lib/mt-libcouchbase/query_full_text.rb +147 -0
- data/lib/mt-libcouchbase/query_n1ql.rb +123 -0
- data/lib/mt-libcouchbase/query_view.rb +135 -0
- data/lib/mt-libcouchbase/results_fiber.rb +281 -0
- data/lib/mt-libcouchbase/results_native.rb +220 -0
- data/lib/mt-libcouchbase/subdoc_request.rb +139 -0
- data/lib/mt-libcouchbase/version.rb +5 -0
- data/lib/mt-libcouchbase.rb +40 -0
- data/mt-libcouchbase.gemspec +68 -0
- data/spec/bucket_spec.rb +290 -0
- data/spec/connection_spec.rb +257 -0
- data/spec/design_docs_spec.rb +31 -0
- data/spec/error_spec.rb +26 -0
- data/spec/fts_spec.rb +135 -0
- data/spec/n1ql_spec.rb +260 -0
- data/spec/results_libuv_spec.rb +244 -0
- data/spec/results_native_spec.rb +259 -0
- data/spec/seed/2016-10-25T043505Z/2016-10-25T043505Z-full/bucket-default/design.json +1 -0
- data/spec/seed/2016-10-25T043505Z/2016-10-25T043505Z-full/bucket-default/node-127.0.0.1%3A8091/data-0000.cbb +0 -0
- data/spec/seed/2016-10-25T043505Z/2016-10-25T043505Z-full/bucket-default/node-127.0.0.1%3A8091/failover.json +1 -0
- data/spec/seed/2016-10-25T043505Z/2016-10-25T043505Z-full/bucket-default/node-127.0.0.1%3A8091/meta.json +1 -0
- data/spec/seed/2016-10-25T043505Z/2016-10-25T043505Z-full/bucket-default/node-127.0.0.1%3A8091/seqno.json +1 -0
- data/spec/seed/2016-10-25T043505Z/2016-10-25T043505Z-full/bucket-default/node-127.0.0.1%3A8091/snapshot_markers.json +1 -0
- data/spec/subdoc_spec.rb +192 -0
- data/spec/view_spec.rb +201 -0
- data/windows_build.md +36 -0
- 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
|
+
}
|