couchbase-memcached 1.2.8
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.
- data.tar.gz.sig +2 -0
- data/BENCHMARKS +134 -0
- data/CHANGELOG +127 -0
- data/LICENSE +184 -0
- data/Manifest +535 -0
- data/README +118 -0
- data/Rakefile +83 -0
- data/TODO +4 -0
- data/couchbase-memcached.gemspec +33 -0
- data/ext/extconf-make.rb +25 -0
- data/ext/extconf.rb +91 -0
- data/ext/libmemcached-0.50/AUTHORS +11 -0
- data/ext/libmemcached-0.50/COPYING +33 -0
- data/ext/libmemcached-0.50/ChangeLog +392 -0
- data/ext/libmemcached-0.50/Makefile.am +114 -0
- data/ext/libmemcached-0.50/Makefile.in +4232 -0
- data/ext/libmemcached-0.50/NEWS +1 -0
- data/ext/libmemcached-0.50/README +43 -0
- data/ext/libmemcached-0.50/README.FIRST +31 -0
- data/ext/libmemcached-0.50/README.win32 +25 -0
- data/ext/libmemcached-0.50/THANKS +14 -0
- data/ext/libmemcached-0.50/TODO +11 -0
- data/ext/libmemcached-0.50/aclocal.m4 +1077 -0
- data/ext/libmemcached-0.50/clients/client_options.h +45 -0
- data/ext/libmemcached-0.50/clients/execute.cc +131 -0
- data/ext/libmemcached-0.50/clients/execute.h +30 -0
- data/ext/libmemcached-0.50/clients/generator.cc +96 -0
- data/ext/libmemcached-0.50/clients/generator.h +36 -0
- data/ext/libmemcached-0.50/clients/include.am +116 -0
- data/ext/libmemcached-0.50/clients/memaslap.c +908 -0
- data/ext/libmemcached-0.50/clients/memcapable.cc +2094 -0
- data/ext/libmemcached-0.50/clients/memcat.cc +242 -0
- data/ext/libmemcached-0.50/clients/memcp.cc +317 -0
- data/ext/libmemcached-0.50/clients/memdump.cc +183 -0
- data/ext/libmemcached-0.50/clients/memerror.cc +102 -0
- data/ext/libmemcached-0.50/clients/memflush.cc +154 -0
- data/ext/libmemcached-0.50/clients/memparse.cc +68 -0
- data/ext/libmemcached-0.50/clients/memrm.cc +177 -0
- data/ext/libmemcached-0.50/clients/memslap.cc +495 -0
- data/ext/libmemcached-0.50/clients/memstat.cc +349 -0
- data/ext/libmemcached-0.50/clients/ms_atomic.h +69 -0
- data/ext/libmemcached-0.50/clients/ms_conn.c +3413 -0
- data/ext/libmemcached-0.50/clients/ms_conn.h +241 -0
- data/ext/libmemcached-0.50/clients/ms_memslap.h +132 -0
- data/ext/libmemcached-0.50/clients/ms_setting.c +1068 -0
- data/ext/libmemcached-0.50/clients/ms_setting.h +181 -0
- data/ext/libmemcached-0.50/clients/ms_sigsegv.c +126 -0
- data/ext/libmemcached-0.50/clients/ms_sigsegv.h +34 -0
- data/ext/libmemcached-0.50/clients/ms_stats.c +307 -0
- data/ext/libmemcached-0.50/clients/ms_stats.h +69 -0
- data/ext/libmemcached-0.50/clients/ms_task.c +1114 -0
- data/ext/libmemcached-0.50/clients/ms_task.h +94 -0
- data/ext/libmemcached-0.50/clients/ms_thread.c +351 -0
- data/ext/libmemcached-0.50/clients/ms_thread.h +78 -0
- data/ext/libmemcached-0.50/clients/utilities.cc +231 -0
- data/ext/libmemcached-0.50/clients/utilities.h +64 -0
- data/ext/libmemcached-0.50/config.h.in +647 -0
- data/ext/libmemcached-0.50/config/autorun.sh +126 -0
- data/ext/libmemcached-0.50/config/compile +143 -0
- data/ext/libmemcached-0.50/config/config.guess +1517 -0
- data/ext/libmemcached-0.50/config/config.rpath +666 -0
- data/ext/libmemcached-0.50/config/config.sub +1760 -0
- data/ext/libmemcached-0.50/config/depcomp +630 -0
- data/ext/libmemcached-0.50/config/install-sh +520 -0
- data/ext/libmemcached-0.50/config/ltmain.sh +9642 -0
- data/ext/libmemcached-0.50/config/missing +376 -0
- data/ext/libmemcached-0.50/config/pandora-plugin +752 -0
- data/ext/libmemcached-0.50/config/uncrustify.cfg +1112 -0
- data/ext/libmemcached-0.50/configure +27103 -0
- data/ext/libmemcached-0.50/configure.ac +186 -0
- data/ext/libmemcached-0.50/docs/conf.py.in +354 -0
- data/ext/libmemcached-0.50/docs/include.am +240 -0
- data/ext/libmemcached-0.50/docs/man/hashkit_clone.3 +88 -0
- data/ext/libmemcached-0.50/docs/man/hashkit_crc32.3 +105 -0
- data/ext/libmemcached-0.50/docs/man/hashkit_create.3 +88 -0
- data/ext/libmemcached-0.50/docs/man/hashkit_fnv1_32.3 +105 -0
- data/ext/libmemcached-0.50/docs/man/hashkit_fnv1_64.3 +105 -0
- data/ext/libmemcached-0.50/docs/man/hashkit_fnv1a_32.3 +105 -0
- data/ext/libmemcached-0.50/docs/man/hashkit_fnv1a_64.3 +105 -0
- data/ext/libmemcached-0.50/docs/man/hashkit_free.3 +88 -0
- data/ext/libmemcached-0.50/docs/man/hashkit_functions.3 +105 -0
- data/ext/libmemcached-0.50/docs/man/hashkit_hsieh.3 +105 -0
- data/ext/libmemcached-0.50/docs/man/hashkit_is_allocated.3 +88 -0
- data/ext/libmemcached-0.50/docs/man/hashkit_jenkins.3 +105 -0
- data/ext/libmemcached-0.50/docs/man/hashkit_md5.3 +105 -0
- data/ext/libmemcached-0.50/docs/man/hashkit_murmur.3 +105 -0
- data/ext/libmemcached-0.50/docs/man/hashkit_value.3 +66 -0
- data/ext/libmemcached-0.50/docs/man/libhashkit.3 +57 -0
- data/ext/libmemcached-0.50/docs/man/libmemcached.3 +208 -0
- data/ext/libmemcached-0.50/docs/man/libmemcached_check_configuration.3 +293 -0
- data/ext/libmemcached-0.50/docs/man/libmemcached_configuration.3 +293 -0
- data/ext/libmemcached-0.50/docs/man/libmemcached_examples.3 +144 -0
- data/ext/libmemcached-0.50/docs/man/libmemcachedutil.3 +68 -0
- data/ext/libmemcached-0.50/docs/man/memaslap.1 +1222 -0
- data/ext/libmemcached-0.50/docs/man/memcached.3 +293 -0
- data/ext/libmemcached-0.50/docs/man/memcached_add.3 +132 -0
- data/ext/libmemcached-0.50/docs/man/memcached_add_by_key.3 +132 -0
- data/ext/libmemcached-0.50/docs/man/memcached_analyze.3 +77 -0
- data/ext/libmemcached-0.50/docs/man/memcached_append.3 +111 -0
- data/ext/libmemcached-0.50/docs/man/memcached_append_by_key.3 +111 -0
- data/ext/libmemcached-0.50/docs/man/memcached_behavior_get.3 +333 -0
- data/ext/libmemcached-0.50/docs/man/memcached_behavior_set.3 +333 -0
- data/ext/libmemcached-0.50/docs/man/memcached_callback_get.3 +159 -0
- data/ext/libmemcached-0.50/docs/man/memcached_callback_set.3 +159 -0
- data/ext/libmemcached-0.50/docs/man/memcached_cas.3 +91 -0
- data/ext/libmemcached-0.50/docs/man/memcached_cas_by_key.3 +91 -0
- data/ext/libmemcached-0.50/docs/man/memcached_clone.3 +99 -0
- data/ext/libmemcached-0.50/docs/man/memcached_create.3 +99 -0
- data/ext/libmemcached-0.50/docs/man/memcached_decrement.3 +124 -0
- data/ext/libmemcached-0.50/docs/man/memcached_decrement_with_initial.3 +124 -0
- data/ext/libmemcached-0.50/docs/man/memcached_delete.3 +83 -0
- data/ext/libmemcached-0.50/docs/man/memcached_delete_by_key.3 +83 -0
- data/ext/libmemcached-0.50/docs/man/memcached_destroy_sasl_auth_data.3 +95 -0
- data/ext/libmemcached-0.50/docs/man/memcached_dump.3 +77 -0
- data/ext/libmemcached-0.50/docs/man/memcached_fetch.3 +174 -0
- data/ext/libmemcached-0.50/docs/man/memcached_fetch_execute.3 +174 -0
- data/ext/libmemcached-0.50/docs/man/memcached_fetch_result.3 +174 -0
- data/ext/libmemcached-0.50/docs/man/memcached_flush_buffers.3 +72 -0
- data/ext/libmemcached-0.50/docs/man/memcached_free.3 +99 -0
- data/ext/libmemcached-0.50/docs/man/memcached_generate_hash.3 +85 -0
- data/ext/libmemcached-0.50/docs/man/memcached_generate_hash_value.3 +85 -0
- data/ext/libmemcached-0.50/docs/man/memcached_get.3 +174 -0
- data/ext/libmemcached-0.50/docs/man/memcached_get_by_key.3 +174 -0
- data/ext/libmemcached-0.50/docs/man/memcached_get_memory_allocators.3 +111 -0
- data/ext/libmemcached-0.50/docs/man/memcached_get_sasl_callbacks.3 +95 -0
- data/ext/libmemcached-0.50/docs/man/memcached_get_user_data.3 +79 -0
- data/ext/libmemcached-0.50/docs/man/memcached_increment.3 +124 -0
- data/ext/libmemcached-0.50/docs/man/memcached_increment_with_initial.3 +124 -0
- data/ext/libmemcached-0.50/docs/man/memcached_lib_version.3 +76 -0
- data/ext/libmemcached-0.50/docs/man/memcached_mget.3 +174 -0
- data/ext/libmemcached-0.50/docs/man/memcached_mget_by_key.3 +174 -0
- data/ext/libmemcached-0.50/docs/man/memcached_mget_execute.3 +174 -0
- data/ext/libmemcached-0.50/docs/man/memcached_mget_execute_by_key.3 +174 -0
- data/ext/libmemcached-0.50/docs/man/memcached_pool_behavior_get.3 +139 -0
- data/ext/libmemcached-0.50/docs/man/memcached_pool_behavior_set.3 +139 -0
- data/ext/libmemcached-0.50/docs/man/memcached_pool_create.3 +139 -0
- data/ext/libmemcached-0.50/docs/man/memcached_pool_destroy.3 +139 -0
- data/ext/libmemcached-0.50/docs/man/memcached_pool_pop.3 +139 -0
- data/ext/libmemcached-0.50/docs/man/memcached_pool_push.3 +139 -0
- data/ext/libmemcached-0.50/docs/man/memcached_pool_st.3 +139 -0
- data/ext/libmemcached-0.50/docs/man/memcached_prepend.3 +111 -0
- data/ext/libmemcached-0.50/docs/man/memcached_prepend_by_key.3 +111 -0
- data/ext/libmemcached-0.50/docs/man/memcached_quit.3 +74 -0
- data/ext/libmemcached-0.50/docs/man/memcached_replace.3 +132 -0
- data/ext/libmemcached-0.50/docs/man/memcached_replace_by_key.3 +132 -0
- data/ext/libmemcached-0.50/docs/man/memcached_sasl_set_auth_data.3 +95 -0
- data/ext/libmemcached-0.50/docs/man/memcached_server_add.3 +141 -0
- data/ext/libmemcached-0.50/docs/man/memcached_server_count.3 +141 -0
- data/ext/libmemcached-0.50/docs/man/memcached_server_cursor.3 +141 -0
- data/ext/libmemcached-0.50/docs/man/memcached_server_list.3 +141 -0
- data/ext/libmemcached-0.50/docs/man/memcached_server_list_append.3 +111 -0
- data/ext/libmemcached-0.50/docs/man/memcached_server_list_count.3 +111 -0
- data/ext/libmemcached-0.50/docs/man/memcached_server_list_free.3 +111 -0
- data/ext/libmemcached-0.50/docs/man/memcached_server_push.3 +141 -0
- data/ext/libmemcached-0.50/docs/man/memcached_servers_parse.3 +111 -0
- data/ext/libmemcached-0.50/docs/man/memcached_set.3 +132 -0
- data/ext/libmemcached-0.50/docs/man/memcached_set_by_key.3 +132 -0
- data/ext/libmemcached-0.50/docs/man/memcached_set_memory_allocators.3 +111 -0
- data/ext/libmemcached-0.50/docs/man/memcached_set_sasl_callbacks.3 +95 -0
- data/ext/libmemcached-0.50/docs/man/memcached_set_user_data.3 +79 -0
- data/ext/libmemcached-0.50/docs/man/memcached_stat.3 +116 -0
- data/ext/libmemcached-0.50/docs/man/memcached_stat_execute.3 +116 -0
- data/ext/libmemcached-0.50/docs/man/memcached_stat_get_keys.3 +116 -0
- data/ext/libmemcached-0.50/docs/man/memcached_stat_get_value.3 +116 -0
- data/ext/libmemcached-0.50/docs/man/memcached_stat_servername.3 +116 -0
- data/ext/libmemcached-0.50/docs/man/memcached_strerror.3 +69 -0
- data/ext/libmemcached-0.50/docs/man/memcached_verbosity.3 +66 -0
- data/ext/libmemcached-0.50/docs/man/memcached_version.3 +76 -0
- data/ext/libmemcached-0.50/docs/man/memcapable.1 +92 -0
- data/ext/libmemcached-0.50/docs/man/memcat.1 +71 -0
- data/ext/libmemcached-0.50/docs/man/memcp.1 +77 -0
- data/ext/libmemcached-0.50/docs/man/memdump.1 +66 -0
- data/ext/libmemcached-0.50/docs/man/memerror.1 +65 -0
- data/ext/libmemcached-0.50/docs/man/memflush.1 +73 -0
- data/ext/libmemcached-0.50/docs/man/memrm.1 +72 -0
- data/ext/libmemcached-0.50/docs/man/memslap.1 +59 -0
- data/ext/libmemcached-0.50/docs/man/memstat.1 +70 -0
- data/ext/libmemcached-0.50/example/include.am +24 -0
- data/ext/libmemcached-0.50/example/interface_v0.c +594 -0
- data/ext/libmemcached-0.50/example/interface_v1.c +411 -0
- data/ext/libmemcached-0.50/example/memcached_light.c +474 -0
- data/ext/libmemcached-0.50/example/memcached_light.h +7 -0
- data/ext/libmemcached-0.50/example/storage.c +172 -0
- data/ext/libmemcached-0.50/example/storage.h +27 -0
- data/ext/libmemcached-0.50/example/storage_innodb.c +535 -0
- data/ext/libmemcached-0.50/libhashkit/algorithm.cc +69 -0
- data/ext/libmemcached-0.50/libhashkit/algorithm.h +96 -0
- data/ext/libmemcached-0.50/libhashkit/behavior.cc +9 -0
- data/ext/libmemcached-0.50/libhashkit/behavior.h +26 -0
- data/ext/libmemcached-0.50/libhashkit/common.h +33 -0
- data/ext/libmemcached-0.50/libhashkit/configure.h.in +19 -0
- data/ext/libmemcached-0.50/libhashkit/crc32.cc +86 -0
- data/ext/libmemcached-0.50/libhashkit/digest.cc +62 -0
- data/ext/libmemcached-0.50/libhashkit/digest.h +30 -0
- data/ext/libmemcached-0.50/libhashkit/fnv.cc +75 -0
- data/ext/libmemcached-0.50/libhashkit/function.cc +156 -0
- data/ext/libmemcached-0.50/libhashkit/function.h +44 -0
- data/ext/libmemcached-0.50/libhashkit/hashkit.cc +100 -0
- data/ext/libmemcached-0.50/libhashkit/hashkit.h +95 -0
- data/ext/libmemcached-0.50/libhashkit/hashkit.hpp +97 -0
- data/ext/libmemcached-0.50/libhashkit/hsieh.cc +70 -0
- data/ext/libmemcached-0.50/libhashkit/include.am +69 -0
- data/ext/libmemcached-0.50/libhashkit/jenkins.cc +214 -0
- data/ext/libmemcached-0.50/libhashkit/ketama.cc +164 -0
- data/ext/libmemcached-0.50/libhashkit/md5.cc +367 -0
- data/ext/libmemcached-0.50/libhashkit/murmur.cc +77 -0
- data/ext/libmemcached-0.50/libhashkit/one_at_a_time.cc +34 -0
- data/ext/libmemcached-0.50/libhashkit/str_algorithm.cc +58 -0
- data/ext/libmemcached-0.50/libhashkit/str_algorithm.h +48 -0
- data/ext/libmemcached-0.50/libhashkit/strerror.cc +25 -0
- data/ext/libmemcached-0.50/libhashkit/strerror.h +23 -0
- data/ext/libmemcached-0.50/libhashkit/types.h +90 -0
- data/ext/libmemcached-0.50/libhashkit/visibility.h +48 -0
- data/ext/libmemcached-0.50/libmemcached/allocators.cc +119 -0
- data/ext/libmemcached-0.50/libmemcached/allocators.h +87 -0
- data/ext/libmemcached-0.50/libmemcached/analyze.cc +110 -0
- data/ext/libmemcached-0.50/libmemcached/analyze.h +66 -0
- data/ext/libmemcached-0.50/libmemcached/array.c +128 -0
- data/ext/libmemcached-0.50/libmemcached/array.h +75 -0
- data/ext/libmemcached-0.50/libmemcached/auto.cc +383 -0
- data/ext/libmemcached-0.50/libmemcached/auto.h +111 -0
- data/ext/libmemcached-0.50/libmemcached/basic_string.h +55 -0
- data/ext/libmemcached-0.50/libmemcached/behavior.cc +590 -0
- data/ext/libmemcached-0.50/libmemcached/behavior.h +86 -0
- data/ext/libmemcached-0.50/libmemcached/byteorder.cc +90 -0
- data/ext/libmemcached-0.50/libmemcached/byteorder.h +52 -0
- data/ext/libmemcached-0.50/libmemcached/callback.cc +160 -0
- data/ext/libmemcached-0.50/libmemcached/callback.h +61 -0
- data/ext/libmemcached-0.50/libmemcached/common.h +182 -0
- data/ext/libmemcached-0.50/libmemcached/configure.h.in +52 -0
- data/ext/libmemcached-0.50/libmemcached/connect.cc +626 -0
- data/ext/libmemcached-0.50/libmemcached/constants.h +167 -0
- data/ext/libmemcached-0.50/libmemcached/delete.cc +266 -0
- data/ext/libmemcached-0.50/libmemcached/delete.h +57 -0
- data/ext/libmemcached-0.50/libmemcached/do.cc +100 -0
- data/ext/libmemcached-0.50/libmemcached/do.hpp +49 -0
- data/ext/libmemcached-0.50/libmemcached/dump.cc +107 -0
- data/ext/libmemcached-0.50/libmemcached/dump.h +51 -0
- data/ext/libmemcached-0.50/libmemcached/error.cc +419 -0
- data/ext/libmemcached-0.50/libmemcached/error.h +61 -0
- data/ext/libmemcached-0.50/libmemcached/error.hpp +87 -0
- data/ext/libmemcached-0.50/libmemcached/exception.hpp +63 -0
- data/ext/libmemcached-0.50/libmemcached/fetch.cc +267 -0
- data/ext/libmemcached-0.50/libmemcached/fetch.h +53 -0
- data/ext/libmemcached-0.50/libmemcached/flush.cc +149 -0
- data/ext/libmemcached-0.50/libmemcached/flush.h +49 -0
- data/ext/libmemcached-0.50/libmemcached/flush_buffers.cc +66 -0
- data/ext/libmemcached-0.50/libmemcached/flush_buffers.h +49 -0
- data/ext/libmemcached-0.50/libmemcached/get.cc +842 -0
- data/ext/libmemcached-0.50/libmemcached/get.h +135 -0
- data/ext/libmemcached-0.50/libmemcached/hash.cc +178 -0
- data/ext/libmemcached-0.50/libmemcached/hash.h +68 -0
- data/ext/libmemcached-0.50/libmemcached/hosts.cc +516 -0
- data/ext/libmemcached-0.50/libmemcached/include.am +183 -0
- data/ext/libmemcached-0.50/libmemcached/initialize_query.cc +70 -0
- data/ext/libmemcached-0.50/libmemcached/initialize_query.h +51 -0
- data/ext/libmemcached-0.50/libmemcached/internal.h +46 -0
- data/ext/libmemcached-0.50/libmemcached/io.cc +920 -0
- data/ext/libmemcached-0.50/libmemcached/io.h +119 -0
- data/ext/libmemcached-0.50/libmemcached/is.h +48 -0
- data/ext/libmemcached-0.50/libmemcached/key.cc +23 -0
- data/ext/libmemcached-0.50/libmemcached/libmemcached_probes.d +30 -0
- data/ext/libmemcached-0.50/libmemcached/libmemcached_probes.h +118 -0
- data/ext/libmemcached-0.50/libmemcached/memcached.cc +437 -0
- data/ext/libmemcached-0.50/libmemcached/memcached.h +214 -0
- data/ext/libmemcached-0.50/libmemcached/memcached.hpp +799 -0
- data/ext/libmemcached-0.50/libmemcached/memcached/README.txt +7 -0
- data/ext/libmemcached-0.50/libmemcached/memcached/protocol_binary.h +726 -0
- data/ext/libmemcached-0.50/libmemcached/memcached/vbucket.h +26 -0
- data/ext/libmemcached-0.50/libmemcached/memcached_util.h +44 -0
- data/ext/libmemcached-0.50/libmemcached/memory.h +79 -0
- data/ext/libmemcached-0.50/libmemcached/options.cc +178 -0
- data/ext/libmemcached-0.50/libmemcached/options.h +49 -0
- data/ext/libmemcached-0.50/libmemcached/options.hpp +56 -0
- data/ext/libmemcached-0.50/libmemcached/options/context.h +151 -0
- data/ext/libmemcached-0.50/libmemcached/options/include.am +19 -0
- data/ext/libmemcached-0.50/libmemcached/options/parser.am +0 -0
- data/ext/libmemcached-0.50/libmemcached/options/parser.cc +2324 -0
- data/ext/libmemcached-0.50/libmemcached/options/parser.h +122 -0
- data/ext/libmemcached-0.50/libmemcached/options/scanner.cc +3203 -0
- data/ext/libmemcached-0.50/libmemcached/options/scanner.h +479 -0
- data/ext/libmemcached-0.50/libmemcached/options/server.h +60 -0
- data/ext/libmemcached-0.50/libmemcached/options/symbol.h +57 -0
- data/ext/libmemcached-0.50/libmemcached/parse.cc +110 -0
- data/ext/libmemcached-0.50/libmemcached/parse.h +23 -0
- data/ext/libmemcached-0.50/libmemcached/platform.h +56 -0
- data/ext/libmemcached-0.50/libmemcached/prefix_key.cc +65 -0
- data/ext/libmemcached-0.50/libmemcached/prefix_key.h +49 -0
- data/ext/libmemcached-0.50/libmemcached/protocol/ascii_handler.c +963 -0
- data/ext/libmemcached-0.50/libmemcached/protocol/ascii_handler.h +40 -0
- data/ext/libmemcached-0.50/libmemcached/protocol/binary_handler.c +1121 -0
- data/ext/libmemcached-0.50/libmemcached/protocol/binary_handler.h +47 -0
- data/ext/libmemcached-0.50/libmemcached/protocol/cache.c +149 -0
- data/ext/libmemcached-0.50/libmemcached/protocol/cache.h +116 -0
- data/ext/libmemcached-0.50/libmemcached/protocol/callback.h +418 -0
- data/ext/libmemcached-0.50/libmemcached/protocol/common.h +163 -0
- data/ext/libmemcached-0.50/libmemcached/protocol/include.am +26 -0
- data/ext/libmemcached-0.50/libmemcached/protocol/pedantic.c +202 -0
- data/ext/libmemcached-0.50/libmemcached/protocol/protocol_handler.c +365 -0
- data/ext/libmemcached-0.50/libmemcached/protocol_handler.h +215 -0
- data/ext/libmemcached-0.50/libmemcached/purge.cc +90 -0
- data/ext/libmemcached-0.50/libmemcached/quit.cc +139 -0
- data/ext/libmemcached-0.50/libmemcached/quit.h +55 -0
- data/ext/libmemcached-0.50/libmemcached/response.cc +619 -0
- data/ext/libmemcached-0.50/libmemcached/response.h +57 -0
- data/ext/libmemcached-0.50/libmemcached/result.cc +173 -0
- data/ext/libmemcached-0.50/libmemcached/result.h +100 -0
- data/ext/libmemcached-0.50/libmemcached/return.h +98 -0
- data/ext/libmemcached-0.50/libmemcached/sasl.c +408 -0
- data/ext/libmemcached-0.50/libmemcached/sasl.h +86 -0
- data/ext/libmemcached-0.50/libmemcached/server.cc +351 -0
- data/ext/libmemcached-0.50/libmemcached/server.h +169 -0
- data/ext/libmemcached-0.50/libmemcached/server_list.cc +88 -0
- data/ext/libmemcached-0.50/libmemcached/server_list.h +77 -0
- data/ext/libmemcached-0.50/libmemcached/stats.cc +623 -0
- data/ext/libmemcached-0.50/libmemcached/stats.h +96 -0
- data/ext/libmemcached-0.50/libmemcached/storage.cc +567 -0
- data/ext/libmemcached-0.50/libmemcached/storage.h +133 -0
- data/ext/libmemcached-0.50/libmemcached/strerror.cc +189 -0
- data/ext/libmemcached-0.50/libmemcached/strerror.h +50 -0
- data/ext/libmemcached-0.50/libmemcached/string.cc +253 -0
- data/ext/libmemcached-0.50/libmemcached/string.h +121 -0
- data/ext/libmemcached-0.50/libmemcached/touch.cc +106 -0
- data/ext/libmemcached-0.50/libmemcached/touch.h +59 -0
- data/ext/libmemcached-0.50/libmemcached/types.h +117 -0
- data/ext/libmemcached-0.50/libmemcached/util.h +40 -0
- data/ext/libmemcached-0.50/libmemcached/util/flush.cc +61 -0
- data/ext/libmemcached-0.50/libmemcached/util/flush.h +50 -0
- data/ext/libmemcached-0.50/libmemcached/util/include.am +34 -0
- data/ext/libmemcached-0.50/libmemcached/util/ping.cc +62 -0
- data/ext/libmemcached-0.50/libmemcached/util/ping.h +49 -0
- data/ext/libmemcached-0.50/libmemcached/util/pool.cc +392 -0
- data/ext/libmemcached-0.50/libmemcached/util/pool.h +78 -0
- data/ext/libmemcached-0.50/libmemcached/util/version.cc +87 -0
- data/ext/libmemcached-0.50/libmemcached/util/version.h +53 -0
- data/ext/libmemcached-0.50/libmemcached/verbosity.cc +97 -0
- data/ext/libmemcached-0.50/libmemcached/verbosity.h +50 -0
- data/ext/libmemcached-0.50/libmemcached/version.cc +214 -0
- data/ext/libmemcached-0.50/libmemcached/version.h +52 -0
- data/ext/libmemcached-0.50/libmemcached/virtual_bucket.c +118 -0
- data/ext/libmemcached-0.50/libmemcached/virtual_bucket.h +59 -0
- data/ext/libmemcached-0.50/libmemcached/visibility.h +51 -0
- data/ext/libmemcached-0.50/libmemcached/watchpoint.h +110 -0
- data/ext/libmemcached-0.50/libtest/callbacks.h +21 -0
- data/ext/libmemcached-0.50/libtest/collection.h +19 -0
- data/ext/libmemcached-0.50/libtest/common.h +50 -0
- data/ext/libmemcached-0.50/libtest/core.h +11 -0
- data/ext/libmemcached-0.50/libtest/error.h +18 -0
- data/ext/libmemcached-0.50/libtest/failed.h +52 -0
- data/ext/libmemcached-0.50/libtest/framework.cc +57 -0
- data/ext/libmemcached-0.50/libtest/framework.h +137 -0
- data/ext/libmemcached-0.50/libtest/get.h +22 -0
- data/ext/libmemcached-0.50/libtest/include.am +52 -0
- data/ext/libmemcached-0.50/libtest/runner.h +19 -0
- data/ext/libmemcached-0.50/libtest/server.c +355 -0
- data/ext/libmemcached-0.50/libtest/server.h +43 -0
- data/ext/libmemcached-0.50/libtest/stats.h +30 -0
- data/ext/libmemcached-0.50/libtest/strerror.h +14 -0
- data/ext/libmemcached-0.50/libtest/test.cc +319 -0
- data/ext/libmemcached-0.50/libtest/test.h +162 -0
- data/ext/libmemcached-0.50/libtest/test.hpp +46 -0
- data/ext/libmemcached-0.50/libtest/visibility.h +69 -0
- data/ext/libmemcached-0.50/m4/ac_cxx_header_stdcxx_98.m4 +83 -0
- data/ext/libmemcached-0.50/m4/acx_pthread.m4 +271 -0
- data/ext/libmemcached-0.50/m4/byteorder.m4 +19 -0
- data/ext/libmemcached-0.50/m4/deprecated.m4 +17 -0
- data/ext/libmemcached-0.50/m4/eagain.m4 +28 -0
- data/ext/libmemcached-0.50/m4/enable_utillib.m4 +16 -0
- data/ext/libmemcached-0.50/m4/gettext.m4 +379 -0
- data/ext/libmemcached-0.50/m4/hsieh.m4 +18 -0
- data/ext/libmemcached-0.50/m4/iconv.m4 +214 -0
- data/ext/libmemcached-0.50/m4/lib-ld.m4 +110 -0
- data/ext/libmemcached-0.50/m4/lib-link.m4 +767 -0
- data/ext/libmemcached-0.50/m4/lib-prefix.m4 +221 -0
- data/ext/libmemcached-0.50/m4/libtool.m4 +7851 -0
- data/ext/libmemcached-0.50/m4/ltoptions.m4 +369 -0
- data/ext/libmemcached-0.50/m4/ltsugar.m4 +123 -0
- data/ext/libmemcached-0.50/m4/ltversion.m4 +23 -0
- data/ext/libmemcached-0.50/m4/lt~obsolete.m4 +98 -0
- data/ext/libmemcached-0.50/m4/memaslap.m4 +9 -0
- data/ext/libmemcached-0.50/m4/memcached.m4 +31 -0
- data/ext/libmemcached-0.50/m4/murmur.m4 +18 -0
- data/ext/libmemcached-0.50/m4/pandora_64bit.m4 +60 -0
- data/ext/libmemcached-0.50/m4/pandora_bison.m4 +33 -0
- data/ext/libmemcached-0.50/m4/pandora_canonical.m4 +418 -0
- data/ext/libmemcached-0.50/m4/pandora_check_compiler_version.m4 +37 -0
- data/ext/libmemcached-0.50/m4/pandora_check_cxx_standard.m4 +23 -0
- data/ext/libmemcached-0.50/m4/pandora_cinttypes.m4 +39 -0
- data/ext/libmemcached-0.50/m4/pandora_clock_gettime.m4 +15 -0
- data/ext/libmemcached-0.50/m4/pandora_compile_stdcxx_0x.m4 +103 -0
- data/ext/libmemcached-0.50/m4/pandora_cstdint.m4 +38 -0
- data/ext/libmemcached-0.50/m4/pandora_cxx_demangle.m4 +27 -0
- data/ext/libmemcached-0.50/m4/pandora_enable_dtrace.m4 +60 -0
- data/ext/libmemcached-0.50/m4/pandora_ensure_gcc_version.m4 +62 -0
- data/ext/libmemcached-0.50/m4/pandora_extensions.m4 +16 -0
- data/ext/libmemcached-0.50/m4/pandora_fdatasync.m4 +25 -0
- data/ext/libmemcached-0.50/m4/pandora_flex.m4 +33 -0
- data/ext/libmemcached-0.50/m4/pandora_have_better_malloc.m4 +66 -0
- data/ext/libmemcached-0.50/m4/pandora_have_boost.m4 +93 -0
- data/ext/libmemcached-0.50/m4/pandora_have_gcc_atomics.m4 +37 -0
- data/ext/libmemcached-0.50/m4/pandora_have_innodb.m4 +41 -0
- data/ext/libmemcached-0.50/m4/pandora_have_libaio.m4 +56 -0
- data/ext/libmemcached-0.50/m4/pandora_have_libavahi.m4 +41 -0
- data/ext/libmemcached-0.50/m4/pandora_have_libbdb.m4 +40 -0
- data/ext/libmemcached-0.50/m4/pandora_have_libboost_date_time.m4 +46 -0
- data/ext/libmemcached-0.50/m4/pandora_have_libboost_filesystem.m4 +47 -0
- data/ext/libmemcached-0.50/m4/pandora_have_libboost_iostreams.m4 +49 -0
- data/ext/libmemcached-0.50/m4/pandora_have_libboost_options.m4 +47 -0
- data/ext/libmemcached-0.50/m4/pandora_have_libboost_regex.m4 +54 -0
- data/ext/libmemcached-0.50/m4/pandora_have_libboost_test.m4 +45 -0
- data/ext/libmemcached-0.50/m4/pandora_have_libboost_thread.m4 +54 -0
- data/ext/libmemcached-0.50/m4/pandora_have_libcassandra.m4 +44 -0
- data/ext/libmemcached-0.50/m4/pandora_have_libcurl.m4 +62 -0
- data/ext/libmemcached-0.50/m4/pandora_have_libdl.m4 +51 -0
- data/ext/libmemcached-0.50/m4/pandora_have_libdrizzle.m4 +61 -0
- data/ext/libmemcached-0.50/m4/pandora_have_libevent.m4 +66 -0
- data/ext/libmemcached-0.50/m4/pandora_have_libgearman.m4 +41 -0
- data/ext/libmemcached-0.50/m4/pandora_have_libgtest.m4 +47 -0
- data/ext/libmemcached-0.50/m4/pandora_have_libhaildb.m4 +43 -0
- data/ext/libmemcached-0.50/m4/pandora_have_libhashkit.m4 +42 -0
- data/ext/libmemcached-0.50/m4/pandora_have_libinnodb.m4 +64 -0
- data/ext/libmemcached-0.50/m4/pandora_have_libldap.m4 +73 -0
- data/ext/libmemcached-0.50/m4/pandora_have_libmemcached.m4 +106 -0
- data/ext/libmemcached-0.50/m4/pandora_have_libmysqlclient.m4 +146 -0
- data/ext/libmemcached-0.50/m4/pandora_have_libndbclient.m4 +80 -0
- data/ext/libmemcached-0.50/m4/pandora_have_libpcre.m4 +73 -0
- data/ext/libmemcached-0.50/m4/pandora_have_libpq.m4 +46 -0
- data/ext/libmemcached-0.50/m4/pandora_have_libpqxx.m4 +44 -0
- data/ext/libmemcached-0.50/m4/pandora_have_libsqlite3.m4 +42 -0
- data/ext/libmemcached-0.50/m4/pandora_have_libtokyocabinet.m4 +54 -0
- data/ext/libmemcached-0.50/m4/pandora_have_libuuid.m4 +55 -0
- data/ext/libmemcached-0.50/m4/pandora_have_libvbucket.m4 +40 -0
- data/ext/libmemcached-0.50/m4/pandora_have_libxml2.m4 +52 -0
- data/ext/libmemcached-0.50/m4/pandora_have_libz.m4 +51 -0
- data/ext/libmemcached-0.50/m4/pandora_have_protobuf.m4 +82 -0
- data/ext/libmemcached-0.50/m4/pandora_have_sasl.m4 +133 -0
- data/ext/libmemcached-0.50/m4/pandora_have_thrift.m4 +45 -0
- data/ext/libmemcached-0.50/m4/pandora_header_assert.m4 +23 -0
- data/ext/libmemcached-0.50/m4/pandora_header_stdcxx_98.m4 +83 -0
- data/ext/libmemcached-0.50/m4/pandora_intltool.m4 +225 -0
- data/ext/libmemcached-0.50/m4/pandora_libtool.m4 +25 -0
- data/ext/libmemcached-0.50/m4/pandora_optimize.m4 +75 -0
- data/ext/libmemcached-0.50/m4/pandora_platform.m4 +117 -0
- data/ext/libmemcached-0.50/m4/pandora_plugins.m4 +62 -0
- data/ext/libmemcached-0.50/m4/pandora_print_callstack.m4 +61 -0
- data/ext/libmemcached-0.50/m4/pandora_pthread.m4 +258 -0
- data/ext/libmemcached-0.50/m4/pandora_python3_devel.m4 +236 -0
- data/ext/libmemcached-0.50/m4/pandora_run_cpplint.m4 +8 -0
- data/ext/libmemcached-0.50/m4/pandora_sasl.m4 +133 -0
- data/ext/libmemcached-0.50/m4/pandora_shared_ptr.m4 +59 -0
- data/ext/libmemcached-0.50/m4/pandora_stack_direction.m4 +39 -0
- data/ext/libmemcached-0.50/m4/pandora_stl_hash.m4 +94 -0
- data/ext/libmemcached-0.50/m4/pandora_swig.m4 +39 -0
- data/ext/libmemcached-0.50/m4/pandora_use_pipe.m4 +36 -0
- data/ext/libmemcached-0.50/m4/pandora_vc_build.m4 +168 -0
- data/ext/libmemcached-0.50/m4/pandora_version.m4 +11 -0
- data/ext/libmemcached-0.50/m4/pandora_visibility.m4 +75 -0
- data/ext/libmemcached-0.50/m4/pandora_warnings.m4 +447 -0
- data/ext/libmemcached-0.50/m4/pandora_with_gettext.m4 +44 -0
- data/ext/libmemcached-0.50/m4/pandora_with_lua.m4 +55 -0
- data/ext/libmemcached-0.50/m4/pandora_with_memcached.m4 +41 -0
- data/ext/libmemcached-0.50/m4/pandora_with_perl.m4 +81 -0
- data/ext/libmemcached-0.50/m4/pandora_with_php.m4 +56 -0
- data/ext/libmemcached-0.50/m4/pandora_with_python.m4 +37 -0
- data/ext/libmemcached-0.50/m4/pandora_with_python3.m4 +44 -0
- data/ext/libmemcached-0.50/m4/pandora_with_r.m4 +33 -0
- data/ext/libmemcached-0.50/m4/pandora_with_ruby.m4 +79 -0
- data/ext/libmemcached-0.50/m4/pandora_with_valgrind.m4 +17 -0
- data/ext/libmemcached-0.50/m4/pkg.m4 +157 -0
- data/ext/libmemcached-0.50/m4/po.m4 +449 -0
- data/ext/libmemcached-0.50/m4/progtest.m4 +92 -0
- data/ext/libmemcached-0.50/m4/protocol_binary.m4 +36 -0
- data/ext/libmemcached-0.50/m4/setsockopt.m4 +73 -0
- data/ext/libmemcached-0.50/m4/socket_send_flags.m4 +66 -0
- data/ext/libmemcached-0.50/poll/include.am +8 -0
- data/ext/libmemcached-0.50/poll/poll.c +77 -0
- data/ext/libmemcached-0.50/poll/poll.h +45 -0
- data/ext/libmemcached-0.50/support/include.am +11 -0
- data/ext/libmemcached-0.50/support/libmemcached-fc.spec.in +105 -0
- data/ext/libmemcached-0.50/support/libmemcached.pc.in +10 -0
- data/ext/libmemcached-0.50/support/libmemcached.spec.in +281 -0
- data/ext/libmemcached-0.50/support/set_benchmark.sh +5 -0
- data/ext/libmemcached-0.50/tests/atomsmasher.cc +295 -0
- data/ext/libmemcached-0.50/tests/basic.cc +134 -0
- data/ext/libmemcached-0.50/tests/basic.h +66 -0
- data/ext/libmemcached-0.50/tests/cpp_example.cc +195 -0
- data/ext/libmemcached-0.50/tests/deprecated.cc +72 -0
- data/ext/libmemcached-0.50/tests/deprecated.h +49 -0
- data/ext/libmemcached-0.50/tests/error_conditions.cc +63 -0
- data/ext/libmemcached-0.50/tests/error_conditions.h +48 -0
- data/ext/libmemcached-0.50/tests/hash_plus.cc +225 -0
- data/ext/libmemcached-0.50/tests/hash_results.h +127 -0
- data/ext/libmemcached-0.50/tests/hashkit_functions.cc +619 -0
- data/ext/libmemcached-0.50/tests/include.am +342 -0
- data/ext/libmemcached-0.50/tests/ketama_test_cases.h +121 -0
- data/ext/libmemcached-0.50/tests/ketama_test_cases_spy.h +118 -0
- data/ext/libmemcached-0.50/tests/libmemcached_world.h +205 -0
- data/ext/libmemcached-0.50/tests/mem_functions.cc +6648 -0
- data/ext/libmemcached-0.50/tests/mem_udp.cc +510 -0
- data/ext/libmemcached-0.50/tests/output_plus.res +5 -0
- data/ext/libmemcached-0.50/tests/parser.cc +599 -0
- data/ext/libmemcached-0.50/tests/parser.h +109 -0
- data/ext/libmemcached-0.50/tests/plus.cpp +240 -0
- data/ext/libmemcached-0.50/tests/pool.cc +78 -0
- data/ext/libmemcached-0.50/tests/pool.h +49 -0
- data/ext/libmemcached-0.50/tests/print.cc +58 -0
- data/ext/libmemcached-0.50/tests/print.h +51 -0
- data/ext/libmemcached-0.50/tests/replication.cc +333 -0
- data/ext/libmemcached-0.50/tests/replication.h +64 -0
- data/ext/libmemcached-0.50/tests/start.cc +29 -0
- data/ext/libmemcached-0.50/tests/string.cc +174 -0
- data/ext/libmemcached-0.50/tests/string.h +67 -0
- data/ext/libmemcached-0.50/tests/virtual_buckets.cc +143 -0
- data/ext/libmemcached-0.50/tests/virtual_buckets.h +51 -0
- data/ext/libmemcached-0.50/win32/include.am +11 -0
- data/ext/libmemcached-0.50/win32/wrappers.h +55 -0
- data/ext/rlibmemcached.i +263 -0
- data/ext/rlibmemcached_wrap.c +16732 -0
- data/lib/memcached.rb +32 -0
- data/lib/memcached/auth.rb +16 -0
- data/lib/memcached/behaviors.rb +77 -0
- data/lib/memcached/exceptions.rb +84 -0
- data/lib/memcached/experimental.rb +48 -0
- data/lib/memcached/memcached.rb +660 -0
- data/lib/memcached/rails.rb +133 -0
- data/test/profile/benchmark.rb +245 -0
- data/test/profile/c_profiler.rb +14 -0
- data/test/profile/exercise.rb +185 -0
- data/test/profile/rb_profiler.rb +21 -0
- data/test/profile/valgrind.rb +10 -0
- data/test/setup.rb +30 -0
- data/test/teardown.rb +0 -0
- data/test/test_helper.rb +19 -0
- data/test/unit/binding_test.rb +8 -0
- data/test/unit/memcached_experimental_test.rb +274 -0
- data/test/unit/memcached_test.rb +1293 -0
- data/test/unit/rails_test.rb +122 -0
- metadata +650 -0
- metadata.gz.sig +0 -0
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
/* vim:expandtab:shiftwidth=2:tabstop=2:smarttab:
|
|
2
|
+
*
|
|
3
|
+
* LibMemcached
|
|
4
|
+
*
|
|
5
|
+
* Copyright (C) 2011 Data Differential, http://datadifferential.com/
|
|
6
|
+
* Copyright (C) 2006-2009 Brian Aker
|
|
7
|
+
* All rights reserved.
|
|
8
|
+
*
|
|
9
|
+
* Redistribution and use in source and binary forms, with or without
|
|
10
|
+
* modification, are permitted provided that the following conditions are
|
|
11
|
+
* met:
|
|
12
|
+
*
|
|
13
|
+
* * Redistributions of source code must retain the above copyright
|
|
14
|
+
* notice, this list of conditions and the following disclaimer.
|
|
15
|
+
*
|
|
16
|
+
* * Redistributions in binary form must reproduce the above
|
|
17
|
+
* copyright notice, this list of conditions and the following disclaimer
|
|
18
|
+
* in the documentation and/or other materials provided with the
|
|
19
|
+
* distribution.
|
|
20
|
+
*
|
|
21
|
+
* * The names of its contributors may not be used to endorse or
|
|
22
|
+
* promote products derived from this software without specific prior
|
|
23
|
+
* written permission.
|
|
24
|
+
*
|
|
25
|
+
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
26
|
+
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
27
|
+
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
28
|
+
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
29
|
+
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
30
|
+
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
31
|
+
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
32
|
+
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
33
|
+
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
34
|
+
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
35
|
+
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
36
|
+
*
|
|
37
|
+
*/
|
|
38
|
+
|
|
39
|
+
/*
|
|
40
|
+
Common include file for libmemached
|
|
41
|
+
*/
|
|
42
|
+
|
|
43
|
+
#pragma once
|
|
44
|
+
|
|
45
|
+
#include <config.h>
|
|
46
|
+
|
|
47
|
+
#ifdef __cplusplus
|
|
48
|
+
#include <cstdio>
|
|
49
|
+
#include <cstdlib>
|
|
50
|
+
#include <cstring>
|
|
51
|
+
#include <ctime>
|
|
52
|
+
#include <ctype.h>
|
|
53
|
+
#else
|
|
54
|
+
#include <stdio.h>
|
|
55
|
+
#include <stdlib.h>
|
|
56
|
+
#include <string.h>
|
|
57
|
+
#include <time.h>
|
|
58
|
+
#endif
|
|
59
|
+
|
|
60
|
+
#include <errno.h>
|
|
61
|
+
#include <fcntl.h>
|
|
62
|
+
#include <limits.h>
|
|
63
|
+
#include <sys/types.h>
|
|
64
|
+
#include <unistd.h>
|
|
65
|
+
|
|
66
|
+
#include <libmemcached/memcached.h>
|
|
67
|
+
#include <libmemcached/watchpoint.h>
|
|
68
|
+
#include <libmemcached/is.h>
|
|
69
|
+
|
|
70
|
+
#ifdef __cplusplus
|
|
71
|
+
extern "C" {
|
|
72
|
+
#endif
|
|
73
|
+
|
|
74
|
+
typedef struct memcached_server_st * memcached_server_write_instance_st;
|
|
75
|
+
|
|
76
|
+
typedef memcached_return_t (*memcached_server_execute_fn)(memcached_st *ptr, memcached_server_write_instance_st server, void *context);
|
|
77
|
+
|
|
78
|
+
LIBMEMCACHED_LOCAL
|
|
79
|
+
memcached_server_write_instance_st memcached_server_instance_fetch(memcached_st *ptr, uint32_t server_key);
|
|
80
|
+
|
|
81
|
+
LIBMEMCACHED_LOCAL
|
|
82
|
+
memcached_return_t memcached_server_execute(memcached_st *ptr,
|
|
83
|
+
memcached_server_execute_fn callback,
|
|
84
|
+
void *context);
|
|
85
|
+
#ifdef __cplusplus
|
|
86
|
+
} // extern "C"
|
|
87
|
+
#endif
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
/* These are private not to be installed headers */
|
|
91
|
+
#include <libmemcached/error.hpp>
|
|
92
|
+
#include <libmemcached/memory.h>
|
|
93
|
+
#include <libmemcached/io.h>
|
|
94
|
+
#include <libmemcached/do.hpp>
|
|
95
|
+
#include <libmemcached/internal.h>
|
|
96
|
+
#include <libmemcached/array.h>
|
|
97
|
+
#include <libmemcached/libmemcached_probes.h>
|
|
98
|
+
#include <libmemcached/memcached/protocol_binary.h>
|
|
99
|
+
#include <libmemcached/byteorder.h>
|
|
100
|
+
#include <libmemcached/initialize_query.h>
|
|
101
|
+
#include <libmemcached/response.h>
|
|
102
|
+
#include <libmemcached/prefix_key.h>
|
|
103
|
+
|
|
104
|
+
/* string value */
|
|
105
|
+
struct memcached_continuum_item_st
|
|
106
|
+
{
|
|
107
|
+
uint32_t index;
|
|
108
|
+
uint32_t value;
|
|
109
|
+
};
|
|
110
|
+
|
|
111
|
+
#if !defined(__GNUC__) || (__GNUC__ == 2 && __GNUC_MINOR__ < 96)
|
|
112
|
+
|
|
113
|
+
#define likely(x) if((x))
|
|
114
|
+
#define unlikely(x) if((x))
|
|
115
|
+
|
|
116
|
+
#else
|
|
117
|
+
|
|
118
|
+
#define likely(x) if(__builtin_expect((x) != 0, 1))
|
|
119
|
+
#define unlikely(x) if(__builtin_expect((x) != 0, 0))
|
|
120
|
+
#endif
|
|
121
|
+
|
|
122
|
+
#define MEMCACHED_BLOCK_SIZE 1024
|
|
123
|
+
#define MEMCACHED_DEFAULT_COMMAND_SIZE 350
|
|
124
|
+
#define SMALL_STRING_LEN 1024
|
|
125
|
+
#define HUGE_STRING_LEN 8196
|
|
126
|
+
|
|
127
|
+
#ifdef __cplusplus
|
|
128
|
+
extern "C" {
|
|
129
|
+
#endif
|
|
130
|
+
|
|
131
|
+
LIBMEMCACHED_LOCAL
|
|
132
|
+
memcached_return_t memcached_connect(memcached_server_write_instance_st ptr);
|
|
133
|
+
|
|
134
|
+
LIBMEMCACHED_LOCAL
|
|
135
|
+
memcached_return_t run_distribution(memcached_st *ptr);
|
|
136
|
+
|
|
137
|
+
#define memcached_server_response_increment(A) (A)->cursor_active++
|
|
138
|
+
#define memcached_server_response_decrement(A) (A)->cursor_active--
|
|
139
|
+
#define memcached_server_response_reset(A) (A)->cursor_active=0
|
|
140
|
+
|
|
141
|
+
LIBMEMCACHED_LOCAL
|
|
142
|
+
void set_last_disconnected_host(memcached_server_write_instance_st ptr);
|
|
143
|
+
|
|
144
|
+
LIBMEMCACHED_LOCAL
|
|
145
|
+
memcached_return_t memcached_key_test(const char * const *keys,
|
|
146
|
+
const size_t *key_length,
|
|
147
|
+
size_t number_of_keys);
|
|
148
|
+
|
|
149
|
+
LIBMEMCACHED_LOCAL
|
|
150
|
+
memcached_return_t memcached_purge(memcached_server_write_instance_st ptr);
|
|
151
|
+
|
|
152
|
+
LIBMEMCACHED_LOCAL
|
|
153
|
+
memcached_server_st *memcached_server_create_with(const memcached_st *memc,
|
|
154
|
+
memcached_server_write_instance_st host,
|
|
155
|
+
const char *hostname,
|
|
156
|
+
in_port_t port,
|
|
157
|
+
uint32_t weight,
|
|
158
|
+
memcached_connection_t type);
|
|
159
|
+
|
|
160
|
+
|
|
161
|
+
static inline memcached_return_t memcached_validate_key_length(size_t key_length, bool binary)
|
|
162
|
+
{
|
|
163
|
+
unlikely (key_length == 0)
|
|
164
|
+
return MEMCACHED_BAD_KEY_PROVIDED;
|
|
165
|
+
|
|
166
|
+
if (binary)
|
|
167
|
+
{
|
|
168
|
+
unlikely (key_length > 0xffff)
|
|
169
|
+
return MEMCACHED_BAD_KEY_PROVIDED;
|
|
170
|
+
}
|
|
171
|
+
else
|
|
172
|
+
{
|
|
173
|
+
unlikely (key_length >= MEMCACHED_MAX_KEY)
|
|
174
|
+
return MEMCACHED_BAD_KEY_PROVIDED;
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
return MEMCACHED_SUCCESS;
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
#ifdef __cplusplus
|
|
181
|
+
}
|
|
182
|
+
#endif
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/* vim:expandtab:shiftwidth=2:tabstop=2:smarttab:
|
|
2
|
+
*
|
|
3
|
+
* Libmemcached library
|
|
4
|
+
*
|
|
5
|
+
* Copyright (C) 2011 Data Differential, http://datadifferential.com/
|
|
6
|
+
* Copyright (C) 2006-2009 Brian Aker, Trond Norbye All rights reserved.
|
|
7
|
+
*
|
|
8
|
+
* Redistribution and use in source and binary forms, with or without
|
|
9
|
+
* modification, are permitted provided that the following conditions are
|
|
10
|
+
* met:
|
|
11
|
+
*
|
|
12
|
+
* * Redistributions of source code must retain the above copyright
|
|
13
|
+
* notice, this list of conditions and the following disclaimer.
|
|
14
|
+
*
|
|
15
|
+
* * Redistributions in binary form must reproduce the above
|
|
16
|
+
* copyright notice, this list of conditions and the following disclaimer
|
|
17
|
+
* in the documentation and/or other materials provided with the
|
|
18
|
+
* distribution.
|
|
19
|
+
*
|
|
20
|
+
* * The names of its contributors may not be used to endorse or
|
|
21
|
+
* promote products derived from this software without specific prior
|
|
22
|
+
* written permission.
|
|
23
|
+
*
|
|
24
|
+
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
25
|
+
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
26
|
+
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
27
|
+
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
28
|
+
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
29
|
+
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
30
|
+
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
31
|
+
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
32
|
+
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
33
|
+
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
34
|
+
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
35
|
+
*
|
|
36
|
+
*/
|
|
37
|
+
|
|
38
|
+
#pragma once
|
|
39
|
+
|
|
40
|
+
#ifdef __cplusplus
|
|
41
|
+
extern "C" {
|
|
42
|
+
#endif
|
|
43
|
+
|
|
44
|
+
@DEPRECATED@
|
|
45
|
+
@LIBMEMCACHED_WITH_SASL_SUPPORT@
|
|
46
|
+
|
|
47
|
+
#define LIBMEMCACHED_VERSION_STRING "@VERSION@"
|
|
48
|
+
#define LIBMEMCACHED_VERSION_HEX @PANDORA_HEX_VERSION@
|
|
49
|
+
|
|
50
|
+
#ifdef __cplusplus
|
|
51
|
+
}
|
|
52
|
+
#endif
|
|
@@ -0,0 +1,626 @@
|
|
|
1
|
+
/* vim:expandtab:shiftwidth=2:tabstop=2:smarttab:
|
|
2
|
+
*
|
|
3
|
+
* Libmemcached library
|
|
4
|
+
*
|
|
5
|
+
* Copyright (C) 2011 Data Differential, http://datadifferential.com/
|
|
6
|
+
* Copyright (C) 2006-2010 Brian Aker All rights reserved.
|
|
7
|
+
*
|
|
8
|
+
* Redistribution and use in source and binary forms, with or without
|
|
9
|
+
* modification, are permitted provided that the following conditions are
|
|
10
|
+
* met:
|
|
11
|
+
*
|
|
12
|
+
* * Redistributions of source code must retain the above copyright
|
|
13
|
+
* notice, this list of conditions and the following disclaimer.
|
|
14
|
+
*
|
|
15
|
+
* * Redistributions in binary form must reproduce the above
|
|
16
|
+
* copyright notice, this list of conditions and the following disclaimer
|
|
17
|
+
* in the documentation and/or other materials provided with the
|
|
18
|
+
* distribution.
|
|
19
|
+
*
|
|
20
|
+
* * The names of its contributors may not be used to endorse or
|
|
21
|
+
* promote products derived from this software without specific prior
|
|
22
|
+
* written permission.
|
|
23
|
+
*
|
|
24
|
+
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
25
|
+
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
26
|
+
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
27
|
+
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
28
|
+
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
29
|
+
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
30
|
+
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
31
|
+
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
32
|
+
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
33
|
+
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
34
|
+
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
35
|
+
*
|
|
36
|
+
*/
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
#include <libmemcached/common.h>
|
|
40
|
+
#include <cassert>
|
|
41
|
+
#include <ctime>
|
|
42
|
+
#include <sys/time.h>
|
|
43
|
+
|
|
44
|
+
static memcached_return_t connect_poll(memcached_server_st *ptr)
|
|
45
|
+
{
|
|
46
|
+
struct pollfd fds[1];
|
|
47
|
+
fds[0].fd = ptr->fd;
|
|
48
|
+
fds[0].events = POLLOUT;
|
|
49
|
+
|
|
50
|
+
size_t loop_max= 5;
|
|
51
|
+
|
|
52
|
+
if (ptr->root->poll_timeout == 0)
|
|
53
|
+
{
|
|
54
|
+
return memcached_set_error(*ptr, MEMCACHED_TIMEOUT, MEMCACHED_AT);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
while (--loop_max) // Should only loop on cases of ERESTART or EINTR
|
|
58
|
+
{
|
|
59
|
+
int error= poll(fds, 1, ptr->root->connect_timeout);
|
|
60
|
+
switch (error)
|
|
61
|
+
{
|
|
62
|
+
case 1:
|
|
63
|
+
{
|
|
64
|
+
int err;
|
|
65
|
+
socklen_t len= sizeof (err);
|
|
66
|
+
(void)getsockopt(ptr->fd, SOL_SOCKET, SO_ERROR, &err, &len);
|
|
67
|
+
|
|
68
|
+
// We check the value to see what happened wth the socket.
|
|
69
|
+
if (err == 0)
|
|
70
|
+
{
|
|
71
|
+
return MEMCACHED_SUCCESS;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
return memcached_set_errno(*ptr, err, MEMCACHED_AT);
|
|
75
|
+
}
|
|
76
|
+
case 0:
|
|
77
|
+
{
|
|
78
|
+
return memcached_set_error(*ptr, MEMCACHED_TIMEOUT, MEMCACHED_AT);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
default: // A real error occurred and we need to completely bail
|
|
82
|
+
WATCHPOINT_ERRNO(get_socket_errno());
|
|
83
|
+
switch (get_socket_errno())
|
|
84
|
+
{
|
|
85
|
+
#ifdef TARGET_OS_LINUX
|
|
86
|
+
case ERESTART:
|
|
87
|
+
#endif
|
|
88
|
+
case EINTR:
|
|
89
|
+
continue;
|
|
90
|
+
|
|
91
|
+
case EFAULT:
|
|
92
|
+
case ENOMEM:
|
|
93
|
+
return memcached_set_error(*ptr, MEMCACHED_MEMORY_ALLOCATION_FAILURE, MEMCACHED_AT);
|
|
94
|
+
|
|
95
|
+
case EINVAL:
|
|
96
|
+
return memcached_set_error(*ptr, MEMCACHED_MEMORY_ALLOCATION_FAILURE, MEMCACHED_AT, memcached_literal_param("RLIMIT_NOFILE exceeded, or if OSX the timeout value was invalid"));
|
|
97
|
+
|
|
98
|
+
default: // This should not happen
|
|
99
|
+
if (fds[0].revents & POLLERR)
|
|
100
|
+
{
|
|
101
|
+
int err;
|
|
102
|
+
socklen_t len= sizeof (err);
|
|
103
|
+
(void)getsockopt(ptr->fd, SOL_SOCKET, SO_ERROR, &err, &len);
|
|
104
|
+
ptr->cached_errno= (err == 0) ? get_socket_errno() : err;
|
|
105
|
+
}
|
|
106
|
+
else
|
|
107
|
+
{
|
|
108
|
+
ptr->cached_errno= get_socket_errno();
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
WATCHPOINT_ASSERT(ptr->fd != INVALID_SOCKET);
|
|
112
|
+
(void)closesocket(ptr->fd);
|
|
113
|
+
ptr->fd= INVALID_SOCKET;
|
|
114
|
+
ptr->state= MEMCACHED_SERVER_STATE_NEW;
|
|
115
|
+
|
|
116
|
+
return memcached_set_errno(*ptr, get_socket_errno(), MEMCACHED_AT);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
// This should only be possible from ERESTART or EINTR;
|
|
122
|
+
return memcached_set_errno(*ptr, get_socket_errno(), MEMCACHED_AT);
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
static memcached_return_t set_hostinfo(memcached_server_st *server)
|
|
126
|
+
{
|
|
127
|
+
WATCHPOINT_ASSERT(not server->address_info); // We cover the case where a programming mistake has been made.
|
|
128
|
+
if (server->address_info)
|
|
129
|
+
{
|
|
130
|
+
freeaddrinfo(server->address_info);
|
|
131
|
+
server->address_info= NULL;
|
|
132
|
+
server->address_info_next= NULL;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
char str_port[NI_MAXSERV];
|
|
136
|
+
int length= snprintf(str_port, NI_MAXSERV, "%u", (uint32_t)server->port);
|
|
137
|
+
if (length >= NI_MAXSERV || length < 0)
|
|
138
|
+
return MEMCACHED_FAILURE;
|
|
139
|
+
|
|
140
|
+
struct addrinfo hints;
|
|
141
|
+
memset(&hints, 0, sizeof(struct addrinfo));
|
|
142
|
+
|
|
143
|
+
#if 0
|
|
144
|
+
hints.ai_family= AF_INET;
|
|
145
|
+
#endif
|
|
146
|
+
if (server->type == MEMCACHED_CONNECTION_UDP)
|
|
147
|
+
{
|
|
148
|
+
hints.ai_protocol= IPPROTO_UDP;
|
|
149
|
+
hints.ai_socktype= SOCK_DGRAM;
|
|
150
|
+
}
|
|
151
|
+
else
|
|
152
|
+
{
|
|
153
|
+
hints.ai_socktype= SOCK_STREAM;
|
|
154
|
+
hints.ai_protocol= IPPROTO_TCP;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
int errcode;
|
|
158
|
+
switch(errcode= getaddrinfo(server->hostname, str_port, &hints, &server->address_info))
|
|
159
|
+
{
|
|
160
|
+
case 0:
|
|
161
|
+
break;
|
|
162
|
+
|
|
163
|
+
case EAI_AGAIN:
|
|
164
|
+
return memcached_set_error(*server, MEMCACHED_TIMEOUT, MEMCACHED_AT, memcached_string_make_from_cstr(gai_strerror(errcode)));
|
|
165
|
+
|
|
166
|
+
case EAI_SYSTEM:
|
|
167
|
+
return memcached_set_errno(*server, errno, MEMCACHED_AT, memcached_literal_param("getaddrinfo(EAI_SYSTEM)"));
|
|
168
|
+
|
|
169
|
+
case EAI_BADFLAGS:
|
|
170
|
+
return memcached_set_error(*server, MEMCACHED_INVALID_ARGUMENTS, MEMCACHED_AT, memcached_literal_param("getaddrinfo(EAI_BADFLAGS)"));
|
|
171
|
+
|
|
172
|
+
case EAI_MEMORY:
|
|
173
|
+
return memcached_set_error(*server, MEMCACHED_MEMORY_ALLOCATION_FAILURE, MEMCACHED_AT, memcached_literal_param("getaddrinfo(EAI_MEMORY)"));
|
|
174
|
+
|
|
175
|
+
default:
|
|
176
|
+
{
|
|
177
|
+
WATCHPOINT_STRING(server->hostname);
|
|
178
|
+
WATCHPOINT_STRING(gai_strerror(errcode));
|
|
179
|
+
return memcached_set_error(*server, MEMCACHED_HOST_LOOKUP_FAILURE, MEMCACHED_AT, memcached_string_make_from_cstr(gai_strerror(errcode)));
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
server->address_info_next= server->address_info;
|
|
183
|
+
server->state= MEMCACHED_SERVER_STATE_ADDRINFO;
|
|
184
|
+
|
|
185
|
+
return MEMCACHED_SUCCESS;
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
static inline void set_socket_nonblocking(memcached_server_st *ptr)
|
|
189
|
+
{
|
|
190
|
+
#ifdef WIN32
|
|
191
|
+
u_long arg = 1;
|
|
192
|
+
if (ioctlsocket(ptr->fd, FIONBIO, &arg) == SOCKET_ERROR)
|
|
193
|
+
{
|
|
194
|
+
memcached_set_errno(*ptr, get_socket_errno(), NULL);
|
|
195
|
+
}
|
|
196
|
+
#else
|
|
197
|
+
int flags;
|
|
198
|
+
|
|
199
|
+
do
|
|
200
|
+
{
|
|
201
|
+
flags= fcntl(ptr->fd, F_GETFL, 0);
|
|
202
|
+
} while (flags == -1 && (errno == EINTR || errno == EAGAIN));
|
|
203
|
+
|
|
204
|
+
if (flags == -1)
|
|
205
|
+
{
|
|
206
|
+
memcached_set_errno(*ptr, errno, NULL);
|
|
207
|
+
}
|
|
208
|
+
else if ((flags & O_NONBLOCK) == 0)
|
|
209
|
+
{
|
|
210
|
+
int rval;
|
|
211
|
+
|
|
212
|
+
do
|
|
213
|
+
{
|
|
214
|
+
rval= fcntl(ptr->fd, F_SETFL, flags | O_NONBLOCK);
|
|
215
|
+
} while (rval == -1 && (errno == EINTR || errno == EAGAIN));
|
|
216
|
+
|
|
217
|
+
unlikely (rval == -1)
|
|
218
|
+
{
|
|
219
|
+
memcached_set_errno(*ptr, errno, NULL);
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
#endif
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
static void set_socket_options(memcached_server_st *ptr)
|
|
226
|
+
{
|
|
227
|
+
WATCHPOINT_ASSERT(ptr->fd != -1);
|
|
228
|
+
|
|
229
|
+
if (ptr->type == MEMCACHED_CONNECTION_UDP)
|
|
230
|
+
return;
|
|
231
|
+
|
|
232
|
+
#ifdef HAVE_SNDTIMEO
|
|
233
|
+
if (ptr->root->snd_timeout)
|
|
234
|
+
{
|
|
235
|
+
int error;
|
|
236
|
+
struct timeval waittime;
|
|
237
|
+
|
|
238
|
+
waittime.tv_sec= 0;
|
|
239
|
+
waittime.tv_usec= ptr->root->snd_timeout;
|
|
240
|
+
|
|
241
|
+
error= setsockopt(ptr->fd, SOL_SOCKET, SO_SNDTIMEO,
|
|
242
|
+
&waittime, (socklen_t)sizeof(struct timeval));
|
|
243
|
+
WATCHPOINT_ASSERT(error == 0);
|
|
244
|
+
}
|
|
245
|
+
#endif
|
|
246
|
+
|
|
247
|
+
#ifdef HAVE_RCVTIMEO
|
|
248
|
+
if (ptr->root->rcv_timeout)
|
|
249
|
+
{
|
|
250
|
+
int error;
|
|
251
|
+
struct timeval waittime;
|
|
252
|
+
|
|
253
|
+
waittime.tv_sec= 0;
|
|
254
|
+
waittime.tv_usec= ptr->root->rcv_timeout;
|
|
255
|
+
|
|
256
|
+
error= setsockopt(ptr->fd, SOL_SOCKET, SO_RCVTIMEO,
|
|
257
|
+
&waittime, (socklen_t)sizeof(struct timeval));
|
|
258
|
+
WATCHPOINT_ASSERT(error == 0);
|
|
259
|
+
}
|
|
260
|
+
#endif
|
|
261
|
+
|
|
262
|
+
|
|
263
|
+
#if defined(__MACH__) && defined(__APPLE__) || defined(__FreeBSD__)
|
|
264
|
+
{
|
|
265
|
+
int set= 1;
|
|
266
|
+
int error= setsockopt(ptr->fd, SOL_SOCKET, SO_NOSIGPIPE, (void *)&set, sizeof(int));
|
|
267
|
+
|
|
268
|
+
// This is not considered a fatal error
|
|
269
|
+
if (error == -1)
|
|
270
|
+
{
|
|
271
|
+
WATCHPOINT_ERRNO(get_socket_errno());
|
|
272
|
+
perror("setsockopt(SO_NOSIGPIPE)");
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
#endif
|
|
276
|
+
|
|
277
|
+
if (ptr->root->flags.no_block)
|
|
278
|
+
{
|
|
279
|
+
int error;
|
|
280
|
+
struct linger linger;
|
|
281
|
+
|
|
282
|
+
linger.l_onoff= 1;
|
|
283
|
+
linger.l_linger= 0; /* By default on close() just drop the socket */
|
|
284
|
+
error= setsockopt(ptr->fd, SOL_SOCKET, SO_LINGER,
|
|
285
|
+
&linger, (socklen_t)sizeof(struct linger));
|
|
286
|
+
WATCHPOINT_ASSERT(error == 0);
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
if (ptr->root->flags.tcp_nodelay)
|
|
290
|
+
{
|
|
291
|
+
int flag= 1;
|
|
292
|
+
int error;
|
|
293
|
+
|
|
294
|
+
error= setsockopt(ptr->fd, IPPROTO_TCP, TCP_NODELAY,
|
|
295
|
+
&flag, (socklen_t)sizeof(int));
|
|
296
|
+
WATCHPOINT_ASSERT(error == 0);
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
if (ptr->root->flags.tcp_keepalive)
|
|
300
|
+
{
|
|
301
|
+
int flag= 1;
|
|
302
|
+
int error;
|
|
303
|
+
|
|
304
|
+
error= setsockopt(ptr->fd, SOL_SOCKET, SO_KEEPALIVE,
|
|
305
|
+
&flag, (socklen_t)sizeof(int));
|
|
306
|
+
WATCHPOINT_ASSERT(error == 0);
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
#ifdef TCP_KEEPIDLE
|
|
310
|
+
if (ptr->root->tcp_keepidle > 0)
|
|
311
|
+
{
|
|
312
|
+
int error;
|
|
313
|
+
|
|
314
|
+
error= setsockopt(ptr->fd, IPPROTO_TCP, TCP_KEEPIDLE,
|
|
315
|
+
&ptr->root->tcp_keepidle, (socklen_t)sizeof(int));
|
|
316
|
+
WATCHPOINT_ASSERT(error == 0);
|
|
317
|
+
}
|
|
318
|
+
#endif
|
|
319
|
+
|
|
320
|
+
if (ptr->root->send_size > 0)
|
|
321
|
+
{
|
|
322
|
+
int error;
|
|
323
|
+
|
|
324
|
+
error= setsockopt(ptr->fd, SOL_SOCKET, SO_SNDBUF,
|
|
325
|
+
&ptr->root->send_size, (socklen_t)sizeof(int));
|
|
326
|
+
WATCHPOINT_ASSERT(error == 0);
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
if (ptr->root->recv_size > 0)
|
|
330
|
+
{
|
|
331
|
+
int error;
|
|
332
|
+
|
|
333
|
+
error= setsockopt(ptr->fd, SOL_SOCKET, SO_RCVBUF,
|
|
334
|
+
&ptr->root->recv_size, (socklen_t)sizeof(int));
|
|
335
|
+
WATCHPOINT_ASSERT(error == 0);
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
|
|
339
|
+
/* libmemcached will always use nonblocking IO to avoid write deadlocks */
|
|
340
|
+
set_socket_nonblocking(ptr);
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
static memcached_return_t unix_socket_connect(memcached_server_st *ptr)
|
|
344
|
+
{
|
|
345
|
+
#ifndef WIN32
|
|
346
|
+
WATCHPOINT_ASSERT(ptr->fd == -1);
|
|
347
|
+
|
|
348
|
+
if ((ptr->fd= socket(AF_UNIX, SOCK_STREAM, 0)) < 0)
|
|
349
|
+
{
|
|
350
|
+
return memcached_set_errno(*ptr, errno, NULL);
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
struct sockaddr_un servAddr;
|
|
354
|
+
|
|
355
|
+
memset(&servAddr, 0, sizeof (struct sockaddr_un));
|
|
356
|
+
servAddr.sun_family= AF_UNIX;
|
|
357
|
+
strncpy(servAddr.sun_path, ptr->hostname, sizeof(servAddr.sun_path)); /* Copy filename */
|
|
358
|
+
|
|
359
|
+
do {
|
|
360
|
+
if (connect(ptr->fd, (struct sockaddr *)&servAddr, sizeof(servAddr)) < 0)
|
|
361
|
+
{
|
|
362
|
+
switch (errno)
|
|
363
|
+
{
|
|
364
|
+
case EINPROGRESS:
|
|
365
|
+
case EALREADY:
|
|
366
|
+
case EINTR:
|
|
367
|
+
continue;
|
|
368
|
+
|
|
369
|
+
case EISCONN: /* We were spinning waiting on connect */
|
|
370
|
+
{
|
|
371
|
+
WATCHPOINT_ASSERT(0); // Programmer error
|
|
372
|
+
break;
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
default:
|
|
376
|
+
WATCHPOINT_ERRNO(errno);
|
|
377
|
+
return memcached_set_errno(*ptr, errno, MEMCACHED_AT);
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
} while (0);
|
|
381
|
+
ptr->state= MEMCACHED_SERVER_STATE_CONNECTED;
|
|
382
|
+
|
|
383
|
+
WATCHPOINT_ASSERT(ptr->fd != INVALID_SOCKET);
|
|
384
|
+
|
|
385
|
+
return MEMCACHED_SUCCESS;
|
|
386
|
+
#else
|
|
387
|
+
(void)ptr;
|
|
388
|
+
return MEMCACHED_NOT_SUPPORTED;
|
|
389
|
+
#endif
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
static memcached_return_t network_connect(memcached_server_st *ptr)
|
|
393
|
+
{
|
|
394
|
+
bool timeout_error_occured= false;
|
|
395
|
+
|
|
396
|
+
WATCHPOINT_ASSERT(ptr->fd == INVALID_SOCKET);
|
|
397
|
+
WATCHPOINT_ASSERT(ptr->cursor_active == 0);
|
|
398
|
+
|
|
399
|
+
if (not ptr->address_info)
|
|
400
|
+
{
|
|
401
|
+
WATCHPOINT_ASSERT(ptr->state == MEMCACHED_SERVER_STATE_NEW);
|
|
402
|
+
memcached_return_t rc;
|
|
403
|
+
uint32_t counter= 5;
|
|
404
|
+
while (--counter)
|
|
405
|
+
{
|
|
406
|
+
if ((rc= set_hostinfo(ptr)) != MEMCACHED_TIMEOUT)
|
|
407
|
+
break;
|
|
408
|
+
|
|
409
|
+
#ifndef WIN32
|
|
410
|
+
struct timespec dream, rem;
|
|
411
|
+
|
|
412
|
+
dream.tv_nsec= 1000;
|
|
413
|
+
dream.tv_sec= 0;
|
|
414
|
+
|
|
415
|
+
nanosleep(&dream, &rem);
|
|
416
|
+
#endif
|
|
417
|
+
}
|
|
418
|
+
|
|
419
|
+
if (memcached_failed(rc))
|
|
420
|
+
return rc;
|
|
421
|
+
}
|
|
422
|
+
|
|
423
|
+
/* Create the socket */
|
|
424
|
+
while (ptr->address_info_next && ptr->fd == INVALID_SOCKET)
|
|
425
|
+
{
|
|
426
|
+
/* Memcache server does not support IPV6 in udp mode, so skip if not ipv4 */
|
|
427
|
+
if (ptr->type == MEMCACHED_CONNECTION_UDP && ptr->address_info_next->ai_family != AF_INET)
|
|
428
|
+
{
|
|
429
|
+
ptr->address_info_next= ptr->address_info_next->ai_next;
|
|
430
|
+
continue;
|
|
431
|
+
}
|
|
432
|
+
|
|
433
|
+
if ((ptr->fd= socket(ptr->address_info_next->ai_family,
|
|
434
|
+
ptr->address_info_next->ai_socktype,
|
|
435
|
+
ptr->address_info_next->ai_protocol)) < 0)
|
|
436
|
+
{
|
|
437
|
+
return memcached_set_errno(*ptr, get_socket_errno(), NULL);
|
|
438
|
+
}
|
|
439
|
+
|
|
440
|
+
set_socket_options(ptr);
|
|
441
|
+
|
|
442
|
+
/* connect to server */
|
|
443
|
+
if ((connect(ptr->fd, ptr->address_info_next->ai_addr, ptr->address_info_next->ai_addrlen) != SOCKET_ERROR))
|
|
444
|
+
{
|
|
445
|
+
ptr->state= MEMCACHED_SERVER_STATE_CONNECTED;
|
|
446
|
+
break; // Success
|
|
447
|
+
}
|
|
448
|
+
|
|
449
|
+
/* An error occurred */
|
|
450
|
+
switch (get_socket_errno())
|
|
451
|
+
{
|
|
452
|
+
case ETIMEDOUT:
|
|
453
|
+
timeout_error_occured= true;
|
|
454
|
+
break;
|
|
455
|
+
|
|
456
|
+
case EWOULDBLOCK:
|
|
457
|
+
case EINPROGRESS: // nonblocking mode - first return
|
|
458
|
+
case EALREADY: // nonblocking mode - subsequent returns
|
|
459
|
+
{
|
|
460
|
+
ptr->state= MEMCACHED_SERVER_STATE_IN_PROGRESS;
|
|
461
|
+
memcached_return_t rc= connect_poll(ptr);
|
|
462
|
+
|
|
463
|
+
if (memcached_success(rc))
|
|
464
|
+
{
|
|
465
|
+
ptr->state= MEMCACHED_SERVER_STATE_CONNECTED;
|
|
466
|
+
return MEMCACHED_SUCCESS;
|
|
467
|
+
}
|
|
468
|
+
|
|
469
|
+
// A timeout here is treated as an error, we will not retry
|
|
470
|
+
if (rc == MEMCACHED_TIMEOUT)
|
|
471
|
+
{
|
|
472
|
+
timeout_error_occured= true;
|
|
473
|
+
}
|
|
474
|
+
}
|
|
475
|
+
break;
|
|
476
|
+
|
|
477
|
+
case EISCONN: // we are connected :-)
|
|
478
|
+
WATCHPOINT_ASSERT(0); // This is a programmer's error
|
|
479
|
+
break;
|
|
480
|
+
|
|
481
|
+
case EINTR: // Special case, we retry ai_addr
|
|
482
|
+
WATCHPOINT_ASSERT(ptr->fd != INVALID_SOCKET);
|
|
483
|
+
(void)closesocket(ptr->fd);
|
|
484
|
+
ptr->fd= INVALID_SOCKET;
|
|
485
|
+
continue;
|
|
486
|
+
|
|
487
|
+
default:
|
|
488
|
+
break;
|
|
489
|
+
}
|
|
490
|
+
|
|
491
|
+
WATCHPOINT_ASSERT(ptr->fd != INVALID_SOCKET);
|
|
492
|
+
(void)closesocket(ptr->fd);
|
|
493
|
+
ptr->fd= INVALID_SOCKET;
|
|
494
|
+
ptr->address_info_next= ptr->address_info_next->ai_next;
|
|
495
|
+
}
|
|
496
|
+
|
|
497
|
+
WATCHPOINT_ASSERT(ptr->fd == INVALID_SOCKET);
|
|
498
|
+
|
|
499
|
+
if (timeout_error_occured)
|
|
500
|
+
{
|
|
501
|
+
if (ptr->fd != INVALID_SOCKET)
|
|
502
|
+
{
|
|
503
|
+
(void)closesocket(ptr->fd);
|
|
504
|
+
ptr->fd= INVALID_SOCKET;
|
|
505
|
+
}
|
|
506
|
+
}
|
|
507
|
+
|
|
508
|
+
WATCHPOINT_STRING("Never got a good file descriptor");
|
|
509
|
+
/* Failed to connect. schedule next retry */
|
|
510
|
+
if (ptr->root->retry_timeout)
|
|
511
|
+
{
|
|
512
|
+
struct timeval next_time;
|
|
513
|
+
|
|
514
|
+
if (gettimeofday(&next_time, NULL) == 0)
|
|
515
|
+
ptr->next_retry= next_time.tv_sec + ptr->root->retry_timeout;
|
|
516
|
+
}
|
|
517
|
+
|
|
518
|
+
if (timeout_error_occured)
|
|
519
|
+
return memcached_set_error(*ptr, MEMCACHED_TIMEOUT, MEMCACHED_AT);
|
|
520
|
+
|
|
521
|
+
return memcached_set_error(*ptr, MEMCACHED_CONNECTION_FAILURE, MEMCACHED_AT); /* The last error should be from connect() */
|
|
522
|
+
}
|
|
523
|
+
|
|
524
|
+
void set_last_disconnected_host(memcached_server_write_instance_st self)
|
|
525
|
+
{
|
|
526
|
+
// const_cast
|
|
527
|
+
memcached_st *root= (memcached_st *)self->root;
|
|
528
|
+
|
|
529
|
+
#if 0
|
|
530
|
+
WATCHPOINT_STRING(self->hostname);
|
|
531
|
+
WATCHPOINT_NUMBER(self->port);
|
|
532
|
+
WATCHPOINT_ERRNO(self->cached_errno);
|
|
533
|
+
#endif
|
|
534
|
+
memcached_server_free(root->last_disconnected_server);
|
|
535
|
+
root->last_disconnected_server= memcached_server_clone(NULL, self);
|
|
536
|
+
}
|
|
537
|
+
|
|
538
|
+
memcached_return_t memcached_connect(memcached_server_write_instance_st ptr)
|
|
539
|
+
{
|
|
540
|
+
memcached_return_t rc= MEMCACHED_NO_SERVERS;
|
|
541
|
+
|
|
542
|
+
if (ptr->fd != INVALID_SOCKET)
|
|
543
|
+
return MEMCACHED_SUCCESS;
|
|
544
|
+
|
|
545
|
+
LIBMEMCACHED_MEMCACHED_CONNECT_START();
|
|
546
|
+
|
|
547
|
+
/* both retry_timeout and server_failure_limit must be set in order to delay retrying a server on error. */
|
|
548
|
+
WATCHPOINT_ASSERT(ptr->root);
|
|
549
|
+
// If we are over the counter failure, we just fail. Reject host only
|
|
550
|
+
// works if you have a set number of failures.
|
|
551
|
+
if (ptr->root->server_failure_limit && ptr->server_failure_counter >= ptr->root->server_failure_limit)
|
|
552
|
+
{
|
|
553
|
+
// @todo fix this by fixing behavior to no longer make use of
|
|
554
|
+
// memcached_st
|
|
555
|
+
if (_is_auto_eject_host(ptr->root))
|
|
556
|
+
{
|
|
557
|
+
ptr->server_failure_counter= 0;
|
|
558
|
+
run_distribution((memcached_st *)ptr->root);
|
|
559
|
+
}
|
|
560
|
+
|
|
561
|
+
if (ptr->root->retry_timeout && ptr->next_retry)
|
|
562
|
+
{
|
|
563
|
+
struct timeval curr_time;
|
|
564
|
+
|
|
565
|
+
gettimeofday(&curr_time, NULL);
|
|
566
|
+
|
|
567
|
+
// We should optimize this to remove the allocation if the server was
|
|
568
|
+
// the last server to die
|
|
569
|
+
if (ptr->next_retry > curr_time.tv_sec)
|
|
570
|
+
{
|
|
571
|
+
set_last_disconnected_host(ptr);
|
|
572
|
+
return memcached_set_error(*ptr, MEMCACHED_SERVER_MARKED_DEAD, MEMCACHED_AT);
|
|
573
|
+
}
|
|
574
|
+
}
|
|
575
|
+
}
|
|
576
|
+
|
|
577
|
+
/* We need to clean up the multi startup piece */
|
|
578
|
+
switch (ptr->type)
|
|
579
|
+
{
|
|
580
|
+
case MEMCACHED_CONNECTION_UNKNOWN:
|
|
581
|
+
WATCHPOINT_ASSERT(0);
|
|
582
|
+
rc= MEMCACHED_NOT_SUPPORTED;
|
|
583
|
+
break;
|
|
584
|
+
|
|
585
|
+
case MEMCACHED_CONNECTION_UDP:
|
|
586
|
+
case MEMCACHED_CONNECTION_TCP:
|
|
587
|
+
rc= network_connect(ptr);
|
|
588
|
+
#ifdef LIBMEMCACHED_WITH_SASL_SUPPORT
|
|
589
|
+
if (ptr->fd != INVALID_SOCKET and ptr->root->sasl.callbacks)
|
|
590
|
+
{
|
|
591
|
+
rc= memcached_sasl_authenticate_connection(ptr);
|
|
592
|
+
if (memcached_failed(rc) and ptr->fd != INVALID_SOCKET)
|
|
593
|
+
{
|
|
594
|
+
WATCHPOINT_ASSERT(ptr->fd != INVALID_SOCKET);
|
|
595
|
+
(void)closesocket(ptr->fd);
|
|
596
|
+
ptr->fd= INVALID_SOCKET;
|
|
597
|
+
}
|
|
598
|
+
}
|
|
599
|
+
#endif
|
|
600
|
+
break;
|
|
601
|
+
|
|
602
|
+
case MEMCACHED_CONNECTION_UNIX_SOCKET:
|
|
603
|
+
rc= unix_socket_connect(ptr);
|
|
604
|
+
break;
|
|
605
|
+
|
|
606
|
+
case MEMCACHED_CONNECTION_MAX:
|
|
607
|
+
default:
|
|
608
|
+
WATCHPOINT_ASSERT(0);
|
|
609
|
+
}
|
|
610
|
+
|
|
611
|
+
if (memcached_success(rc))
|
|
612
|
+
{
|
|
613
|
+
ptr->server_failure_counter= 0;
|
|
614
|
+
ptr->next_retry= 0;
|
|
615
|
+
}
|
|
616
|
+
else
|
|
617
|
+
{
|
|
618
|
+
memcached_set_error(*ptr, rc, MEMCACHED_AT);
|
|
619
|
+
ptr->server_failure_counter++;
|
|
620
|
+
set_last_disconnected_host(ptr);
|
|
621
|
+
}
|
|
622
|
+
|
|
623
|
+
LIBMEMCACHED_MEMCACHED_CONNECT_END();
|
|
624
|
+
|
|
625
|
+
return rc;
|
|
626
|
+
}
|