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,183 @@
|
|
|
1
|
+
# vim:ft=automake
|
|
2
|
+
# included from Top Level Makefile.am
|
|
3
|
+
# All paths should be given relative to the root
|
|
4
|
+
|
|
5
|
+
libmemcached_libmemcached_la_SOURCES =
|
|
6
|
+
|
|
7
|
+
include libmemcached/options/include.am
|
|
8
|
+
|
|
9
|
+
EXTRA_DIST+= \
|
|
10
|
+
libmemcached/configure.h.in \
|
|
11
|
+
libmemcached/libmemcached_probes.d \
|
|
12
|
+
libmemcached/memcached/README.txt
|
|
13
|
+
|
|
14
|
+
noinst_HEADERS+= \
|
|
15
|
+
libmemcached/byteorder.h \
|
|
16
|
+
libmemcached/common.h \
|
|
17
|
+
libmemcached/do.hpp \
|
|
18
|
+
libmemcached/error.hpp \
|
|
19
|
+
libmemcached/initialize_query.h \
|
|
20
|
+
libmemcached/internal.h \
|
|
21
|
+
libmemcached/io.h \
|
|
22
|
+
libmemcached/is.h \
|
|
23
|
+
libmemcached/libmemcached_probes.h \
|
|
24
|
+
libmemcached/memory.h \
|
|
25
|
+
libmemcached/options.hpp \
|
|
26
|
+
libmemcached/protocol/ascii_handler.h \
|
|
27
|
+
libmemcached/protocol/binary_handler.h \
|
|
28
|
+
libmemcached/protocol/common.h \
|
|
29
|
+
libmemcached/response.h \
|
|
30
|
+
libmemcached/virtual_bucket.h
|
|
31
|
+
|
|
32
|
+
nobase_include_HEADERS+= \
|
|
33
|
+
libmemcached/allocators.h \
|
|
34
|
+
libmemcached/analyze.h \
|
|
35
|
+
libmemcached/array.h \
|
|
36
|
+
libmemcached/auto.h \
|
|
37
|
+
libmemcached/basic_string.h \
|
|
38
|
+
libmemcached/behavior.h \
|
|
39
|
+
libmemcached/callback.h \
|
|
40
|
+
libmemcached/configure.h \
|
|
41
|
+
libmemcached/constants.h \
|
|
42
|
+
libmemcached/delete.h \
|
|
43
|
+
libmemcached/dump.h \
|
|
44
|
+
libmemcached/error.h \
|
|
45
|
+
libmemcached/exception.hpp \
|
|
46
|
+
libmemcached/fetch.h \
|
|
47
|
+
libmemcached/flush.h \
|
|
48
|
+
libmemcached/flush_buffers.h \
|
|
49
|
+
libmemcached/get.h \
|
|
50
|
+
libmemcached/touch.h \
|
|
51
|
+
libmemcached/hash.h \
|
|
52
|
+
libmemcached/memcached.h \
|
|
53
|
+
libmemcached/memcached.hpp \
|
|
54
|
+
libmemcached/memcached/protocol_binary.h \
|
|
55
|
+
libmemcached/memcached/vbucket.h \
|
|
56
|
+
libmemcached/options.h \
|
|
57
|
+
libmemcached/parse.h \
|
|
58
|
+
libmemcached/prefix_key.h \
|
|
59
|
+
libmemcached/protocol/cache.h \
|
|
60
|
+
libmemcached/protocol/callback.h \
|
|
61
|
+
libmemcached/protocol_handler.h \
|
|
62
|
+
libmemcached/quit.h \
|
|
63
|
+
libmemcached/return.h \
|
|
64
|
+
libmemcached/platform.h \
|
|
65
|
+
libmemcached/result.h \
|
|
66
|
+
libmemcached/sasl.h \
|
|
67
|
+
libmemcached/server.h \
|
|
68
|
+
libmemcached/server_list.h \
|
|
69
|
+
libmemcached/stats.h \
|
|
70
|
+
libmemcached/storage.h \
|
|
71
|
+
libmemcached/strerror.h \
|
|
72
|
+
libmemcached/string.h \
|
|
73
|
+
libmemcached/types.h \
|
|
74
|
+
libmemcached/verbosity.h \
|
|
75
|
+
libmemcached/version.h \
|
|
76
|
+
libmemcached/visibility.h \
|
|
77
|
+
libmemcached/watchpoint.h
|
|
78
|
+
|
|
79
|
+
# This noinst lib contains things we want to be ABI private but still want to
|
|
80
|
+
# either use in client programs or be able to test in test cases
|
|
81
|
+
# These symbols will not be exposed in the shipped .so
|
|
82
|
+
noinst_LTLIBRARIES+= libmemcached/libmemcachedinternal.la
|
|
83
|
+
libmemcached_libmemcachedinternal_la_SOURCES= \
|
|
84
|
+
libmemcached/array.c \
|
|
85
|
+
libmemcached/error.cc \
|
|
86
|
+
libmemcached/string.cc
|
|
87
|
+
libmemcached_libmemcachedinternal_la_CFLAGS= \
|
|
88
|
+
${AM_CFLAGS} \
|
|
89
|
+
${NO_CONVERSION} \
|
|
90
|
+
-DBUILDING_LIBMEMCACHED
|
|
91
|
+
|
|
92
|
+
libmemcached_libmemcachedinternal_la_CXXFLAGS= \
|
|
93
|
+
${AM_CXXFLAGS} \
|
|
94
|
+
${NO_CONVERSION} \
|
|
95
|
+
-DBUILDING_LIBMEMCACHED
|
|
96
|
+
|
|
97
|
+
lib_LTLIBRARIES+= libmemcached/libmemcached.la
|
|
98
|
+
libmemcached_libmemcached_la_CFLAGS= \
|
|
99
|
+
${AM_CFLAGS} \
|
|
100
|
+
${NO_CONVERSION} \
|
|
101
|
+
-DBUILDING_LIBMEMCACHED
|
|
102
|
+
|
|
103
|
+
libmemcached_libmemcached_la_CXXFLAGS= \
|
|
104
|
+
${AM_CXXFLAGS} \
|
|
105
|
+
${NO_CONVERSION} \
|
|
106
|
+
-DBUILDING_LIBMEMCACHED
|
|
107
|
+
|
|
108
|
+
libmemcached_libmemcached_la_SOURCES+= \
|
|
109
|
+
${libhashkit_libhashkit_la_SOURCES} \
|
|
110
|
+
libmemcached/allocators.cc \
|
|
111
|
+
libmemcached/analyze.cc \
|
|
112
|
+
libmemcached/array.c \
|
|
113
|
+
libmemcached/auto.cc \
|
|
114
|
+
libmemcached/behavior.cc \
|
|
115
|
+
libmemcached/byteorder.cc \
|
|
116
|
+
libmemcached/callback.cc \
|
|
117
|
+
libmemcached/connect.cc \
|
|
118
|
+
libmemcached/delete.cc \
|
|
119
|
+
libmemcached/do.cc \
|
|
120
|
+
libmemcached/dump.cc \
|
|
121
|
+
libmemcached/error.cc \
|
|
122
|
+
libmemcached/fetch.cc \
|
|
123
|
+
libmemcached/flush.cc \
|
|
124
|
+
libmemcached/flush_buffers.cc \
|
|
125
|
+
libmemcached/get.cc \
|
|
126
|
+
libmemcached/touch.cc \
|
|
127
|
+
libmemcached/hash.cc \
|
|
128
|
+
libmemcached/hosts.cc \
|
|
129
|
+
libmemcached/initialize_query.cc \
|
|
130
|
+
libmemcached/io.cc \
|
|
131
|
+
libmemcached/key.cc \
|
|
132
|
+
libmemcached/memcached.cc \
|
|
133
|
+
libmemcached/options.cc \
|
|
134
|
+
libmemcached/parse.cc \
|
|
135
|
+
libmemcached/prefix_key.cc \
|
|
136
|
+
libmemcached/purge.cc \
|
|
137
|
+
libmemcached/quit.cc \
|
|
138
|
+
libmemcached/response.cc \
|
|
139
|
+
libmemcached/result.cc \
|
|
140
|
+
libmemcached/server.cc \
|
|
141
|
+
libmemcached/server_list.cc \
|
|
142
|
+
libmemcached/stats.cc \
|
|
143
|
+
libmemcached/storage.cc \
|
|
144
|
+
libmemcached/strerror.cc \
|
|
145
|
+
libmemcached/string.cc \
|
|
146
|
+
libmemcached/verbosity.cc \
|
|
147
|
+
libmemcached/version.cc \
|
|
148
|
+
libmemcached/virtual_bucket.c
|
|
149
|
+
|
|
150
|
+
libmemcached/options.cc: libmemcached/options/parser.h
|
|
151
|
+
|
|
152
|
+
|
|
153
|
+
libmemcached_libmemcached_la_DEPENDENCIES=
|
|
154
|
+
libmemcached_libmemcached_la_LIBADD= $(LIBM)
|
|
155
|
+
libmemcached_libmemcached_la_LDFLAGS= ${AM_LDFLAGS} -version-info ${MEMCACHED_LIBRARY_VERSION}
|
|
156
|
+
|
|
157
|
+
if HAVE_SASL
|
|
158
|
+
libmemcached_libmemcached_la_LDFLAGS+= $(LTLIBSASL) $(LTLIBSASL2)
|
|
159
|
+
libmemcached_libmemcached_la_SOURCES += libmemcached/sasl.c
|
|
160
|
+
endif
|
|
161
|
+
|
|
162
|
+
if HAVE_DTRACE
|
|
163
|
+
BUILT_SOURCES+= libmemcached/dtrace_probes.h
|
|
164
|
+
CLEANFILES+= libmemcached/dtrace_probes.h
|
|
165
|
+
endif
|
|
166
|
+
|
|
167
|
+
if DTRACE_NEEDS_OBJECTS
|
|
168
|
+
libmemcached_libmemcached_la_SOURCES += libmemcached/libmemcached_probes.d
|
|
169
|
+
libmemcached_libmemcached_la_DEPENDENCIES += libmemcached/libmemcached_probes.o
|
|
170
|
+
libmemcached_libmemcached_la_LIBADD += libmemcached/libmemcached_probes.o
|
|
171
|
+
CLEANFILES+= libmemcached/libmemcached_probes.o
|
|
172
|
+
endif
|
|
173
|
+
|
|
174
|
+
SUFFIXES+= .d
|
|
175
|
+
|
|
176
|
+
libmemcached/dtrace_probes.h: libmemcached/libmemcached_probes.d
|
|
177
|
+
$(DTRACE) $(DTRACEFLAGS) -h -o libmemcached/dtrace_probes.h -s ${top_srcdir}/libmemcached/libmemcached_probes.d
|
|
178
|
+
|
|
179
|
+
libmemcached/libmemcached_probes.o: libmemcached/libmemcached_probes.d ${libmemcached_libmemcached_la_OBJECTS} config.h
|
|
180
|
+
|
|
181
|
+
.d.o:
|
|
182
|
+
$(DTRACE) $(DTRACEFLAGS) -o $@ -G -s $< `grep '^pic_object' ${top_builddir}/libmemcached/*.lo | cut -f 2 -d\' | sed "s/^/${top_builddir}\/libmemcached\//"`
|
|
183
|
+
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/* vim:expandtab:shiftwidth=2:tabstop=2:smarttab:
|
|
2
|
+
*
|
|
3
|
+
* Libmemcached library
|
|
4
|
+
*
|
|
5
|
+
* Copyright (C) 2011 Data Differential, http://datadifferential.com/
|
|
6
|
+
*
|
|
7
|
+
* Redistribution and use in source and binary forms, with or without
|
|
8
|
+
* modification, are permitted provided that the following conditions are
|
|
9
|
+
* met:
|
|
10
|
+
*
|
|
11
|
+
* * Redistributions of source code must retain the above copyright
|
|
12
|
+
* notice, this list of conditions and the following disclaimer.
|
|
13
|
+
*
|
|
14
|
+
* * Redistributions in binary form must reproduce the above
|
|
15
|
+
* copyright notice, this list of conditions and the following disclaimer
|
|
16
|
+
* in the documentation and/or other materials provided with the
|
|
17
|
+
* distribution.
|
|
18
|
+
*
|
|
19
|
+
* * The names of its contributors may not be used to endorse or
|
|
20
|
+
* promote products derived from this software without specific prior
|
|
21
|
+
* written permission.
|
|
22
|
+
*
|
|
23
|
+
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
24
|
+
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
25
|
+
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
26
|
+
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
27
|
+
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
28
|
+
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
29
|
+
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
30
|
+
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
31
|
+
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
32
|
+
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
33
|
+
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
34
|
+
*
|
|
35
|
+
*/
|
|
36
|
+
|
|
37
|
+
#include <libmemcached/common.h>
|
|
38
|
+
|
|
39
|
+
memcached_return_t initialize_query(memcached_st *self)
|
|
40
|
+
{
|
|
41
|
+
if (not self)
|
|
42
|
+
return MEMCACHED_INVALID_ARGUMENTS;
|
|
43
|
+
|
|
44
|
+
self->query_id++;
|
|
45
|
+
|
|
46
|
+
if (self->state.is_time_for_rebuild)
|
|
47
|
+
{
|
|
48
|
+
memcached_reset(self);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
if (memcached_server_count(self) == 0)
|
|
52
|
+
{
|
|
53
|
+
return memcached_set_error(*self, MEMCACHED_NO_SERVERS, MEMCACHED_AT);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
return MEMCACHED_SUCCESS;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
memcached_return_t initialize_const_query(const memcached_st *self)
|
|
60
|
+
{
|
|
61
|
+
if (not self)
|
|
62
|
+
return MEMCACHED_INVALID_ARGUMENTS;
|
|
63
|
+
|
|
64
|
+
if (memcached_server_count(self) == 0)
|
|
65
|
+
{
|
|
66
|
+
return MEMCACHED_NO_SERVERS;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
return MEMCACHED_SUCCESS;
|
|
70
|
+
}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/* vim:expandtab:shiftwidth=2:tabstop=2:smarttab:
|
|
2
|
+
*
|
|
3
|
+
* Libmemcached library
|
|
4
|
+
*
|
|
5
|
+
* Copyright (C) 2011 Data Differential, http://datadifferential.com/
|
|
6
|
+
*
|
|
7
|
+
* Redistribution and use in source and binary forms, with or without
|
|
8
|
+
* modification, are permitted provided that the following conditions are
|
|
9
|
+
* met:
|
|
10
|
+
*
|
|
11
|
+
* * Redistributions of source code must retain the above copyright
|
|
12
|
+
* notice, this list of conditions and the following disclaimer.
|
|
13
|
+
*
|
|
14
|
+
* * Redistributions in binary form must reproduce the above
|
|
15
|
+
* copyright notice, this list of conditions and the following disclaimer
|
|
16
|
+
* in the documentation and/or other materials provided with the
|
|
17
|
+
* distribution.
|
|
18
|
+
*
|
|
19
|
+
* * The names of its contributors may not be used to endorse or
|
|
20
|
+
* promote products derived from this software without specific prior
|
|
21
|
+
* written permission.
|
|
22
|
+
*
|
|
23
|
+
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
24
|
+
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
25
|
+
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
26
|
+
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
27
|
+
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
28
|
+
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
29
|
+
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
30
|
+
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
31
|
+
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
32
|
+
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
33
|
+
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
34
|
+
*
|
|
35
|
+
*/
|
|
36
|
+
|
|
37
|
+
#pragma once
|
|
38
|
+
|
|
39
|
+
#ifdef __cplusplus
|
|
40
|
+
extern "C" {
|
|
41
|
+
#endif
|
|
42
|
+
|
|
43
|
+
LIBMEMCACHED_LOCAL
|
|
44
|
+
memcached_return_t initialize_query(memcached_st *self);
|
|
45
|
+
|
|
46
|
+
LIBMEMCACHED_LOCAL
|
|
47
|
+
memcached_return_t initialize_const_query(const memcached_st *self);
|
|
48
|
+
|
|
49
|
+
#ifdef __cplusplus
|
|
50
|
+
} // extern "C"
|
|
51
|
+
#endif
|
|
@@ -0,0 +1,46 @@
|
|
|
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 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
|
+
#ifdef __cplusplus
|
|
45
|
+
}
|
|
46
|
+
#endif
|
|
@@ -0,0 +1,920 @@
|
|
|
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
|
+
#include <libmemcached/common.h>
|
|
41
|
+
#include <cassert>
|
|
42
|
+
|
|
43
|
+
enum memc_read_or_write {
|
|
44
|
+
MEM_READ,
|
|
45
|
+
MEM_WRITE
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
static ssize_t io_flush(memcached_server_write_instance_st ptr,
|
|
49
|
+
const bool with_flush,
|
|
50
|
+
memcached_return_t *error);
|
|
51
|
+
static void increment_udp_message_id(memcached_server_write_instance_st ptr);
|
|
52
|
+
|
|
53
|
+
static memcached_return_t io_wait(memcached_server_write_instance_st ptr,
|
|
54
|
+
memc_read_or_write read_or_write)
|
|
55
|
+
{
|
|
56
|
+
struct pollfd fds;
|
|
57
|
+
fds.fd= ptr->fd;
|
|
58
|
+
fds.events= POLLIN;
|
|
59
|
+
|
|
60
|
+
if (read_or_write == MEM_WRITE) /* write */
|
|
61
|
+
{
|
|
62
|
+
fds.events= POLLOUT;
|
|
63
|
+
WATCHPOINT_SET(ptr->io_wait_count.write++);
|
|
64
|
+
}
|
|
65
|
+
else
|
|
66
|
+
{
|
|
67
|
+
WATCHPOINT_SET(ptr->io_wait_count.read++);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/*
|
|
71
|
+
** We are going to block on write, but at least on Solaris we might block
|
|
72
|
+
** on write if we haven't read anything from our input buffer..
|
|
73
|
+
** Try to purge the input buffer if we don't do any flow control in the
|
|
74
|
+
** application layer (just sending a lot of data etc)
|
|
75
|
+
** The test is moved down in the purge function to avoid duplication of
|
|
76
|
+
** the test.
|
|
77
|
+
*/
|
|
78
|
+
if (read_or_write == MEM_WRITE)
|
|
79
|
+
{
|
|
80
|
+
memcached_return_t rc= memcached_purge(ptr);
|
|
81
|
+
if (rc != MEMCACHED_SUCCESS && rc != MEMCACHED_STORED)
|
|
82
|
+
{
|
|
83
|
+
return MEMCACHED_FAILURE;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
if (ptr->root->poll_timeout == 0) // Mimic 0 causes timeout behavior (not all platforms do this)
|
|
88
|
+
{
|
|
89
|
+
return memcached_set_error(*ptr, MEMCACHED_TIMEOUT, MEMCACHED_AT);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
size_t loop_max= 5;
|
|
93
|
+
while (--loop_max) // While loop is for ERESTART or EINTR
|
|
94
|
+
{
|
|
95
|
+
|
|
96
|
+
int error= poll(&fds, 1, ptr->root->poll_timeout);
|
|
97
|
+
switch (error)
|
|
98
|
+
{
|
|
99
|
+
case 1: // Success!
|
|
100
|
+
WATCHPOINT_IF_LABELED_NUMBER(read_or_write && loop_max < 4, "read() times we had to loop, decremented down from 5", loop_max);
|
|
101
|
+
WATCHPOINT_IF_LABELED_NUMBER(!read_or_write && loop_max < 4, "write() times we had to loop, decremented down from 5", loop_max);
|
|
102
|
+
|
|
103
|
+
return MEMCACHED_SUCCESS;
|
|
104
|
+
|
|
105
|
+
case 0: // Timeout occured, we let the while() loop do its thing.
|
|
106
|
+
return memcached_set_error(*ptr, MEMCACHED_TIMEOUT, MEMCACHED_AT);
|
|
107
|
+
|
|
108
|
+
default:
|
|
109
|
+
WATCHPOINT_ERRNO(get_socket_errno());
|
|
110
|
+
switch (get_socket_errno())
|
|
111
|
+
{
|
|
112
|
+
#ifdef TARGET_OS_LINUX
|
|
113
|
+
case ERESTART:
|
|
114
|
+
#endif
|
|
115
|
+
case EINTR:
|
|
116
|
+
break;
|
|
117
|
+
|
|
118
|
+
case EFAULT:
|
|
119
|
+
case ENOMEM:
|
|
120
|
+
return memcached_set_error(*ptr, MEMCACHED_MEMORY_ALLOCATION_FAILURE, MEMCACHED_AT);
|
|
121
|
+
|
|
122
|
+
case EINVAL:
|
|
123
|
+
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"));
|
|
124
|
+
|
|
125
|
+
default:
|
|
126
|
+
if (fds.revents & POLLERR)
|
|
127
|
+
{
|
|
128
|
+
int err;
|
|
129
|
+
socklen_t len= sizeof (err);
|
|
130
|
+
(void)getsockopt(ptr->fd, SOL_SOCKET, SO_ERROR, &err, &len);
|
|
131
|
+
ptr->cached_errno= (err == 0) ? get_socket_errno() : err;
|
|
132
|
+
}
|
|
133
|
+
else
|
|
134
|
+
{
|
|
135
|
+
ptr->cached_errno= get_socket_errno();
|
|
136
|
+
}
|
|
137
|
+
memcached_quit_server(ptr, true);
|
|
138
|
+
|
|
139
|
+
return memcached_set_errno(*ptr, get_socket_errno(), MEMCACHED_AT);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
ptr->cached_errno= get_socket_errno();
|
|
145
|
+
memcached_quit_server(ptr, true);
|
|
146
|
+
|
|
147
|
+
return memcached_set_error(*ptr, MEMCACHED_FAILURE, MEMCACHED_AT);
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
memcached_return_t memcached_io_wait_for_write(memcached_server_write_instance_st ptr)
|
|
151
|
+
{
|
|
152
|
+
return io_wait(ptr, MEM_WRITE);
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
/**
|
|
156
|
+
* Try to fill the input buffer for a server with as much
|
|
157
|
+
* data as possible.
|
|
158
|
+
*
|
|
159
|
+
* @param ptr the server to pack
|
|
160
|
+
*/
|
|
161
|
+
static bool repack_input_buffer(memcached_server_write_instance_st ptr)
|
|
162
|
+
{
|
|
163
|
+
if (ptr->read_ptr != ptr->read_buffer)
|
|
164
|
+
{
|
|
165
|
+
/* Move all of the data to the beginning of the buffer so
|
|
166
|
+
** that we can fit more data into the buffer...
|
|
167
|
+
*/
|
|
168
|
+
memmove(ptr->read_buffer, ptr->read_ptr, ptr->read_buffer_length);
|
|
169
|
+
ptr->read_ptr= ptr->read_buffer;
|
|
170
|
+
ptr->read_data_length= ptr->read_buffer_length;
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
/* There is room in the buffer, try to fill it! */
|
|
174
|
+
if (ptr->read_buffer_length != MEMCACHED_MAX_BUFFER)
|
|
175
|
+
{
|
|
176
|
+
do {
|
|
177
|
+
/* Just try a single read to grab what's available */
|
|
178
|
+
ssize_t nr= recv(ptr->fd,
|
|
179
|
+
ptr->read_ptr + ptr->read_data_length,
|
|
180
|
+
MEMCACHED_MAX_BUFFER - ptr->read_data_length,
|
|
181
|
+
MSG_DONTWAIT);
|
|
182
|
+
|
|
183
|
+
switch (nr)
|
|
184
|
+
{
|
|
185
|
+
case SOCKET_ERROR:
|
|
186
|
+
{
|
|
187
|
+
switch (get_socket_errno())
|
|
188
|
+
{
|
|
189
|
+
case EINTR:
|
|
190
|
+
continue;
|
|
191
|
+
|
|
192
|
+
case EWOULDBLOCK:
|
|
193
|
+
#ifdef USE_EAGAIN
|
|
194
|
+
case EAGAIN:
|
|
195
|
+
#endif
|
|
196
|
+
#ifdef TARGET_OS_LINUX
|
|
197
|
+
case ERESTART:
|
|
198
|
+
#endif
|
|
199
|
+
break; // No IO is fine, we can just move on
|
|
200
|
+
|
|
201
|
+
default:
|
|
202
|
+
memcached_set_errno(*ptr, get_socket_errno(), MEMCACHED_AT);
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
break;
|
|
206
|
+
|
|
207
|
+
case 0: // Shutdown on the socket has occurred
|
|
208
|
+
{
|
|
209
|
+
memcached_set_error(*ptr, MEMCACHED_CONNECTION_FAILURE, MEMCACHED_AT);
|
|
210
|
+
}
|
|
211
|
+
break;
|
|
212
|
+
|
|
213
|
+
default:
|
|
214
|
+
{
|
|
215
|
+
ptr->read_data_length+= size_t(nr);
|
|
216
|
+
ptr->read_buffer_length+= size_t(nr);
|
|
217
|
+
return true;
|
|
218
|
+
}
|
|
219
|
+
break;
|
|
220
|
+
}
|
|
221
|
+
} while (0);
|
|
222
|
+
}
|
|
223
|
+
return false;
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
/**
|
|
227
|
+
* If the we have callbacks connected to this server structure
|
|
228
|
+
* we may start process the input queue and fire the callbacks
|
|
229
|
+
* for the incomming messages. This function is _only_ called
|
|
230
|
+
* when the input buffer is full, so that we _know_ that we have
|
|
231
|
+
* at least _one_ message to process.
|
|
232
|
+
*
|
|
233
|
+
* @param ptr the server to star processing iput messages for
|
|
234
|
+
* @return true if we processed anything, false otherwise
|
|
235
|
+
*/
|
|
236
|
+
static bool process_input_buffer(memcached_server_write_instance_st ptr)
|
|
237
|
+
{
|
|
238
|
+
/*
|
|
239
|
+
** We might be able to process some of the response messages if we
|
|
240
|
+
** have a callback set up
|
|
241
|
+
*/
|
|
242
|
+
if (ptr->root->callbacks != NULL && ptr->root->flags.use_udp == false)
|
|
243
|
+
{
|
|
244
|
+
/*
|
|
245
|
+
* We might have responses... try to read them out and fire
|
|
246
|
+
* callbacks
|
|
247
|
+
*/
|
|
248
|
+
memcached_callback_st cb= *ptr->root->callbacks;
|
|
249
|
+
|
|
250
|
+
memcached_set_processing_input((memcached_st *)ptr->root, true);
|
|
251
|
+
|
|
252
|
+
char buffer[MEMCACHED_DEFAULT_COMMAND_SIZE];
|
|
253
|
+
memcached_return_t error;
|
|
254
|
+
memcached_st *root= (memcached_st *)ptr->root;
|
|
255
|
+
error= memcached_response(ptr, buffer, sizeof(buffer),
|
|
256
|
+
&root->result);
|
|
257
|
+
|
|
258
|
+
memcached_set_processing_input(root, false);
|
|
259
|
+
|
|
260
|
+
if (error == MEMCACHED_SUCCESS)
|
|
261
|
+
{
|
|
262
|
+
for (unsigned int x= 0; x < cb.number_of_callback; x++)
|
|
263
|
+
{
|
|
264
|
+
error= (*cb.callback[x])(ptr->root, &root->result, cb.context);
|
|
265
|
+
if (error != MEMCACHED_SUCCESS)
|
|
266
|
+
break;
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
/* @todo what should I do with the error message??? */
|
|
270
|
+
}
|
|
271
|
+
/* @todo what should I do with other error messages?? */
|
|
272
|
+
return true;
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
return false;
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
memcached_return_t memcached_io_read(memcached_server_write_instance_st ptr,
|
|
279
|
+
void *buffer, size_t length, ssize_t *nread)
|
|
280
|
+
{
|
|
281
|
+
assert(ptr); // Programmer error
|
|
282
|
+
char *buffer_ptr= static_cast<char *>(buffer);
|
|
283
|
+
|
|
284
|
+
if (ptr->fd == INVALID_SOCKET)
|
|
285
|
+
{
|
|
286
|
+
assert(int(ptr->state) <= int(MEMCACHED_SERVER_STATE_ADDRINFO));
|
|
287
|
+
return MEMCACHED_CONNECTION_FAILURE;
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
while (length)
|
|
291
|
+
{
|
|
292
|
+
if (not ptr->read_buffer_length)
|
|
293
|
+
{
|
|
294
|
+
ssize_t data_read;
|
|
295
|
+
do
|
|
296
|
+
{
|
|
297
|
+
data_read= recv(ptr->fd, ptr->read_buffer, MEMCACHED_MAX_BUFFER, MSG_DONTWAIT);
|
|
298
|
+
if (data_read == SOCKET_ERROR)
|
|
299
|
+
{
|
|
300
|
+
switch (get_socket_errno())
|
|
301
|
+
{
|
|
302
|
+
case EINTR: // We just retry
|
|
303
|
+
continue;
|
|
304
|
+
|
|
305
|
+
case ETIMEDOUT: // OSX
|
|
306
|
+
case EWOULDBLOCK:
|
|
307
|
+
#ifdef USE_EAGAIN
|
|
308
|
+
case EAGAIN:
|
|
309
|
+
#endif
|
|
310
|
+
#ifdef TARGET_OS_LINUX
|
|
311
|
+
case ERESTART:
|
|
312
|
+
#endif
|
|
313
|
+
if (memcached_success(io_wait(ptr, MEM_READ)))
|
|
314
|
+
{
|
|
315
|
+
continue;
|
|
316
|
+
}
|
|
317
|
+
return MEMCACHED_IN_PROGRESS;
|
|
318
|
+
|
|
319
|
+
/* fall through */
|
|
320
|
+
|
|
321
|
+
case ENOTCONN: // Programmer Error
|
|
322
|
+
WATCHPOINT_ASSERT(0);
|
|
323
|
+
case ENOTSOCK:
|
|
324
|
+
WATCHPOINT_ASSERT(0);
|
|
325
|
+
case EBADF:
|
|
326
|
+
assert(ptr->fd != INVALID_SOCKET);
|
|
327
|
+
case EINVAL:
|
|
328
|
+
case EFAULT:
|
|
329
|
+
case ECONNREFUSED:
|
|
330
|
+
default:
|
|
331
|
+
{
|
|
332
|
+
memcached_quit_server(ptr, true);
|
|
333
|
+
*nread= -1;
|
|
334
|
+
return memcached_set_errno(*ptr, get_socket_errno(), MEMCACHED_AT);
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
else if (data_read == 0)
|
|
339
|
+
{
|
|
340
|
+
/*
|
|
341
|
+
EOF. Any data received so far is incomplete
|
|
342
|
+
so discard it. This always reads by byte in case of TCP
|
|
343
|
+
and protocol enforcement happens at memcached_response()
|
|
344
|
+
looking for '\n'. We do not care for UDB which requests 8 bytes
|
|
345
|
+
at once. Generally, this means that connection went away. Since
|
|
346
|
+
for blocking I/O we do not return 0 and for non-blocking case
|
|
347
|
+
it will return EGAIN if data is not immediatly available.
|
|
348
|
+
*/
|
|
349
|
+
WATCHPOINT_STRING("We had a zero length recv()");
|
|
350
|
+
assert(0);
|
|
351
|
+
memcached_quit_server(ptr, true);
|
|
352
|
+
*nread= -1;
|
|
353
|
+
return memcached_set_error(*ptr, MEMCACHED_UNKNOWN_READ_FAILURE, MEMCACHED_AT);
|
|
354
|
+
}
|
|
355
|
+
} while (data_read <= 0);
|
|
356
|
+
|
|
357
|
+
ptr->io_bytes_sent = 0;
|
|
358
|
+
ptr->read_data_length= (size_t) data_read;
|
|
359
|
+
ptr->read_buffer_length= (size_t) data_read;
|
|
360
|
+
ptr->read_ptr= ptr->read_buffer;
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
if (length > 1)
|
|
364
|
+
{
|
|
365
|
+
size_t difference;
|
|
366
|
+
|
|
367
|
+
difference= (length > ptr->read_buffer_length) ? ptr->read_buffer_length : length;
|
|
368
|
+
|
|
369
|
+
memcpy(buffer_ptr, ptr->read_ptr, difference);
|
|
370
|
+
length -= difference;
|
|
371
|
+
ptr->read_ptr+= difference;
|
|
372
|
+
ptr->read_buffer_length-= difference;
|
|
373
|
+
buffer_ptr+= difference;
|
|
374
|
+
}
|
|
375
|
+
else
|
|
376
|
+
{
|
|
377
|
+
*buffer_ptr= *ptr->read_ptr;
|
|
378
|
+
ptr->read_ptr++;
|
|
379
|
+
ptr->read_buffer_length--;
|
|
380
|
+
buffer_ptr++;
|
|
381
|
+
break;
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
ptr->server_failure_counter= 0;
|
|
386
|
+
*nread = (ssize_t)(buffer_ptr - (char*)buffer);
|
|
387
|
+
return MEMCACHED_SUCCESS;
|
|
388
|
+
}
|
|
389
|
+
|
|
390
|
+
memcached_return_t memcached_io_slurp(memcached_server_write_instance_st ptr)
|
|
391
|
+
{
|
|
392
|
+
assert(ptr); // Programmer error
|
|
393
|
+
|
|
394
|
+
if (ptr->fd == INVALID_SOCKET)
|
|
395
|
+
{
|
|
396
|
+
assert(int(ptr->state) <= int(MEMCACHED_SERVER_STATE_ADDRINFO));
|
|
397
|
+
return MEMCACHED_CONNECTION_FAILURE;
|
|
398
|
+
}
|
|
399
|
+
|
|
400
|
+
ssize_t data_read;
|
|
401
|
+
char buffer[MEMCACHED_MAX_BUFFER];
|
|
402
|
+
do
|
|
403
|
+
{
|
|
404
|
+
data_read= recv(ptr->fd, ptr->read_buffer, sizeof(buffer), MSG_DONTWAIT);
|
|
405
|
+
if (data_read == SOCKET_ERROR)
|
|
406
|
+
{
|
|
407
|
+
switch (get_socket_errno())
|
|
408
|
+
{
|
|
409
|
+
case EINTR: // We just retry
|
|
410
|
+
continue;
|
|
411
|
+
|
|
412
|
+
case ETIMEDOUT: // OSX
|
|
413
|
+
case EWOULDBLOCK:
|
|
414
|
+
#ifdef USE_EAGAIN
|
|
415
|
+
case EAGAIN:
|
|
416
|
+
#endif
|
|
417
|
+
#ifdef TARGET_OS_LINUX
|
|
418
|
+
case ERESTART:
|
|
419
|
+
#endif
|
|
420
|
+
if (memcached_success(io_wait(ptr, MEM_READ)))
|
|
421
|
+
{
|
|
422
|
+
continue;
|
|
423
|
+
}
|
|
424
|
+
return MEMCACHED_IN_PROGRESS;
|
|
425
|
+
|
|
426
|
+
/* fall through */
|
|
427
|
+
|
|
428
|
+
case ENOTCONN: // Programmer Error
|
|
429
|
+
WATCHPOINT_ASSERT(0);
|
|
430
|
+
case ENOTSOCK:
|
|
431
|
+
WATCHPOINT_ASSERT(0);
|
|
432
|
+
case EBADF:
|
|
433
|
+
assert(ptr->fd != INVALID_SOCKET);
|
|
434
|
+
case EINVAL:
|
|
435
|
+
case EFAULT:
|
|
436
|
+
case ECONNREFUSED:
|
|
437
|
+
default:
|
|
438
|
+
return MEMCACHED_CONNECTION_FAILURE; // We want this!
|
|
439
|
+
}
|
|
440
|
+
}
|
|
441
|
+
} while (data_read > 0);
|
|
442
|
+
|
|
443
|
+
return MEMCACHED_CONNECTION_FAILURE;
|
|
444
|
+
}
|
|
445
|
+
|
|
446
|
+
static ssize_t _io_write(memcached_server_write_instance_st ptr,
|
|
447
|
+
const void *buffer, size_t length, bool with_flush)
|
|
448
|
+
{
|
|
449
|
+
size_t original_length;
|
|
450
|
+
const char* buffer_ptr;
|
|
451
|
+
|
|
452
|
+
WATCHPOINT_ASSERT(ptr->fd != INVALID_SOCKET);
|
|
453
|
+
|
|
454
|
+
original_length= length;
|
|
455
|
+
buffer_ptr= static_cast<const char *>(buffer);
|
|
456
|
+
|
|
457
|
+
while (length)
|
|
458
|
+
{
|
|
459
|
+
char *write_ptr;
|
|
460
|
+
size_t should_write;
|
|
461
|
+
size_t buffer_end;
|
|
462
|
+
|
|
463
|
+
if (ptr->type == MEMCACHED_CONNECTION_UDP)
|
|
464
|
+
{
|
|
465
|
+
//UDP does not support partial writes
|
|
466
|
+
buffer_end= MAX_UDP_DATAGRAM_LENGTH;
|
|
467
|
+
should_write= length;
|
|
468
|
+
if (ptr->write_buffer_offset + should_write > buffer_end)
|
|
469
|
+
{
|
|
470
|
+
return -1;
|
|
471
|
+
}
|
|
472
|
+
}
|
|
473
|
+
else
|
|
474
|
+
{
|
|
475
|
+
buffer_end= MEMCACHED_MAX_BUFFER;
|
|
476
|
+
should_write= buffer_end - ptr->write_buffer_offset;
|
|
477
|
+
should_write= (should_write < length) ? should_write : length;
|
|
478
|
+
}
|
|
479
|
+
|
|
480
|
+
write_ptr= ptr->write_buffer + ptr->write_buffer_offset;
|
|
481
|
+
memcpy(write_ptr, buffer_ptr, should_write);
|
|
482
|
+
ptr->write_buffer_offset+= should_write;
|
|
483
|
+
buffer_ptr+= should_write;
|
|
484
|
+
length-= should_write;
|
|
485
|
+
|
|
486
|
+
if (ptr->write_buffer_offset == buffer_end && ptr->type != MEMCACHED_CONNECTION_UDP)
|
|
487
|
+
{
|
|
488
|
+
WATCHPOINT_ASSERT(ptr->fd != INVALID_SOCKET);
|
|
489
|
+
|
|
490
|
+
memcached_return_t rc;
|
|
491
|
+
ssize_t sent_length= io_flush(ptr, with_flush, &rc);
|
|
492
|
+
if (sent_length == -1)
|
|
493
|
+
{
|
|
494
|
+
return -1;
|
|
495
|
+
}
|
|
496
|
+
|
|
497
|
+
/* If io_flush calls memcached_purge, sent_length may be 0 */
|
|
498
|
+
unlikely (sent_length != 0)
|
|
499
|
+
{
|
|
500
|
+
WATCHPOINT_ASSERT(sent_length == (ssize_t)buffer_end);
|
|
501
|
+
}
|
|
502
|
+
}
|
|
503
|
+
}
|
|
504
|
+
|
|
505
|
+
if (with_flush)
|
|
506
|
+
{
|
|
507
|
+
memcached_return_t rc;
|
|
508
|
+
WATCHPOINT_ASSERT(ptr->fd != INVALID_SOCKET);
|
|
509
|
+
if (io_flush(ptr, with_flush, &rc) == -1)
|
|
510
|
+
{
|
|
511
|
+
return -1;
|
|
512
|
+
}
|
|
513
|
+
}
|
|
514
|
+
|
|
515
|
+
return (ssize_t) original_length;
|
|
516
|
+
}
|
|
517
|
+
|
|
518
|
+
ssize_t memcached_io_write(memcached_server_write_instance_st ptr,
|
|
519
|
+
const void *buffer, size_t length, bool with_flush)
|
|
520
|
+
{
|
|
521
|
+
return _io_write(ptr, buffer, length, with_flush);
|
|
522
|
+
}
|
|
523
|
+
|
|
524
|
+
ssize_t memcached_io_writev(memcached_server_write_instance_st ptr,
|
|
525
|
+
const struct libmemcached_io_vector_st *vector,
|
|
526
|
+
size_t number_of, bool with_flush)
|
|
527
|
+
{
|
|
528
|
+
ssize_t total= 0;
|
|
529
|
+
|
|
530
|
+
for (size_t x= 0; x < number_of; x++, vector++)
|
|
531
|
+
{
|
|
532
|
+
ssize_t returnable;
|
|
533
|
+
|
|
534
|
+
if ((returnable= _io_write(ptr, vector->buffer, vector->length, false)) == -1)
|
|
535
|
+
{
|
|
536
|
+
return -1;
|
|
537
|
+
}
|
|
538
|
+
total+= returnable;
|
|
539
|
+
}
|
|
540
|
+
|
|
541
|
+
if (with_flush)
|
|
542
|
+
{
|
|
543
|
+
if (memcached_io_write(ptr, NULL, 0, true) == -1)
|
|
544
|
+
{
|
|
545
|
+
return -1;
|
|
546
|
+
}
|
|
547
|
+
}
|
|
548
|
+
|
|
549
|
+
return total;
|
|
550
|
+
}
|
|
551
|
+
|
|
552
|
+
|
|
553
|
+
void memcached_io_close(memcached_server_write_instance_st ptr)
|
|
554
|
+
{
|
|
555
|
+
if (ptr->fd == INVALID_SOCKET)
|
|
556
|
+
{
|
|
557
|
+
return;
|
|
558
|
+
}
|
|
559
|
+
|
|
560
|
+
/* in case of death shutdown to avoid blocking at close() */
|
|
561
|
+
if (shutdown(ptr->fd, SHUT_RDWR) == SOCKET_ERROR && get_socket_errno() != ENOTCONN)
|
|
562
|
+
{
|
|
563
|
+
WATCHPOINT_NUMBER(ptr->fd);
|
|
564
|
+
WATCHPOINT_ERRNO(get_socket_errno());
|
|
565
|
+
WATCHPOINT_ASSERT(get_socket_errno());
|
|
566
|
+
}
|
|
567
|
+
|
|
568
|
+
if (closesocket(ptr->fd) == SOCKET_ERROR)
|
|
569
|
+
{
|
|
570
|
+
WATCHPOINT_ERRNO(get_socket_errno());
|
|
571
|
+
}
|
|
572
|
+
ptr->state= MEMCACHED_SERVER_STATE_NEW;
|
|
573
|
+
ptr->fd= INVALID_SOCKET;
|
|
574
|
+
}
|
|
575
|
+
|
|
576
|
+
memcached_server_write_instance_st memcached_io_get_readable_server(memcached_st *memc)
|
|
577
|
+
{
|
|
578
|
+
#define MAX_SERVERS_TO_POLL 100
|
|
579
|
+
struct pollfd fds[MAX_SERVERS_TO_POLL];
|
|
580
|
+
unsigned int host_index= 0;
|
|
581
|
+
|
|
582
|
+
for (uint32_t x= 0; x < memcached_server_count(memc) && host_index < MAX_SERVERS_TO_POLL; ++x)
|
|
583
|
+
{
|
|
584
|
+
memcached_server_write_instance_st instance=
|
|
585
|
+
memcached_server_instance_fetch(memc, x);
|
|
586
|
+
|
|
587
|
+
if (instance->read_buffer_length > 0) /* I have data in the buffer */
|
|
588
|
+
return instance;
|
|
589
|
+
|
|
590
|
+
if (memcached_server_response_count(instance) > 0)
|
|
591
|
+
{
|
|
592
|
+
fds[host_index].events = POLLIN;
|
|
593
|
+
fds[host_index].revents = 0;
|
|
594
|
+
fds[host_index].fd = instance->fd;
|
|
595
|
+
++host_index;
|
|
596
|
+
}
|
|
597
|
+
}
|
|
598
|
+
|
|
599
|
+
if (host_index < 2)
|
|
600
|
+
{
|
|
601
|
+
/* We have 0 or 1 server with pending events.. */
|
|
602
|
+
for (uint32_t x= 0; x< memcached_server_count(memc); ++x)
|
|
603
|
+
{
|
|
604
|
+
memcached_server_write_instance_st instance=
|
|
605
|
+
memcached_server_instance_fetch(memc, x);
|
|
606
|
+
|
|
607
|
+
if (memcached_server_response_count(instance) > 0)
|
|
608
|
+
{
|
|
609
|
+
return instance;
|
|
610
|
+
}
|
|
611
|
+
}
|
|
612
|
+
|
|
613
|
+
return NULL;
|
|
614
|
+
}
|
|
615
|
+
|
|
616
|
+
int error= poll(fds, host_index, memc->poll_timeout);
|
|
617
|
+
switch (error)
|
|
618
|
+
{
|
|
619
|
+
case -1:
|
|
620
|
+
memcached_set_errno(*memc, get_socket_errno(), MEMCACHED_AT);
|
|
621
|
+
/* FALLTHROUGH */
|
|
622
|
+
case 0:
|
|
623
|
+
break;
|
|
624
|
+
|
|
625
|
+
default:
|
|
626
|
+
for (size_t x= 0; x < host_index; ++x)
|
|
627
|
+
{
|
|
628
|
+
if (fds[x].revents & POLLIN)
|
|
629
|
+
{
|
|
630
|
+
for (uint32_t y= 0; y < memcached_server_count(memc); ++y)
|
|
631
|
+
{
|
|
632
|
+
memcached_server_write_instance_st instance=
|
|
633
|
+
memcached_server_instance_fetch(memc, y);
|
|
634
|
+
|
|
635
|
+
if (instance->fd == fds[x].fd)
|
|
636
|
+
return instance;
|
|
637
|
+
}
|
|
638
|
+
}
|
|
639
|
+
}
|
|
640
|
+
}
|
|
641
|
+
|
|
642
|
+
return NULL;
|
|
643
|
+
}
|
|
644
|
+
|
|
645
|
+
static ssize_t io_flush(memcached_server_write_instance_st ptr,
|
|
646
|
+
const bool with_flush,
|
|
647
|
+
memcached_return_t *error)
|
|
648
|
+
{
|
|
649
|
+
/*
|
|
650
|
+
** We might want to purge the input buffer if we haven't consumed
|
|
651
|
+
** any output yet... The test for the limits is the purge is inline
|
|
652
|
+
** in the purge function to avoid duplicating the logic..
|
|
653
|
+
*/
|
|
654
|
+
{
|
|
655
|
+
memcached_return_t rc;
|
|
656
|
+
WATCHPOINT_ASSERT(ptr->fd != INVALID_SOCKET);
|
|
657
|
+
rc= memcached_purge(ptr);
|
|
658
|
+
|
|
659
|
+
if (rc != MEMCACHED_SUCCESS && rc != MEMCACHED_STORED)
|
|
660
|
+
{
|
|
661
|
+
return -1;
|
|
662
|
+
}
|
|
663
|
+
}
|
|
664
|
+
ssize_t sent_length;
|
|
665
|
+
size_t return_length;
|
|
666
|
+
char *local_write_ptr= ptr->write_buffer;
|
|
667
|
+
size_t write_length= ptr->write_buffer_offset;
|
|
668
|
+
|
|
669
|
+
*error= MEMCACHED_SUCCESS;
|
|
670
|
+
|
|
671
|
+
WATCHPOINT_ASSERT(ptr->fd != INVALID_SOCKET);
|
|
672
|
+
|
|
673
|
+
// UDP Sanity check, make sure that we are not sending somthing too big
|
|
674
|
+
if (ptr->type == MEMCACHED_CONNECTION_UDP && write_length > MAX_UDP_DATAGRAM_LENGTH)
|
|
675
|
+
{
|
|
676
|
+
*error= MEMCACHED_WRITE_FAILURE;
|
|
677
|
+
return -1;
|
|
678
|
+
}
|
|
679
|
+
|
|
680
|
+
if (ptr->write_buffer_offset == 0 || (ptr->type == MEMCACHED_CONNECTION_UDP
|
|
681
|
+
&& ptr->write_buffer_offset == UDP_DATAGRAM_HEADER_LENGTH))
|
|
682
|
+
{
|
|
683
|
+
return 0;
|
|
684
|
+
}
|
|
685
|
+
|
|
686
|
+
/* Looking for memory overflows */
|
|
687
|
+
#if defined(DEBUG)
|
|
688
|
+
if (write_length == MEMCACHED_MAX_BUFFER)
|
|
689
|
+
WATCHPOINT_ASSERT(ptr->write_buffer == local_write_ptr);
|
|
690
|
+
WATCHPOINT_ASSERT((ptr->write_buffer + MEMCACHED_MAX_BUFFER) >= (local_write_ptr + write_length));
|
|
691
|
+
#endif
|
|
692
|
+
|
|
693
|
+
return_length= 0;
|
|
694
|
+
while (write_length)
|
|
695
|
+
{
|
|
696
|
+
WATCHPOINT_ASSERT(ptr->fd != INVALID_SOCKET);
|
|
697
|
+
WATCHPOINT_ASSERT(write_length > 0);
|
|
698
|
+
sent_length= 0;
|
|
699
|
+
if (ptr->type == MEMCACHED_CONNECTION_UDP)
|
|
700
|
+
increment_udp_message_id(ptr);
|
|
701
|
+
|
|
702
|
+
WATCHPOINT_ASSERT(ptr->fd != INVALID_SOCKET);
|
|
703
|
+
if (with_flush)
|
|
704
|
+
{
|
|
705
|
+
sent_length= send(ptr->fd, local_write_ptr, write_length, MSG_NOSIGNAL|MSG_DONTWAIT);
|
|
706
|
+
}
|
|
707
|
+
else
|
|
708
|
+
{
|
|
709
|
+
sent_length= send(ptr->fd, local_write_ptr, write_length, MSG_NOSIGNAL|MSG_DONTWAIT|MSG_MORE);
|
|
710
|
+
}
|
|
711
|
+
|
|
712
|
+
if (sent_length == SOCKET_ERROR)
|
|
713
|
+
{
|
|
714
|
+
ptr->cached_errno= get_socket_errno();
|
|
715
|
+
#if 0 // @todo I should look at why we hit this bit of code hard frequently
|
|
716
|
+
WATCHPOINT_ERRNO(get_socket_errno());
|
|
717
|
+
WATCHPOINT_NUMBER(get_socket_errno());
|
|
718
|
+
#endif
|
|
719
|
+
switch (get_socket_errno())
|
|
720
|
+
{
|
|
721
|
+
case ENOBUFS:
|
|
722
|
+
continue;
|
|
723
|
+
case EWOULDBLOCK:
|
|
724
|
+
#ifdef USE_EAGAIN
|
|
725
|
+
case EAGAIN:
|
|
726
|
+
#endif
|
|
727
|
+
{
|
|
728
|
+
/*
|
|
729
|
+
* We may be blocked on write because the input buffer
|
|
730
|
+
* is full. Let's check if we have room in our input
|
|
731
|
+
* buffer for more data and retry the write before
|
|
732
|
+
* waiting..
|
|
733
|
+
*/
|
|
734
|
+
if (repack_input_buffer(ptr) or
|
|
735
|
+
process_input_buffer(ptr))
|
|
736
|
+
{
|
|
737
|
+
continue;
|
|
738
|
+
}
|
|
739
|
+
|
|
740
|
+
memcached_return_t rc= io_wait(ptr, MEM_WRITE);
|
|
741
|
+
if (memcached_success(rc))
|
|
742
|
+
{
|
|
743
|
+
continue;
|
|
744
|
+
}
|
|
745
|
+
else if (rc == MEMCACHED_TIMEOUT)
|
|
746
|
+
{
|
|
747
|
+
*error= memcached_set_error(*ptr, MEMCACHED_TIMEOUT, MEMCACHED_AT);
|
|
748
|
+
return -1;
|
|
749
|
+
}
|
|
750
|
+
|
|
751
|
+
memcached_quit_server(ptr, true);
|
|
752
|
+
*error= memcached_set_errno(*ptr, get_socket_errno(), MEMCACHED_AT);
|
|
753
|
+
return -1;
|
|
754
|
+
}
|
|
755
|
+
case ENOTCONN:
|
|
756
|
+
case EPIPE:
|
|
757
|
+
default:
|
|
758
|
+
memcached_quit_server(ptr, true);
|
|
759
|
+
*error= memcached_set_errno(*ptr, get_socket_errno(), MEMCACHED_AT);
|
|
760
|
+
WATCHPOINT_ASSERT(ptr->fd == -1);
|
|
761
|
+
return -1;
|
|
762
|
+
}
|
|
763
|
+
}
|
|
764
|
+
|
|
765
|
+
if (ptr->type == MEMCACHED_CONNECTION_UDP and
|
|
766
|
+
(size_t)sent_length != write_length)
|
|
767
|
+
{
|
|
768
|
+
memcached_quit_server(ptr, true);
|
|
769
|
+
*error= memcached_set_error(*ptr, MEMCACHED_WRITE_FAILURE, MEMCACHED_AT);
|
|
770
|
+
return -1;
|
|
771
|
+
}
|
|
772
|
+
|
|
773
|
+
ptr->io_bytes_sent += (uint32_t) sent_length;
|
|
774
|
+
|
|
775
|
+
local_write_ptr+= sent_length;
|
|
776
|
+
write_length-= (uint32_t) sent_length;
|
|
777
|
+
return_length+= (uint32_t) sent_length;
|
|
778
|
+
}
|
|
779
|
+
|
|
780
|
+
WATCHPOINT_ASSERT(write_length == 0);
|
|
781
|
+
// Need to study this assert() WATCHPOINT_ASSERT(return_length ==
|
|
782
|
+
// ptr->write_buffer_offset);
|
|
783
|
+
|
|
784
|
+
// if we are a udp server, the begining of the buffer is reserverd for
|
|
785
|
+
// the upd frame header
|
|
786
|
+
if (ptr->type == MEMCACHED_CONNECTION_UDP)
|
|
787
|
+
ptr->write_buffer_offset= UDP_DATAGRAM_HEADER_LENGTH;
|
|
788
|
+
else
|
|
789
|
+
ptr->write_buffer_offset= 0;
|
|
790
|
+
|
|
791
|
+
return (ssize_t) return_length;
|
|
792
|
+
}
|
|
793
|
+
|
|
794
|
+
/*
|
|
795
|
+
Eventually we will just kill off the server with the problem.
|
|
796
|
+
*/
|
|
797
|
+
void memcached_io_reset(memcached_server_write_instance_st ptr)
|
|
798
|
+
{
|
|
799
|
+
memcached_quit_server(ptr, true);
|
|
800
|
+
}
|
|
801
|
+
|
|
802
|
+
/**
|
|
803
|
+
* Read a given number of bytes from the server and place it into a specific
|
|
804
|
+
* buffer. Reset the IO channel on this server if an error occurs.
|
|
805
|
+
*/
|
|
806
|
+
memcached_return_t memcached_safe_read(memcached_server_write_instance_st ptr,
|
|
807
|
+
void *dta,
|
|
808
|
+
size_t size)
|
|
809
|
+
{
|
|
810
|
+
size_t offset= 0;
|
|
811
|
+
char *data= static_cast<char *>(dta);
|
|
812
|
+
|
|
813
|
+
while (offset < size)
|
|
814
|
+
{
|
|
815
|
+
ssize_t nread;
|
|
816
|
+
memcached_return_t rc;
|
|
817
|
+
|
|
818
|
+
while (memcached_continue(rc= memcached_io_read(ptr, data + offset, size - offset, &nread))) { };
|
|
819
|
+
|
|
820
|
+
if (memcached_failed(rc))
|
|
821
|
+
{
|
|
822
|
+
return rc;
|
|
823
|
+
}
|
|
824
|
+
|
|
825
|
+
offset+= (size_t) nread;
|
|
826
|
+
}
|
|
827
|
+
|
|
828
|
+
return MEMCACHED_SUCCESS;
|
|
829
|
+
}
|
|
830
|
+
|
|
831
|
+
memcached_return_t memcached_io_readline(memcached_server_write_instance_st ptr,
|
|
832
|
+
char *buffer_ptr,
|
|
833
|
+
size_t size)
|
|
834
|
+
{
|
|
835
|
+
bool line_complete= false;
|
|
836
|
+
size_t total_nr= 0;
|
|
837
|
+
|
|
838
|
+
while (not line_complete)
|
|
839
|
+
{
|
|
840
|
+
if (ptr->read_buffer_length == 0)
|
|
841
|
+
{
|
|
842
|
+
/*
|
|
843
|
+
* We don't have any data in the buffer, so let's fill the read
|
|
844
|
+
* buffer. Call the standard read function to avoid duplicating
|
|
845
|
+
* the logic.
|
|
846
|
+
*/
|
|
847
|
+
ssize_t nread;
|
|
848
|
+
memcached_return_t rc= memcached_io_read(ptr, buffer_ptr, 1, &nread);
|
|
849
|
+
if (memcached_failed(rc) and rc == MEMCACHED_IN_PROGRESS)
|
|
850
|
+
{
|
|
851
|
+
memcached_quit_server(ptr, true);
|
|
852
|
+
return memcached_set_error(*ptr, rc, MEMCACHED_AT);
|
|
853
|
+
}
|
|
854
|
+
else if (memcached_failed(rc))
|
|
855
|
+
{
|
|
856
|
+
return rc;
|
|
857
|
+
}
|
|
858
|
+
|
|
859
|
+
if (*buffer_ptr == '\n')
|
|
860
|
+
line_complete= true;
|
|
861
|
+
|
|
862
|
+
++buffer_ptr;
|
|
863
|
+
++total_nr;
|
|
864
|
+
}
|
|
865
|
+
|
|
866
|
+
/* Now let's look in the buffer and copy as we go! */
|
|
867
|
+
while (ptr->read_buffer_length && total_nr < size && !line_complete)
|
|
868
|
+
{
|
|
869
|
+
*buffer_ptr = *ptr->read_ptr;
|
|
870
|
+
if (*buffer_ptr == '\n')
|
|
871
|
+
line_complete = true;
|
|
872
|
+
--ptr->read_buffer_length;
|
|
873
|
+
++ptr->read_ptr;
|
|
874
|
+
++total_nr;
|
|
875
|
+
++buffer_ptr;
|
|
876
|
+
}
|
|
877
|
+
|
|
878
|
+
if (total_nr == size)
|
|
879
|
+
return MEMCACHED_PROTOCOL_ERROR;
|
|
880
|
+
}
|
|
881
|
+
|
|
882
|
+
return MEMCACHED_SUCCESS;
|
|
883
|
+
}
|
|
884
|
+
|
|
885
|
+
/*
|
|
886
|
+
* The udp request id consists of two seperate sections
|
|
887
|
+
* 1) The thread id
|
|
888
|
+
* 2) The message number
|
|
889
|
+
* The thread id should only be set when the memcached_st struct is created
|
|
890
|
+
* and should not be changed.
|
|
891
|
+
*
|
|
892
|
+
* The message num is incremented for each new message we send, this function
|
|
893
|
+
* extracts the message number from message_id, increments it and then
|
|
894
|
+
* writes the new value back into the header
|
|
895
|
+
*/
|
|
896
|
+
static void increment_udp_message_id(memcached_server_write_instance_st ptr)
|
|
897
|
+
{
|
|
898
|
+
struct udp_datagram_header_st *header= (struct udp_datagram_header_st *)ptr->write_buffer;
|
|
899
|
+
uint16_t cur_req= get_udp_datagram_request_id(header);
|
|
900
|
+
int msg_num= get_msg_num_from_request_id(cur_req);
|
|
901
|
+
int thread_id= get_thread_id_from_request_id(cur_req);
|
|
902
|
+
|
|
903
|
+
if (((++msg_num) & UDP_REQUEST_ID_THREAD_MASK) != 0)
|
|
904
|
+
msg_num= 0;
|
|
905
|
+
|
|
906
|
+
header->request_id= htons((uint16_t) (thread_id | msg_num));
|
|
907
|
+
}
|
|
908
|
+
|
|
909
|
+
memcached_return_t memcached_io_init_udp_header(memcached_server_write_instance_st ptr, uint16_t thread_id)
|
|
910
|
+
{
|
|
911
|
+
if (thread_id > UDP_REQUEST_ID_MAX_THREAD_ID)
|
|
912
|
+
return MEMCACHED_FAILURE;
|
|
913
|
+
|
|
914
|
+
struct udp_datagram_header_st *header= (struct udp_datagram_header_st *)ptr->write_buffer;
|
|
915
|
+
header->request_id= htons((uint16_t) (generate_udp_request_thread_id(thread_id)));
|
|
916
|
+
header->num_datagrams= htons(1);
|
|
917
|
+
header->sequence_number= htons(0);
|
|
918
|
+
|
|
919
|
+
return MEMCACHED_SUCCESS;
|
|
920
|
+
}
|