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,1230 @@
|
|
|
1
|
+
/* -*- Mode: C++; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */
|
|
2
|
+
/*
|
|
3
|
+
* Copyright 2011-2012 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
|
+
#define NOMINMAX // Because MS' CRT headers #define min and max :(
|
|
18
|
+
#include "config.h"
|
|
19
|
+
#include <sys/types.h>
|
|
20
|
+
#include <libcouchbase/couchbase.h>
|
|
21
|
+
#include <errno.h>
|
|
22
|
+
#include <iostream>
|
|
23
|
+
#include <map>
|
|
24
|
+
#include <sstream>
|
|
25
|
+
#include <queue>
|
|
26
|
+
#include <list>
|
|
27
|
+
#include <cstring>
|
|
28
|
+
#include <cassert>
|
|
29
|
+
#include <cstdio>
|
|
30
|
+
#include <cstdlib>
|
|
31
|
+
#include <fstream>
|
|
32
|
+
#include <signal.h>
|
|
33
|
+
#ifndef WIN32
|
|
34
|
+
#include <pthread.h>
|
|
35
|
+
#include <libcouchbase/metrics.h>
|
|
36
|
+
#else
|
|
37
|
+
#define usleep(n) Sleep(n/1000)
|
|
38
|
+
#endif
|
|
39
|
+
#include <cstdarg>
|
|
40
|
+
#include <exception>
|
|
41
|
+
#include <stdexcept>
|
|
42
|
+
#include "common/options.h"
|
|
43
|
+
#include "common/histogram.h"
|
|
44
|
+
#include "contrib/lcb-jsoncpp/lcb-jsoncpp.h"
|
|
45
|
+
|
|
46
|
+
#include "docgen/seqgen.h"
|
|
47
|
+
#include "docgen/docgen.h"
|
|
48
|
+
|
|
49
|
+
using namespace std;
|
|
50
|
+
using namespace cbc;
|
|
51
|
+
using namespace cliopts;
|
|
52
|
+
using namespace Pillowfight;
|
|
53
|
+
using std::vector;
|
|
54
|
+
using std::string;
|
|
55
|
+
|
|
56
|
+
// Deprecated options which still exist from previous versions.
|
|
57
|
+
struct DeprecatedOptions {
|
|
58
|
+
UIntOption iterations;
|
|
59
|
+
UIntOption instances;
|
|
60
|
+
BoolOption loop;
|
|
61
|
+
|
|
62
|
+
DeprecatedOptions() :
|
|
63
|
+
iterations("iterations"), instances("num-instances"), loop("loop")
|
|
64
|
+
{
|
|
65
|
+
iterations.abbrev('i').hide().setDefault(1000);
|
|
66
|
+
instances.abbrev('Q').hide().setDefault(1);
|
|
67
|
+
loop.abbrev('l').hide().setDefault(false);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
void addOptions(Parser &p) {
|
|
71
|
+
p.addOption(instances);
|
|
72
|
+
p.addOption(loop);
|
|
73
|
+
p.addOption(iterations);
|
|
74
|
+
}
|
|
75
|
+
};
|
|
76
|
+
|
|
77
|
+
static TemplateSpec
|
|
78
|
+
parseTemplateSpec(const string& input)
|
|
79
|
+
{
|
|
80
|
+
TemplateSpec spec;
|
|
81
|
+
// Just need to find the path
|
|
82
|
+
size_t endpos = input.find(',');
|
|
83
|
+
if (endpos == string::npos) {
|
|
84
|
+
throw std::runtime_error("invalid template spec: need field,min,max");
|
|
85
|
+
}
|
|
86
|
+
spec.term = input.substr(0, endpos);
|
|
87
|
+
unsigned is_sequential = 0;
|
|
88
|
+
int rv = sscanf(input.c_str() + endpos + 1, "%u,%u,%u",
|
|
89
|
+
&spec.minval, &spec.maxval, &is_sequential);
|
|
90
|
+
if (rv < 2) {
|
|
91
|
+
throw std::runtime_error("invalid template spec: need field,min,max");
|
|
92
|
+
}
|
|
93
|
+
spec.sequential = is_sequential;
|
|
94
|
+
if (spec.minval > spec.maxval) {
|
|
95
|
+
throw std::runtime_error("min cannot be higher than max");
|
|
96
|
+
}
|
|
97
|
+
return spec;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
class Configuration
|
|
101
|
+
{
|
|
102
|
+
public:
|
|
103
|
+
Configuration() :
|
|
104
|
+
o_multiSize("batch-size"),
|
|
105
|
+
o_numItems("num-items"),
|
|
106
|
+
o_keyPrefix("key-prefix"),
|
|
107
|
+
o_numThreads("num-threads"),
|
|
108
|
+
o_randSeed("random-seed"),
|
|
109
|
+
o_randomBody("random-body"),
|
|
110
|
+
o_setPercent("set-pct"),
|
|
111
|
+
o_minSize("min-size"),
|
|
112
|
+
o_maxSize("max-size"),
|
|
113
|
+
o_noPopulate("no-population"),
|
|
114
|
+
o_pauseAtEnd("pause-at-end"),
|
|
115
|
+
o_numCycles("num-cycles"),
|
|
116
|
+
o_sequential("sequential"),
|
|
117
|
+
o_startAt("start-at"),
|
|
118
|
+
o_rateLimit("rate-limit"),
|
|
119
|
+
o_userdocs("docs"),
|
|
120
|
+
o_writeJson("json"),
|
|
121
|
+
o_templatePairs("template"),
|
|
122
|
+
o_subdoc("subdoc"),
|
|
123
|
+
o_noop("noop"),
|
|
124
|
+
o_sdPathCount("pathcount"),
|
|
125
|
+
o_populateOnly("populate-only"),
|
|
126
|
+
o_exptime("expiry"),
|
|
127
|
+
o_collection("collection"),
|
|
128
|
+
o_separator("separator"),
|
|
129
|
+
o_persist("persist-to"),
|
|
130
|
+
o_replicate("replicate-to"),
|
|
131
|
+
o_lock("lock")
|
|
132
|
+
{
|
|
133
|
+
o_multiSize.setDefault(100).abbrev('B').description("Number of operations to batch");
|
|
134
|
+
o_numItems.setDefault(1000).abbrev('I').description("Number of items to operate on");
|
|
135
|
+
o_keyPrefix.abbrev('p').description("key prefix to use");
|
|
136
|
+
o_numThreads.setDefault(1).abbrev('t').description("The number of threads to use");
|
|
137
|
+
o_randSeed.setDefault(0).abbrev('s').description("Specify random seed").hide();
|
|
138
|
+
o_randomBody.setDefault(false).abbrev('R').description("Randomize document body (otherwise use 'x' and '*' to fill)");
|
|
139
|
+
o_setPercent.setDefault(33).abbrev('r').description("The percentage of operations which should be mutations");
|
|
140
|
+
o_minSize.setDefault(50).abbrev('m').description("Set minimum payload size");
|
|
141
|
+
o_maxSize.setDefault(5120).abbrev('M').description("Set maximum payload size");
|
|
142
|
+
o_noPopulate.setDefault(false).abbrev('n').description("Skip population");
|
|
143
|
+
o_pauseAtEnd.setDefault(false).abbrev('E').description("Pause at end of run (holding connections open) until user input");
|
|
144
|
+
o_numCycles.setDefault(-1).abbrev('c').description("Number of cycles to be run until exiting. Set to -1 to loop infinitely");
|
|
145
|
+
o_sequential.setDefault(false).description("Use sequential access (instead of random)");
|
|
146
|
+
o_startAt.setDefault(0).description("For sequential access, set the first item");
|
|
147
|
+
o_rateLimit.setDefault(0).description("Set operations per second limit (per thread)");
|
|
148
|
+
o_userdocs.description("User documents to load (overrides --min-size and --max-size");
|
|
149
|
+
o_writeJson.abbrev('J').description("Enable writing JSON values (rather than bytes)");
|
|
150
|
+
o_templatePairs.description("Values for templates to be inserted into user documents");
|
|
151
|
+
o_templatePairs.argdesc("FIELD,MIN,MAX[,SEQUENTIAL]").hide();
|
|
152
|
+
o_subdoc.description("Use subdoc instead of fulldoc operations");
|
|
153
|
+
o_noop.description("Use NOOP instead of document operations").setDefault(0);
|
|
154
|
+
o_sdPathCount.description("Number of subdoc paths per command").setDefault(1);
|
|
155
|
+
o_populateOnly.description("Exit after documents have been populated");
|
|
156
|
+
o_exptime.description("Set TTL for items").abbrev('e');
|
|
157
|
+
o_collection.description("Allowed collection name (could be specified multiple times)").hide();
|
|
158
|
+
o_separator.setDefault(":").description("Separator for collection prefix in keys").hide();
|
|
159
|
+
o_persist.description("Wait until item is persisted to this number of nodes (-1 for master+replicas)").setDefault(0);
|
|
160
|
+
o_replicate.description("Wait until item is replicated to this number of nodes (-1 for all replicas)").setDefault(0);
|
|
161
|
+
o_lock.description("Lock keys for updates for given time (will not lock when set to zero)").setDefault(0);
|
|
162
|
+
params.getTimings().description("Enable command timings (second time to dump timings automatically)");
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
void processOptions() {
|
|
166
|
+
opsPerCycle = o_multiSize.result();
|
|
167
|
+
prefix = o_keyPrefix.result();
|
|
168
|
+
setprc = o_setPercent.result();
|
|
169
|
+
shouldPopulate = !o_noPopulate.result();
|
|
170
|
+
persistTo = o_persist.result();
|
|
171
|
+
replicateTo = o_replicate.result();
|
|
172
|
+
lockTime = o_lock.result();
|
|
173
|
+
if (lockTime && o_numItems < opsPerCycle * o_numThreads) {
|
|
174
|
+
fprintf(stderr, "The --num-items=%d cannot be smaller than --batch-size=%d multiplied to --num-thread=%d when used with --lock=%d\n",
|
|
175
|
+
(int)o_numItems, (int)opsPerCycle, (int)o_numThreads, (int)lockTime);
|
|
176
|
+
exit(EXIT_FAILURE);
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
if (o_keyPrefix.passed() && o_collection.passed()) {
|
|
180
|
+
throw std::runtime_error("The --collection is not compatible with --key-prefix");
|
|
181
|
+
}
|
|
182
|
+
if (depr.loop.passed()) {
|
|
183
|
+
fprintf(stderr, "The --loop/-l option is deprecated. Use --num-cycles\n");
|
|
184
|
+
maxCycles = -1;
|
|
185
|
+
} else {
|
|
186
|
+
maxCycles = o_numCycles.result();
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
if (o_populateOnly.passed()) {
|
|
190
|
+
// Determine how many iterations are required.
|
|
191
|
+
if (o_numCycles.passed()) {
|
|
192
|
+
throw std::runtime_error("--num-cycles incompatible with --populate-only");
|
|
193
|
+
}
|
|
194
|
+
size_t est = (o_numItems / o_numThreads) / o_multiSize;
|
|
195
|
+
while (est * o_numThreads * o_multiSize < o_numItems) {
|
|
196
|
+
est++;
|
|
197
|
+
}
|
|
198
|
+
maxCycles = est;
|
|
199
|
+
o_sequential.setDefault(true);
|
|
200
|
+
fprintf(stderr, "Populating using %d cycles\n", maxCycles);
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
if (depr.iterations.passed()) {
|
|
204
|
+
fprintf(stderr, "The --num-iterations/-I option is deprecated. Use --batch-size\n");
|
|
205
|
+
opsPerCycle = depr.iterations.result();
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
vector<TemplateSpec> specs;
|
|
209
|
+
vector<string> userdocs;
|
|
210
|
+
|
|
211
|
+
if (o_templatePairs.passed()) {
|
|
212
|
+
vector<string> specs_str = o_templatePairs.result();
|
|
213
|
+
for (size_t ii = 0; ii < specs_str.size(); ii++) {
|
|
214
|
+
specs.push_back(parseTemplateSpec(specs_str[ii]));
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
// Set the document sizes..
|
|
219
|
+
if (o_userdocs.passed()) {
|
|
220
|
+
if (o_minSize.passed() || o_maxSize.passed()) {
|
|
221
|
+
fprintf(stderr, "--min-size/--max-size invalid with userdocs\n");
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
vector<string> filenames = o_userdocs.result();
|
|
225
|
+
for (size_t ii = 0; ii < filenames.size(); ii++) {
|
|
226
|
+
std::stringstream ss;
|
|
227
|
+
std::ifstream ifs(filenames[ii].c_str());
|
|
228
|
+
if (!ifs.is_open()) {
|
|
229
|
+
perror(filenames[ii].c_str());
|
|
230
|
+
exit(EXIT_FAILURE);
|
|
231
|
+
}
|
|
232
|
+
ss << ifs.rdbuf();
|
|
233
|
+
userdocs.push_back(ss.str());
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
if (specs.empty()) {
|
|
238
|
+
if (o_writeJson.result()) {
|
|
239
|
+
docgen = new JsonDocGenerator(o_minSize.result(), o_maxSize.result(), o_randomBody.numSpecified());
|
|
240
|
+
} else if (!userdocs.empty()) {
|
|
241
|
+
docgen = new PresetDocGenerator(userdocs);
|
|
242
|
+
} else {
|
|
243
|
+
docgen = new RawDocGenerator(o_minSize.result(), o_maxSize.result(), o_randomBody.numSpecified());
|
|
244
|
+
}
|
|
245
|
+
} else {
|
|
246
|
+
if (o_writeJson.result()) {
|
|
247
|
+
if (userdocs.empty()) {
|
|
248
|
+
docgen = new PlaceholderJsonGenerator(
|
|
249
|
+
o_minSize.result(), o_maxSize.result(), specs, o_randomBody.numSpecified());
|
|
250
|
+
} else {
|
|
251
|
+
docgen = new PlaceholderJsonGenerator(userdocs, specs);
|
|
252
|
+
}
|
|
253
|
+
} else {
|
|
254
|
+
if (userdocs.empty()) {
|
|
255
|
+
throw std::runtime_error("Must provide documents with placeholders!");
|
|
256
|
+
}
|
|
257
|
+
docgen = new PlaceholderDocGenerator(userdocs, specs);
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
sdOpsPerCmd = o_sdPathCount.result();
|
|
262
|
+
if (o_sdPathCount.passed()) {
|
|
263
|
+
o_subdoc.setDefault(true);
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
if (o_collection.passed()) {
|
|
267
|
+
string separator = o_separator.result();
|
|
268
|
+
if (separator.empty()) {
|
|
269
|
+
throw std::runtime_error("Collection name separator must not be empty");
|
|
270
|
+
}
|
|
271
|
+
vector<string> names = o_collection.result();
|
|
272
|
+
for (size_t ii = 0; ii < names.size(); ii++) {
|
|
273
|
+
collections.push_back(names[ii] + separator);
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
void addOptions(Parser& parser) {
|
|
279
|
+
parser.addOption(o_multiSize);
|
|
280
|
+
parser.addOption(o_numItems);
|
|
281
|
+
parser.addOption(o_keyPrefix);
|
|
282
|
+
parser.addOption(o_numThreads);
|
|
283
|
+
parser.addOption(o_randSeed);
|
|
284
|
+
parser.addOption(o_randomBody);
|
|
285
|
+
parser.addOption(o_setPercent);
|
|
286
|
+
parser.addOption(o_noPopulate);
|
|
287
|
+
parser.addOption(o_minSize);
|
|
288
|
+
parser.addOption(o_maxSize);
|
|
289
|
+
parser.addOption(o_pauseAtEnd);
|
|
290
|
+
parser.addOption(o_numCycles);
|
|
291
|
+
parser.addOption(o_sequential);
|
|
292
|
+
parser.addOption(o_startAt);
|
|
293
|
+
parser.addOption(o_rateLimit);
|
|
294
|
+
parser.addOption(o_userdocs);
|
|
295
|
+
parser.addOption(o_writeJson);
|
|
296
|
+
parser.addOption(o_templatePairs);
|
|
297
|
+
parser.addOption(o_subdoc);
|
|
298
|
+
parser.addOption(o_noop);
|
|
299
|
+
parser.addOption(o_sdPathCount);
|
|
300
|
+
parser.addOption(o_populateOnly);
|
|
301
|
+
parser.addOption(o_exptime);
|
|
302
|
+
parser.addOption(o_collection);
|
|
303
|
+
parser.addOption(o_separator);
|
|
304
|
+
parser.addOption(o_persist);
|
|
305
|
+
parser.addOption(o_replicate);
|
|
306
|
+
parser.addOption(o_lock);
|
|
307
|
+
params.addToParser(parser);
|
|
308
|
+
depr.addOptions(parser);
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
int numTimings(void) { return params.numTimings(); }
|
|
312
|
+
|
|
313
|
+
bool isLoopDone(size_t niter) {
|
|
314
|
+
if (maxCycles == -1) {
|
|
315
|
+
return false;
|
|
316
|
+
}
|
|
317
|
+
return niter >= (size_t)maxCycles;
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
uint32_t getRandomSeed() { return o_randSeed; }
|
|
321
|
+
uint32_t getNumThreads() { return o_numThreads; }
|
|
322
|
+
string& getKeyPrefix() { return prefix; }
|
|
323
|
+
bool shouldPauseAtEnd() { return o_pauseAtEnd; }
|
|
324
|
+
bool sequentialAccess() { return o_sequential; }
|
|
325
|
+
bool isSubdoc() { return o_subdoc; }
|
|
326
|
+
bool isNoop() { return o_noop.result(); }
|
|
327
|
+
bool useCollections() { return o_collection.passed(); }
|
|
328
|
+
bool writeJson() { return o_writeJson.result(); }
|
|
329
|
+
unsigned firstKeyOffset() { return o_startAt; }
|
|
330
|
+
uint32_t getNumItems() { return o_numItems; }
|
|
331
|
+
uint32_t getRateLimit() { return o_rateLimit; }
|
|
332
|
+
unsigned getExptime() { return o_exptime; }
|
|
333
|
+
|
|
334
|
+
uint32_t opsPerCycle;
|
|
335
|
+
uint32_t sdOpsPerCmd;
|
|
336
|
+
unsigned setprc;
|
|
337
|
+
string prefix;
|
|
338
|
+
volatile int maxCycles;
|
|
339
|
+
bool shouldPopulate;
|
|
340
|
+
bool hasTemplates;
|
|
341
|
+
ConnParams params;
|
|
342
|
+
const DocGeneratorBase *docgen;
|
|
343
|
+
vector<string> collections;
|
|
344
|
+
int replicateTo;
|
|
345
|
+
int persistTo;
|
|
346
|
+
int lockTime;
|
|
347
|
+
|
|
348
|
+
private:
|
|
349
|
+
UIntOption o_multiSize;
|
|
350
|
+
UIntOption o_numItems;
|
|
351
|
+
StringOption o_keyPrefix;
|
|
352
|
+
UIntOption o_numThreads;
|
|
353
|
+
UIntOption o_randSeed;
|
|
354
|
+
BoolOption o_randomBody;
|
|
355
|
+
UIntOption o_setPercent;
|
|
356
|
+
UIntOption o_minSize;
|
|
357
|
+
UIntOption o_maxSize;
|
|
358
|
+
BoolOption o_noPopulate;
|
|
359
|
+
BoolOption o_pauseAtEnd; // Should pillowfight pause execution (with
|
|
360
|
+
// connections open) before exiting?
|
|
361
|
+
IntOption o_numCycles;
|
|
362
|
+
BoolOption o_sequential;
|
|
363
|
+
UIntOption o_startAt;
|
|
364
|
+
UIntOption o_rateLimit;
|
|
365
|
+
|
|
366
|
+
// List of paths to user documents to load.. They should all be valid JSON
|
|
367
|
+
ListOption o_userdocs;
|
|
368
|
+
|
|
369
|
+
// Whether generated values should be JSON
|
|
370
|
+
BoolOption o_writeJson;
|
|
371
|
+
|
|
372
|
+
// List of template ranges for value generation
|
|
373
|
+
ListOption o_templatePairs;
|
|
374
|
+
BoolOption o_subdoc;
|
|
375
|
+
BoolOption o_noop;
|
|
376
|
+
UIntOption o_sdPathCount;
|
|
377
|
+
|
|
378
|
+
// Compound option
|
|
379
|
+
BoolOption o_populateOnly;
|
|
380
|
+
|
|
381
|
+
UIntOption o_exptime;
|
|
382
|
+
|
|
383
|
+
ListOption o_collection;
|
|
384
|
+
StringOption o_separator;
|
|
385
|
+
IntOption o_persist;
|
|
386
|
+
IntOption o_replicate;
|
|
387
|
+
|
|
388
|
+
IntOption o_lock;
|
|
389
|
+
DeprecatedOptions depr;
|
|
390
|
+
} config;
|
|
391
|
+
|
|
392
|
+
void log(const char *format, ...)
|
|
393
|
+
{
|
|
394
|
+
char buffer[512];
|
|
395
|
+
va_list args;
|
|
396
|
+
|
|
397
|
+
va_start(args, format);
|
|
398
|
+
vsprintf(buffer, format, args);
|
|
399
|
+
if (config.numTimings() > 0) {
|
|
400
|
+
std::cerr << "[" << std::fixed << lcb_nstime() / 1000000000.0 << "] ";
|
|
401
|
+
}
|
|
402
|
+
std::cerr << buffer << std::endl;
|
|
403
|
+
va_end(args);
|
|
404
|
+
}
|
|
405
|
+
|
|
406
|
+
|
|
407
|
+
|
|
408
|
+
extern "C" {
|
|
409
|
+
static void operationCallback(lcb_t, int, const lcb_RESPBASE*);
|
|
410
|
+
static void storeCallback(lcb_t, int, const lcb_RESPBASE *);
|
|
411
|
+
}
|
|
412
|
+
|
|
413
|
+
class ThreadContext;
|
|
414
|
+
|
|
415
|
+
class InstanceCookie {
|
|
416
|
+
public:
|
|
417
|
+
InstanceCookie(lcb_t instance) {
|
|
418
|
+
lcb_set_cookie(instance, this);
|
|
419
|
+
lastPrint = 0;
|
|
420
|
+
if (config.numTimings() > 0) {
|
|
421
|
+
hg.install(instance, stdout);
|
|
422
|
+
}
|
|
423
|
+
stats.total = 0;
|
|
424
|
+
stats.retried = 0;
|
|
425
|
+
stats.etmpfail = 0;
|
|
426
|
+
stats.eexist = 0;
|
|
427
|
+
stats.etimeout = 0;
|
|
428
|
+
}
|
|
429
|
+
|
|
430
|
+
static InstanceCookie* get(lcb_t instance) {
|
|
431
|
+
return (InstanceCookie *)lcb_get_cookie(instance);
|
|
432
|
+
}
|
|
433
|
+
|
|
434
|
+
|
|
435
|
+
static void dumpTimings(lcb_t instance, const char *header = NULL, bool force=false) {
|
|
436
|
+
time_t now = time(NULL);
|
|
437
|
+
InstanceCookie *ic = get(instance);
|
|
438
|
+
|
|
439
|
+
if (now - ic->lastPrint > 0) {
|
|
440
|
+
ic->lastPrint = now;
|
|
441
|
+
} else if (!force) {
|
|
442
|
+
return;
|
|
443
|
+
}
|
|
444
|
+
|
|
445
|
+
Histogram &h = ic->hg;
|
|
446
|
+
if (header) {
|
|
447
|
+
printf("[%f %s]\n", lcb_nstime() / 1000000000.0, header);
|
|
448
|
+
}
|
|
449
|
+
printf(" +---------+---------+---------+---------+\n");
|
|
450
|
+
h.write();
|
|
451
|
+
printf(" +----------------------------------------\n");
|
|
452
|
+
}
|
|
453
|
+
|
|
454
|
+
void setContext(ThreadContext *context) {
|
|
455
|
+
m_context = context;
|
|
456
|
+
}
|
|
457
|
+
|
|
458
|
+
ThreadContext * getContext() {
|
|
459
|
+
return m_context;
|
|
460
|
+
}
|
|
461
|
+
|
|
462
|
+
struct {
|
|
463
|
+
size_t total;
|
|
464
|
+
size_t retried;
|
|
465
|
+
size_t etmpfail;
|
|
466
|
+
size_t eexist;
|
|
467
|
+
size_t etimeout;
|
|
468
|
+
} stats;
|
|
469
|
+
private:
|
|
470
|
+
time_t lastPrint;
|
|
471
|
+
Histogram hg;
|
|
472
|
+
ThreadContext *m_context;
|
|
473
|
+
};
|
|
474
|
+
|
|
475
|
+
struct NextOp {
|
|
476
|
+
NextOp() : m_seqno(0), m_mode(GET), m_cas(0) {}
|
|
477
|
+
|
|
478
|
+
string m_key;
|
|
479
|
+
uint32_t m_seqno;
|
|
480
|
+
vector<lcb_IOV> m_valuefrags;
|
|
481
|
+
vector<lcb_SDSPEC> m_specs;
|
|
482
|
+
// The mode here is for future use with subdoc
|
|
483
|
+
enum Mode { STORE, GET, SDSTORE, SDGET, NOOP };
|
|
484
|
+
Mode m_mode;
|
|
485
|
+
uint64_t m_cas;
|
|
486
|
+
};
|
|
487
|
+
|
|
488
|
+
class OpGenerator {
|
|
489
|
+
public:
|
|
490
|
+
OpGenerator(int id): m_id(id) {}
|
|
491
|
+
|
|
492
|
+
virtual ~OpGenerator() {};
|
|
493
|
+
virtual void setNextOp(NextOp& op) = 0;
|
|
494
|
+
virtual void setValue(NextOp& op) = 0;
|
|
495
|
+
virtual void populateIov(uint32_t, vector<lcb_IOV>&) = 0;
|
|
496
|
+
virtual bool inPopulation() const = 0;
|
|
497
|
+
virtual void checkin(uint32_t) = 0;
|
|
498
|
+
virtual const char *getStageString() const = 0;
|
|
499
|
+
|
|
500
|
+
protected:
|
|
501
|
+
int m_id;
|
|
502
|
+
};
|
|
503
|
+
|
|
504
|
+
class NoopGenerator : public OpGenerator {
|
|
505
|
+
public:
|
|
506
|
+
NoopGenerator(int ix) : OpGenerator(ix) {}
|
|
507
|
+
|
|
508
|
+
|
|
509
|
+
void setNextOp(NextOp& op) {
|
|
510
|
+
op.m_mode = NextOp::NOOP;
|
|
511
|
+
}
|
|
512
|
+
|
|
513
|
+
void setValue(NextOp&) {}
|
|
514
|
+
void populateIov(uint32_t, vector<lcb_IOV>&) {}
|
|
515
|
+
|
|
516
|
+
bool inPopulation() const {
|
|
517
|
+
return false;
|
|
518
|
+
}
|
|
519
|
+
|
|
520
|
+
void checkin(uint32_t) {}
|
|
521
|
+
|
|
522
|
+
const char *getStageString() const {
|
|
523
|
+
return "Run";
|
|
524
|
+
}
|
|
525
|
+
};
|
|
526
|
+
|
|
527
|
+
/** Stateful, per-thread generator */
|
|
528
|
+
class KeyGenerator : public OpGenerator {
|
|
529
|
+
public:
|
|
530
|
+
KeyGenerator(int ix)
|
|
531
|
+
: OpGenerator(ix), m_gencount(0), m_force_sequential(false),
|
|
532
|
+
m_in_population(config.shouldPopulate)
|
|
533
|
+
{
|
|
534
|
+
srand(config.getRandomSeed());
|
|
535
|
+
|
|
536
|
+
m_genrandom = new SeqGenerator(
|
|
537
|
+
config.firstKeyOffset(),
|
|
538
|
+
config.getNumItems() + config.firstKeyOffset());
|
|
539
|
+
|
|
540
|
+
m_gensequence = new SeqGenerator(
|
|
541
|
+
config.firstKeyOffset(),
|
|
542
|
+
config.getNumItems() + config.firstKeyOffset(),
|
|
543
|
+
config.getNumThreads(),
|
|
544
|
+
ix);
|
|
545
|
+
|
|
546
|
+
if (m_in_population) {
|
|
547
|
+
m_force_sequential = true;
|
|
548
|
+
} else {
|
|
549
|
+
m_force_sequential = config.sequentialAccess();
|
|
550
|
+
}
|
|
551
|
+
|
|
552
|
+
m_local_genstate = config.docgen->createState(config.getNumThreads(), ix);
|
|
553
|
+
if (config.isSubdoc()) {
|
|
554
|
+
m_mode_read = NextOp::SDGET;
|
|
555
|
+
m_mode_write = NextOp::SDSTORE;
|
|
556
|
+
m_sdgenstate = config.docgen->createSubdocState(config.getNumThreads(), ix);
|
|
557
|
+
if (!m_sdgenstate) {
|
|
558
|
+
std::cerr << "Current generator does not support subdoc. Did you try --json?" << std::endl;
|
|
559
|
+
exit(EXIT_FAILURE);
|
|
560
|
+
}
|
|
561
|
+
} else {
|
|
562
|
+
m_mode_read = NextOp::GET;
|
|
563
|
+
m_mode_write = NextOp::STORE;
|
|
564
|
+
}
|
|
565
|
+
}
|
|
566
|
+
|
|
567
|
+
void setValue(NextOp& op) {
|
|
568
|
+
m_local_genstate->populateIov(op.m_seqno, op.m_valuefrags);
|
|
569
|
+
}
|
|
570
|
+
|
|
571
|
+
void populateIov(uint32_t seq, vector<lcb_IOV>& iov_out) {
|
|
572
|
+
m_local_genstate->populateIov(seq, iov_out);
|
|
573
|
+
}
|
|
574
|
+
|
|
575
|
+
void setNextOp(NextOp& op) {
|
|
576
|
+
bool store_override = false;
|
|
577
|
+
|
|
578
|
+
if (m_in_population) {
|
|
579
|
+
if (m_gencount++ < m_gensequence->maxItems()) {
|
|
580
|
+
store_override = true;
|
|
581
|
+
} else {
|
|
582
|
+
printf("Thread %d has finished populating.\n", m_id);
|
|
583
|
+
m_in_population = false;
|
|
584
|
+
m_force_sequential = config.sequentialAccess();
|
|
585
|
+
}
|
|
586
|
+
}
|
|
587
|
+
|
|
588
|
+
if (m_in_population || !config.lockTime) {
|
|
589
|
+
op.m_seqno = (m_force_sequential ? m_gensequence : m_genrandom)->next();
|
|
590
|
+
} else {
|
|
591
|
+
op.m_seqno = (m_force_sequential ? m_gensequence : m_genrandom)->checkout();
|
|
592
|
+
}
|
|
593
|
+
|
|
594
|
+
if (store_override) {
|
|
595
|
+
// Populate
|
|
596
|
+
op.m_mode = NextOp::STORE;
|
|
597
|
+
setValue(op);
|
|
598
|
+
|
|
599
|
+
} else if (shouldStore(op.m_seqno)) {
|
|
600
|
+
op.m_mode = m_mode_write;
|
|
601
|
+
if (op.m_mode == NextOp::STORE) {
|
|
602
|
+
setValue(op);
|
|
603
|
+
} else if (op.m_mode == NextOp::SDSTORE) {
|
|
604
|
+
op.m_specs.resize(config.sdOpsPerCmd);
|
|
605
|
+
m_sdgenstate->populateMutate(op.m_seqno, op.m_specs);
|
|
606
|
+
} else {
|
|
607
|
+
fprintf(stderr, "Invalid mode for op: %d\n", op.m_mode);
|
|
608
|
+
abort();
|
|
609
|
+
}
|
|
610
|
+
} else {
|
|
611
|
+
op.m_mode = m_mode_read;
|
|
612
|
+
if (op.m_mode == NextOp::SDGET) {
|
|
613
|
+
op.m_specs.resize(config.sdOpsPerCmd);
|
|
614
|
+
m_sdgenstate->populateLookup(op.m_seqno, op.m_specs);
|
|
615
|
+
}
|
|
616
|
+
}
|
|
617
|
+
|
|
618
|
+
generateKey(op);
|
|
619
|
+
}
|
|
620
|
+
|
|
621
|
+
bool inPopulation() const {
|
|
622
|
+
return m_in_population;
|
|
623
|
+
}
|
|
624
|
+
|
|
625
|
+
void checkin(uint32_t seqno) {
|
|
626
|
+
(m_force_sequential ? m_gensequence : m_genrandom)->checkin(seqno);
|
|
627
|
+
}
|
|
628
|
+
|
|
629
|
+
const char *getStageString() const {
|
|
630
|
+
if (m_in_population) {
|
|
631
|
+
return "Populate";
|
|
632
|
+
} else {
|
|
633
|
+
return "Run";
|
|
634
|
+
}
|
|
635
|
+
}
|
|
636
|
+
|
|
637
|
+
private:
|
|
638
|
+
bool shouldStore(uint32_t seqno) {
|
|
639
|
+
if (config.setprc == 0) {
|
|
640
|
+
return false;
|
|
641
|
+
}
|
|
642
|
+
|
|
643
|
+
float seqno_f = seqno % 100;
|
|
644
|
+
float pct_f = seqno_f / config.setprc;
|
|
645
|
+
return pct_f < 1;
|
|
646
|
+
}
|
|
647
|
+
|
|
648
|
+
void generateKey(NextOp& op) {
|
|
649
|
+
uint32_t seqno = op.m_seqno;
|
|
650
|
+
char buffer[21];
|
|
651
|
+
snprintf(buffer, sizeof(buffer), "%020d", seqno);
|
|
652
|
+
string &prefix = config.useCollections()
|
|
653
|
+
? config.collections[seqno % config.collections.size()]
|
|
654
|
+
: config.getKeyPrefix();
|
|
655
|
+
op.m_key.assign(prefix + buffer);
|
|
656
|
+
}
|
|
657
|
+
|
|
658
|
+
|
|
659
|
+
SeqGenerator *m_genrandom;
|
|
660
|
+
SeqGenerator *m_gensequence;
|
|
661
|
+
size_t m_gencount;
|
|
662
|
+
|
|
663
|
+
bool m_force_sequential;
|
|
664
|
+
bool m_in_population;
|
|
665
|
+
NextOp::Mode m_mode_read;
|
|
666
|
+
NextOp::Mode m_mode_write;
|
|
667
|
+
GeneratorState *m_local_genstate;
|
|
668
|
+
SubdocGeneratorState *m_sdgenstate;
|
|
669
|
+
};
|
|
670
|
+
|
|
671
|
+
#define OPFLAGS_LOCKED 0x01
|
|
672
|
+
|
|
673
|
+
class ThreadContext
|
|
674
|
+
{
|
|
675
|
+
public:
|
|
676
|
+
ThreadContext(lcb_t handle, int ix) : niter(0), instance(handle) {
|
|
677
|
+
if (config.isNoop()) {
|
|
678
|
+
gen = new NoopGenerator(ix);
|
|
679
|
+
} else {
|
|
680
|
+
gen = new KeyGenerator(ix);
|
|
681
|
+
}
|
|
682
|
+
}
|
|
683
|
+
|
|
684
|
+
~ThreadContext() {
|
|
685
|
+
delete gen;
|
|
686
|
+
gen = NULL;
|
|
687
|
+
}
|
|
688
|
+
|
|
689
|
+
bool inPopulation() {
|
|
690
|
+
return gen && (gen->inPopulation() || !retryq.empty());
|
|
691
|
+
}
|
|
692
|
+
|
|
693
|
+
void checkin(uint32_t seqno) {
|
|
694
|
+
if (gen) {
|
|
695
|
+
gen->checkin(seqno);
|
|
696
|
+
}
|
|
697
|
+
}
|
|
698
|
+
|
|
699
|
+
void singleLoop() {
|
|
700
|
+
bool hasItems = false;
|
|
701
|
+
|
|
702
|
+
lcb_sched_enter(instance);
|
|
703
|
+
for (size_t ii = 0; ii < config.opsPerCycle; ++ii) {
|
|
704
|
+
hasItems = scheduleNextOperation();
|
|
705
|
+
}
|
|
706
|
+
if (hasItems) {
|
|
707
|
+
error = LCB_SUCCESS;
|
|
708
|
+
lcb_sched_leave(instance);
|
|
709
|
+
lcb_wait(instance);
|
|
710
|
+
} else {
|
|
711
|
+
lcb_sched_fail(instance);
|
|
712
|
+
}
|
|
713
|
+
purgeRetryQueue();
|
|
714
|
+
}
|
|
715
|
+
|
|
716
|
+
void purgeRetryQueue() {
|
|
717
|
+
NextOp opinfo;
|
|
718
|
+
InstanceCookie *cookie = InstanceCookie::get(instance);
|
|
719
|
+
|
|
720
|
+
while (!retryq.empty()) {
|
|
721
|
+
unsigned exptime = config.getExptime();
|
|
722
|
+
lcb_sched_enter(instance);
|
|
723
|
+
while (!retryq.empty()) {
|
|
724
|
+
opinfo = retryq.front();
|
|
725
|
+
retryq.pop();
|
|
726
|
+
lcb_CMDSTOREDUR scmd = { 0 };
|
|
727
|
+
scmd.operation = LCB_SET;
|
|
728
|
+
scmd.exptime = exptime;
|
|
729
|
+
LCB_CMD_SET_KEY(&scmd, opinfo.m_key.c_str(), opinfo.m_key.size());
|
|
730
|
+
LCB_CMD_SET_VALUEIOV(&scmd, &opinfo.m_valuefrags[0], opinfo.m_valuefrags.size());
|
|
731
|
+
if (config.persistTo > 0 || config.replicateTo > 0) {
|
|
732
|
+
scmd.persist_to = config.persistTo;
|
|
733
|
+
scmd.replicate_to = config.replicateTo;
|
|
734
|
+
error = lcb_storedur3(instance, NULL, &scmd);
|
|
735
|
+
} else {
|
|
736
|
+
error = lcb_store3(instance, NULL, reinterpret_cast<lcb_CMDSTORE*>(&scmd));
|
|
737
|
+
}
|
|
738
|
+
cookie->stats.retried++;
|
|
739
|
+
}
|
|
740
|
+
lcb_sched_leave(instance);
|
|
741
|
+
lcb_wait(instance);
|
|
742
|
+
if (error != LCB_SUCCESS) {
|
|
743
|
+
log("Operation(s) failed: [0x%x] %s", error, lcb_strerror(instance, error));
|
|
744
|
+
}
|
|
745
|
+
}
|
|
746
|
+
}
|
|
747
|
+
|
|
748
|
+
bool scheduleNextOperation()
|
|
749
|
+
{
|
|
750
|
+
NextOp opinfo;
|
|
751
|
+
unsigned exptime = config.getExptime();
|
|
752
|
+
gen->setNextOp(opinfo);
|
|
753
|
+
|
|
754
|
+
switch (opinfo.m_mode) {
|
|
755
|
+
case NextOp::STORE: {
|
|
756
|
+
if (!gen->inPopulation() && config.lockTime > 0) {
|
|
757
|
+
lcb_CMDGET gcmd = { 0 };
|
|
758
|
+
LCB_CMD_SET_KEY(&gcmd, opinfo.m_key.c_str(), opinfo.m_key.size());
|
|
759
|
+
gcmd.lock = config.lockTime;
|
|
760
|
+
error = lcb_get3(instance, (void *)OPFLAGS_LOCKED, &gcmd);
|
|
761
|
+
} else {
|
|
762
|
+
lcb_CMDSTOREDUR scmd = { 0 };
|
|
763
|
+
scmd.operation = LCB_SET;
|
|
764
|
+
scmd.exptime = exptime;
|
|
765
|
+
if (config.writeJson()) {
|
|
766
|
+
scmd.datatype = LCB_VALUE_F_JSON;
|
|
767
|
+
}
|
|
768
|
+
LCB_CMD_SET_KEY(&scmd, opinfo.m_key.c_str(), opinfo.m_key.size());
|
|
769
|
+
LCB_CMD_SET_VALUEIOV(&scmd, &opinfo.m_valuefrags[0], opinfo.m_valuefrags.size());
|
|
770
|
+
if (config.persistTo > 0 || config.replicateTo > 0) {
|
|
771
|
+
scmd.persist_to = config.persistTo;
|
|
772
|
+
scmd.replicate_to = config.replicateTo;
|
|
773
|
+
error = lcb_storedur3(instance, NULL, &scmd);
|
|
774
|
+
} else {
|
|
775
|
+
error = lcb_store3(instance, NULL, reinterpret_cast<lcb_CMDSTORE*>(&scmd));
|
|
776
|
+
}
|
|
777
|
+
}
|
|
778
|
+
break;
|
|
779
|
+
}
|
|
780
|
+
case NextOp::GET: {
|
|
781
|
+
lcb_CMDGET gcmd = { 0 };
|
|
782
|
+
LCB_CMD_SET_KEY(&gcmd, opinfo.m_key.c_str(), opinfo.m_key.size());
|
|
783
|
+
gcmd.exptime = exptime;
|
|
784
|
+
error = lcb_get3(instance, this, &gcmd);
|
|
785
|
+
break;
|
|
786
|
+
}
|
|
787
|
+
case NextOp::SDSTORE:
|
|
788
|
+
case NextOp::SDGET: {
|
|
789
|
+
lcb_CMDSUBDOC sdcmd = { 0 };
|
|
790
|
+
if (opinfo.m_mode == NextOp::SDSTORE) {
|
|
791
|
+
sdcmd.exptime = exptime;
|
|
792
|
+
}
|
|
793
|
+
LCB_CMD_SET_KEY(&sdcmd, opinfo.m_key.c_str(), opinfo.m_key.size());
|
|
794
|
+
sdcmd.specs = &opinfo.m_specs[0];
|
|
795
|
+
sdcmd.nspecs = opinfo.m_specs.size();
|
|
796
|
+
error = lcb_subdoc3(instance, NULL, &sdcmd);
|
|
797
|
+
break;
|
|
798
|
+
}
|
|
799
|
+
case NextOp::NOOP: {
|
|
800
|
+
lcb_CMDNOOP ncmd = { 0 };
|
|
801
|
+
error = lcb_noop3(instance, NULL, &ncmd);
|
|
802
|
+
break;
|
|
803
|
+
}
|
|
804
|
+
}
|
|
805
|
+
|
|
806
|
+
if (error != LCB_SUCCESS) {
|
|
807
|
+
log("Failed to schedule operation: [0x%x] %s", error, lcb_strerror(instance, error));
|
|
808
|
+
return false;
|
|
809
|
+
} else {
|
|
810
|
+
return true;
|
|
811
|
+
}
|
|
812
|
+
}
|
|
813
|
+
|
|
814
|
+
bool run() {
|
|
815
|
+
do {
|
|
816
|
+
singleLoop();
|
|
817
|
+
|
|
818
|
+
if (config.numTimings() > 1) {
|
|
819
|
+
InstanceCookie::dumpTimings(instance, gen->getStageString());
|
|
820
|
+
}
|
|
821
|
+
if (config.params.shouldDump()) {
|
|
822
|
+
lcb_dump(instance, stderr, LCB_DUMP_ALL);
|
|
823
|
+
}
|
|
824
|
+
if (config.getRateLimit() > 0) {
|
|
825
|
+
rateLimitThrottle();
|
|
826
|
+
}
|
|
827
|
+
|
|
828
|
+
} while (!config.isLoopDone(++niter));
|
|
829
|
+
|
|
830
|
+
if (config.numTimings() > 1) {
|
|
831
|
+
InstanceCookie::dumpTimings(instance, gen->getStageString(), true);
|
|
832
|
+
}
|
|
833
|
+
return true;
|
|
834
|
+
}
|
|
835
|
+
|
|
836
|
+
void retry(NextOp &op) {
|
|
837
|
+
if (op.m_mode == NextOp::STORE) {
|
|
838
|
+
gen->setValue(op);
|
|
839
|
+
}
|
|
840
|
+
retryq.push(op);
|
|
841
|
+
}
|
|
842
|
+
|
|
843
|
+
void populateIov(uint32_t seq, vector<lcb_IOV>& iov_out)
|
|
844
|
+
{
|
|
845
|
+
gen->populateIov(seq, iov_out);
|
|
846
|
+
}
|
|
847
|
+
|
|
848
|
+
|
|
849
|
+
#ifndef WIN32
|
|
850
|
+
pthread_t thr;
|
|
851
|
+
#endif
|
|
852
|
+
|
|
853
|
+
lcb_t getInstance() {
|
|
854
|
+
return instance;
|
|
855
|
+
}
|
|
856
|
+
|
|
857
|
+
protected:
|
|
858
|
+
// the callback methods needs to be able to set the error handler..
|
|
859
|
+
friend void operationCallback(lcb_t, int, const lcb_RESPBASE*);
|
|
860
|
+
friend void storeCallback(lcb_t, int, const lcb_RESPBASE *);
|
|
861
|
+
|
|
862
|
+
Histogram histogram;
|
|
863
|
+
|
|
864
|
+
void setError(lcb_error_t e) { error = e; }
|
|
865
|
+
|
|
866
|
+
private:
|
|
867
|
+
|
|
868
|
+
void rateLimitThrottle() {
|
|
869
|
+
lcb_U64 now = lcb_nstime();
|
|
870
|
+
static lcb_U64 previous_time = now;
|
|
871
|
+
|
|
872
|
+
const lcb_U64 elapsed_ns = now - previous_time;
|
|
873
|
+
const lcb_U64 wanted_duration_ns =
|
|
874
|
+
(config.getNumThreads() * config.opsPerCycle * 1e9) / config.getRateLimit();
|
|
875
|
+
// On first invocation no previous_time, so skip attempting to sleep.
|
|
876
|
+
if (elapsed_ns > 0 && elapsed_ns < wanted_duration_ns) {
|
|
877
|
+
// Dampen the sleep time by averaging with the previous
|
|
878
|
+
// sleep time.
|
|
879
|
+
static lcb_U64 last_sleep_ns = 0;
|
|
880
|
+
const lcb_U64 sleep_ns =
|
|
881
|
+
(last_sleep_ns + wanted_duration_ns - elapsed_ns) / 2;
|
|
882
|
+
usleep(sleep_ns / 1000);
|
|
883
|
+
now += sleep_ns;
|
|
884
|
+
last_sleep_ns = sleep_ns;
|
|
885
|
+
}
|
|
886
|
+
previous_time = now;
|
|
887
|
+
}
|
|
888
|
+
|
|
889
|
+
OpGenerator *gen;
|
|
890
|
+
size_t niter;
|
|
891
|
+
lcb_error_t error;
|
|
892
|
+
lcb_t instance;
|
|
893
|
+
std::queue<NextOp> retryq;
|
|
894
|
+
};
|
|
895
|
+
|
|
896
|
+
static void updateOpsPerSecDisplay()
|
|
897
|
+
{
|
|
898
|
+
|
|
899
|
+
static time_t start_time = time(NULL);
|
|
900
|
+
static int is_tty =
|
|
901
|
+
#ifdef WIN32
|
|
902
|
+
0;
|
|
903
|
+
#else
|
|
904
|
+
isatty(STDERR_FILENO);
|
|
905
|
+
#endif
|
|
906
|
+
static volatile unsigned long nops = 0;
|
|
907
|
+
time_t now = time(NULL);
|
|
908
|
+
time_t nsecs = now - start_time;
|
|
909
|
+
if (!nsecs) { nsecs = 1; }
|
|
910
|
+
unsigned long ops_sec = nops / nsecs;
|
|
911
|
+
if (++nops % 10000 == 0) {
|
|
912
|
+
fprintf(stderr, "OPS/SEC: %10lu%c", ops_sec, is_tty ? '\r' : '\n');
|
|
913
|
+
}
|
|
914
|
+
}
|
|
915
|
+
|
|
916
|
+
static void updateStats(InstanceCookie *cookie, lcb_error_t rc)
|
|
917
|
+
{
|
|
918
|
+
cookie->stats.total++;
|
|
919
|
+
switch (rc) {
|
|
920
|
+
case LCB_ETMPFAIL:
|
|
921
|
+
cookie->stats.etmpfail++;
|
|
922
|
+
break;
|
|
923
|
+
case LCB_KEY_EEXISTS:
|
|
924
|
+
cookie->stats.eexist++;
|
|
925
|
+
break;
|
|
926
|
+
case LCB_ETIMEDOUT:
|
|
927
|
+
cookie->stats.etimeout++;
|
|
928
|
+
break;
|
|
929
|
+
default:
|
|
930
|
+
break;
|
|
931
|
+
}
|
|
932
|
+
}
|
|
933
|
+
|
|
934
|
+
static void operationCallback(lcb_t instance, int cbtype, const lcb_RESPBASE *resp)
|
|
935
|
+
{
|
|
936
|
+
InstanceCookie *cookie = InstanceCookie::get(instance);
|
|
937
|
+
ThreadContext *tc = cookie->getContext();
|
|
938
|
+
tc->setError(resp->rc);
|
|
939
|
+
updateStats(cookie, resp->rc);
|
|
940
|
+
|
|
941
|
+
uintptr_t flags = 0;
|
|
942
|
+
if (resp->cookie) {
|
|
943
|
+
flags = (uintptr_t)resp->cookie;
|
|
944
|
+
}
|
|
945
|
+
bool done = true;
|
|
946
|
+
string key((const char*)resp->key, resp->nkey);
|
|
947
|
+
uint32_t seqno = atoi(key.c_str());
|
|
948
|
+
if (cbtype == LCB_CALLBACK_GET && (flags & OPFLAGS_LOCKED)) {
|
|
949
|
+
if (resp->rc == LCB_SUCCESS) {
|
|
950
|
+
lcb_CMDSTOREDUR scmd = { 0 };
|
|
951
|
+
vector<lcb_IOV> valuefrags;
|
|
952
|
+
scmd.operation = LCB_SET;
|
|
953
|
+
scmd.exptime = config.getExptime();
|
|
954
|
+
scmd.cas = resp->cas;
|
|
955
|
+
tc->populateIov(seqno, valuefrags);
|
|
956
|
+
LCB_CMD_SET_KEY(&scmd, resp->key, resp->nkey);
|
|
957
|
+
LCB_CMD_SET_VALUEIOV(&scmd, &valuefrags[0], valuefrags.size());
|
|
958
|
+
if (config.persistTo > 0 || config.replicateTo > 0) {
|
|
959
|
+
scmd.persist_to = config.persistTo;
|
|
960
|
+
scmd.replicate_to = config.replicateTo;
|
|
961
|
+
lcb_storedur3(instance, NULL, &scmd);
|
|
962
|
+
} else {
|
|
963
|
+
lcb_store3(instance, NULL, reinterpret_cast<lcb_CMDSTORE*>(&scmd));
|
|
964
|
+
}
|
|
965
|
+
done = false;
|
|
966
|
+
} else if (resp->rc == LCB_ETMPFAIL) {
|
|
967
|
+
NextOp op;
|
|
968
|
+
op.m_mode = NextOp::STORE;
|
|
969
|
+
op.m_key = key;
|
|
970
|
+
op.m_seqno = seqno;
|
|
971
|
+
tc->retry(op);
|
|
972
|
+
done = false;
|
|
973
|
+
}
|
|
974
|
+
}
|
|
975
|
+
|
|
976
|
+
if (done) {
|
|
977
|
+
tc->checkin(seqno);
|
|
978
|
+
}
|
|
979
|
+
updateOpsPerSecDisplay();
|
|
980
|
+
}
|
|
981
|
+
|
|
982
|
+
static void storeCallback(lcb_t instance, int, const lcb_RESPBASE *resp)
|
|
983
|
+
{
|
|
984
|
+
InstanceCookie *cookie = InstanceCookie::get(instance);
|
|
985
|
+
ThreadContext *tc = cookie->getContext();
|
|
986
|
+
tc->setError(resp->rc);
|
|
987
|
+
updateStats(cookie, resp->rc);
|
|
988
|
+
|
|
989
|
+
string key((const char*)resp->key, resp->nkey);
|
|
990
|
+
uint32_t seqno = atoi(key.c_str());
|
|
991
|
+
if (resp->rc != LCB_SUCCESS && tc->inPopulation()) {
|
|
992
|
+
NextOp op;
|
|
993
|
+
op.m_mode = NextOp::STORE;
|
|
994
|
+
op.m_key = key;
|
|
995
|
+
op.m_seqno = seqno;
|
|
996
|
+
tc->retry(op);
|
|
997
|
+
} else {
|
|
998
|
+
tc->checkin(seqno);
|
|
999
|
+
}
|
|
1000
|
+
|
|
1001
|
+
updateOpsPerSecDisplay();
|
|
1002
|
+
}
|
|
1003
|
+
|
|
1004
|
+
std::list<ThreadContext *> contexts;
|
|
1005
|
+
|
|
1006
|
+
extern "C" {
|
|
1007
|
+
typedef void (*handler_t)(int);
|
|
1008
|
+
|
|
1009
|
+
static void dump_metrics(void)
|
|
1010
|
+
{
|
|
1011
|
+
std::list<ThreadContext *>::iterator it;
|
|
1012
|
+
for (it = contexts.begin(); it != contexts.end(); ++it) {
|
|
1013
|
+
lcb_t instance = (*it)->getInstance();
|
|
1014
|
+
lcb_CMDDIAG req = {};
|
|
1015
|
+
req.options = LCB_PINGOPT_F_JSONPRETTY;
|
|
1016
|
+
lcb_diag(instance, NULL, &req);
|
|
1017
|
+
if (config.numTimings() > 0) {
|
|
1018
|
+
InstanceCookie::dumpTimings(instance);
|
|
1019
|
+
}
|
|
1020
|
+
}
|
|
1021
|
+
}
|
|
1022
|
+
|
|
1023
|
+
#ifndef WIN32
|
|
1024
|
+
static void diag_callback(lcb_t instance, int, const lcb_RESPBASE *rb)
|
|
1025
|
+
{
|
|
1026
|
+
const lcb_RESPDIAG *resp = (const lcb_RESPDIAG *)rb;
|
|
1027
|
+
if (resp->rc != LCB_SUCCESS) {
|
|
1028
|
+
fprintf(stderr, "%p, diag failed: %s\n", (void *)instance, lcb_strerror(NULL, resp->rc));
|
|
1029
|
+
} else {
|
|
1030
|
+
if (resp->njson) {
|
|
1031
|
+
fprintf(stderr, "\n%.*s", (int)resp->njson, resp->json);
|
|
1032
|
+
}
|
|
1033
|
+
|
|
1034
|
+
{
|
|
1035
|
+
InstanceCookie *cookie = InstanceCookie::get(instance);
|
|
1036
|
+
lcb_METRICS* metrics;
|
|
1037
|
+
size_t ii;
|
|
1038
|
+
lcb_cntl(instance, LCB_CNTL_GET, LCB_CNTL_METRICS, &metrics);
|
|
1039
|
+
|
|
1040
|
+
fprintf(stderr, "%p: total: %lu, etmpfail: %lu, eexist: %lu, etimeout: %lu, retried: %lu, rq: %lu\n",
|
|
1041
|
+
(void *)instance,
|
|
1042
|
+
(unsigned long)cookie->stats.total,
|
|
1043
|
+
(unsigned long)cookie->stats.etmpfail,
|
|
1044
|
+
(unsigned long)cookie->stats.eexist,
|
|
1045
|
+
(unsigned long)cookie->stats.etimeout,
|
|
1046
|
+
(unsigned long)cookie->stats.retried,
|
|
1047
|
+
(unsigned long)metrics->packets_retried);
|
|
1048
|
+
for (ii = 0; ii < metrics->nservers; ii++) {
|
|
1049
|
+
fprintf(stderr, " [srv-%d] snt: %lu, rcv: %lu, q: %lu, err: %lu, tmo: %lu, nmv: %lu, orph: %lu\n",
|
|
1050
|
+
(int)ii,
|
|
1051
|
+
(unsigned long)metrics->servers[ii]->packets_sent,
|
|
1052
|
+
(unsigned long)metrics->servers[ii]->packets_read,
|
|
1053
|
+
(unsigned long)metrics->servers[ii]->packets_queued,
|
|
1054
|
+
(unsigned long)metrics->servers[ii]->packets_errored,
|
|
1055
|
+
(unsigned long)metrics->servers[ii]->packets_timeout,
|
|
1056
|
+
(unsigned long)metrics->servers[ii]->packets_nmv,
|
|
1057
|
+
(unsigned long)metrics->servers[ii]->packets_ownerless);
|
|
1058
|
+
}
|
|
1059
|
+
}
|
|
1060
|
+
}
|
|
1061
|
+
}
|
|
1062
|
+
|
|
1063
|
+
static void sigquit_handler(int)
|
|
1064
|
+
{
|
|
1065
|
+
dump_metrics();
|
|
1066
|
+
signal(SIGQUIT, sigquit_handler); // Reinstall
|
|
1067
|
+
}
|
|
1068
|
+
|
|
1069
|
+
static void setup_sigquit_handler()
|
|
1070
|
+
{
|
|
1071
|
+
struct sigaction action;
|
|
1072
|
+
sigemptyset(&action.sa_mask);
|
|
1073
|
+
action.sa_handler = sigquit_handler;
|
|
1074
|
+
action.sa_flags = 0;
|
|
1075
|
+
sigaction(SIGQUIT, &action, NULL);
|
|
1076
|
+
}
|
|
1077
|
+
|
|
1078
|
+
static void sigint_handler(int)
|
|
1079
|
+
{
|
|
1080
|
+
static int ncalled = 0;
|
|
1081
|
+
ncalled++;
|
|
1082
|
+
|
|
1083
|
+
if (ncalled < 2) {
|
|
1084
|
+
log("\nTermination requested. Waiting threads to finish. Ctrl-C to force termination.");
|
|
1085
|
+
signal(SIGINT, sigint_handler); // Reinstall
|
|
1086
|
+
config.maxCycles = 0;
|
|
1087
|
+
return;
|
|
1088
|
+
}
|
|
1089
|
+
|
|
1090
|
+
std::list<ThreadContext *>::iterator it;
|
|
1091
|
+
for (it = contexts.begin(); it != contexts.end(); ++it) {
|
|
1092
|
+
delete *it;
|
|
1093
|
+
}
|
|
1094
|
+
contexts.clear();
|
|
1095
|
+
exit(EXIT_FAILURE);
|
|
1096
|
+
}
|
|
1097
|
+
|
|
1098
|
+
static void setup_sigint_handler()
|
|
1099
|
+
{
|
|
1100
|
+
struct sigaction action;
|
|
1101
|
+
sigemptyset(&action.sa_mask);
|
|
1102
|
+
action.sa_handler = sigint_handler;
|
|
1103
|
+
action.sa_flags = 0;
|
|
1104
|
+
sigaction(SIGINT, &action, NULL);
|
|
1105
|
+
}
|
|
1106
|
+
|
|
1107
|
+
static void* thread_worker(void*);
|
|
1108
|
+
|
|
1109
|
+
static void start_worker(ThreadContext *ctx)
|
|
1110
|
+
{
|
|
1111
|
+
pthread_attr_t attr;
|
|
1112
|
+
pthread_attr_init(&attr);
|
|
1113
|
+
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);
|
|
1114
|
+
int rc = pthread_create(&ctx->thr, &attr, thread_worker, ctx);
|
|
1115
|
+
if (rc != 0) {
|
|
1116
|
+
log("Couldn't create thread: (%d)", errno);
|
|
1117
|
+
exit(EXIT_FAILURE);
|
|
1118
|
+
}
|
|
1119
|
+
}
|
|
1120
|
+
static void join_worker(ThreadContext *ctx)
|
|
1121
|
+
{
|
|
1122
|
+
void *arg = NULL;
|
|
1123
|
+
int rc = pthread_join(ctx->thr, &arg);
|
|
1124
|
+
if (rc != 0) {
|
|
1125
|
+
log("Couldn't join thread (%d)", errno);
|
|
1126
|
+
exit(EXIT_FAILURE);
|
|
1127
|
+
}
|
|
1128
|
+
}
|
|
1129
|
+
|
|
1130
|
+
#else
|
|
1131
|
+
static void setup_sigquit_handler() {}
|
|
1132
|
+
static void setup_sigint_handler() {}
|
|
1133
|
+
static void start_worker(ThreadContext *ctx) { ctx->run(); }
|
|
1134
|
+
static void join_worker(ThreadContext *ctx) { (void)ctx; }
|
|
1135
|
+
#endif
|
|
1136
|
+
|
|
1137
|
+
static void *thread_worker(void *arg)
|
|
1138
|
+
{
|
|
1139
|
+
ThreadContext *ctx = static_cast<ThreadContext *>(arg);
|
|
1140
|
+
ctx->run();
|
|
1141
|
+
return NULL;
|
|
1142
|
+
}
|
|
1143
|
+
}
|
|
1144
|
+
|
|
1145
|
+
int main(int argc, char **argv)
|
|
1146
|
+
{
|
|
1147
|
+
int exit_code = EXIT_SUCCESS;
|
|
1148
|
+
setup_sigint_handler();
|
|
1149
|
+
setup_sigquit_handler();
|
|
1150
|
+
|
|
1151
|
+
Parser parser("cbc-pillowfight");
|
|
1152
|
+
try {
|
|
1153
|
+
config.addOptions(parser);
|
|
1154
|
+
parser.parse(argc, argv, false);
|
|
1155
|
+
config.processOptions();
|
|
1156
|
+
} catch (std::string& e) {
|
|
1157
|
+
std::cerr << e << std::endl;
|
|
1158
|
+
exit(EXIT_FAILURE);
|
|
1159
|
+
} catch (std::exception& e) {
|
|
1160
|
+
std::cerr << e.what() << std::endl;
|
|
1161
|
+
exit(EXIT_FAILURE);
|
|
1162
|
+
}
|
|
1163
|
+
size_t nthreads = config.getNumThreads();
|
|
1164
|
+
log("Running. Press Ctrl-C to terminate...");
|
|
1165
|
+
|
|
1166
|
+
#ifdef WIN32
|
|
1167
|
+
if (nthreads > 1) {
|
|
1168
|
+
log("WARNING: More than a single thread on Windows not supported. Forcing 1");
|
|
1169
|
+
nthreads = 1;
|
|
1170
|
+
}
|
|
1171
|
+
#endif
|
|
1172
|
+
|
|
1173
|
+
struct lcb_create_st options;
|
|
1174
|
+
ConnParams& cp = config.params;
|
|
1175
|
+
lcb_error_t error;
|
|
1176
|
+
|
|
1177
|
+
for (uint32_t ii = 0; ii < nthreads; ++ii) {
|
|
1178
|
+
cp.fillCropts(options);
|
|
1179
|
+
lcb_t instance = NULL;
|
|
1180
|
+
error = lcb_create(&instance, &options);
|
|
1181
|
+
if (error != LCB_SUCCESS) {
|
|
1182
|
+
log("Failed to create instance: %s", lcb_strerror(NULL, error));
|
|
1183
|
+
exit(EXIT_FAILURE);
|
|
1184
|
+
}
|
|
1185
|
+
lcb_install_callback3(instance, LCB_CALLBACK_STOREDUR, storeCallback);
|
|
1186
|
+
lcb_install_callback3(instance, LCB_CALLBACK_STORE, storeCallback);
|
|
1187
|
+
lcb_install_callback3(instance, LCB_CALLBACK_GET, operationCallback);
|
|
1188
|
+
lcb_install_callback3(instance, LCB_CALLBACK_SDMUTATE, operationCallback);
|
|
1189
|
+
lcb_install_callback3(instance, LCB_CALLBACK_SDLOOKUP, operationCallback);
|
|
1190
|
+
lcb_install_callback3(instance, LCB_CALLBACK_NOOP, operationCallback);
|
|
1191
|
+
#ifndef WIN32
|
|
1192
|
+
lcb_install_callback3(instance, LCB_CALLBACK_DIAG, diag_callback);
|
|
1193
|
+
{
|
|
1194
|
+
int activate = 1;
|
|
1195
|
+
lcb_cntl(instance, LCB_CNTL_SET, LCB_CNTL_METRICS, &activate);
|
|
1196
|
+
}
|
|
1197
|
+
#endif
|
|
1198
|
+
cp.doCtls(instance);
|
|
1199
|
+
if (config.useCollections()) {
|
|
1200
|
+
int use = 1;
|
|
1201
|
+
lcb_cntl(instance, LCB_CNTL_SET, LCB_CNTL_USE_COLLECTIONS, &use);
|
|
1202
|
+
}
|
|
1203
|
+
|
|
1204
|
+
InstanceCookie *cookie = new InstanceCookie(instance);
|
|
1205
|
+
|
|
1206
|
+
lcb_connect(instance);
|
|
1207
|
+
lcb_wait(instance);
|
|
1208
|
+
error = lcb_get_bootstrap_status(instance);
|
|
1209
|
+
|
|
1210
|
+
if (error != LCB_SUCCESS) {
|
|
1211
|
+
std::cout << std::endl;
|
|
1212
|
+
log("Failed to connect: %s", lcb_strerror(instance, error));
|
|
1213
|
+
exit(EXIT_FAILURE);
|
|
1214
|
+
}
|
|
1215
|
+
|
|
1216
|
+
ThreadContext *ctx = new ThreadContext(instance, ii);
|
|
1217
|
+
cookie->setContext(ctx);
|
|
1218
|
+
contexts.push_back(ctx);
|
|
1219
|
+
start_worker(ctx);
|
|
1220
|
+
}
|
|
1221
|
+
|
|
1222
|
+
for (std::list<ThreadContext *>::iterator it = contexts.begin();
|
|
1223
|
+
it != contexts.end(); ++it) {
|
|
1224
|
+
join_worker(*it);
|
|
1225
|
+
}
|
|
1226
|
+
if (config.numTimings() > 0) {
|
|
1227
|
+
dump_metrics();
|
|
1228
|
+
}
|
|
1229
|
+
return exit_code;
|
|
1230
|
+
}
|