dalli_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.
Files changed (209) hide show
  1. data/BENCHMARKS +142 -0
  2. data/CHANGELOG +176 -0
  3. data/Gemfile +11 -0
  4. data/Gemfile.lock +45 -0
  5. data/LICENSE +184 -0
  6. data/Manifest +209 -0
  7. data/README.rdoc +124 -0
  8. data/Rakefile +134 -0
  9. data/TODO +1 -0
  10. data/dalli_memcached.gemspec +0 -0
  11. data/ext/extconf-make.rb +25 -0
  12. data/ext/extconf.rb +78 -0
  13. data/ext/libmemcached-0.32/AUTHORS +7 -0
  14. data/ext/libmemcached-0.32/COPYING +32 -0
  15. data/ext/libmemcached-0.32/ChangeLog +303 -0
  16. data/ext/libmemcached-0.32/INSTALL +302 -0
  17. data/ext/libmemcached-0.32/Makefile.am +36 -0
  18. data/ext/libmemcached-0.32/Makefile.in +911 -0
  19. data/ext/libmemcached-0.32/NEWS +1 -0
  20. data/ext/libmemcached-0.32/README +33 -0
  21. data/ext/libmemcached-0.32/THANKS +14 -0
  22. data/ext/libmemcached-0.32/TODO +11 -0
  23. data/ext/libmemcached-0.32/aclocal.m4 +2108 -0
  24. data/ext/libmemcached-0.32/clients/Makefile.am +80 -0
  25. data/ext/libmemcached-0.32/clients/Makefile.in +773 -0
  26. data/ext/libmemcached-0.32/clients/client_options.h +32 -0
  27. data/ext/libmemcached-0.32/clients/execute.c +64 -0
  28. data/ext/libmemcached-0.32/clients/execute.h +5 -0
  29. data/ext/libmemcached-0.32/clients/generator.c +74 -0
  30. data/ext/libmemcached-0.32/clients/generator.h +20 -0
  31. data/ext/libmemcached-0.32/clients/memcat.c +178 -0
  32. data/ext/libmemcached-0.32/clients/memcp.c +251 -0
  33. data/ext/libmemcached-0.32/clients/memdump.c +170 -0
  34. data/ext/libmemcached-0.32/clients/memerror.c +80 -0
  35. data/ext/libmemcached-0.32/clients/memflush.c +143 -0
  36. data/ext/libmemcached-0.32/clients/memrm.c +160 -0
  37. data/ext/libmemcached-0.32/clients/memslap.c +441 -0
  38. data/ext/libmemcached-0.32/clients/memstat.c +326 -0
  39. data/ext/libmemcached-0.32/clients/utilities.c +207 -0
  40. data/ext/libmemcached-0.32/clients/utilities.h +41 -0
  41. data/ext/libmemcached-0.32/config.h.in +254 -0
  42. data/ext/libmemcached-0.32/config/compile +143 -0
  43. data/ext/libmemcached-0.32/config/config.guess +1561 -0
  44. data/ext/libmemcached-0.32/config/config.rpath +666 -0
  45. data/ext/libmemcached-0.32/config/config.sub +1686 -0
  46. data/ext/libmemcached-0.32/config/depcomp +630 -0
  47. data/ext/libmemcached-0.32/config/install-sh +520 -0
  48. data/ext/libmemcached-0.32/config/ltmain.sh +9636 -0
  49. data/ext/libmemcached-0.32/config/missing +376 -0
  50. data/ext/libmemcached-0.32/configure +23843 -0
  51. data/ext/libmemcached-0.32/configure.ac +120 -0
  52. data/ext/libmemcached-0.32/libmemcached/Makefile.am +111 -0
  53. data/ext/libmemcached-0.32/libmemcached/Makefile.in +1069 -0
  54. data/ext/libmemcached-0.32/libmemcached/byteorder.c +31 -0
  55. data/ext/libmemcached-0.32/libmemcached/common.h +189 -0
  56. data/ext/libmemcached-0.32/libmemcached/crc.c +86 -0
  57. data/ext/libmemcached-0.32/libmemcached/hsieh_hash.c +68 -0
  58. data/ext/libmemcached-0.32/libmemcached/jenkins_hash.c +213 -0
  59. data/ext/libmemcached-0.32/libmemcached/libmemcached.ver +1 -0
  60. data/ext/libmemcached-0.32/libmemcached/libmemcached_probes.d +30 -0
  61. data/ext/libmemcached-0.32/libmemcached/libmemcached_probes.h +82 -0
  62. data/ext/libmemcached-0.32/libmemcached/md5.c +354 -0
  63. data/ext/libmemcached-0.32/libmemcached/memcached.c +153 -0
  64. data/ext/libmemcached-0.32/libmemcached/memcached.h +305 -0
  65. data/ext/libmemcached-0.32/libmemcached/memcached.hpp +799 -0
  66. data/ext/libmemcached-0.32/libmemcached/memcached/README.txt +7 -0
  67. data/ext/libmemcached-0.32/libmemcached/memcached/protocol_binary.h +385 -0
  68. data/ext/libmemcached-0.32/libmemcached/memcached_allocators.c +72 -0
  69. data/ext/libmemcached-0.32/libmemcached/memcached_analyze.c +100 -0
  70. data/ext/libmemcached-0.32/libmemcached/memcached_auto.c +207 -0
  71. data/ext/libmemcached-0.32/libmemcached/memcached_behavior.c +290 -0
  72. data/ext/libmemcached-0.32/libmemcached/memcached_callback.c +175 -0
  73. data/ext/libmemcached-0.32/libmemcached/memcached_configure.h.in +23 -0
  74. data/ext/libmemcached-0.32/libmemcached/memcached_connect.c +371 -0
  75. data/ext/libmemcached-0.32/libmemcached/memcached_constants.h +146 -0
  76. data/ext/libmemcached-0.32/libmemcached/memcached_delete.c +0 -0
  77. data/ext/libmemcached-0.32/libmemcached/memcached_do.c +72 -0
  78. data/ext/libmemcached-0.32/libmemcached/memcached_dump.c +79 -0
  79. data/ext/libmemcached-0.32/libmemcached/memcached_exist.c +114 -0
  80. data/ext/libmemcached-0.32/libmemcached/memcached_exist.h +20 -0
  81. data/ext/libmemcached-0.32/libmemcached/memcached_fetch.c +102 -0
  82. data/ext/libmemcached-0.32/libmemcached/memcached_flush.c +89 -0
  83. data/ext/libmemcached-0.32/libmemcached/memcached_flush_buffers.c +23 -0
  84. data/ext/libmemcached-0.32/libmemcached/memcached_get.c +494 -0
  85. data/ext/libmemcached-0.32/libmemcached/memcached_get.h +87 -0
  86. data/ext/libmemcached-0.32/libmemcached/memcached_hash.c +252 -0
  87. data/ext/libmemcached-0.32/libmemcached/memcached_hosts.c +510 -0
  88. data/ext/libmemcached-0.32/libmemcached/memcached_internal.h +31 -0
  89. data/ext/libmemcached-0.32/libmemcached/memcached_io.c +594 -0
  90. data/ext/libmemcached-0.32/libmemcached/memcached_io.h +72 -0
  91. data/ext/libmemcached-0.32/libmemcached/memcached_key.c +28 -0
  92. data/ext/libmemcached-0.32/libmemcached/memcached_parse.c +74 -0
  93. data/ext/libmemcached-0.32/libmemcached/memcached_pool.h +38 -0
  94. data/ext/libmemcached-0.32/libmemcached/memcached_purge.c +76 -0
  95. data/ext/libmemcached-0.32/libmemcached/memcached_quit.c +75 -0
  96. data/ext/libmemcached-0.32/libmemcached/memcached_response.c +529 -0
  97. data/ext/libmemcached-0.32/libmemcached/memcached_result.c +57 -0
  98. data/ext/libmemcached-0.32/libmemcached/memcached_result.h +59 -0
  99. data/ext/libmemcached-0.32/libmemcached/memcached_sasl.c +225 -0
  100. data/ext/libmemcached-0.32/libmemcached/memcached_sasl.h +44 -0
  101. data/ext/libmemcached-0.32/libmemcached/memcached_server.c +159 -0
  102. data/ext/libmemcached-0.32/libmemcached/memcached_server.h +93 -0
  103. data/ext/libmemcached-0.32/libmemcached/memcached_stats.c +437 -0
  104. data/ext/libmemcached-0.32/libmemcached/memcached_storage.c +514 -0
  105. data/ext/libmemcached-0.32/libmemcached/memcached_storage.h +107 -0
  106. data/ext/libmemcached-0.32/libmemcached/memcached_strerror.c +92 -0
  107. data/ext/libmemcached-0.32/libmemcached/memcached_string.c +138 -0
  108. data/ext/libmemcached-0.32/libmemcached/memcached_string.h +53 -0
  109. data/ext/libmemcached-0.32/libmemcached/memcached_touch.c +60 -0
  110. data/ext/libmemcached-0.32/libmemcached/memcached_touch.h +31 -0
  111. data/ext/libmemcached-0.32/libmemcached/memcached_types.h +44 -0
  112. data/ext/libmemcached-0.32/libmemcached/memcached_util.h +15 -0
  113. data/ext/libmemcached-0.32/libmemcached/memcached_verbosity.c +36 -0
  114. data/ext/libmemcached-0.32/libmemcached/memcached_version.c +112 -0
  115. data/ext/libmemcached-0.32/libmemcached/memcached_watchpoint.h +38 -0
  116. data/ext/libmemcached-0.32/libmemcached/murmur_hash.c +76 -0
  117. data/ext/libmemcached-0.32/libmemcached/visibility.h +51 -0
  118. data/ext/libmemcached-0.32/libmemcachedutil/Makefile.am +11 -0
  119. data/ext/libmemcached-0.32/libmemcachedutil/Makefile.in +604 -0
  120. data/ext/libmemcached-0.32/libmemcachedutil/libmemcachedutil.ver +1 -0
  121. data/ext/libmemcached-0.32/libmemcachedutil/memcached_pool.c +170 -0
  122. data/ext/libmemcached-0.32/m4/ac_cxx_compile_stdcxx_0x.m4 +103 -0
  123. data/ext/libmemcached-0.32/m4/ac_cxx_header_stdcxx_98.m4 +67 -0
  124. data/ext/libmemcached-0.32/m4/acx_pthread.m4 +276 -0
  125. data/ext/libmemcached-0.32/m4/byteorder.m4 +40 -0
  126. data/ext/libmemcached-0.32/m4/deprecated.m4 +17 -0
  127. data/ext/libmemcached-0.32/m4/enable_utillib.m4 +16 -0
  128. data/ext/libmemcached-0.32/m4/extensions.m4 +94 -0
  129. data/ext/libmemcached-0.32/m4/hsieh.m4 +18 -0
  130. data/ext/libmemcached-0.32/m4/lib-prefix.m4 +221 -0
  131. data/ext/libmemcached-0.32/m4/libtool.m4 +7831 -0
  132. data/ext/libmemcached-0.32/m4/ltoptions.m4 +369 -0
  133. data/ext/libmemcached-0.32/m4/ltsugar.m4 +123 -0
  134. data/ext/libmemcached-0.32/m4/ltversion.m4 +23 -0
  135. data/ext/libmemcached-0.32/m4/lt~obsolete.m4 +98 -0
  136. data/ext/libmemcached-0.32/m4/memcached.m4 +30 -0
  137. data/ext/libmemcached-0.32/m4/pandora_64bit.m4 +55 -0
  138. data/ext/libmemcached-0.32/m4/pandora_canonical.m4 +151 -0
  139. data/ext/libmemcached-0.32/m4/pandora_check_compiler_version.m4 +37 -0
  140. data/ext/libmemcached-0.32/m4/pandora_check_cxx_standard.m4 +16 -0
  141. data/ext/libmemcached-0.32/m4/pandora_enable_dtrace.m4 +41 -0
  142. data/ext/libmemcached-0.32/m4/pandora_ensure_gcc_version.m4 +36 -0
  143. data/ext/libmemcached-0.32/m4/pandora_have_better_malloc.m4 +54 -0
  144. data/ext/libmemcached-0.32/m4/pandora_have_sasl.m4 +133 -0
  145. data/ext/libmemcached-0.32/m4/pandora_header_assert.m4 +23 -0
  146. data/ext/libmemcached-0.32/m4/pandora_libtool.m4 +15 -0
  147. data/ext/libmemcached-0.32/m4/pandora_optimize.m4 +79 -0
  148. data/ext/libmemcached-0.32/m4/pandora_shared_ptr.m4 +56 -0
  149. data/ext/libmemcached-0.32/m4/pandora_vc_build.m4 +32 -0
  150. data/ext/libmemcached-0.32/m4/pandora_warnings.m4 +262 -0
  151. data/ext/libmemcached-0.32/m4/pod2man.m4 +7 -0
  152. data/ext/libmemcached-0.32/m4/protocol_binary.m4 +23 -0
  153. data/ext/libmemcached-0.32/m4/setsockopt.m4 +57 -0
  154. data/ext/libmemcached-0.32/m4/visibility.m4 +52 -0
  155. data/ext/libmemcached-0.32/support/Makefile.am +4 -0
  156. data/ext/libmemcached-0.32/support/Makefile.in +487 -0
  157. data/ext/libmemcached-0.32/support/libmemcached-fc.spec.in +105 -0
  158. data/ext/libmemcached-0.32/support/libmemcached.pc.in +10 -0
  159. data/ext/libmemcached-0.32/support/libmemcached.spec +105 -0
  160. data/ext/libmemcached-0.32/support/libmemcached.spec.in +105 -0
  161. data/ext/libmemcached-0.32/support/set_benchmark.sh +5 -0
  162. data/ext/libmemcached-0.32/tests/Makefile.am +113 -0
  163. data/ext/libmemcached-0.32/tests/Makefile.in +762 -0
  164. data/ext/libmemcached-0.32/tests/atomsmasher.c +245 -0
  165. data/ext/libmemcached-0.32/tests/function.c +4904 -0
  166. data/ext/libmemcached-0.32/tests/ketama_test_cases.h +108 -0
  167. data/ext/libmemcached-0.32/tests/output.cmp +7 -0
  168. data/ext/libmemcached-0.32/tests/output.res +7 -0
  169. data/ext/libmemcached-0.32/tests/output2.res +46 -0
  170. data/ext/libmemcached-0.32/tests/plus.cpp +293 -0
  171. data/ext/libmemcached-0.32/tests/r/memcat.res +19 -0
  172. data/ext/libmemcached-0.32/tests/r/memcp.res +27 -0
  173. data/ext/libmemcached-0.32/tests/r/memrm.res +19 -0
  174. data/ext/libmemcached-0.32/tests/r/memslap.res +33 -0
  175. data/ext/libmemcached-0.32/tests/r/memstat.res +33 -0
  176. data/ext/libmemcached-0.32/tests/server.c +118 -0
  177. data/ext/libmemcached-0.32/tests/server.h +25 -0
  178. data/ext/libmemcached-0.32/tests/start.c +16 -0
  179. data/ext/libmemcached-0.32/tests/t/memcat.test +4 -0
  180. data/ext/libmemcached-0.32/tests/t/memcp.test +3 -0
  181. data/ext/libmemcached-0.32/tests/t/memrm.test +3 -0
  182. data/ext/libmemcached-0.32/tests/t/memslap.test +5 -0
  183. data/ext/libmemcached-0.32/tests/t/memstat.test +3 -0
  184. data/ext/libmemcached-0.32/tests/test.c +137 -0
  185. data/ext/libmemcached-0.32/tests/test.h +46 -0
  186. data/ext/libmemcached-0.32/tests/udp.c +76 -0
  187. data/ext/rlibmemcached.i +258 -0
  188. data/ext/rlibmemcached_wrap.c +13917 -0
  189. data/lib/memcached.rb +33 -0
  190. data/lib/memcached/auth.rb +16 -0
  191. data/lib/memcached/behaviors.rb +78 -0
  192. data/lib/memcached/exceptions.rb +84 -0
  193. data/lib/memcached/experimental.rb +48 -0
  194. data/lib/memcached/marshal_codec.rb +10 -0
  195. data/lib/memcached/memcached.rb +732 -0
  196. data/lib/memcached/rails.rb +250 -0
  197. data/test/profile/benchmark.rb +280 -0
  198. data/test/profile/c_profiler.rb +14 -0
  199. data/test/profile/exercise.rb +185 -0
  200. data/test/profile/rb_profiler.rb +21 -0
  201. data/test/profile/valgrind.rb +10 -0
  202. data/test/setup.rb +30 -0
  203. data/test/teardown.rb +0 -0
  204. data/test/test_helper.rb +18 -0
  205. data/test/unit/binding_test.rb +8 -0
  206. data/test/unit/memcached_experimental_test.rb +272 -0
  207. data/test/unit/memcached_test.rb +1487 -0
  208. data/test/unit/rails_test.rb +330 -0
  209. metadata +347 -0
@@ -0,0 +1,14 @@
1
+ require "#{File.dirname(__FILE__)}/../setup"
2
+
3
+ $LOAD_PATH << "#{File.dirname(__FILE__)}/../../lib/"
4
+ require 'memcached'
5
+
6
+ profile = "/tmp/memcached_#{Memcached::VERSION}_c"
7
+
8
+ system("env CPUPROFILE_FREQUENCY=500 CPUPROFILE=#{profile}.out DYLD_INSERT_LIBRARIES=/opt/local/lib/libprofiler.dylib ruby -r#{File.dirname(__FILE__)}/exercise -e \"Worker.new('mixed', 200000).work\"")
9
+
10
+ ruby = `which ruby`.chomp
11
+
12
+ system("pprof --nodefraction=0.0000001 --text #{ruby} #{profile}.out")
13
+ system("pprof --nodefraction=0.0000001 --pdf #{ruby} #{profile}.out > #{profile}.pdf")
14
+ system("open #{profile}.pdf")
@@ -0,0 +1,185 @@
1
+
2
+ require "#{File.dirname(__FILE__)}/../setup"
3
+
4
+ $LOAD_PATH << "#{File.dirname(__FILE__)}/../../lib/"
5
+ require 'memcached'
6
+ require 'rubygems'
7
+ require 'ostruct'
8
+
9
+ GC.copy_on_write_friendly = true if GC.respond_to?("copy_on_write_friendly=")
10
+
11
+ class Worker
12
+ def initialize(method_name, iterations, with_memory = 'false')
13
+ @method = method_name || 'mixed'
14
+ @i = (iterations || 10000).to_i
15
+ @with_memory = with_memory
16
+
17
+ puts "*** Running #{@method.inspect} test for #{@i} loops. ***"
18
+
19
+ @key1 = "key1--------------------------------"
20
+ @key2 = "key2--------------------------------"
21
+ @key3 = "key3--------------------------------"
22
+
23
+ @value = OpenStruct.new(
24
+ :a => 1, :b => 2, "array" => [1, 2, 3], "hash" => {:badger => 1}
25
+ )
26
+ @marshalled = Marshal.dump(@value)
27
+
28
+ @opts = [
29
+ ['localhost:43042', 'localhost:43043', 'localhost:43044'],
30
+ {
31
+ :buffer_requests => true,
32
+ :no_block => true,
33
+ :noreply => false,
34
+ :namespace => "namespace"
35
+ }
36
+ ]
37
+ @cache = Memcached::Rails.new(*@opts)
38
+
39
+ @cache.set @key1, @value
40
+ end
41
+
42
+ def work
43
+ case @method
44
+ when "set"
45
+ @i.times do
46
+ @cache.set @key1, @value
47
+ end
48
+ when "get"
49
+ @i.times do
50
+ @cache.get @key1
51
+ end
52
+ when "delete"
53
+ @i.times do
54
+ @cache.set @key1, @value
55
+ @cache.delete @key1
56
+ end
57
+ when "delete-miss"
58
+ @i.times do
59
+ @cache.delete @key1
60
+ end
61
+ when "get-miss"
62
+ @i.times do
63
+ @cache.get @key2
64
+ end
65
+ when "get-increasing"
66
+ one_k = "x"*1024
67
+ @i.times do |i|
68
+ @cache.set @key1, one_k*(i+1), 0, false
69
+ @cache.get @key1, false
70
+ end
71
+ when "get-miss-increasing"
72
+ @i.times do |i|
73
+ @cache.delete @key2
74
+ @cache.get @key2
75
+ end
76
+ when "add"
77
+ @i.times do
78
+ @cache.delete @key1
79
+ @cache.add @key1, @value
80
+ end
81
+ when "add-present"
82
+ @cache.set @key1, @value
83
+ @i.times do
84
+ @cache.add @key1, @value
85
+ end
86
+ when "mixed"
87
+ @i.times do
88
+ @cache.set @key1, @value
89
+ @cache.set @key2, @value
90
+ @cache.get @key1
91
+ @cache.get @key3
92
+ @cache.get [@key1, @key2, @key3]
93
+ @cache.prepend @key1, @marshalled
94
+ @cache.prepend @key2, @marshalled
95
+ @cache.delete @key1
96
+ @cache.delete @key2
97
+ end
98
+ when "everything"
99
+ @i.times do
100
+ @cache.set @key1, @value
101
+ @cache.set @key2, @value
102
+ @cache.get @key1
103
+ @cache.get @key3
104
+ @cache.get [@key1, @key2, @key3]
105
+ @cache.prepend @key1, @marshalled
106
+ @cache.prepend @key2, @marshalled
107
+ @cache.delete @key1
108
+ @cache.delete @key2
109
+ @cache.prepend @key1, @marshalled
110
+ @cache.prepend @key2, @marshalled
111
+ @cache.get @key1
112
+ @cache.get @key3
113
+ cache = Memcached::Rails.new(*@opts)
114
+ cache = @cache.clone
115
+ servers = @cache.servers
116
+ server = @cache.server_by_key(@key1)
117
+ @cache.stats
118
+ end
119
+ @i.times do
120
+ @cache.reset
121
+ end
122
+ system("killall -9 memcached")
123
+ @i.times do
124
+ @cache.set @key1, @value rescue nil
125
+ @cache.get @key3 rescue nil
126
+ @cache.delete @key2 rescue nil
127
+ end
128
+ when "stats"
129
+ @cache.stats
130
+ when "multiget"
131
+ @i.times do
132
+ @cache.get([@key1, @key2, @key3])
133
+ end
134
+ when "clone"
135
+ @i.times do
136
+ cache = @cache.clone
137
+ end
138
+ when "reset"
139
+ @i.times do
140
+ @cache.reset
141
+ end
142
+ when "servers"
143
+ @i.times do
144
+ @cache.servers
145
+ end
146
+ when "server_by_key"
147
+ @i.times do
148
+ @cache.server_by_key(@key1)
149
+ end
150
+ when "server_error"
151
+ @i.times do
152
+ begin
153
+ @cache.set @key1, "I'm big" * 1000000
154
+ rescue
155
+ end
156
+ end
157
+ else
158
+ raise "No such method"
159
+ end
160
+
161
+ @cache = nil
162
+
163
+ if @with_memory == "true"
164
+ puts "*** Garbage collect. ***"
165
+ 10.times do
166
+ GC.start
167
+ sleep 0.1
168
+ end
169
+
170
+ sts, server_sts, clients = 0, 0, 0
171
+ ObjectSpace.each_object(Memcached) { clients += 1 }
172
+ ObjectSpace.each_object(Rlibmemcached::MemcachedSt) { sts += 1 }
173
+ ObjectSpace.each_object(Rlibmemcached::MemcachedServerSt) { server_sts += 1 }
174
+ puts "*** memcached_st structs: #{sts} ***"
175
+ puts "*** memcached_server_st structs: #{server_sts} ***"
176
+ puts "*** Memcached instances: #{clients} ***"
177
+
178
+ begin;
179
+ require 'memory'
180
+ Process.memory.each { |key, value| puts "#{key}: #{value/1024.0}M" }
181
+ rescue LoadError
182
+ end
183
+ end
184
+ end
185
+ end
@@ -0,0 +1,21 @@
1
+
2
+ require "#{File.dirname(__FILE__)}/../setup"
3
+
4
+ $LOAD_PATH << "#{File.dirname(__FILE__)}/../../lib/"
5
+
6
+ ENV['CPUPROFILE_FREQUENCY'] = '500'
7
+ require 'memcached'
8
+ require 'rubygems'
9
+ require 'perftools'
10
+ require "#{HERE}/profile/exercise"
11
+
12
+ profile = "/tmp/memcached_#{Memcached::VERSION}_rb"
13
+ worker = Worker.new('mixed', 200000)
14
+
15
+ PerfTools::CpuProfiler.start("#{profile}.out") do
16
+ worker.work
17
+ end
18
+
19
+ system("pprof.rb --nodefraction=0.0000001 --text #{profile}.out")
20
+ system("pprof.rb --nodefraction=0.0000001 --edgefraction=0.0000001 --pdf #{profile}.out > #{profile}.pdf")
21
+ system("open #{profile}.pdf")
@@ -0,0 +1,10 @@
1
+ require "#{File.dirname(__FILE__)}/../setup"
2
+
3
+ COMMAND = "--dsymutil=yes ruby -r#{File.dirname(__FILE__)}/exercise.rb -e \"Worker.new(ENV['TEST'] || 'everything', (ENV['LOOPS'] || 50).to_i, 'true').work\""
4
+
5
+ case ENV["TOOL"]
6
+ when nil, "memcheck":
7
+ exec("valgrind --tool=memcheck --error-limit=no --undef-value-errors=no --leak-check=full --show-reachable=no --num-callers=15 --track-fds=yes --workaround-gcc296-bugs=yes --leak-resolution=med --max-stackframe=7304328 #{COMMAND}")
8
+ when "massif":
9
+ exec("valgrind --tool=massif --time-unit=B #{COMMAND}")
10
+ end
@@ -0,0 +1,30 @@
1
+
2
+ unless defined? UNIX_SOCKET_NAME
3
+ HERE = File.dirname(__FILE__)
4
+ UNIX_SOCKET_NAME = File.join(ENV['TMPDIR']||'/tmp','memcached')
5
+
6
+ # Kill memcached
7
+ system("killall -9 memcached")
8
+
9
+ # Start memcached
10
+ verbosity = (ENV['DEBUG'] ? "-vv" : "")
11
+ log = "/tmp/memcached.log"
12
+ memcached = ENV['MEMCACHED_COMMAND'] || 'memcached'
13
+ system ">#{log}"
14
+
15
+ # TCP memcached
16
+ (43042..43046).each do |port|
17
+ cmd = "#{memcached} #{verbosity} -U 0 -p #{port} >> #{log} 2>&1 &"
18
+ raise "'#{cmd}' failed to start" unless system(cmd)
19
+ end
20
+ # UDP memcached
21
+ (43052..43053).each do |port|
22
+ cmd = "#{memcached} #{verbosity} -U #{port} -p 0 >> #{log} 2>&1 &"
23
+ raise "'#{cmd}' failed to start" unless system(cmd)
24
+ end
25
+ # Domain socket memcached
26
+ (0..1).each do |i|
27
+ cmd = "#{memcached} -M -s #{UNIX_SOCKET_NAME}#{i} #{verbosity} >> #{log} 2>&1 &"
28
+ raise "'#{cmd}' failed to start" unless system(cmd)
29
+ end
30
+ end
File without changes
@@ -0,0 +1,18 @@
1
+ $LOAD_PATH << "#{File.dirname(__FILE__)}/../lib"
2
+
3
+ require 'socket'
4
+ require 'benchmark'
5
+
6
+ require 'rubygems'
7
+ require 'ruby-debug' if ENV['DEBUG']
8
+ require 'memcached'
9
+
10
+ require 'test/unit'
11
+ require 'test/unit/assertions'
12
+ require 'mocha/test_unit'
13
+ require 'ostruct'
14
+
15
+ UNIX_SOCKET_NAME = File.join(ENV['TMPDIR']||'/tmp','memcached') unless defined? UNIX_SOCKET_NAME
16
+
17
+ class GenericClass
18
+ end
@@ -0,0 +1,8 @@
1
+
2
+ require File.expand_path("#{File.dirname(__FILE__)}/../test_helper")
3
+
4
+ class BindingTest < Test::Unit::TestCase
5
+ def test_libmemcached_loaded
6
+ assert_nothing_raised { Rlibmemcached }
7
+ end
8
+ end
@@ -0,0 +1,272 @@
1
+ require File.expand_path("#{File.dirname(__FILE__)}/../test_helper")
2
+
3
+ class MemcachedExperimentalTest < Test::Unit::TestCase
4
+
5
+ def setup
6
+ @servers = ['localhost:43042', 'localhost:43043', "#{UNIX_SOCKET_NAME}0"]
7
+
8
+ # Maximum allowed prefix key size for :hash_with_prefix_key_key => false
9
+ @prefix_key = 'prefix_key_'
10
+
11
+ @options = {
12
+ :prefix_key => @prefix_key,
13
+ :hash => :default,
14
+ :distribution => :modula}
15
+ @cache = Memcached.new(@servers, @options)
16
+
17
+ @experimental_options = {
18
+ :prefix_key => @prefix_key,
19
+ :hash => :default,
20
+ :distribution => :modula,
21
+ :experimental_features => true}
22
+ @experimental_cache = Memcached.new(@servers, @experimental_options)
23
+
24
+ @experimental_cas_options = {
25
+ :prefix_key => @prefix_key,
26
+ :support_cas => true,
27
+ :experimental_features => true}
28
+ @experimental_cas_cache = Memcached.new(@servers, @experimental_cas_options)
29
+
30
+ @experimental_binary_protocol_options = {
31
+ :prefix_key => @prefix_key,
32
+ :hash => :default,
33
+ :distribution => :modula,
34
+ :experimental_features => true,
35
+ # binary_protocol does not work -- test_get, test_get, test_append, and test_missing_append will fail when it is set to true.
36
+ :binary_protocol => true}
37
+ @experimental_binary_protocol_cache = Memcached.new(@servers, @experimental_binary_protocol_options)
38
+
39
+ @value = OpenStruct.new(:a => 1, :b => 2, :c => GenericClass)
40
+ end
41
+
42
+ def server_get_len_capable
43
+ begin
44
+ value = "foobar"
45
+ @experimental_cache.set key, value, 0, false
46
+ @experimental_cache.get_len 1, key
47
+ yield
48
+ rescue Memcached::ProtocolError
49
+ # Skip tests when the server does not support the experimental get_len command.
50
+ end
51
+ end
52
+
53
+ def server_touch_capable
54
+ @experimental_binary_protocol_cache.set(key, 'touchval')
55
+ @experimental_binary_protocol_cache.touch(key)
56
+ yield
57
+ rescue Memcached::ProtocolError
58
+ # Skip tests when the server does not support the experimental touch command
59
+ end
60
+
61
+ def test_get_len
62
+ server_get_len_capable do
63
+ value = "foobar"
64
+ @experimental_cache.set key, value, 0, false
65
+ result = @experimental_cache.get_len 1, key
66
+ assert_equal result.size, 1
67
+ assert_equal result, value[0..0]
68
+
69
+ result = @experimental_cache.get_len 2, key
70
+ assert_equal result.size, 2
71
+ assert_equal result, value[0..1]
72
+
73
+ result = @experimental_cache.get_len 5, key
74
+ assert_equal result.size, 5
75
+ assert_equal result, value[0..4]
76
+
77
+ result = @experimental_cache.get_len 6, key
78
+ assert_equal result.size, 6
79
+ assert_equal result, value
80
+
81
+ result = @experimental_cache.get_len 32, key
82
+ assert_equal result.size, 6
83
+ assert_equal result, value
84
+ end
85
+ end
86
+
87
+ def test_get_len_0_failure
88
+ server_get_len_capable do
89
+ value = "Test that we cannot get 0 bytes with a get_len call."
90
+ @experimental_cache.set key, value, 0, false
91
+ assert_raises(Memcached::Failure) do
92
+ result = @experimental_cache.get_len 0, key
93
+ end
94
+ end
95
+ end
96
+
97
+ def test_get_len_large
98
+ server_get_len_capable do
99
+ value = "Test that we can get the first 20 bytes of a string"
100
+ @experimental_cache.set key, value, 0, false
101
+ result = @experimental_cache.get_len 20, key
102
+ assert_equal result.size, 20
103
+ assert_equal result, value[0..19]
104
+ end
105
+ end
106
+
107
+ def test_get_len_packed
108
+ server_get_len_capable do
109
+ value = [1, 2, 3, 4].pack("Q*")
110
+ @experimental_cache.set key, value, 0, false
111
+ result = @experimental_cache.get_len 8, key
112
+ assert_equal [1], result.unpack("Q*")
113
+ end
114
+ end
115
+
116
+ # get_len is not supported when using the binary protocol.
117
+ # Make sure the single get variant fails appropriately.
118
+ def test_get_len_binary
119
+ server_get_len_capable do
120
+ @experimental_binary_protocol_cache.set key, @value
121
+ assert_raises(Memcached::ActionNotSupported) do
122
+ result = @experimental_binary_protocol_cache.get_len 2, key
123
+ end
124
+ end
125
+ end
126
+
127
+ # Retrieve the first 64 bits of the values for multiple keys.
128
+ def test_get_len_multi_packed
129
+ server_get_len_capable do
130
+ key_1 = "get_len_1"
131
+ value_1 = [1, 2, 3].pack("Q*")
132
+ key_2 = "get_len_missing"
133
+ key_3 = "get_len_2"
134
+ value_3 = [5, 6, 4].pack("Q*")
135
+ keys = [key_1, key_2, key_3]
136
+ @experimental_cache.set key_1, value_1, 0, false
137
+ @experimental_cache.set key_3, value_3, 0, false
138
+ assert_equal(
139
+ {key_1=>value_1[0..7], key_3=>value_3[0..7]},
140
+ @experimental_cache.get_len(8, keys)
141
+ )
142
+ end
143
+ end
144
+
145
+ # Test that the entire value is passed back when the length specified
146
+ # is larger than any of the values (e.g., 32 in the case below).
147
+ def test_get_len_multi_packed_full
148
+ server_get_len_capable do
149
+ key_1 = "get_len_1"
150
+ value_1 = [1, 2, 3].pack("Q*")
151
+ key_2 = "get_len_missing"
152
+ key_3 = "get_len_2"
153
+ value_3 = [5, 6, 4].pack("Q*")
154
+ keys = [key_1, key_2, key_3]
155
+ @experimental_cache.set key_1, value_1, 0, false
156
+ @experimental_cache.set key_3, value_3, 0, false
157
+ assert_equal(
158
+ {key_1=>value_1, key_3=>value_3},
159
+ @experimental_cache.get_len(32, keys)
160
+ )
161
+ end
162
+ end
163
+
164
+ # get_len is not supported when using the binary protocol.
165
+ # Test that the multi get variant fails appropriately.
166
+ def test_get_len_multi_packed_binary
167
+ server_get_len_capable do
168
+ key_1 = "get_len_1"
169
+ value_1 = [1, 2, 3].pack("Q*")
170
+ key_2 = "get_len_2"
171
+ value_2 = [5, 6, 4].pack("Q*")
172
+ keys = [key_1, key_2]
173
+ @experimental_binary_protocol_cache.set key_1, value_1, 0, false
174
+ @experimental_binary_protocol_cache.set key_2, value_2, 0, false
175
+ assert_raises(Memcached::ActionNotSupported) do
176
+ result = @experimental_binary_protocol_cache.get_len 2, keys
177
+ end
178
+ end
179
+ end
180
+
181
+ def test_get_len_multi_completely_missing
182
+ server_get_len_capable do
183
+ @experimental_cache.delete "#{key}_1" rescue nil
184
+ @experimental_cache.delete "#{key}_2" rescue nil
185
+ assert_equal(
186
+ {},
187
+ @experimental_cache.get_len(1, ["#{key}_1", "#{key}_2"])
188
+ )
189
+ end
190
+ end
191
+
192
+ def test_get_len_failure
193
+ server_get_len_capable do
194
+ value = "Test that we cannot use get_len without setting the :experimental_features config."
195
+ assert_raises(NoMethodError) do
196
+ result = @cache.get_len 10, key
197
+ end
198
+ end
199
+ end
200
+
201
+ def test_cas
202
+ server_get_len_capable do
203
+ # Get the first three chars of the value back.
204
+ @experimental_cas_cache.set(key, "foo_bar", 0, false)
205
+ assert_equal "foo", @experimental_cas_cache.get_len(3, key)
206
+ assert_equal "foo_bar", @experimental_cas_cache.get_len(7, key)
207
+ end
208
+ end
209
+
210
+ # Touch command
211
+
212
+ def test_touch_capability
213
+ server_touch_capable do
214
+ @experimental_binary_protocol_cache.set(key, "value", 10)
215
+ assert_nothing_raised do
216
+ @experimental_binary_protocol_cache.touch(key, 20)
217
+ end
218
+ assert_raises(Memcached::ActionNotSupported) do
219
+ @experimental_cache.touch(key, 10)
220
+ end
221
+ end
222
+ end
223
+
224
+ def test_touch_missing_key
225
+ server_touch_capable do
226
+ @experimental_binary_protocol_cache.delete key rescue nil
227
+ assert_raises(Memcached::NotFound) do
228
+ @experimental_binary_protocol_cache.touch(key, 10)
229
+ end
230
+ end
231
+ end
232
+
233
+ def test_touch
234
+ server_touch_capable do
235
+ @experimental_binary_protocol_cache.set key, @value, 2
236
+ assert_equal @value, @experimental_binary_protocol_cache.get(key)
237
+ sleep(1)
238
+ assert_equal @value, @experimental_binary_protocol_cache.get(key)
239
+ @experimental_binary_protocol_cache.touch(key, 3)
240
+ sleep(2)
241
+ assert_equal @value, @experimental_binary_protocol_cache.get(key)
242
+ sleep(2)
243
+ assert_raises(Memcached::NotFound) do
244
+ @experimental_binary_protocol_cache.get(key)
245
+ end
246
+ end
247
+ end
248
+
249
+ # Memory cleanup
250
+
251
+ def test_reset
252
+ original_struct = @cache.instance_variable_get("@struct")
253
+ assert_nothing_raised do
254
+ @cache.reset
255
+ end
256
+ assert_not_equal original_struct,
257
+ @cache.instance_variable_get("@struct")
258
+ end
259
+
260
+ private
261
+
262
+ def key
263
+ caller.first[/.*[` ](.*)'/, 1] # '
264
+ end
265
+
266
+ def stub_server(port)
267
+ socket = TCPServer.new('127.0.0.1', port)
268
+ Thread.new { socket.accept }
269
+ socket
270
+ end
271
+
272
+ end