redis_failover 0.9.0 → 0.9.1
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/Changes.md +6 -0
- data/README.md +1 -0
- data/lib/redis_failover/client.rb +5 -3
- data/lib/redis_failover/node.rb +4 -4
- data/lib/redis_failover/node_manager.rb +18 -4
- data/lib/redis_failover/version.rb +1 -1
- metadata +4 -4
data/Changes.md
CHANGED
data/README.md
CHANGED
@@ -175,6 +175,7 @@ redis_failover uses YARD for its API documentation. Refer to the generated [API
|
|
175
175
|
- To learn more about ZooKeeper, see the official [ZooKeeper](http://zookeeper.apache.org/) site.
|
176
176
|
- See the [Quick ZooKeeper Guide](https://github.com/ryanlecompte/redis_failover/wiki/Quick-ZooKeeper-Guide) for a quick guide to getting ZooKeeper up and running with redis_failover.
|
177
177
|
- To learn more about how ZooKeeper handles network partitions, see [ZooKeeper Failure Scenarios](http://wiki.apache.org/hadoop/ZooKeeper/FailureScenarios)
|
178
|
+
- Feel free to join #zk on the IRC freenode network. We're usually hanging out there talking about ZooKeeper and redis_failover.
|
178
179
|
|
179
180
|
|
180
181
|
## License
|
@@ -177,6 +177,8 @@ module RedisFailover
|
|
177
177
|
else
|
178
178
|
logger.error("Unknown ZK node event: #{event.inspect}")
|
179
179
|
end
|
180
|
+
ensure
|
181
|
+
@zk.stat(@znode, :watch => true)
|
180
182
|
end
|
181
183
|
|
182
184
|
# Determines if a method is a known redis operation.
|
@@ -237,7 +239,7 @@ module RedisFailover
|
|
237
239
|
# @raise [NoMasterError] if no master fallback is available
|
238
240
|
def slave
|
239
241
|
# pick a slave, if none available fallback to master
|
240
|
-
if slave = @lock.synchronize { @slaves.
|
242
|
+
if slave = @lock.synchronize { @slaves.shuffle.first }
|
241
243
|
verify_role!(slave, :slave)
|
242
244
|
return slave
|
243
245
|
end
|
@@ -253,7 +255,7 @@ module RedisFailover
|
|
253
255
|
return unless nodes_changed?(nodes)
|
254
256
|
|
255
257
|
purge_clients
|
256
|
-
logger.info("Building new clients for nodes #{nodes}")
|
258
|
+
logger.info("Building new clients for nodes #{nodes.inspect}")
|
257
259
|
new_master = new_clients_for(nodes[:master]).first if nodes[:master]
|
258
260
|
new_slaves = new_clients_for(*nodes[:slaves])
|
259
261
|
@master = new_master
|
@@ -287,7 +289,7 @@ module RedisFailover
|
|
287
289
|
def fetch_nodes
|
288
290
|
data = @zk.get(@znode, :watch => true).first
|
289
291
|
nodes = symbolize_keys(decode(data))
|
290
|
-
logger.debug("Fetched nodes: #{nodes}")
|
292
|
+
logger.debug("Fetched nodes: #{nodes.inspect}")
|
291
293
|
|
292
294
|
nodes
|
293
295
|
rescue Zookeeper::Exceptions::InheritedConnectionError => ex
|
data/lib/redis_failover/node.rb
CHANGED
@@ -175,14 +175,14 @@ module RedisFailover
|
|
175
175
|
redis = new_client
|
176
176
|
yield redis
|
177
177
|
end
|
178
|
-
rescue
|
179
|
-
raise NodeUnavailableError,
|
178
|
+
rescue => ex
|
179
|
+
raise NodeUnavailableError, "#{ex.class}: #{ex.message}", ex.backtrace
|
180
180
|
ensure
|
181
181
|
if redis
|
182
182
|
begin
|
183
183
|
redis.client.disconnect
|
184
|
-
rescue
|
185
|
-
raise NodeUnavailableError,
|
184
|
+
rescue => ex
|
185
|
+
raise NodeUnavailableError, "#{ex.class}: #{ex.message}", ex.backtrace
|
186
186
|
end
|
187
187
|
end
|
188
188
|
end
|
@@ -87,8 +87,15 @@ module RedisFailover
|
|
87
87
|
|
88
88
|
@zk.register(@manual_znode) do |event|
|
89
89
|
@mutex.synchronize do
|
90
|
-
|
91
|
-
|
90
|
+
begin
|
91
|
+
if event.node_created? || event.node_changed?
|
92
|
+
schedule_manual_failover
|
93
|
+
end
|
94
|
+
rescue => ex
|
95
|
+
logger.error("Error scheduling a manual failover: #{ex.inspect}")
|
96
|
+
logger.error(ex.backtrace.join("\n"))
|
97
|
+
ensure
|
98
|
+
@zk.stat(@manual_znode, :watch => true)
|
92
99
|
end
|
93
100
|
end
|
94
101
|
end
|
@@ -340,15 +347,22 @@ module RedisFailover
|
|
340
347
|
def schedule_manual_failover
|
341
348
|
return unless @leader
|
342
349
|
new_master = @zk.get(@manual_znode, :watch => true).first
|
350
|
+
return unless new_master && new_master.size > 0
|
343
351
|
logger.info("Received manual failover request for: #{new_master}")
|
352
|
+
logger.info("Current nodes: #{current_nodes.inspect}")
|
344
353
|
|
345
354
|
node = if new_master == ManualFailover::ANY_SLAVE
|
346
|
-
@slaves.
|
355
|
+
@slaves.shuffle.first
|
347
356
|
else
|
348
357
|
host, port = new_master.split(':', 2)
|
349
358
|
Node.new(:host => host, :port => port, :password => @options[:password])
|
350
359
|
end
|
351
|
-
|
360
|
+
|
361
|
+
if node
|
362
|
+
notify_state(node, :manual_failover)
|
363
|
+
else
|
364
|
+
logger.error('Failed to perform manual failover, no candidate found.')
|
365
|
+
end
|
352
366
|
end
|
353
367
|
end
|
354
368
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: redis_failover
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.9.
|
4
|
+
version: 0.9.1
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-08-
|
12
|
+
date: 2012-08-16 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: redis
|
@@ -189,7 +189,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
189
189
|
version: '0'
|
190
190
|
segments:
|
191
191
|
- 0
|
192
|
-
hash:
|
192
|
+
hash: -610590228690809533
|
193
193
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
194
194
|
none: false
|
195
195
|
requirements:
|
@@ -198,7 +198,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
198
198
|
version: '0'
|
199
199
|
segments:
|
200
200
|
- 0
|
201
|
-
hash:
|
201
|
+
hash: -610590228690809533
|
202
202
|
requirements: []
|
203
203
|
rubyforge_project:
|
204
204
|
rubygems_version: 1.8.23
|