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