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,452 @@
|
|
|
1
|
+
/* -*- Mode: C; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */
|
|
2
|
+
/*
|
|
3
|
+
* Copyright 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
|
+
#ifndef NETBUF_H
|
|
19
|
+
#define NETBUF_H
|
|
20
|
+
|
|
21
|
+
#ifdef __cplusplus
|
|
22
|
+
extern "C" {
|
|
23
|
+
#endif
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* @file
|
|
27
|
+
* @brief Netbuf write buffers
|
|
28
|
+
*/
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* @defgroup netbufs Netbufs
|
|
32
|
+
*
|
|
33
|
+
* # Introduction
|
|
34
|
+
*
|
|
35
|
+
* ## GOALS
|
|
36
|
+
*
|
|
37
|
+
* 1. provide a simple buffer allocation API
|
|
38
|
+
* From a logic perspective it's simplest to deal with a straight
|
|
39
|
+
* contiguous buffer per packet.
|
|
40
|
+
*
|
|
41
|
+
* 2. provide an efficient way of sending multiple contiguous packets. This
|
|
42
|
+
* will reduce IOV fragmentation and reduce the number of trips to the
|
|
43
|
+
* I/O plugin for multiple writes. Currently this is done very efficiently
|
|
44
|
+
* with the ringbuffer - however this comes at the cost of copying all
|
|
45
|
+
* request data to the ringbuffer itself. Our aim is to reduce the
|
|
46
|
+
* number of copies while still maintaining a packed buffer.
|
|
47
|
+
*
|
|
48
|
+
* 3. Allow a pluggable method by which user-provided data can be plugged
|
|
49
|
+
* into the span/cursor/flush architecture.
|
|
50
|
+
*
|
|
51
|
+
* @addtogroup netbufs
|
|
52
|
+
* @{
|
|
53
|
+
*/
|
|
54
|
+
|
|
55
|
+
#include "sllist.h"
|
|
56
|
+
#include "netbuf-defs.h"
|
|
57
|
+
#include "netbuf-mblock.h"
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* @brief Structure representing a buffer within netbufs
|
|
61
|
+
*
|
|
62
|
+
* @note It is recommended that you maintain the individual fields in your
|
|
63
|
+
* own structure and then re-create them as needed. The span structure is 16
|
|
64
|
+
* bytes on 64 bit systems, but can be reduced to 12 if needed. Additionally,
|
|
65
|
+
* you may already have the 'size' field stored/calculated elsewhere.
|
|
66
|
+
*/
|
|
67
|
+
typedef struct {
|
|
68
|
+
/** @private Parent block */
|
|
69
|
+
nb_MBLOCK *parent;
|
|
70
|
+
|
|
71
|
+
/** @private Offset from root at which this buffer begins */
|
|
72
|
+
nb_SIZE offset;
|
|
73
|
+
|
|
74
|
+
/** write-once: Allocation size */
|
|
75
|
+
nb_SIZE size;
|
|
76
|
+
} nb_SPAN;
|
|
77
|
+
|
|
78
|
+
#define NETBUF_INVALID_OFFSET (nb_SIZE)-1
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* Creates a span from a buffer _not_ owned by netbufs.
|
|
82
|
+
* @param span the span to initialize
|
|
83
|
+
* @param buf the buffer
|
|
84
|
+
* @param len the length of the buffer
|
|
85
|
+
*/
|
|
86
|
+
#define CREATE_STANDALONE_SPAN(span, buf, len) \
|
|
87
|
+
(span)->parent = (nb_MBLOCK *) (void *)buf; \
|
|
88
|
+
(span)->offset = NETBUF_INVALID_OFFSET; \
|
|
89
|
+
(span)->size = len;
|
|
90
|
+
|
|
91
|
+
/** @private */
|
|
92
|
+
typedef struct {
|
|
93
|
+
sllist_node slnode;
|
|
94
|
+
char *base;
|
|
95
|
+
nb_SIZE len;
|
|
96
|
+
/* Extra 4 bytes here. WHAT WE DO!!! */
|
|
97
|
+
} nb_SNDQELEM;
|
|
98
|
+
|
|
99
|
+
/** @private */
|
|
100
|
+
typedef struct {
|
|
101
|
+
/** Linked list of pending spans to send */
|
|
102
|
+
sllist_root pending;
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* List of PDUs to be flushed. A PDU is comprised of one or more IOVs
|
|
106
|
+
* (or even a subsection thereof)
|
|
107
|
+
*/
|
|
108
|
+
sllist_root pdus;
|
|
109
|
+
|
|
110
|
+
/** The last window which was part of the previous fill call */
|
|
111
|
+
nb_SNDQELEM *last_requested;
|
|
112
|
+
|
|
113
|
+
/**
|
|
114
|
+
* Number of bytes enqueued in the 'last request' element. This is needed
|
|
115
|
+
* because it is possible for the last element to grow in length during
|
|
116
|
+
* a subsequent flush.
|
|
117
|
+
*/
|
|
118
|
+
nb_SIZE last_offset;
|
|
119
|
+
|
|
120
|
+
/** Offset from last PDU which was partially flushed */
|
|
121
|
+
nb_SIZE pdu_offset;
|
|
122
|
+
|
|
123
|
+
/** Pool of elements to utilize */
|
|
124
|
+
nb_MBPOOL elempool;
|
|
125
|
+
} nb_SENDQ;
|
|
126
|
+
|
|
127
|
+
struct netbuf_st {
|
|
128
|
+
/** Send Queue */
|
|
129
|
+
nb_SENDQ sendq;
|
|
130
|
+
|
|
131
|
+
/** Pool for variable-size data */
|
|
132
|
+
nb_MBPOOL datapool;
|
|
133
|
+
|
|
134
|
+
nb_SETTINGS settings;
|
|
135
|
+
};
|
|
136
|
+
|
|
137
|
+
/**
|
|
138
|
+
* Quick way to get the span from a buffer, when the buffer is *known* to
|
|
139
|
+
* be standalone (i.e. CREATE_STANDALONE_SPAN()
|
|
140
|
+
* @param span The span from which to extract the buffer
|
|
141
|
+
* @return a pointer to the buffer
|
|
142
|
+
*/
|
|
143
|
+
#define SPAN_SABUFFER_NC(span) ((char *)(span)->parent)
|
|
144
|
+
|
|
145
|
+
/**
|
|
146
|
+
* Quick way to get the span from a buffer when the buffer is known *not*
|
|
147
|
+
* to be standalone
|
|
148
|
+
* @param span The span from which to extract the buffer
|
|
149
|
+
* @return A pointer to a buffer
|
|
150
|
+
*/
|
|
151
|
+
#define SPAN_MBUFFER_NC(span) ((span)->parent->root + (span)->offset)
|
|
152
|
+
|
|
153
|
+
/**
|
|
154
|
+
* @brief Retrieves a pointer to the buffer related to this span.
|
|
155
|
+
* @param span the span from which to extract the buffer
|
|
156
|
+
* @return a pointer to the buffer.
|
|
157
|
+
*
|
|
158
|
+
* @see SPAN_SABUFFER_NC
|
|
159
|
+
* @see SPAN_MBUFFER_NC
|
|
160
|
+
*/
|
|
161
|
+
#define SPAN_BUFFER(span) \
|
|
162
|
+
(((span)->offset == NETBUF_INVALID_OFFSET) ? SPAN_SABUFFER_NC(span) : SPAN_MBUFFER_NC(span))
|
|
163
|
+
|
|
164
|
+
/**
|
|
165
|
+
* @brief allocate a span
|
|
166
|
+
*
|
|
167
|
+
* Reserve a contiguous region of memory, in-order for a given span. The
|
|
168
|
+
* span will be reserved from the last block to be flushed to the network.
|
|
169
|
+
*
|
|
170
|
+
* The contents of the span are guaranteed to be contiguous (though not aligned)
|
|
171
|
+
* and are available via the SPAN_BUFFER macro.
|
|
172
|
+
*
|
|
173
|
+
* @return 0 if successful, -1 on error
|
|
174
|
+
*/
|
|
175
|
+
int
|
|
176
|
+
netbuf_mblock_reserve(nb_MGR *mgr, nb_SPAN *span);
|
|
177
|
+
|
|
178
|
+
/**
|
|
179
|
+
* @brief release a span
|
|
180
|
+
*
|
|
181
|
+
* Release a span previously allocated via reserve_span. It is assumed that the
|
|
182
|
+
* contents of the span have either:
|
|
183
|
+
*
|
|
184
|
+
* 1. been successfully sent to the network
|
|
185
|
+
* 2. have just been scheduled (and are being removed due to error handling)
|
|
186
|
+
* 3. have been partially sent to a connection which is being closed.
|
|
187
|
+
*
|
|
188
|
+
* @param mgr the manager in which this span is reserved
|
|
189
|
+
* @param span the span
|
|
190
|
+
*/
|
|
191
|
+
void
|
|
192
|
+
netbuf_mblock_release(nb_MGR *mgr, nb_SPAN *span);
|
|
193
|
+
|
|
194
|
+
/**
|
|
195
|
+
* @brief Enqueue a span for serialization
|
|
196
|
+
*
|
|
197
|
+
* Schedules an IOV to be placed inside the send queue. The storage of the
|
|
198
|
+
* underlying buffer must not be freed or otherwise modified until it has
|
|
199
|
+
* been sent.
|
|
200
|
+
*
|
|
201
|
+
* With the current usage model, flush status is implicitly completed once
|
|
202
|
+
* a response has arrived.
|
|
203
|
+
*
|
|
204
|
+
* Note that you may create the IOV from a SPAN object like so:
|
|
205
|
+
* @code{.c}
|
|
206
|
+
* iov->iov_len = span->size;
|
|
207
|
+
* iov->iov_base = SPAN_BUFFER(span);
|
|
208
|
+
* @endcode
|
|
209
|
+
*/
|
|
210
|
+
void
|
|
211
|
+
netbuf_enqueue(nb_MGR *mgr, const nb_IOV *bufinfo);
|
|
212
|
+
|
|
213
|
+
void
|
|
214
|
+
netbuf_enqueue_span(nb_MGR *mgr, nb_SPAN *span);
|
|
215
|
+
|
|
216
|
+
/**
|
|
217
|
+
* Gets the number of IOV structures required to flush the entire contents of
|
|
218
|
+
* all buffers.
|
|
219
|
+
*/
|
|
220
|
+
unsigned int
|
|
221
|
+
netbuf_get_niov(nb_MGR *mgr);
|
|
222
|
+
|
|
223
|
+
/**
|
|
224
|
+
* @brief
|
|
225
|
+
* Populates an iovec structure for flushing a set of bytes from the various
|
|
226
|
+
* blocks.
|
|
227
|
+
*
|
|
228
|
+
* You may call this function mutltiple times, so long as each call to
|
|
229
|
+
* start_flush is eventually mapped with a call to end_flush.
|
|
230
|
+
*
|
|
231
|
+
* @code{.c}
|
|
232
|
+
* netbuf_start_flush(mgr, iov1, niov1);
|
|
233
|
+
* netbuf_start_flush(mgr, iov2, niov2);
|
|
234
|
+
* ...
|
|
235
|
+
* netbuf_end_flush(mgr, nbytes1);
|
|
236
|
+
* netbuf_end_flush(mgr, nbytes2);
|
|
237
|
+
* @endcode
|
|
238
|
+
*
|
|
239
|
+
* Additionally, only the LAST end_flush call may be supplied an nflushed
|
|
240
|
+
* parameter which is smaller than the size returned by start_flush. If the
|
|
241
|
+
* entire contents of the `iovs` structure cannot be flushed immediately and
|
|
242
|
+
* you do not wish to persist it until such a time that it may be flushed, then
|
|
243
|
+
* netbuf_reset_flush() should be called. See that functions' documentation
|
|
244
|
+
* for more details.
|
|
245
|
+
*
|
|
246
|
+
* This function may be thought of advancing a virtual cursor which is mapped
|
|
247
|
+
* to a send queue. Each time this function is called the cursor is advanced
|
|
248
|
+
* by the number of bytes that the library expects you to flush (i.e. the return
|
|
249
|
+
* value of this function). Typically the cursor is never rewound and any
|
|
250
|
+
* operation that advances the cursor places the burden on the user to
|
|
251
|
+
* actually flush the data contained within the IOV objects.
|
|
252
|
+
* The netbuf_end_flush() function merely has the task of releasing any memory
|
|
253
|
+
* used for mapping of already-flushed data.
|
|
254
|
+
*
|
|
255
|
+
* From a different perspective, each call to netbuf_start_flush() establishes
|
|
256
|
+
* a contract between the library and the user: The library guarantees that
|
|
257
|
+
* this specific region (referred to within the IOVs) will not be flushed by
|
|
258
|
+
* any other subsystem (i.e. nothing else will try to flush the same data).
|
|
259
|
+
* The user guarantees that the data will eventually be flushed, and that the
|
|
260
|
+
* data will be flushed in the order it was received via start_flush().
|
|
261
|
+
*
|
|
262
|
+
*
|
|
263
|
+
* @param mgr the manager object
|
|
264
|
+
* @param iovs an array of iovec structures
|
|
265
|
+
* @param niov the number of iovec structures allocated.
|
|
266
|
+
* @param[out] nused how many IOVs are actually required
|
|
267
|
+
*
|
|
268
|
+
* @return the number of bytes which can be flushed in this IOV. If the
|
|
269
|
+
* return value is 0 then there are no more bytes to flush.
|
|
270
|
+
*
|
|
271
|
+
* Note that the return value is limited by the number of IOV structures
|
|
272
|
+
* provided and should not be taken as an indicator of how many bytes are
|
|
273
|
+
* used overall.
|
|
274
|
+
*/
|
|
275
|
+
nb_SIZE
|
|
276
|
+
netbuf_start_flush(nb_MGR *mgr, nb_IOV *iovs, int niov, int *nused);
|
|
277
|
+
|
|
278
|
+
/**
|
|
279
|
+
* @brief Indicate that a flush has completed.
|
|
280
|
+
*
|
|
281
|
+
* Indicate that a number of bytes have been flushed. This should be called after
|
|
282
|
+
* the data retrieved by get_flushing_iov has been flushed to the TCP buffers.
|
|
283
|
+
*
|
|
284
|
+
* @param mgr the manager object
|
|
285
|
+
* @param nflushed how much data in bytes was flushed to the network.
|
|
286
|
+
*/
|
|
287
|
+
void
|
|
288
|
+
netbuf_end_flush(nb_MGR *mgr, nb_SIZE nflushed);
|
|
289
|
+
|
|
290
|
+
/**
|
|
291
|
+
* Reset the flush context for the buffer. This should be called only when the
|
|
292
|
+
* following is true:
|
|
293
|
+
*
|
|
294
|
+
* (1) There is only a single open call to netbuf_start_flush
|
|
295
|
+
* (2) The last call to end_flush did not pass all the bytes which were to
|
|
296
|
+
* be flushed.
|
|
297
|
+
*
|
|
298
|
+
* In this case, the next call to start_flush() will return an IOV which begins
|
|
299
|
+
* where the last end_flush() finished, rather than the last start_flush().
|
|
300
|
+
* As a consequence it means that the previous IOV populated with start_flush
|
|
301
|
+
* is no longer valid and start_flush should be called again.
|
|
302
|
+
*/
|
|
303
|
+
#define netbuf_reset_flush(mgr) do { \
|
|
304
|
+
(mgr)->sendq.last_requested = NULL; \
|
|
305
|
+
(mgr)->sendq.last_offset = 0; \
|
|
306
|
+
} while (0);
|
|
307
|
+
|
|
308
|
+
/**
|
|
309
|
+
* Informational function to get the total size of all data in the
|
|
310
|
+
* buffers. This traverses all blocks, so call this for debugging only.
|
|
311
|
+
*/
|
|
312
|
+
nb_SIZE
|
|
313
|
+
netbuf_get_size(const nb_MGR *mgr);
|
|
314
|
+
|
|
315
|
+
/**
|
|
316
|
+
* Get the maximum size of a span which can be satisfied without using an
|
|
317
|
+
* additional block.
|
|
318
|
+
*
|
|
319
|
+
* @param mgr
|
|
320
|
+
*
|
|
321
|
+
* @param allow_wrap
|
|
322
|
+
* Whether to take into consideration wrapping. If this is true then the span
|
|
323
|
+
* size will allow wrapping. If disabled, then only the packed size will be
|
|
324
|
+
* available. Consider:
|
|
325
|
+
* <pre>
|
|
326
|
+
* [ ooooooo{S:10}xxxxxxxxx{C:10}ooooo{A:5} ]
|
|
327
|
+
* </pre>
|
|
328
|
+
* If wrapping is allowed, then the maximum span size will be 10, from 0..10
|
|
329
|
+
* but the last 5 bytes at the end will be lost for the duration of the block.
|
|
330
|
+
* If wrapping is not allowed then the maximum span size will be 5.
|
|
331
|
+
*
|
|
332
|
+
* @return
|
|
333
|
+
* the maximum span size without requiring additional blocks.
|
|
334
|
+
*/
|
|
335
|
+
nb_SIZE
|
|
336
|
+
netbuf_mblock_get_next_size(const nb_MGR *mgr, int allow_wrap);
|
|
337
|
+
|
|
338
|
+
/**
|
|
339
|
+
* @brief Initializes an nb_MGR structure
|
|
340
|
+
* @param mgr the manager to initialize
|
|
341
|
+
* @param settings
|
|
342
|
+
*/
|
|
343
|
+
void
|
|
344
|
+
netbuf_init(nb_MGR *mgr, const nb_SETTINGS *settings);
|
|
345
|
+
|
|
346
|
+
/**
|
|
347
|
+
* @brief Frees up any allocated resources for a given manager
|
|
348
|
+
* @param mgr the manager for which to release resources
|
|
349
|
+
*/
|
|
350
|
+
void
|
|
351
|
+
netbuf_cleanup(nb_MGR *mgr);
|
|
352
|
+
|
|
353
|
+
/**
|
|
354
|
+
* Populates the settings structure with the default settings. This structure
|
|
355
|
+
* may then be modified or tuned and passed to netbuf_init()
|
|
356
|
+
*/
|
|
357
|
+
void
|
|
358
|
+
netbuf_default_settings(nb_SETTINGS *settings);
|
|
359
|
+
|
|
360
|
+
/**
|
|
361
|
+
* Dump the internal structure of the manager to the screen. Useful for
|
|
362
|
+
* debugging.
|
|
363
|
+
*/
|
|
364
|
+
void
|
|
365
|
+
netbuf_dump_status(nb_MGR *mgr, FILE *fp);
|
|
366
|
+
|
|
367
|
+
|
|
368
|
+
/**
|
|
369
|
+
* Mark a PDU as being enqueued. This should be called whenever the final IOV
|
|
370
|
+
* for a given PDU has just been enqueued.
|
|
371
|
+
*
|
|
372
|
+
* The PDU itself must remain valid and is assumed to contain an 'slnode'
|
|
373
|
+
* structure which will point to the next PDU. The PDU will later be removed
|
|
374
|
+
* from the queue when 'end_flush' has been called including its range.
|
|
375
|
+
*
|
|
376
|
+
* @param mgr The manager
|
|
377
|
+
*
|
|
378
|
+
* @param pdu An opaque pointer
|
|
379
|
+
*
|
|
380
|
+
* @param lloff The offset from the pdu pointer at which the slist_node
|
|
381
|
+
* structure may be found.
|
|
382
|
+
*/
|
|
383
|
+
void
|
|
384
|
+
netbuf_pdu_enqueue(nb_MGR *mgr, void *pdu, nb_SIZE lloff);
|
|
385
|
+
|
|
386
|
+
|
|
387
|
+
/**
|
|
388
|
+
* This callback is invoked during 'end_flush2'.
|
|
389
|
+
*
|
|
390
|
+
* @param pdu The PDU pointer enqueued via netbuf_pdu_enqueue()
|
|
391
|
+
*
|
|
392
|
+
* @param remaining A hint passed to the callback indicating how many bytes
|
|
393
|
+
* remain on the stream. IFF remaining is greater than the size of the
|
|
394
|
+
* PDU the callback may change internal state within the packet to mark
|
|
395
|
+
* it as flushed.
|
|
396
|
+
*
|
|
397
|
+
* XXX:
|
|
398
|
+
* If nremaining < pdusize then it <b>must</b> be ignored. The value
|
|
399
|
+
* may have been previously passed to the same callback during a
|
|
400
|
+
* prior iteration.
|
|
401
|
+
*
|
|
402
|
+
* This is done by design in order to avoid forcing each PDU to maintain
|
|
403
|
+
* a variable indicating "How much was flushed".
|
|
404
|
+
*
|
|
405
|
+
* @param arg A pointer passed to the start_flush call; used to correlate any
|
|
406
|
+
* data common to the queue itself.
|
|
407
|
+
*
|
|
408
|
+
* @return The size of the PDU. This will be used to determine future calls
|
|
409
|
+
* to the callback for subsequent PDUs.
|
|
410
|
+
*
|
|
411
|
+
* If size <= remaining then this PDU will be popped off the PDU queue
|
|
412
|
+
* and is deemed to be no longer utilized by the send queue (and may
|
|
413
|
+
* be released from the mblock allocator; if it's being used).
|
|
414
|
+
*
|
|
415
|
+
* If size > remaining then no further callbacks will be invoked on
|
|
416
|
+
* the relevant PDUs.
|
|
417
|
+
*/
|
|
418
|
+
typedef nb_SIZE (*nb_getsize_fn)(void *pdu, nb_SIZE remaining, void *arg);
|
|
419
|
+
|
|
420
|
+
void
|
|
421
|
+
netbuf_end_flush2(nb_MGR *mgr,
|
|
422
|
+
unsigned int nflushed,
|
|
423
|
+
nb_getsize_fn callback,
|
|
424
|
+
nb_SIZE lloff, void *arg);
|
|
425
|
+
|
|
426
|
+
|
|
427
|
+
/**
|
|
428
|
+
* Ensures that the given internal structures of the manager are not allocated
|
|
429
|
+
* or otherwise in use by other systems. This is useful for testing to ensure
|
|
430
|
+
* that we wouldn't accidentally think everything is OK.
|
|
431
|
+
*
|
|
432
|
+
* Because resources are released at the block level, we might have had blocks
|
|
433
|
+
* which were partially allocated.
|
|
434
|
+
*
|
|
435
|
+
* This also checks the PDU and send queues as well.
|
|
436
|
+
*/
|
|
437
|
+
int
|
|
438
|
+
netbuf_is_clean(nb_MGR *mgr);
|
|
439
|
+
|
|
440
|
+
/**
|
|
441
|
+
* Determines if there is any data to be flushed to the network
|
|
442
|
+
*/
|
|
443
|
+
int
|
|
444
|
+
netbuf_has_flushdata(nb_MGR *mgr);
|
|
445
|
+
|
|
446
|
+
/**@}*/
|
|
447
|
+
|
|
448
|
+
#ifdef __cplusplus
|
|
449
|
+
}
|
|
450
|
+
#endif
|
|
451
|
+
|
|
452
|
+
#endif /* LCB_PACKET_H */
|
|
@@ -0,0 +1,385 @@
|
|
|
1
|
+
/* -*- Mode: C; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */
|
|
2
|
+
/*
|
|
3
|
+
* Copyright 2011-2013 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 "packetutils.h"
|
|
20
|
+
#include "bucketconfig/clconfig.h"
|
|
21
|
+
#include "vbucket/aliases.h"
|
|
22
|
+
#include "sllist-inl.h"
|
|
23
|
+
|
|
24
|
+
#define LOGARGS(instance, lvl) (instance)->settings, "newconfig", LCB_LOG_##lvl, __FILE__, __LINE__
|
|
25
|
+
#define LOG(instance, lvlbase, msg) lcb_log(instance->settings, "newconfig", LCB_LOG_##lvlbase, __FILE__, __LINE__, msg)
|
|
26
|
+
|
|
27
|
+
#define SERVER_FMT "%s:%s (%p)"
|
|
28
|
+
#define SERVER_ARGS(s) (s)->curhost->host, (s)->curhost->port, (void *)s
|
|
29
|
+
|
|
30
|
+
typedef struct lcb_GUESSVB_st {
|
|
31
|
+
time_t last_update; /**< Last time this vBucket was heuristically set */
|
|
32
|
+
char newix; /**< New index, heuristically determined */
|
|
33
|
+
char oldix; /**< Original index, according to map */
|
|
34
|
+
char used; /**< Flag indicating whether or not this entry has been used */
|
|
35
|
+
} lcb_GUESSVB;
|
|
36
|
+
|
|
37
|
+
/* Ignore configuration updates for heuristically guessed vBuckets for a
|
|
38
|
+
* maximum amount of [n] seconds */
|
|
39
|
+
#define MAX_KEEP_GUESS 20
|
|
40
|
+
|
|
41
|
+
static int
|
|
42
|
+
should_keep_guess(lcb_GUESSVB *guess, lcbvb_VBUCKET *vb)
|
|
43
|
+
{
|
|
44
|
+
if (guess->newix == guess->oldix) {
|
|
45
|
+
/* Heuristic position is the same as starting position */
|
|
46
|
+
return 0;
|
|
47
|
+
}
|
|
48
|
+
if (vb->servers[0] != guess->oldix) {
|
|
49
|
+
/* Previous master changed */
|
|
50
|
+
return 0;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
if (time(NULL) - guess->last_update > MAX_KEEP_GUESS) {
|
|
54
|
+
/* Last usage too old */
|
|
55
|
+
return 0;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
return 1;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
void
|
|
62
|
+
lcb_vbguess_newconfig(lcb_t instance, lcbvb_CONFIG *cfg, lcb_GUESSVB *guesses)
|
|
63
|
+
{
|
|
64
|
+
unsigned ii;
|
|
65
|
+
|
|
66
|
+
if (!guesses) {
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
for (ii = 0; ii < cfg->nvb; ii++) {
|
|
71
|
+
lcb_GUESSVB *guess = guesses + ii;
|
|
72
|
+
lcbvb_VBUCKET *vb = cfg->vbuckets + ii;
|
|
73
|
+
|
|
74
|
+
if (!guess->used) {
|
|
75
|
+
continue;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/* IF: Heuristically learned a new index, _and_ the old index (which is
|
|
79
|
+
* known to be bad) is the same index stated by the new config */
|
|
80
|
+
if (should_keep_guess(guess, vb)) {
|
|
81
|
+
lcb_log(LOGARGS(instance, TRACE), "Keeping heuristically guessed index. VBID=%d. Current=%d. Old=%d.", ii, guess->newix, guess->oldix);
|
|
82
|
+
vb->servers[0] = guess->newix;
|
|
83
|
+
} else {
|
|
84
|
+
/* We don't reassign to the guess structure here. The idea is that
|
|
85
|
+
* we will simply use the new config. If this gives us problems, the
|
|
86
|
+
* config will re-learn again. */
|
|
87
|
+
lcb_log(LOGARGS(instance, TRACE), "Ignoring heuristically guessed index. VBID=%d. Current=%d. Old=%d. New=%d", ii, guess->newix, guess->oldix, vb->servers[0]);
|
|
88
|
+
guess->used = 0;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
int
|
|
94
|
+
lcb_vbguess_remap(lcb_t instance, int vbid, int bad)
|
|
95
|
+
{
|
|
96
|
+
|
|
97
|
+
if (LCBT_SETTING(instance, vb_noguess)) {
|
|
98
|
+
int newix = lcbvb_nmv_remap_ex(LCBT_VBCONFIG(instance), vbid, bad, 0);
|
|
99
|
+
if (newix > -1 && newix != bad) {
|
|
100
|
+
lcb_log(LOGARGS(instance, TRACE), "Got new index from ffmap. VBID=%d. Old=%d. New=%d", vbid, bad, newix);
|
|
101
|
+
}
|
|
102
|
+
return newix;
|
|
103
|
+
|
|
104
|
+
} else {
|
|
105
|
+
lcb_GUESSVB *guesses = instance->vbguess;
|
|
106
|
+
lcb_GUESSVB *guess = guesses + vbid;
|
|
107
|
+
int newix = lcbvb_nmv_remap_ex(LCBT_VBCONFIG(instance), vbid, bad, 1);
|
|
108
|
+
if (!guesses) {
|
|
109
|
+
guesses = instance->vbguess = calloc(
|
|
110
|
+
LCBT_VBCONFIG(instance)->nvb, sizeof *guesses);
|
|
111
|
+
}
|
|
112
|
+
if (newix > -1 && newix != bad) {
|
|
113
|
+
guess->newix = newix;
|
|
114
|
+
guess->oldix = bad;
|
|
115
|
+
guess->used = 1;
|
|
116
|
+
guess->last_update = time(NULL);
|
|
117
|
+
lcb_log(LOGARGS(instance, TRACE), "Guessed new heuristic index VBID=%d. Old=%d. New=%d", vbid, bad, newix);
|
|
118
|
+
}
|
|
119
|
+
return newix;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
/**
|
|
124
|
+
* Finds the index of an older server using the current config.
|
|
125
|
+
*
|
|
126
|
+
* This function is used to help reuse the server structures for memcached
|
|
127
|
+
* packets.
|
|
128
|
+
*
|
|
129
|
+
* @param oldconfig The old configuration. This is the configuration the
|
|
130
|
+
* old server is bound to
|
|
131
|
+
* @param newconfig The new configuration. This will be inspected for new
|
|
132
|
+
* nodes which may have been added, and ones which may have been removed.
|
|
133
|
+
* @param server The server to match
|
|
134
|
+
* @return The new index, or -1 if the current server is not present in the new
|
|
135
|
+
* config.
|
|
136
|
+
*/
|
|
137
|
+
static int
|
|
138
|
+
find_new_data_index(lcbvb_CONFIG *oldconfig, lcbvb_CONFIG* newconfig,
|
|
139
|
+
mc_SERVER *server)
|
|
140
|
+
{
|
|
141
|
+
size_t ii;
|
|
142
|
+
const char *old_datahost = lcbvb_get_hostport(oldconfig,
|
|
143
|
+
server->pipeline.index, LCBVB_SVCTYPE_DATA, LCBVB_SVCMODE_PLAIN);
|
|
144
|
+
|
|
145
|
+
if (!old_datahost) {
|
|
146
|
+
/* Old server had no data service */
|
|
147
|
+
return -1;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
for (ii = 0; ii < LCBVB_NSERVERS(newconfig); ii++) {
|
|
151
|
+
const char *new_datahost = lcbvb_get_hostport(newconfig, ii,
|
|
152
|
+
LCBVB_SVCTYPE_DATA, LCBVB_SVCMODE_PLAIN);
|
|
153
|
+
if (new_datahost && strcmp(new_datahost, old_datahost) == 0) {
|
|
154
|
+
return ii;
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
return -1;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
static void
|
|
161
|
+
log_vbdiff(lcb_t instance, lcbvb_CONFIGDIFF *diff)
|
|
162
|
+
{
|
|
163
|
+
char **curserver;
|
|
164
|
+
lcb_log(LOGARGS(instance, INFO), "Config Diff: [ vBuckets Modified=%d ], [Sequence Changed=%d]", diff->n_vb_changes, diff->sequence_changed);
|
|
165
|
+
if (diff->servers_added) {
|
|
166
|
+
for (curserver = diff->servers_added; *curserver; curserver++) {
|
|
167
|
+
lcb_log(LOGARGS(instance, INFO), "Detected server %s added", *curserver);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
if (diff->servers_removed) {
|
|
171
|
+
for (curserver = diff->servers_removed; *curserver; curserver++) {
|
|
172
|
+
lcb_log(LOGARGS(instance, INFO), "Detected server %s removed", *curserver);
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
/**
|
|
178
|
+
* This callback is invoked for packet relocation twice. It tries to relocate
|
|
179
|
+
* commands to their destination server. Some commands may not be relocated
|
|
180
|
+
* either because they have no explicit "Relocation Information" (i.e. no
|
|
181
|
+
* specific vbucket) or because the command is tied to a specific server (i.e.
|
|
182
|
+
* CMD_STAT).
|
|
183
|
+
*
|
|
184
|
+
* Note that `KEEP_PACKET` here doesn't mean to "Save" the packet, but rather
|
|
185
|
+
* to keep the packet in the current queue (so that if the server ends up
|
|
186
|
+
* being removed, the command will fail); rather than being relocated to
|
|
187
|
+
* another server.
|
|
188
|
+
*/
|
|
189
|
+
static int
|
|
190
|
+
iterwipe_cb(mc_CMDQUEUE *cq, mc_PIPELINE *oldpl, mc_PACKET *oldpkt, void *arg)
|
|
191
|
+
{
|
|
192
|
+
protocol_binary_request_header hdr;
|
|
193
|
+
mc_SERVER *srv = (mc_SERVER *)oldpl;
|
|
194
|
+
mc_PIPELINE *newpl;
|
|
195
|
+
mc_PACKET *newpkt;
|
|
196
|
+
int newix;
|
|
197
|
+
|
|
198
|
+
(void)arg;
|
|
199
|
+
|
|
200
|
+
mcreq_read_hdr(oldpkt, &hdr);
|
|
201
|
+
|
|
202
|
+
if (!lcb_should_retry(srv->settings, oldpkt, LCB_MAX_ERROR)) {
|
|
203
|
+
return MCREQ_KEEP_PACKET;
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
if (LCBVB_DISTTYPE(cq->config) == LCBVB_DIST_VBUCKET) {
|
|
207
|
+
newix = lcbvb_vbmaster(cq->config, ntohs(hdr.request.vbucket));
|
|
208
|
+
|
|
209
|
+
} else {
|
|
210
|
+
const void *key = NULL;
|
|
211
|
+
lcb_SIZE nkey = 0;
|
|
212
|
+
int tmpid;
|
|
213
|
+
|
|
214
|
+
/* XXX: We ignore hashkey. This is going away soon, and is probably
|
|
215
|
+
* better than simply failing the items. */
|
|
216
|
+
mcreq_get_key(oldpkt, &key, &nkey);
|
|
217
|
+
lcbvb_map_key(cq->config, key, nkey, &tmpid, &newix);
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
if (newix < 0 || newix > (int)cq->npipelines-1) {
|
|
221
|
+
return MCREQ_KEEP_PACKET;
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
|
|
225
|
+
newpl = cq->pipelines[newix];
|
|
226
|
+
if (newpl == oldpl || newpl == NULL) {
|
|
227
|
+
return MCREQ_KEEP_PACKET;
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
lcb_log(LOGARGS((lcb_t)cq->cqdata, DEBUG), "Remapped packet %p (SEQ=%u) from "SERVER_FMT " to " SERVER_FMT,
|
|
231
|
+
(void*)oldpkt, oldpkt->opaque, SERVER_ARGS((mc_SERVER*)oldpl), SERVER_ARGS((mc_SERVER*)newpl));
|
|
232
|
+
|
|
233
|
+
/** Otherwise, copy over the packet and find the new vBucket to map to */
|
|
234
|
+
newpkt = mcreq_renew_packet(oldpkt);
|
|
235
|
+
newpkt->flags &= ~MCREQ_STATE_FLAGS;
|
|
236
|
+
mcreq_reenqueue_packet(newpl, newpkt);
|
|
237
|
+
mcreq_packet_handled(oldpl, oldpkt);
|
|
238
|
+
return MCREQ_REMOVE_PACKET;
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
static int
|
|
242
|
+
replace_config(lcb_t instance, lcbvb_CONFIG *oldconfig, lcbvb_CONFIG *newconfig)
|
|
243
|
+
{
|
|
244
|
+
mc_CMDQUEUE *cq = &instance->cmdq;
|
|
245
|
+
mc_PIPELINE **ppold, **ppnew;
|
|
246
|
+
unsigned ii, nold, nnew;
|
|
247
|
+
|
|
248
|
+
assert(LCBT_VBCONFIG(instance) == newconfig);
|
|
249
|
+
|
|
250
|
+
nnew = LCBVB_NSERVERS(newconfig);
|
|
251
|
+
ppnew = calloc(nnew, sizeof(*ppnew));
|
|
252
|
+
ppold = mcreq_queue_take_pipelines(cq, &nold);
|
|
253
|
+
|
|
254
|
+
/**
|
|
255
|
+
* Determine which existing servers are still part of the new cluster config
|
|
256
|
+
* and place it inside the new list.
|
|
257
|
+
*/
|
|
258
|
+
for (ii = 0; ii < nold; ii++) {
|
|
259
|
+
mc_SERVER *cur = (mc_SERVER *)ppold[ii];
|
|
260
|
+
int newix = find_new_data_index(oldconfig, newconfig, cur);
|
|
261
|
+
if (newix > -1) {
|
|
262
|
+
cur->pipeline.index = newix;
|
|
263
|
+
ppnew[newix] = &cur->pipeline;
|
|
264
|
+
ppold[ii] = NULL;
|
|
265
|
+
lcb_log(LOGARGS(instance, INFO), "Reusing server "SERVER_FMT". OldIndex=%d. NewIndex=%d", SERVER_ARGS(cur), ii, newix);
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
/**
|
|
270
|
+
* Once we've moved the kept servers to the new list, allocate new mc_SERVER
|
|
271
|
+
* structures for slots that don't have an existing mc_SERVER. We must do
|
|
272
|
+
* this before add_pipelines() is called, so that there are no holes inside
|
|
273
|
+
* ppnew
|
|
274
|
+
*/
|
|
275
|
+
for (ii = 0; ii < nnew; ii++) {
|
|
276
|
+
if (!ppnew[ii]) {
|
|
277
|
+
ppnew[ii] = (mc_PIPELINE *)mcserver_alloc(instance, ii);
|
|
278
|
+
ppnew[ii]->index = ii;
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
/**
|
|
283
|
+
* Once we have all the server structures in place for the new config,
|
|
284
|
+
* transfer the new config along with the new list over to the CQ structure.
|
|
285
|
+
*/
|
|
286
|
+
mcreq_queue_add_pipelines(cq, ppnew, nnew, newconfig);
|
|
287
|
+
for (ii = 0; ii < nnew; ii++) {
|
|
288
|
+
mcreq_iterwipe(cq, ppnew[ii], iterwipe_cb, NULL);
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
/**
|
|
292
|
+
* Go through all the servers that are to be removed and relocate commands
|
|
293
|
+
* from their queues into the new queues
|
|
294
|
+
*/
|
|
295
|
+
for (ii = 0; ii < nold; ii++) {
|
|
296
|
+
if (!ppold[ii]) {
|
|
297
|
+
continue;
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
mcreq_iterwipe(cq, ppold[ii], iterwipe_cb, NULL);
|
|
301
|
+
mcserver_fail_chain((mc_SERVER *)ppold[ii], LCB_MAP_CHANGED);
|
|
302
|
+
mcserver_close((mc_SERVER *)ppold[ii]);
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
for (ii = 0; ii < nnew; ii++) {
|
|
306
|
+
if (mcserver_has_pending((mc_SERVER*)ppnew[ii])) {
|
|
307
|
+
ppnew[ii]->flush_start(ppnew[ii]);
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
free(ppnew);
|
|
312
|
+
free(ppold);
|
|
313
|
+
return LCB_CONFIGURATION_CHANGED;
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
void lcb_update_vbconfig(lcb_t instance, clconfig_info *config)
|
|
317
|
+
{
|
|
318
|
+
lcb_size_t ii;
|
|
319
|
+
int change_status;
|
|
320
|
+
clconfig_info *old_config;
|
|
321
|
+
mc_CMDQUEUE *q = &instance->cmdq;
|
|
322
|
+
|
|
323
|
+
old_config = instance->cur_configinfo;
|
|
324
|
+
instance->cur_configinfo = config;
|
|
325
|
+
lcb_clconfig_incref(config);
|
|
326
|
+
q->config = instance->cur_configinfo->vbc;
|
|
327
|
+
q->cqdata = instance;
|
|
328
|
+
|
|
329
|
+
if (old_config) {
|
|
330
|
+
lcbvb_CONFIGDIFF *diff = lcbvb_compare(old_config->vbc, config->vbc);
|
|
331
|
+
|
|
332
|
+
if (diff) {
|
|
333
|
+
log_vbdiff(instance, diff);
|
|
334
|
+
lcbvb_free_diff(diff);
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
/* Apply the vb guesses */
|
|
338
|
+
lcb_vbguess_newconfig(instance, config->vbc, instance->vbguess);
|
|
339
|
+
|
|
340
|
+
change_status = replace_config(instance, old_config->vbc, config->vbc);
|
|
341
|
+
if (change_status == -1) {
|
|
342
|
+
LOG(instance, ERR, "Couldn't replace config");
|
|
343
|
+
return;
|
|
344
|
+
}
|
|
345
|
+
lcb_clconfig_decref(old_config);
|
|
346
|
+
} else {
|
|
347
|
+
unsigned nservers;
|
|
348
|
+
mc_PIPELINE **servers;
|
|
349
|
+
nservers = VB_NSERVERS(config->vbc);
|
|
350
|
+
if ((servers = malloc(sizeof(*servers) * nservers)) == NULL) {
|
|
351
|
+
assert(servers);
|
|
352
|
+
lcb_log(LOGARGS(instance, FATAL), "Couldn't allocate memory for new server list! (n=%u)", nservers);
|
|
353
|
+
return;
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
for (ii = 0; ii < nservers; ii++) {
|
|
357
|
+
mc_SERVER *srv;
|
|
358
|
+
if ((srv = mcserver_alloc(instance, ii)) == NULL) {
|
|
359
|
+
assert(srv);
|
|
360
|
+
lcb_log(LOGARGS(instance, FATAL), "Couldn't allocate memory for server instance!");
|
|
361
|
+
return;
|
|
362
|
+
}
|
|
363
|
+
servers[ii] = &srv->pipeline;
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
mcreq_queue_add_pipelines(q, servers, nservers, config->vbc);
|
|
367
|
+
change_status = LCB_CONFIGURATION_NEW;
|
|
368
|
+
free(servers);
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
/* Update the list of nodes here for server list */
|
|
372
|
+
hostlist_clear(instance->ht_nodes);
|
|
373
|
+
for (ii = 0; ii < LCBVB_NSERVERS(config->vbc); ++ii) {
|
|
374
|
+
const char *hp = lcbvb_get_hostport(config->vbc, ii,
|
|
375
|
+
LCBVB_SVCTYPE_MGMT, LCBVB_SVCMODE_PLAIN);
|
|
376
|
+
if (hp) {
|
|
377
|
+
hostlist_add_stringz(instance->ht_nodes, hp, LCB_CONFIG_HTTP_PORT);
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
|
|
381
|
+
instance->callbacks.configuration(instance, change_status);
|
|
382
|
+
lcb_maybe_breakout(instance);
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
|