vinted-memcached 1.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/BENCHMARKS +142 -0
- data/CHANGELOG +176 -0
- data/Gemfile +11 -0
- data/Gemfile.lock +45 -0
- data/LICENSE +184 -0
- data/Manifest +209 -0
- data/README.rdoc +124 -0
- data/Rakefile +134 -0
- data/TODO +1 -0
- data/ext/extconf-make.rb +25 -0
- data/ext/extconf.rb +78 -0
- data/ext/libmemcached-0.32/AUTHORS +7 -0
- data/ext/libmemcached-0.32/COPYING +32 -0
- data/ext/libmemcached-0.32/ChangeLog +303 -0
- data/ext/libmemcached-0.32/INSTALL +302 -0
- data/ext/libmemcached-0.32/Makefile.am +36 -0
- data/ext/libmemcached-0.32/Makefile.in +911 -0
- data/ext/libmemcached-0.32/NEWS +1 -0
- data/ext/libmemcached-0.32/README +33 -0
- data/ext/libmemcached-0.32/THANKS +14 -0
- data/ext/libmemcached-0.32/TODO +11 -0
- data/ext/libmemcached-0.32/aclocal.m4 +2108 -0
- data/ext/libmemcached-0.32/clients/Makefile.am +80 -0
- data/ext/libmemcached-0.32/clients/Makefile.in +773 -0
- data/ext/libmemcached-0.32/clients/client_options.h +32 -0
- data/ext/libmemcached-0.32/clients/execute.c +64 -0
- data/ext/libmemcached-0.32/clients/execute.h +5 -0
- data/ext/libmemcached-0.32/clients/generator.c +74 -0
- data/ext/libmemcached-0.32/clients/generator.h +20 -0
- data/ext/libmemcached-0.32/clients/memcat.c +178 -0
- data/ext/libmemcached-0.32/clients/memcp.c +251 -0
- data/ext/libmemcached-0.32/clients/memdump.c +170 -0
- data/ext/libmemcached-0.32/clients/memerror.c +80 -0
- data/ext/libmemcached-0.32/clients/memflush.c +143 -0
- data/ext/libmemcached-0.32/clients/memrm.c +160 -0
- data/ext/libmemcached-0.32/clients/memslap.c +441 -0
- data/ext/libmemcached-0.32/clients/memstat.c +326 -0
- data/ext/libmemcached-0.32/clients/utilities.c +207 -0
- data/ext/libmemcached-0.32/clients/utilities.h +41 -0
- data/ext/libmemcached-0.32/config/compile +143 -0
- data/ext/libmemcached-0.32/config/config.guess +1561 -0
- data/ext/libmemcached-0.32/config/config.rpath +666 -0
- data/ext/libmemcached-0.32/config/config.sub +1686 -0
- data/ext/libmemcached-0.32/config/depcomp +630 -0
- data/ext/libmemcached-0.32/config/install-sh +520 -0
- data/ext/libmemcached-0.32/config/ltmain.sh +9636 -0
- data/ext/libmemcached-0.32/config/missing +376 -0
- data/ext/libmemcached-0.32/config.h.in +254 -0
- data/ext/libmemcached-0.32/configure +23843 -0
- data/ext/libmemcached-0.32/configure.ac +120 -0
- data/ext/libmemcached-0.32/libmemcached/Makefile.am +111 -0
- data/ext/libmemcached-0.32/libmemcached/Makefile.in +1069 -0
- data/ext/libmemcached-0.32/libmemcached/byteorder.c +31 -0
- data/ext/libmemcached-0.32/libmemcached/common.h +189 -0
- data/ext/libmemcached-0.32/libmemcached/crc.c +86 -0
- data/ext/libmemcached-0.32/libmemcached/hsieh_hash.c +68 -0
- data/ext/libmemcached-0.32/libmemcached/jenkins_hash.c +213 -0
- data/ext/libmemcached-0.32/libmemcached/libmemcached.ver +1 -0
- data/ext/libmemcached-0.32/libmemcached/libmemcached_probes.d +30 -0
- data/ext/libmemcached-0.32/libmemcached/libmemcached_probes.h +82 -0
- data/ext/libmemcached-0.32/libmemcached/md5.c +354 -0
- data/ext/libmemcached-0.32/libmemcached/memcached/README.txt +7 -0
- data/ext/libmemcached-0.32/libmemcached/memcached/protocol_binary.h +385 -0
- data/ext/libmemcached-0.32/libmemcached/memcached.c +153 -0
- data/ext/libmemcached-0.32/libmemcached/memcached.h +305 -0
- data/ext/libmemcached-0.32/libmemcached/memcached.hpp +799 -0
- data/ext/libmemcached-0.32/libmemcached/memcached_allocators.c +72 -0
- data/ext/libmemcached-0.32/libmemcached/memcached_analyze.c +100 -0
- data/ext/libmemcached-0.32/libmemcached/memcached_auto.c +207 -0
- data/ext/libmemcached-0.32/libmemcached/memcached_behavior.c +290 -0
- data/ext/libmemcached-0.32/libmemcached/memcached_callback.c +175 -0
- data/ext/libmemcached-0.32/libmemcached/memcached_configure.h.in +23 -0
- data/ext/libmemcached-0.32/libmemcached/memcached_connect.c +371 -0
- data/ext/libmemcached-0.32/libmemcached/memcached_constants.h +146 -0
- data/ext/libmemcached-0.32/libmemcached/memcached_delete.c +0 -0
- data/ext/libmemcached-0.32/libmemcached/memcached_do.c +72 -0
- data/ext/libmemcached-0.32/libmemcached/memcached_dump.c +79 -0
- data/ext/libmemcached-0.32/libmemcached/memcached_exist.c +114 -0
- data/ext/libmemcached-0.32/libmemcached/memcached_exist.h +20 -0
- data/ext/libmemcached-0.32/libmemcached/memcached_fetch.c +102 -0
- data/ext/libmemcached-0.32/libmemcached/memcached_flush.c +89 -0
- data/ext/libmemcached-0.32/libmemcached/memcached_flush_buffers.c +23 -0
- data/ext/libmemcached-0.32/libmemcached/memcached_get.c +494 -0
- data/ext/libmemcached-0.32/libmemcached/memcached_get.h +87 -0
- data/ext/libmemcached-0.32/libmemcached/memcached_hash.c +252 -0
- data/ext/libmemcached-0.32/libmemcached/memcached_hosts.c +510 -0
- data/ext/libmemcached-0.32/libmemcached/memcached_internal.h +31 -0
- data/ext/libmemcached-0.32/libmemcached/memcached_io.c +594 -0
- data/ext/libmemcached-0.32/libmemcached/memcached_io.h +72 -0
- data/ext/libmemcached-0.32/libmemcached/memcached_key.c +28 -0
- data/ext/libmemcached-0.32/libmemcached/memcached_parse.c +74 -0
- data/ext/libmemcached-0.32/libmemcached/memcached_pool.h +38 -0
- data/ext/libmemcached-0.32/libmemcached/memcached_purge.c +76 -0
- data/ext/libmemcached-0.32/libmemcached/memcached_quit.c +75 -0
- data/ext/libmemcached-0.32/libmemcached/memcached_response.c +529 -0
- data/ext/libmemcached-0.32/libmemcached/memcached_result.c +57 -0
- data/ext/libmemcached-0.32/libmemcached/memcached_result.h +59 -0
- data/ext/libmemcached-0.32/libmemcached/memcached_sasl.c +225 -0
- data/ext/libmemcached-0.32/libmemcached/memcached_sasl.h +44 -0
- data/ext/libmemcached-0.32/libmemcached/memcached_server.c +159 -0
- data/ext/libmemcached-0.32/libmemcached/memcached_server.h +93 -0
- data/ext/libmemcached-0.32/libmemcached/memcached_stats.c +437 -0
- data/ext/libmemcached-0.32/libmemcached/memcached_storage.c +514 -0
- data/ext/libmemcached-0.32/libmemcached/memcached_storage.h +107 -0
- data/ext/libmemcached-0.32/libmemcached/memcached_strerror.c +92 -0
- data/ext/libmemcached-0.32/libmemcached/memcached_string.c +138 -0
- data/ext/libmemcached-0.32/libmemcached/memcached_string.h +53 -0
- data/ext/libmemcached-0.32/libmemcached/memcached_touch.c +60 -0
- data/ext/libmemcached-0.32/libmemcached/memcached_touch.h +31 -0
- data/ext/libmemcached-0.32/libmemcached/memcached_types.h +44 -0
- data/ext/libmemcached-0.32/libmemcached/memcached_util.h +15 -0
- data/ext/libmemcached-0.32/libmemcached/memcached_verbosity.c +36 -0
- data/ext/libmemcached-0.32/libmemcached/memcached_version.c +112 -0
- data/ext/libmemcached-0.32/libmemcached/memcached_watchpoint.h +38 -0
- data/ext/libmemcached-0.32/libmemcached/murmur_hash.c +76 -0
- data/ext/libmemcached-0.32/libmemcached/visibility.h +51 -0
- data/ext/libmemcached-0.32/libmemcachedutil/Makefile.am +11 -0
- data/ext/libmemcached-0.32/libmemcachedutil/Makefile.in +604 -0
- data/ext/libmemcached-0.32/libmemcachedutil/libmemcachedutil.ver +1 -0
- data/ext/libmemcached-0.32/libmemcachedutil/memcached_pool.c +170 -0
- data/ext/libmemcached-0.32/m4/ac_cxx_compile_stdcxx_0x.m4 +103 -0
- data/ext/libmemcached-0.32/m4/ac_cxx_header_stdcxx_98.m4 +67 -0
- data/ext/libmemcached-0.32/m4/acx_pthread.m4 +276 -0
- data/ext/libmemcached-0.32/m4/byteorder.m4 +40 -0
- data/ext/libmemcached-0.32/m4/deprecated.m4 +17 -0
- data/ext/libmemcached-0.32/m4/enable_utillib.m4 +16 -0
- data/ext/libmemcached-0.32/m4/extensions.m4 +94 -0
- data/ext/libmemcached-0.32/m4/hsieh.m4 +18 -0
- data/ext/libmemcached-0.32/m4/lib-prefix.m4 +221 -0
- data/ext/libmemcached-0.32/m4/libtool.m4 +7831 -0
- data/ext/libmemcached-0.32/m4/ltoptions.m4 +369 -0
- data/ext/libmemcached-0.32/m4/ltsugar.m4 +123 -0
- data/ext/libmemcached-0.32/m4/ltversion.m4 +23 -0
- data/ext/libmemcached-0.32/m4/lt~obsolete.m4 +98 -0
- data/ext/libmemcached-0.32/m4/memcached.m4 +30 -0
- data/ext/libmemcached-0.32/m4/pandora_64bit.m4 +55 -0
- data/ext/libmemcached-0.32/m4/pandora_canonical.m4 +151 -0
- data/ext/libmemcached-0.32/m4/pandora_check_compiler_version.m4 +37 -0
- data/ext/libmemcached-0.32/m4/pandora_check_cxx_standard.m4 +16 -0
- data/ext/libmemcached-0.32/m4/pandora_enable_dtrace.m4 +41 -0
- data/ext/libmemcached-0.32/m4/pandora_ensure_gcc_version.m4 +36 -0
- data/ext/libmemcached-0.32/m4/pandora_have_better_malloc.m4 +54 -0
- data/ext/libmemcached-0.32/m4/pandora_have_sasl.m4 +133 -0
- data/ext/libmemcached-0.32/m4/pandora_header_assert.m4 +23 -0
- data/ext/libmemcached-0.32/m4/pandora_libtool.m4 +15 -0
- data/ext/libmemcached-0.32/m4/pandora_optimize.m4 +79 -0
- data/ext/libmemcached-0.32/m4/pandora_shared_ptr.m4 +56 -0
- data/ext/libmemcached-0.32/m4/pandora_vc_build.m4 +32 -0
- data/ext/libmemcached-0.32/m4/pandora_warnings.m4 +262 -0
- data/ext/libmemcached-0.32/m4/pod2man.m4 +7 -0
- data/ext/libmemcached-0.32/m4/protocol_binary.m4 +23 -0
- data/ext/libmemcached-0.32/m4/setsockopt.m4 +57 -0
- data/ext/libmemcached-0.32/m4/visibility.m4 +52 -0
- data/ext/libmemcached-0.32/support/Makefile.am +4 -0
- data/ext/libmemcached-0.32/support/Makefile.in +487 -0
- data/ext/libmemcached-0.32/support/libmemcached-fc.spec.in +105 -0
- data/ext/libmemcached-0.32/support/libmemcached.pc.in +10 -0
- data/ext/libmemcached-0.32/support/libmemcached.spec +105 -0
- data/ext/libmemcached-0.32/support/libmemcached.spec.in +105 -0
- data/ext/libmemcached-0.32/support/set_benchmark.sh +5 -0
- data/ext/libmemcached-0.32/tests/Makefile.am +113 -0
- data/ext/libmemcached-0.32/tests/Makefile.in +762 -0
- data/ext/libmemcached-0.32/tests/atomsmasher.c +245 -0
- data/ext/libmemcached-0.32/tests/function.c +4904 -0
- data/ext/libmemcached-0.32/tests/ketama_test_cases.h +108 -0
- data/ext/libmemcached-0.32/tests/output.cmp +7 -0
- data/ext/libmemcached-0.32/tests/output.res +7 -0
- data/ext/libmemcached-0.32/tests/output2.res +46 -0
- data/ext/libmemcached-0.32/tests/plus.cpp +293 -0
- data/ext/libmemcached-0.32/tests/r/memcat.res +19 -0
- data/ext/libmemcached-0.32/tests/r/memcp.res +27 -0
- data/ext/libmemcached-0.32/tests/r/memrm.res +19 -0
- data/ext/libmemcached-0.32/tests/r/memslap.res +33 -0
- data/ext/libmemcached-0.32/tests/r/memstat.res +33 -0
- data/ext/libmemcached-0.32/tests/server.c +118 -0
- data/ext/libmemcached-0.32/tests/server.h +25 -0
- data/ext/libmemcached-0.32/tests/start.c +16 -0
- data/ext/libmemcached-0.32/tests/t/memcat.test +4 -0
- data/ext/libmemcached-0.32/tests/t/memcp.test +3 -0
- data/ext/libmemcached-0.32/tests/t/memrm.test +3 -0
- data/ext/libmemcached-0.32/tests/t/memslap.test +5 -0
- data/ext/libmemcached-0.32/tests/t/memstat.test +3 -0
- data/ext/libmemcached-0.32/tests/test.c +137 -0
- data/ext/libmemcached-0.32/tests/test.h +46 -0
- data/ext/libmemcached-0.32/tests/udp.c +76 -0
- data/ext/rlibmemcached.i +258 -0
- data/ext/rlibmemcached_wrap.c +13917 -0
- data/lib/memcached/auth.rb +16 -0
- data/lib/memcached/behaviors.rb +78 -0
- data/lib/memcached/exceptions.rb +84 -0
- data/lib/memcached/experimental.rb +48 -0
- data/lib/memcached/marshal_codec.rb +10 -0
- data/lib/memcached/memcached.rb +732 -0
- data/lib/memcached/rails.rb +250 -0
- data/lib/memcached.rb +33 -0
- data/memcached.gemspec +0 -0
- data/test/profile/benchmark.rb +280 -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 +18 -0
- data/test/unit/binding_test.rb +8 -0
- data/test/unit/memcached_experimental_test.rb +272 -0
- data/test/unit/memcached_test.rb +1487 -0
- data/test/unit/rails_test.rb +330 -0
- metadata +336 -0
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
#include "common.h"
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
/* Defines */
|
|
5
|
+
static uint64_t FNV_64_INIT= UINT64_C(0xcbf29ce484222325);
|
|
6
|
+
static uint64_t FNV_64_PRIME= UINT64_C(0x100000001b3);
|
|
7
|
+
|
|
8
|
+
static uint32_t FNV_32_INIT= 2166136261UL;
|
|
9
|
+
static uint32_t FNV_32_PRIME= 16777619;
|
|
10
|
+
|
|
11
|
+
/* Prototypes */
|
|
12
|
+
static uint32_t internal_generate_hash(const char *key, size_t key_length);
|
|
13
|
+
static uint32_t internal_generate_md5(const char *key, size_t key_length);
|
|
14
|
+
uint32_t memcached_live_host_index(memcached_st *ptr, uint32_t num);
|
|
15
|
+
|
|
16
|
+
uint32_t memcached_generate_hash_value(const char *key, size_t key_length, memcached_hash hash_algorithm)
|
|
17
|
+
{
|
|
18
|
+
uint32_t hash= 1; /* Just here to remove compile warning */
|
|
19
|
+
uint32_t x= 0;
|
|
20
|
+
|
|
21
|
+
switch (hash_algorithm)
|
|
22
|
+
{
|
|
23
|
+
case MEMCACHED_HASH_DEFAULT:
|
|
24
|
+
hash= internal_generate_hash(key, key_length);
|
|
25
|
+
break;
|
|
26
|
+
case MEMCACHED_HASH_MD5:
|
|
27
|
+
hash= internal_generate_md5(key, key_length);
|
|
28
|
+
break;
|
|
29
|
+
case MEMCACHED_HASH_CRC:
|
|
30
|
+
hash= ((hash_crc32(key, key_length) >> 16) & 0x7fff);
|
|
31
|
+
if (hash == 0)
|
|
32
|
+
hash= 1;
|
|
33
|
+
break;
|
|
34
|
+
/* FNV hash'es lifted from Dustin Sallings work */
|
|
35
|
+
case MEMCACHED_HASH_FNV1_64:
|
|
36
|
+
{
|
|
37
|
+
/* Thanks to pierre@demartines.com for the pointer */
|
|
38
|
+
uint64_t temp_hash;
|
|
39
|
+
|
|
40
|
+
temp_hash= FNV_64_INIT;
|
|
41
|
+
for (x= 0; x < key_length; x++)
|
|
42
|
+
{
|
|
43
|
+
temp_hash *= FNV_64_PRIME;
|
|
44
|
+
temp_hash ^= (uint64_t)key[x];
|
|
45
|
+
}
|
|
46
|
+
hash= (uint32_t)temp_hash;
|
|
47
|
+
}
|
|
48
|
+
break;
|
|
49
|
+
case MEMCACHED_HASH_FNV1A_64:
|
|
50
|
+
{
|
|
51
|
+
hash= (uint32_t) FNV_64_INIT;
|
|
52
|
+
for (x= 0; x < key_length; x++)
|
|
53
|
+
{
|
|
54
|
+
uint32_t val= (uint32_t)key[x];
|
|
55
|
+
hash ^= val;
|
|
56
|
+
hash *= (uint32_t) FNV_64_PRIME;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
break;
|
|
60
|
+
case MEMCACHED_HASH_FNV1_32:
|
|
61
|
+
{
|
|
62
|
+
hash= FNV_32_INIT;
|
|
63
|
+
for (x= 0; x < key_length; x++)
|
|
64
|
+
{
|
|
65
|
+
uint32_t val= (uint32_t)key[x];
|
|
66
|
+
hash *= FNV_32_PRIME;
|
|
67
|
+
hash ^= val;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
break;
|
|
71
|
+
case MEMCACHED_HASH_FNV1A_32:
|
|
72
|
+
{
|
|
73
|
+
hash= FNV_32_INIT;
|
|
74
|
+
for (x= 0; x < key_length; x++)
|
|
75
|
+
{
|
|
76
|
+
uint32_t val= (uint32_t)key[x];
|
|
77
|
+
hash ^= val;
|
|
78
|
+
hash *= FNV_32_PRIME;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
break;
|
|
82
|
+
case MEMCACHED_HASH_HSIEH:
|
|
83
|
+
{
|
|
84
|
+
#ifdef HAVE_HSIEH_HASH
|
|
85
|
+
hash= hsieh_hash(key, key_length);
|
|
86
|
+
#endif
|
|
87
|
+
break;
|
|
88
|
+
}
|
|
89
|
+
case MEMCACHED_HASH_MURMUR:
|
|
90
|
+
{
|
|
91
|
+
hash= murmur_hash(key, key_length);
|
|
92
|
+
break;
|
|
93
|
+
}
|
|
94
|
+
case MEMCACHED_HASH_JENKINS:
|
|
95
|
+
{
|
|
96
|
+
hash=jenkins_hash(key, key_length, 13);
|
|
97
|
+
break;
|
|
98
|
+
}
|
|
99
|
+
case MEMCACHED_HASH_NONE:
|
|
100
|
+
{
|
|
101
|
+
hash= 1;
|
|
102
|
+
break;
|
|
103
|
+
}
|
|
104
|
+
default:
|
|
105
|
+
{
|
|
106
|
+
WATCHPOINT_ASSERT(hash_algorithm);
|
|
107
|
+
break;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
return hash;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
uint32_t generate_hash(memcached_st *ptr, const char *key, size_t key_length)
|
|
114
|
+
{
|
|
115
|
+
uint32_t hash= 1; /* Just here to remove compile warning */
|
|
116
|
+
|
|
117
|
+
|
|
118
|
+
WATCHPOINT_ASSERT(ptr->number_of_hosts);
|
|
119
|
+
|
|
120
|
+
if (ptr->number_of_hosts == 1)
|
|
121
|
+
return 0;
|
|
122
|
+
|
|
123
|
+
hash= memcached_generate_hash_value(key, key_length, ptr->hash);
|
|
124
|
+
WATCHPOINT_ASSERT(hash);
|
|
125
|
+
return hash;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
static uint32_t dispatch_host(memcached_st *ptr, uint32_t hash)
|
|
129
|
+
{
|
|
130
|
+
switch (ptr->distribution)
|
|
131
|
+
{
|
|
132
|
+
case MEMCACHED_DISTRIBUTION_CONSISTENT:
|
|
133
|
+
case MEMCACHED_DISTRIBUTION_CONSISTENT_KETAMA:
|
|
134
|
+
{
|
|
135
|
+
uint32_t num= ptr->continuum_points_counter;
|
|
136
|
+
WATCHPOINT_ASSERT(ptr->continuum);
|
|
137
|
+
|
|
138
|
+
hash= hash;
|
|
139
|
+
memcached_continuum_item_st *begin, *end, *left, *right, *middle;
|
|
140
|
+
begin= left= ptr->continuum;
|
|
141
|
+
end= right= ptr->continuum + num;
|
|
142
|
+
|
|
143
|
+
while (left < right)
|
|
144
|
+
{
|
|
145
|
+
middle= left + (right - left) / 2;
|
|
146
|
+
if (middle->value < hash)
|
|
147
|
+
left= middle + 1;
|
|
148
|
+
else
|
|
149
|
+
right= middle;
|
|
150
|
+
}
|
|
151
|
+
if (right == end)
|
|
152
|
+
right= begin;
|
|
153
|
+
return right->index;
|
|
154
|
+
}
|
|
155
|
+
case MEMCACHED_DISTRIBUTION_MODULA:
|
|
156
|
+
return memcached_live_host_index(ptr, hash);
|
|
157
|
+
case MEMCACHED_DISTRIBUTION_RANDOM:
|
|
158
|
+
return memcached_live_host_index(ptr, (uint32_t) random());
|
|
159
|
+
default:
|
|
160
|
+
WATCHPOINT_ASSERT(0); /* We have added a distribution without extending the logic */
|
|
161
|
+
return hash % ptr->number_of_hosts;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
/* NOTREACHED */
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
/*
|
|
168
|
+
One day make this public, and have it return the actual memcached_server_st
|
|
169
|
+
to the calling application.
|
|
170
|
+
*/
|
|
171
|
+
uint32_t memcached_generate_hash(memcached_st *ptr, const char *key, size_t key_length)
|
|
172
|
+
{
|
|
173
|
+
uint32_t hash= 1; /* Just here to remove compile warning */
|
|
174
|
+
|
|
175
|
+
WATCHPOINT_ASSERT(ptr->number_of_hosts);
|
|
176
|
+
|
|
177
|
+
if (ptr->number_of_hosts == 1)
|
|
178
|
+
return 0;
|
|
179
|
+
|
|
180
|
+
if (ptr->flags & MEM_HASH_WITH_PREFIX_KEY)
|
|
181
|
+
{
|
|
182
|
+
size_t temp_length= ptr->prefix_key_length + key_length;
|
|
183
|
+
char temp[temp_length];
|
|
184
|
+
|
|
185
|
+
if (temp_length > MEMCACHED_MAX_KEY -1)
|
|
186
|
+
return 0;
|
|
187
|
+
|
|
188
|
+
strncpy(temp, ptr->prefix_key, ptr->prefix_key_length);
|
|
189
|
+
strncpy(temp + ptr->prefix_key_length, key, key_length);
|
|
190
|
+
hash= generate_hash(ptr, temp, temp_length);
|
|
191
|
+
}
|
|
192
|
+
else
|
|
193
|
+
{
|
|
194
|
+
hash= generate_hash(ptr, key, key_length);
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
WATCHPOINT_ASSERT(hash);
|
|
198
|
+
|
|
199
|
+
if (memcached_behavior_get(ptr, MEMCACHED_BEHAVIOR_AUTO_EJECT_HOSTS) && ptr->next_distribution_rebuild) {
|
|
200
|
+
struct timeval now;
|
|
201
|
+
|
|
202
|
+
if (gettimeofday(&now, NULL) == 0 &&
|
|
203
|
+
now.tv_sec > ptr->next_distribution_rebuild)
|
|
204
|
+
run_distribution(ptr);
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
return dispatch_host(ptr, hash);
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
uint32_t memcached_live_host_index(memcached_st *ptr, uint32_t num)
|
|
211
|
+
{
|
|
212
|
+
if (memcached_behavior_get(ptr, MEMCACHED_BEHAVIOR_AUTO_EJECT_HOSTS)) {
|
|
213
|
+
if (ptr->number_of_live_hosts > 0) {
|
|
214
|
+
return ptr->live_host_indices[num % ptr->number_of_live_hosts];
|
|
215
|
+
} else {
|
|
216
|
+
return 0; /* FIXME: we should do something different if every server's dead, but I dunno what. */
|
|
217
|
+
}
|
|
218
|
+
} else {
|
|
219
|
+
return num % ptr->number_of_hosts;
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
static uint32_t internal_generate_hash(const char *key, size_t key_length)
|
|
224
|
+
{
|
|
225
|
+
const char *ptr= key;
|
|
226
|
+
uint32_t value= 0;
|
|
227
|
+
|
|
228
|
+
while (key_length--)
|
|
229
|
+
{
|
|
230
|
+
uint32_t val= (uint32_t) *ptr++;
|
|
231
|
+
value += val;
|
|
232
|
+
value += (value << 10);
|
|
233
|
+
value ^= (value >> 6);
|
|
234
|
+
}
|
|
235
|
+
value += (value << 3);
|
|
236
|
+
value ^= (value >> 11);
|
|
237
|
+
value += (value << 15);
|
|
238
|
+
|
|
239
|
+
return value == 0 ? 1 : (uint32_t) value;
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
static uint32_t internal_generate_md5(const char *key, size_t key_length)
|
|
243
|
+
{
|
|
244
|
+
unsigned char results[16];
|
|
245
|
+
|
|
246
|
+
md5_signature((unsigned char*)key, (unsigned int)key_length, results);
|
|
247
|
+
|
|
248
|
+
return ((uint32_t) (results[3] & 0xFF) << 24)
|
|
249
|
+
| ((uint32_t) (results[2] & 0xFF) << 16)
|
|
250
|
+
| ((uint32_t) (results[1] & 0xFF) << 8)
|
|
251
|
+
| (results[0] & 0xFF);
|
|
252
|
+
}
|