AdoccaMemcache 0.1.7 → 0.1.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/Rakefile +1 -1
- data/lib/am_memcache.rb +59 -56
- metadata +1 -1
data/Rakefile
CHANGED
@@ -4,7 +4,7 @@ require 'rubygems'
|
|
4
4
|
require 'hoe'
|
5
5
|
require './lib/adocca_memcache.rb'
|
6
6
|
|
7
|
-
Hoe.new('AdoccaMemcache', '0.1.
|
7
|
+
Hoe.new('AdoccaMemcache', '0.1.8') do |p|
|
8
8
|
p.rubyforge_name = 'adocca-plugins'
|
9
9
|
p.author = 'adocca Entertainment AB'
|
10
10
|
p.summary = 'A client library to simplify using memcached with Ruby on Rails projects.'
|
data/lib/am_memcache.rb
CHANGED
@@ -1,5 +1,4 @@
|
|
1
1
|
require 'socket'
|
2
|
-
require 'thread'
|
3
2
|
require 'digest/sha1'
|
4
3
|
require 'timeout'
|
5
4
|
require 'monitor'
|
@@ -71,7 +70,7 @@ module Adocca
|
|
71
70
|
@namespace = opts[:namespace]
|
72
71
|
@readonly = opts[:readonly]
|
73
72
|
if ActionController::Base.allow_concurrency
|
74
|
-
@mutex =
|
73
|
+
@mutex = Monitor.new
|
75
74
|
else
|
76
75
|
@mutex = NullMutex.new
|
77
76
|
end
|
@@ -79,6 +78,16 @@ module Adocca
|
|
79
78
|
@buckets = []
|
80
79
|
end
|
81
80
|
|
81
|
+
def self.log_error(e)
|
82
|
+
if defined?(RAILS_DEFAULT_LOGGER)
|
83
|
+
RAILS_DEFAULT_LOGGER.error(e)
|
84
|
+
RAILS_DEFAULT_LOGGER.error(PP.pp(e.backtrace, ""))
|
85
|
+
else
|
86
|
+
puts e
|
87
|
+
pp e.backtrace
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
82
91
|
# Return a string representation of the cache object.
|
83
92
|
def inspect
|
84
93
|
sprintf("<MemCache: %s servers, %s buckets, ns: %p, ro: %p>",
|
@@ -128,7 +137,7 @@ module Adocca
|
|
128
137
|
rval = nil
|
129
138
|
@mutex.synchronize do
|
130
139
|
begin
|
131
|
-
response, sock, server = sock_send_command(cache_key, "get #{cache_key}")
|
140
|
+
response, sock, server = sock_send_command(cache_key, "get #{cache_key}", true)
|
132
141
|
return :MemCache_no_such_entry if response =~ /^END/
|
133
142
|
|
134
143
|
v, cache_key, flags, bytes = response.split(/ /)
|
@@ -136,11 +145,11 @@ module Adocca
|
|
136
145
|
|
137
146
|
sock.gets
|
138
147
|
sock.gets
|
139
|
-
rescue MemCacheError => e
|
140
|
-
raise e
|
141
148
|
rescue Exception => err
|
142
149
|
server.mark_dead(err.message)
|
143
|
-
|
150
|
+
|
151
|
+
self.class.log_error(err)
|
152
|
+
return :MemCache_no_such_entry
|
144
153
|
end
|
145
154
|
end
|
146
155
|
|
@@ -151,7 +160,8 @@ module Adocca
|
|
151
160
|
begin
|
152
161
|
Marshal.load(rval)
|
153
162
|
rescue ArgumentError, TypeError => err
|
154
|
-
|
163
|
+
self.class.log_error(err)
|
164
|
+
return :MemCache_no_such_entry
|
155
165
|
end
|
156
166
|
end
|
157
167
|
end
|
@@ -168,10 +178,7 @@ module Adocca
|
|
168
178
|
#
|
169
179
|
def inc(key, amount = 1)
|
170
180
|
cache_key = make_cache_key(key)
|
171
|
-
rval =
|
172
|
-
@mutex.synchronize do
|
173
|
-
rval = send_command(cache_key, "incr #{cache_key} #{amount}")
|
174
|
-
end
|
181
|
+
rval = send_command(cache_key, "incr #{cache_key} #{amount}")
|
175
182
|
rval = rval.strip.to_i if rval =~ /^\d+/
|
176
183
|
rval
|
177
184
|
end
|
@@ -181,10 +188,7 @@ module Adocca
|
|
181
188
|
#
|
182
189
|
def dec(key, amount = 1)
|
183
190
|
cache_key = make_cache_key(key)
|
184
|
-
rval =
|
185
|
-
@mutex.synchronize do
|
186
|
-
rval = send_command(cache_key, "decr #{cache_key} #{amount}")
|
187
|
-
end
|
191
|
+
rval = send_command(cache_key, "decr #{cache_key} #{amount}")
|
188
192
|
rval = rval.strip.to_i if rval =~ /^\d+/
|
189
193
|
rval
|
190
194
|
end
|
@@ -204,9 +208,7 @@ module Adocca
|
|
204
208
|
else
|
205
209
|
marshaled_value = Marshal.dump(value)
|
206
210
|
end
|
207
|
-
|
208
|
-
send_command(cache_key, "add #{cache_key} 0 #{expiry} #{marshaled_value.size}\r\n" + marshaled_value) == ADD_STORED
|
209
|
-
end
|
211
|
+
send_command(cache_key, "add #{cache_key} 0 #{expiry} #{marshaled_value.size}\r\n" + marshaled_value) == ADD_STORED
|
210
212
|
end
|
211
213
|
|
212
214
|
# Add an entry to the cache.
|
@@ -218,18 +220,14 @@ module Adocca
|
|
218
220
|
else
|
219
221
|
marshaled_value = Marshal.dump(value)
|
220
222
|
end
|
221
|
-
|
222
|
-
send_command(cache_key, "set #{cache_key} 0 #{expiry} #{marshaled_value.size}\r\n" + marshaled_value)
|
223
|
-
end
|
223
|
+
send_command(cache_key, "set #{cache_key} 0 #{expiry} #{marshaled_value.size}\r\n" + marshaled_value)
|
224
224
|
end
|
225
225
|
|
226
226
|
# Remove an entry from the cache.
|
227
227
|
# return true if it is deleted
|
228
228
|
def delete(key, expiry = 0)
|
229
229
|
cache_key = make_cache_key(key)
|
230
|
-
|
231
|
-
send_command(cache_key, "delete #{cache_key} #{expiry}")
|
232
|
-
end
|
230
|
+
send_command(cache_key, "delete #{cache_key} #{expiry}")
|
233
231
|
end
|
234
232
|
|
235
233
|
# Reset the connection to all memcache servers. This should be called if
|
@@ -247,7 +245,7 @@ module Adocca
|
|
247
245
|
@mutex.synchronize do
|
248
246
|
|
249
247
|
begin
|
250
|
-
response, sock, server = sock_send_command(cache_key, "get #{cache_key}")
|
248
|
+
response, sock, server = sock_send_command(cache_key, "get #{cache_key}", true)
|
251
249
|
|
252
250
|
return false if response =~ /^END/
|
253
251
|
|
@@ -257,7 +255,8 @@ module Adocca
|
|
257
255
|
sock.gets
|
258
256
|
rescue Exception => err
|
259
257
|
server.mark_dead(err.message)
|
260
|
-
|
258
|
+
self.class.log_error(err)
|
259
|
+
return false
|
261
260
|
end
|
262
261
|
|
263
262
|
true
|
@@ -271,18 +270,16 @@ module Adocca
|
|
271
270
|
@servers.each do |server|
|
272
271
|
|
273
272
|
sock = server.socket
|
274
|
-
|
275
|
-
|
276
|
-
|
277
|
-
|
278
|
-
|
279
|
-
|
280
|
-
|
281
|
-
|
273
|
+
unless sock.nil?
|
274
|
+
begin
|
275
|
+
timeout(LIVELINESS_TIMEOUT) do
|
276
|
+
sock.write "flush_all\r\n"
|
277
|
+
sock.gets
|
278
|
+
end
|
279
|
+
rescue Exception => err
|
280
|
+
server.mark_dead(err.message)
|
281
|
+
self.class.log_error(err)
|
282
282
|
end
|
283
|
-
rescue Exception => err
|
284
|
-
server.mark_dead(err.message)
|
285
|
-
raise MemCacheError, err.message
|
286
283
|
end
|
287
284
|
end
|
288
285
|
end
|
@@ -363,7 +360,7 @@ module Adocca
|
|
363
360
|
|
364
361
|
# The amount of time to wait before attempting to re-establish a
|
365
362
|
# connection with a server that is marked dead.
|
366
|
-
RETRY_DELAY =
|
363
|
+
RETRY_DELAY = 60
|
367
364
|
|
368
365
|
# The host the memcached server is running on.
|
369
366
|
attr_reader :host
|
@@ -430,6 +427,7 @@ module Adocca
|
|
430
427
|
@status = "CONNECTED"
|
431
428
|
rescue Exception => err
|
432
429
|
self.mark_dead(err.message)
|
430
|
+
MemCache.log_error(err)
|
433
431
|
end
|
434
432
|
end
|
435
433
|
end
|
@@ -499,25 +497,30 @@ module Adocca
|
|
499
497
|
# Will send a command to the proper server for this key
|
500
498
|
# and return the response, socket and server
|
501
499
|
#
|
502
|
-
def sock_send_command(key, command)
|
503
|
-
|
504
|
-
|
505
|
-
|
506
|
-
|
507
|
-
|
508
|
-
|
509
|
-
|
510
|
-
|
511
|
-
|
512
|
-
|
513
|
-
|
514
|
-
|
515
|
-
|
516
|
-
|
500
|
+
def sock_send_command(key, command, squash_errors = false)
|
501
|
+
@mutex.synchronize do
|
502
|
+
server = nil
|
503
|
+
begin
|
504
|
+
raise MemCacheError, "No active servers" unless self.active?
|
505
|
+
raise MemCacheError, "Update of readonly cache" if @readonly
|
506
|
+
server = get_server_for_key(key)
|
507
|
+
|
508
|
+
sock = server.socket
|
509
|
+
raise MemCacheError, "No connection to server" if sock.nil?
|
510
|
+
|
511
|
+
response = nil
|
512
|
+
|
513
|
+
timeout(LIVELINESS_TIMEOUT) do
|
514
|
+
sock.write "#{command}\r\n"
|
515
|
+
[sock.gets, sock, server]
|
516
|
+
end
|
517
|
+
|
518
|
+
rescue Exception => err
|
519
|
+
server.mark_dead(err.message) if server
|
520
|
+
self.class.log_error(err)
|
521
|
+
raise err unless squash_errors
|
522
|
+
return err.message
|
517
523
|
end
|
518
|
-
rescue Exception => err
|
519
|
-
server.mark_dead(err.message)
|
520
|
-
raise MemCacheError, err.message
|
521
524
|
end
|
522
525
|
end
|
523
526
|
|
metadata
CHANGED
@@ -3,7 +3,7 @@ rubygems_version: 0.8.11
|
|
3
3
|
specification_version: 1
|
4
4
|
name: AdoccaMemcache
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 0.1.
|
6
|
+
version: 0.1.8
|
7
7
|
date: 2007-02-12 00:00:00 +01:00
|
8
8
|
summary: A client library to simplify using memcached with Ruby on Rails projects.
|
9
9
|
require_paths:
|