timshadel-starling 0.9.8.01.20080924 → 0.9.8.01.200809241125
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/lib/starling.rb +44 -7
- metadata +1 -1
data/lib/starling.rb
CHANGED
@@ -31,14 +31,29 @@ class Starling < MemCache
|
|
31
31
|
# Starling cluster.
|
32
32
|
|
33
33
|
def delete(key, expiry = 0)
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
34
|
+
with_servers do
|
35
|
+
_original_delete(key, expiry)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
##
|
40
|
+
# Provides a way to work with a specific list of servers by
|
41
|
+
# forcing all calls to #get_server_for_key to use a specific
|
42
|
+
# server, and changing that server each time that the call
|
43
|
+
# yields to the block provided. This helps work around the
|
44
|
+
# normally random nature of the #get_server_for_key method.
|
45
|
+
#
|
46
|
+
# Acquires the mutex for the entire duration of the call
|
47
|
+
# since unrelated calls to #get_server_for_key might be
|
48
|
+
# adversely affected by the non_random result.
|
49
|
+
def with_servers(my_servers = @servers.dup)
|
50
|
+
return unless block_given?
|
51
|
+
with_lock do
|
52
|
+
my_servers.each do |server|
|
53
|
+
@force_server = server
|
54
|
+
yield
|
41
55
|
end
|
56
|
+
@force_server = nil
|
42
57
|
end
|
43
58
|
end
|
44
59
|
|
@@ -117,6 +132,7 @@ class Starling < MemCache
|
|
117
132
|
raise ArgumentError, "illegal character in key #{key.inspect}" if key =~ /\s/
|
118
133
|
raise ArgumentError, "key too long #{key.inspect}" if key.length > 250
|
119
134
|
raise MemCacheError, "No servers available" if @servers.empty?
|
135
|
+
return @force_server if @force_server
|
120
136
|
|
121
137
|
bukkits = @buckets.dup
|
122
138
|
bukkits.nitems.times do |try|
|
@@ -129,3 +145,24 @@ class Starling < MemCache
|
|
129
145
|
raise MemCacheError, "No servers available (all dead)"
|
130
146
|
end
|
131
147
|
end
|
148
|
+
|
149
|
+
|
150
|
+
class MemCache
|
151
|
+
|
152
|
+
protected
|
153
|
+
|
154
|
+
##
|
155
|
+
# Ensure that everything within the given block is executed
|
156
|
+
# within the locked mutex if this client is multithreaded.
|
157
|
+
# If the client isn't multithreaded, the block is simply executed.
|
158
|
+
def with_lock
|
159
|
+
return unless block_given?
|
160
|
+
begin
|
161
|
+
@mutex.lock if @multithread
|
162
|
+
yield
|
163
|
+
ensure
|
164
|
+
@mutex.unlock if @multithread
|
165
|
+
end
|
166
|
+
end
|
167
|
+
|
168
|
+
end
|