memcached 1.1.2 → 1.1.3

Sign up to get free protection for your applications and to get access to all the features.
data.tar.gz.sig CHANGED
Binary file
data/CHANGELOG CHANGED
@@ -1,3 +1,5 @@
1
+ v1.1.3. Register new objects to fix leaks around memcached_server_st and other rich structs (tobi).
2
+
1
3
  v1.1.2. Fix memory leak in memcached_mget().
2
4
 
3
5
  v1.1.1. Speed up multiget. Don't cast types on unmarshalled set.
data/README CHANGED
@@ -7,7 +7,7 @@ An interface to the libmemcached C client.
7
7
 
8
8
  Copyright 2009 Cloudburst, LLC. Licensed under the AFL 3. See the included LICENSE file. Portions copyright 2007-2009 TangentOrg, Brian Aker, licensed under the BSD license, and used with permission.
9
9
 
10
- The public certificate for this gem is here[http://blog.evanweaver.com/files/evan_weaver-original-public_cert.pem].
10
+ The public certificate for this gem is here[http://blog.evanweaver.com/files/evan_weaver-original-public_cert.pem].
11
11
 
12
12
  If you use this software, please {make a donation}[http://blog.evanweaver.com/donate/], or {recommend Evan}[http://www.workingwithrails.com/person/7739-evan-weaver] at Working with Rails.
13
13
 
@@ -26,7 +26,7 @@ You need Ruby 1.8.7 or Ruby 1.9.2. Other versions may work, but are not guarante
26
26
 
27
27
  Install the gem:
28
28
  sudo gem install memcached --no-rdoc --no-ri
29
-
29
+
30
30
  == Usage
31
31
 
32
32
  Start a local networked memcached server:
@@ -36,9 +36,9 @@ Now, in Ruby, require the library and instantiate a Memcached object at a global
36
36
 
37
37
  require 'memcached'
38
38
  $cache = Memcached.new("localhost:11211")
39
-
39
+
40
40
  Now you can set things and get things:
41
-
41
+
42
42
  value = 'hello'
43
43
  $cache.set 'test', value
44
44
  $cache.get 'test' #=> "hello"
@@ -55,9 +55,9 @@ You can get multiple values at once:
55
55
  value = 'hello'
56
56
  $cache.set 'test', value
57
57
  $cache.set 'test2', value
58
- $cache.get ['test', 'test2', 'missing']
58
+ $cache.get ['test', 'test2', 'missing']
59
59
  #=> {"test" => "hello", "test2" => "hello"}
60
-
60
+
61
61
  You can set a counter and increment it:
62
62
 
63
63
  start = 1
@@ -69,7 +69,7 @@ You can set a counter and increment it:
69
69
  You can get some server stats:
70
70
 
71
71
  $cache.stats #=> {..., :bytes_written=>[62], :version=>["1.2.4"] ...}
72
-
72
+
73
73
  Note that the API is not the same as that of <b>Ruby-MemCache</b> or <b>memcache-client</b>. In particular, <tt>nil</tt> is a valid record value. Memcached#get does not return <tt>nil</tt> on failure, rather it raises <b>Memcached::NotFound</b>. This is consistent with the behavior of memcached itself. For example:
74
74
 
75
75
  $cache.set 'test', nil
@@ -79,7 +79,7 @@ Note that the API is not the same as that of <b>Ruby-MemCache</b> or <b>memcache
79
79
 
80
80
  == Legacy applications
81
81
 
82
- There is a compatibility wrapper for legacy applications called Memcached::Rails.
82
+ There is a compatibility wrapper for legacy applications called Memcached::Rails.
83
83
 
84
84
  == Threading
85
85
 
@@ -90,14 +90,14 @@ There is a compatibility wrapper for legacy applications called Memcached::Rails
90
90
  # Perform operations on cache, not $cache
91
91
  cache.set 'example', 1
92
92
  cache.get 'example'
93
- end
93
+ end
94
94
 
95
95
  # Join the thread so that exceptions don't get lost
96
96
  thread.join
97
-
97
+
98
98
  == Benchmarks
99
99
 
100
- <b>memcached</b>, correctly configured, is up to 60x faster than <b>memcache-client</b> or <b>dalli</b>. See BENCHMARKS[link:files/BENCHMARKS.html] for details.
100
+ <b>memcached</b>, correctly configured, is between 5x and 60x faster than <b>memcache-client</b> and <b>dalli</b>. See BENCHMARKS[link:files/BENCHMARKS.html] for details.
101
101
 
102
102
  == Reporting problems
103
103
 
@@ -48,7 +48,7 @@ def check_libmemcached
48
48
 
49
49
  Dir.chdir(HERE) do
50
50
  if File.exist?("lib")
51
- puts "Libmemcached already built; run 'rake clean' first if you need to rebuild."
51
+ puts "Libmemcached already configured; run 'rake clean' first if you need to reconfigure."
52
52
  else
53
53
  # have_sasl check may fail on OSX, skip it
54
54
  # unless RUBY_PLATFORM =~ /darwin/ or have_library('sasl2')
@@ -70,12 +70,12 @@ def check_libmemcached
70
70
 
71
71
  Dir.chdir(BUNDLE_PATH) do
72
72
  run("env CFLAGS='-fPIC #{$CFLAGS}' LDFLAGS='-fPIC #{$LDFLAGS}' ./configure --prefix=#{HERE} --without-memcached --disable-shared --disable-utils --disable-dependency-tracking #{$EXTRA_CONF} 2>&1", "Configuring libmemcached.")
73
-
74
- #Running the make command in another script invoked by another shell command solves the "cd ." issue on FreeBSD 6+
75
- run("GMAKE_CMD='#{GMAKE_CMD}' CXXFLAGS='#{$CXXFLAGS}' SOURCE_DIR='#{BUNDLE_PATH}' HERE='#{HERE}' ruby ../extconf-make.rb", "Making libmemcached.")
76
73
  end
74
+ end
77
75
 
78
- system("rm -rf #{BUNDLE_PATH}") unless ENV['DEBUG'] or ENV['DEV']
76
+ Dir.chdir(BUNDLE_PATH) do
77
+ #Running the make command in another script invoked by another shell command solves the "cd ." issue on FreeBSD 6+
78
+ run("GMAKE_CMD='#{GMAKE_CMD}' CXXFLAGS='#{$CXXFLAGS}' SOURCE_DIR='#{BUNDLE_PATH}' HERE='#{HERE}' ruby ../extconf-make.rb", "Making libmemcached.")
79
79
  end
80
80
  end
81
81
 
@@ -13,10 +13,18 @@
13
13
  %include "typemaps.i"
14
14
  %include "libmemcached/visibility.h"
15
15
 
16
+ //// Memory management
17
+
16
18
  // Register libmemcached's struct free function to prevent memory leaks
17
19
  %freefunc memcached_st "memcached_free";
18
20
  %freefunc memcached_server_st "memcached_server_free";
19
21
 
22
+ // Register which functions generate new objects
23
+ %newobject memcached_server_by_key;
24
+ %newobject memcached_create;
25
+ %newobject memcached_clone;
26
+ %newobject memcached_stat_get_value;
27
+
20
28
  // %trackobjects; // Doesn't fix any interesting leaks
21
29
 
22
30
  //// Input maps
@@ -106,13 +114,13 @@
106
114
  $1 = string;
107
115
  $2 = &length;
108
116
  };
117
+
118
+ // Strings with lengths
109
119
  %typemap(argout) (char *key, size_t *key_length) {
110
- // Pushes an empty string when *key_length == 0
111
120
  rb_ary_push($result, rb_str_new($1, *$2));
112
121
  }
113
122
 
114
123
  // Array of strings
115
-
116
124
  %typemap(out) (char **) {
117
125
  int i;
118
126
  VALUE ary = rb_ary_new();
@@ -141,7 +149,8 @@
141
149
  //// Manual wrappers
142
150
 
143
151
  // Single get. SWIG likes to use SWIG_FromCharPtr instead of SWIG_FromCharPtrAndSize because
144
- // of the retval/argout split, so it truncates return values with \0 in them.
152
+ // of the retval/argout split, so it truncates return values with \0 in them. There is probably a better
153
+ // way to do this.
145
154
  VALUE memcached_get_rvalue(memcached_st *ptr, const char *key, size_t key_length, uint32_t *flags, memcached_return *error);
146
155
  %{
147
156
  VALUE memcached_get_rvalue(memcached_st *ptr, const char *key, size_t key_length, uint32_t *flags, memcached_return *error) {
@@ -193,20 +202,6 @@ VALUE memcached_fetch_rvalue(memcached_st *ptr, char *key, size_t *key_length, u
193
202
  };
194
203
  %}
195
204
 
196
- // We need to wrap this so it doesn't leak memory. SWIG doesn't want to automatically free. We could
197
- // maybe use a 'ret' %typemap, but this is ok.
198
- VALUE memcached_stat_get_rvalue(memcached_st *ptr, memcached_stat_st *stat, char *key, memcached_return *error);
199
- %{
200
- VALUE memcached_stat_get_rvalue(memcached_st *ptr, memcached_stat_st *stat, char *key, memcached_return *error) {
201
- char *str;
202
- VALUE ret;
203
- str = memcached_stat_get_value(ptr, stat, key, error);
204
- ret = rb_str_new2(str);
205
- free(str);
206
- return ret;
207
- };
208
- %}
209
-
210
205
  // Ruby isn't aware that the pointer is an array... there is probably a better way to do this
211
206
  memcached_server_st *memcached_select_server_at(memcached_st *in_ptr, int index);
212
207
  %{
@@ -2294,16 +2294,6 @@ VALUE memcached_fetch_rvalue(memcached_st *ptr, char *key, size_t *key_length, u
2294
2294
  };
2295
2295
 
2296
2296
 
2297
- VALUE memcached_stat_get_rvalue(memcached_st *ptr, memcached_stat_st *stat, char *key, memcached_return *error) {
2298
- char *str;
2299
- VALUE ret;
2300
- str = memcached_stat_get_value(ptr, stat, key, error);
2301
- ret = rb_str_new2(str);
2302
- free(str);
2303
- return ret;
2304
- };
2305
-
2306
-
2307
2297
  memcached_server_st *memcached_select_server_at(memcached_st *in_ptr, int index) {
2308
2298
  return &(in_ptr->hosts[index]);
2309
2299
  };
@@ -6907,7 +6897,7 @@ _wrap_memcached_create(int argc, VALUE *argv, VALUE self) {
6907
6897
  }
6908
6898
  arg1 = (memcached_st *)(argp1);
6909
6899
  result = (memcached_st *)memcached_create(arg1);
6910
- vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_memcached_st, 0 | 0 );
6900
+ vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_memcached_st, SWIG_POINTER_OWN | 0 );
6911
6901
  return vresult;
6912
6902
  fail:
6913
6903
  return Qnil;
@@ -6960,7 +6950,7 @@ _wrap_memcached_clone(int argc, VALUE *argv, VALUE self) {
6960
6950
  }
6961
6951
  arg2 = (memcached_st *)(argp2);
6962
6952
  result = (memcached_st *)memcached_clone(arg1,arg2);
6963
- vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_memcached_st, 0 | 0 );
6953
+ vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_memcached_st, SWIG_POINTER_OWN | 0 );
6964
6954
  return vresult;
6965
6955
  fail:
6966
6956
  return Qnil;
@@ -8190,6 +8180,7 @@ _wrap_memcached_stat_get_value(int argc, VALUE *argv, VALUE self) {
8190
8180
  vresult = SWIG_Ruby_AppendOutput(vresult, SWIG_NewPointerObj((void*)(arg4), SWIGTYPE_p_memcached_return, new_flags));
8191
8181
  }
8192
8182
  if (alloc3 == SWIG_NEWOBJ) free((char*)buf3);
8183
+ free((char*)result);
8193
8184
  return vresult;
8194
8185
  fail:
8195
8186
  if (alloc3 == SWIG_NEWOBJ) free((char*)buf3);
@@ -9101,7 +9092,6 @@ _wrap_memcached_fetch(int argc, VALUE *argv, VALUE self) {
9101
9092
  result = (char *)memcached_fetch(arg1,arg2,arg3,arg4,arg5,arg6);
9102
9093
  vresult = SWIG_FromCharPtr((const char *)result);
9103
9094
  {
9104
- // Pushes an empty string when *key_length == 0
9105
9095
  rb_ary_push(vresult, rb_str_new(arg2, *arg3));
9106
9096
  }
9107
9097
  if (SWIG_IsTmpObj(res4)) {
@@ -12064,7 +12054,7 @@ _wrap_memcached_server_by_key(int argc, VALUE *argv, VALUE self) {
12064
12054
  arg3 = (size_t) RSTRING_LEN(argv[1]);
12065
12055
  }
12066
12056
  result = (memcached_server_st *)memcached_server_by_key(arg1,(char const *)arg2,arg3,arg4);
12067
- vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_memcached_server_st, 0 | 0 );
12057
+ vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_memcached_server_st, SWIG_POINTER_OWN | 0 );
12068
12058
  if (SWIG_IsTmpObj(res4)) {
12069
12059
  vresult = SWIG_Ruby_AppendOutput(vresult, SWIG_From_unsigned_SS_short((*arg4)));
12070
12060
  } else {
@@ -12680,7 +12670,6 @@ _wrap_memcached_fetch_rvalue(int argc, VALUE *argv, VALUE self) {
12680
12670
  result = (VALUE)memcached_fetch_rvalue(arg1,arg2,arg3,arg4,arg5);
12681
12671
  vresult = result;
12682
12672
  {
12683
- // Pushes an empty string when *key_length == 0
12684
12673
  rb_ary_push(vresult, rb_str_new(arg2, *arg3));
12685
12674
  }
12686
12675
  if (SWIG_IsTmpObj(res4)) {
@@ -12701,59 +12690,6 @@ fail:
12701
12690
  }
12702
12691
 
12703
12692
 
12704
- SWIGINTERN VALUE
12705
- _wrap_memcached_stat_get_rvalue(int argc, VALUE *argv, VALUE self) {
12706
- memcached_st *arg1 = (memcached_st *) 0 ;
12707
- memcached_stat_st *arg2 = (memcached_stat_st *) 0 ;
12708
- char *arg3 = (char *) 0 ;
12709
- memcached_return *arg4 = (memcached_return *) 0 ;
12710
- void *argp1 = 0 ;
12711
- int res1 = 0 ;
12712
- void *argp2 = 0 ;
12713
- int res2 = 0 ;
12714
- int res3 ;
12715
- char *buf3 = 0 ;
12716
- int alloc3 = 0 ;
12717
- memcached_return temp4 ;
12718
- int res4 = SWIG_TMPOBJ ;
12719
- VALUE result;
12720
- VALUE vresult = Qnil;
12721
-
12722
- arg4 = &temp4;
12723
- if ((argc < 3) || (argc > 3)) {
12724
- rb_raise(rb_eArgError, "wrong # of arguments(%d for 3)",argc); SWIG_fail;
12725
- }
12726
- res1 = SWIG_ConvertPtr(argv[0], &argp1,SWIGTYPE_p_memcached_st, 0 | 0 );
12727
- if (!SWIG_IsOK(res1)) {
12728
- SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "memcached_st *","memcached_stat_get_rvalue", 1, argv[0] ));
12729
- }
12730
- arg1 = (memcached_st *)(argp1);
12731
- res2 = SWIG_ConvertPtr(argv[1], &argp2,SWIGTYPE_p_memcached_stat_st, 0 | 0 );
12732
- if (!SWIG_IsOK(res2)) {
12733
- SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "memcached_stat_st *","memcached_stat_get_rvalue", 2, argv[1] ));
12734
- }
12735
- arg2 = (memcached_stat_st *)(argp2);
12736
- res3 = SWIG_AsCharPtrAndSize(argv[2], &buf3, NULL, &alloc3);
12737
- if (!SWIG_IsOK(res3)) {
12738
- SWIG_exception_fail(SWIG_ArgError(res3), Ruby_Format_TypeError( "", "char *","memcached_stat_get_rvalue", 3, argv[2] ));
12739
- }
12740
- arg3 = (char *)(buf3);
12741
- result = (VALUE)memcached_stat_get_rvalue(arg1,arg2,arg3,arg4);
12742
- vresult = result;
12743
- if (SWIG_IsTmpObj(res4)) {
12744
- vresult = SWIG_Ruby_AppendOutput(vresult, SWIG_From_unsigned_SS_short((*arg4)));
12745
- } else {
12746
- int new_flags = SWIG_IsNewObj(res4) ? (SWIG_POINTER_OWN | 0 ) : 0 ;
12747
- vresult = SWIG_Ruby_AppendOutput(vresult, SWIG_NewPointerObj((void*)(arg4), SWIGTYPE_p_memcached_return, new_flags));
12748
- }
12749
- if (alloc3 == SWIG_NEWOBJ) free((char*)buf3);
12750
- return vresult;
12751
- fail:
12752
- if (alloc3 == SWIG_NEWOBJ) free((char*)buf3);
12753
- return Qnil;
12754
- }
12755
-
12756
-
12757
12693
  SWIGINTERN VALUE
12758
12694
  _wrap_memcached_select_server_at(int argc, VALUE *argv, VALUE self) {
12759
12695
  memcached_st *arg1 = (memcached_st *) 0 ;
@@ -13716,7 +13652,6 @@ SWIGEXPORT void Init_rlibmemcached(void) {
13716
13652
  rb_define_module_function(mRlibmemcached, "memcached_get_len_rvalue", _wrap_memcached_get_len_rvalue, -1);
13717
13653
  rb_define_module_function(mRlibmemcached, "memcached_get_from_last_rvalue", _wrap_memcached_get_from_last_rvalue, -1);
13718
13654
  rb_define_module_function(mRlibmemcached, "memcached_fetch_rvalue", _wrap_memcached_fetch_rvalue, -1);
13719
- rb_define_module_function(mRlibmemcached, "memcached_stat_get_rvalue", _wrap_memcached_stat_get_rvalue, -1);
13720
13655
  rb_define_module_function(mRlibmemcached, "memcached_select_server_at", _wrap_memcached_select_server_at, -1);
13721
13656
  rb_define_module_function(mRlibmemcached, "memcached_select_stat_at", _wrap_memcached_select_stat_at, -1);
13722
13657
  rb_define_module_function(mRlibmemcached, "memcached_generate_hash_rvalue", _wrap_memcached_generate_hash_rvalue, -1);
@@ -223,12 +223,10 @@ Please note that when <tt>:no_block => true</tt>, update methods do not raise on
223
223
  # object.
224
224
  #
225
225
  def clone
226
- # FIXME Memory leak
227
- # memcached = super
228
- # struct = Lib.memcached_clone(nil, @struct)
229
- # memcached.instance_variable_set('@struct', struct)
230
- # memcached
231
- self.class.new(servers, options.merge(:prefix_key => prefix_key))
226
+ memcached = super
227
+ struct = Lib.memcached_clone(nil, @struct)
228
+ memcached.instance_variable_set('@struct', struct)
229
+ memcached
232
230
  end
233
231
 
234
232
  # Reset the state of the libmemcached struct. This is useful for changing the server list at runtime.
@@ -561,7 +559,7 @@ Please note that when <tt>:no_block => true</tt>, update methods do not raise on
561
559
  keys.each do |key|
562
560
  server_structs.size.times do |index|
563
561
 
564
- value, ret = Lib.memcached_stat_get_rvalue(
562
+ value, ret = Lib.memcached_stat_get_value(
565
563
  @struct,
566
564
  Lib.memcached_select_stat_at(@struct, stat_struct, index),
567
565
  key)
@@ -2,12 +2,12 @@
2
2
 
3
3
  Gem::Specification.new do |s|
4
4
  s.name = %q{memcached}
5
- s.version = "1.1.2"
5
+ s.version = "1.1.3"
6
6
 
7
7
  s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
8
8
  s.authors = ["Evan Weaver"]
9
9
  s.cert_chain = ["/Users/eweaver/p/configuration/gem_certificates/evan_weaver-original-public_cert.pem"]
10
- s.date = %q{2011-02-24}
10
+ s.date = %q{2011-02-27}
11
11
  s.description = %q{An interface to the libmemcached C client.}
12
12
  s.email = %q{}
13
13
  s.extensions = ["ext/extconf.rb"]
@@ -97,10 +97,36 @@ class Worker
97
97
  @cache.delete @key1
98
98
  @cache.delete @key2
99
99
  end
100
- when "stats"
100
+ when "everything"
101
101
  @i.times do
102
- @cache.stats
102
+ @cache.set @key1, @value
103
+ @cache.set @key2, @value
104
+ @cache.get @key1
105
+ @cache.get @key3
106
+ @cache.get [@key1, @key2, @key3]
107
+ @cache.prepend @key1, @marshalled
108
+ @cache.prepend @key2, @marshalled
109
+ @cache.delete @key1
110
+ @cache.delete @key2
111
+ @cache.prepend @key1, @marshalled
112
+ @cache.prepend @key2, @marshalled
113
+ @cache.get @key1
114
+ @cache.get @key3
115
+ cache = @cache.clone
116
+ servers = @cache.servers
117
+ server = @cache.server_by_key(@key1)
118
+ end
119
+ @i.times do
120
+ @cache.reset
103
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
104
130
  when "multiget"
105
131
  @i.times do
106
132
  @cache.get([@key1, @key2, @key3])
@@ -136,9 +162,9 @@ class Worker
136
162
  ObjectSpace.each_object(Memcached) { clients += 1 }
137
163
  ObjectSpace.each_object(Rlibmemcached::MemcachedSt) { sts += 1 }
138
164
  ObjectSpace.each_object(Rlibmemcached::MemcachedServerSt) { server_sts += 1 }
139
- puts "*** Structs: #{sts} ***"
140
- puts "*** Server structs: #{server_sts} ***"
141
- puts "*** Clients: #{clients} ***"
165
+ puts "*** memcached_st structs: #{sts} ***"
166
+ puts "*** memcached_server_st structs: #{server_sts} ***"
167
+ puts "*** Memcached instances: #{clients} ***"
142
168
 
143
169
  begin;
144
170
  require 'memory'
@@ -1,3 +1,3 @@
1
1
  require "#{File.dirname(__FILE__)}/../setup"
2
2
 
3
- exec("valgrind --tool=memcheck --error-limit=no --leak-check=full --show-reachable=no --num-callers=15 --track-fds=yes --workaround-gcc296-bugs=yes --max-stackframe=7304328 --dsymutil=yes --track-origins=yes ruby -r#{File.dirname(__FILE__)}/exercise.rb -e \"Worker.new(ENV['TEST'] || 'mixed', 500, 'true').work\"")
3
+ 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 --dsymutil=yes ruby -r#{File.dirname(__FILE__)}/exercise.rb -e \"Worker.new(ENV['TEST'] || 'everything', 50, 'true').work\"")
@@ -1,18 +1,16 @@
1
1
 
2
2
  $LOAD_PATH << "#{File.dirname(__FILE__)}/../lib"
3
3
 
4
- require 'rubygems'
5
- require 'mocha'
6
4
  require 'socket'
7
5
  require 'benchmark'
8
6
 
9
- if ENV['DEBUG']
10
- require 'ruby-debug'
11
- end
12
-
7
+ require 'rubygems'
8
+ require 'ruby-debug' if ENV['DEBUG']
13
9
  require 'memcached'
10
+
14
11
  require 'test/unit'
15
12
  require 'ostruct'
13
+ require 'mocha'
16
14
 
17
15
  UNIX_SOCKET_NAME = File.join(ENV['TMPDIR']||'/tmp','memcached') unless defined? UNIX_SOCKET_NAME
18
16
 
@@ -20,7 +20,6 @@ class MemcachedTest < Test::Unit::TestCase
20
20
  :prefix_key => @prefix_key,
21
21
  :hash => :default,
22
22
  :distribution => :modula,
23
- # binary_protocol does not work -- test_get, test_get, test_append, and test_missing_append will fail when it is set to true.
24
23
  :binary_protocol => true}
25
24
  @binary_protocol_cache = Memcached.new(@servers, @binary_protocol_options)
26
25
 
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: memcached
3
3
  version: !ruby/object:Gem::Version
4
- hash: 23
4
+ hash: 21
5
5
  prerelease:
6
6
  segments:
7
7
  - 1
8
8
  - 1
9
- - 2
10
- version: 1.1.2
9
+ - 3
10
+ version: 1.1.3
11
11
  platform: ruby
12
12
  authors:
13
13
  - Evan Weaver
@@ -36,7 +36,7 @@ cert_chain:
36
36
  yZ0=
37
37
  -----END CERTIFICATE-----
38
38
 
39
- date: 2011-02-24 00:00:00 -08:00
39
+ date: 2011-02-27 00:00:00 -08:00
40
40
  default_executable:
41
41
  dependencies: []
42
42
 
metadata.gz.sig CHANGED
Binary file