nogara-redis_failover 0.8.11 → 0.9.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.
- data/Changes.md +2 -1
- data/lib/redis_failover/errors.rb +4 -0
- data/lib/redis_failover/node_manager.rb +4 -2
- data/lib/redis_failover/runner.rb +3 -2
- data/lib/redis_failover/version.rb +1 -1
- data/redis_failover.gemspec +2 -2
- data/spec/client_spec.rb +37 -12
- metadata +4 -4
data/Changes.md
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
|
1
|
+
0.9.0
|
2
2
|
-----------
|
3
3
|
- Make Node Manager's lock path vary with its main znode. (Bira)
|
4
4
|
- Node Manager's znode for holding current list of redis nodes is no longer ephemeral. This is unnecessary since the current master should only be changed by redis_failover.
|
@@ -7,6 +7,7 @@ HEAD
|
|
7
7
|
- Introduce RedisFailover::Client#on_node_change callback notification for when the currently known list of master/slave redis nodes changes.
|
8
8
|
- Added #current_master and #current_slaves to RedisFailover::Client. This is useful for programmatically doing things based on the current master/slaves.
|
9
9
|
- redis_node_manager should start if no redis servers are available (#29)
|
10
|
+
- Better handling of ZK session expirations in Node Manager.
|
10
11
|
|
11
12
|
0.8.9
|
12
13
|
-----------
|
@@ -52,7 +52,7 @@ module RedisFailover
|
|
52
52
|
spawn_watchers
|
53
53
|
handle_state_reports
|
54
54
|
end
|
55
|
-
rescue ZK::Exceptions::InterruptedSession => ex
|
55
|
+
rescue ZK::Exceptions::InterruptedSession, ZKDisconnectedError => ex
|
56
56
|
logger.error("ZK error while attempting to manage nodes: #{ex.inspect}")
|
57
57
|
logger.error(ex.backtrace.join("\n"))
|
58
58
|
shutdown
|
@@ -83,6 +83,7 @@ module RedisFailover
|
|
83
83
|
def setup_zk
|
84
84
|
@zk.close! if @zk
|
85
85
|
@zk = ZK.new("#{@options[:zkservers]}#{@options[:chroot] || ''}")
|
86
|
+
@zk.on_expired_session { notify_state(:zk_disconnected, nil) }
|
86
87
|
|
87
88
|
@zk.register(@manual_znode) do |event|
|
88
89
|
@mutex.synchronize do
|
@@ -106,12 +107,13 @@ module RedisFailover
|
|
106
107
|
when :available then handle_available(node)
|
107
108
|
when :syncing then handle_syncing(node)
|
108
109
|
when :manual_failover then handle_manual_failover(node)
|
110
|
+
when :zk_disconnected then raise ZKDisconnectedError
|
109
111
|
else raise InvalidNodeStateError.new(node, state)
|
110
112
|
end
|
111
113
|
|
112
114
|
# flush current state
|
113
115
|
write_state
|
114
|
-
rescue ZK::Exceptions::InterruptedSession
|
116
|
+
rescue ZK::Exceptions::InterruptedSession, ZKDisconnectedError
|
115
117
|
# fail hard if this is a ZK connection-related error
|
116
118
|
raise
|
117
119
|
rescue => ex
|
@@ -10,8 +10,8 @@ module RedisFailover
|
|
10
10
|
options = CLI.parse(options)
|
11
11
|
@node_manager = NodeManager.new(options)
|
12
12
|
trap_signals
|
13
|
-
node_manager_thread = Thread.new { @node_manager.start }
|
14
|
-
node_manager_thread.join
|
13
|
+
@node_manager_thread = Thread.new { @node_manager.start }
|
14
|
+
@node_manager_thread.join
|
15
15
|
end
|
16
16
|
|
17
17
|
# Traps shutdown signals.
|
@@ -20,6 +20,7 @@ module RedisFailover
|
|
20
20
|
trap(signal) do
|
21
21
|
Util.logger.info('Shutting down ...')
|
22
22
|
@node_manager.shutdown
|
23
|
+
@node_manager_thread.join
|
23
24
|
exit(0)
|
24
25
|
end
|
25
26
|
end
|
data/redis_failover.gemspec
CHANGED
@@ -4,8 +4,8 @@ require File.expand_path('../lib/redis_failover/version', __FILE__)
|
|
4
4
|
Gem::Specification.new do |gem|
|
5
5
|
gem.authors = ["Ryan LeCompte"]
|
6
6
|
gem.email = ["lecompte@gmail.com"]
|
7
|
-
gem.description = %(
|
8
|
-
gem.summary = %(
|
7
|
+
gem.description = %(redis_failover is a ZooKeeper-based automatic master/slave failover solution for Ruby)
|
8
|
+
gem.summary = %(redis_failover is a ZooKeeper-based automatic master/slave failover solution for Ruby)
|
9
9
|
gem.homepage = "http://github.com/ryanlecompte/redis_failover"
|
10
10
|
|
11
11
|
gem.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
data/spec/client_spec.rb
CHANGED
@@ -26,7 +26,7 @@ module RedisFailover
|
|
26
26
|
end
|
27
27
|
|
28
28
|
describe Client do
|
29
|
-
let(:client) { ClientStub.new(:zkservers => 'localhost:9281') }
|
29
|
+
let(:client) { ClientStub.new(:zkservers => 'localhost:9281', :safe_mode => true) }
|
30
30
|
|
31
31
|
describe '#build_clients' do
|
32
32
|
it 'properly parses master' do
|
@@ -48,14 +48,28 @@ module RedisFailover
|
|
48
48
|
called.should be_true
|
49
49
|
end
|
50
50
|
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
51
|
+
context 'with :master_only false' do
|
52
|
+
it 'routes read operations to a slave' do
|
53
|
+
called = false
|
54
|
+
client.current_slaves.first.change_role_to('slave')
|
55
|
+
client.current_slaves.first.define_singleton_method(:get) do |*args|
|
56
|
+
called = true
|
57
|
+
end
|
58
|
+
client.get('foo')
|
59
|
+
called.should be_true
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
context 'with :master_only true' do
|
64
|
+
it 'routes read operations to master' do
|
65
|
+
client = ClientStub.new(:zkservers => 'localhost:9281', :master_only => true)
|
66
|
+
called = false
|
67
|
+
client.current_master.define_singleton_method(:get) do |*args|
|
68
|
+
called = true
|
69
|
+
end
|
70
|
+
client.get('foo')
|
71
|
+
called.should be_true
|
56
72
|
end
|
57
|
-
client.get('foo')
|
58
|
-
called.should be_true
|
59
73
|
end
|
60
74
|
|
61
75
|
it 'reconnects when node is unavailable' do
|
@@ -90,10 +104,21 @@ module RedisFailover
|
|
90
104
|
expect { client.select }.to raise_error(UnsupportedOperationError)
|
91
105
|
end
|
92
106
|
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
107
|
+
context 'with :safe_mode enabled' do
|
108
|
+
it 'rebuilds clients when no communication from Node Manager within certain time window' do
|
109
|
+
client.instance_variable_set(:@last_znode_timestamp, Time.at(0))
|
110
|
+
client.should_receive(:build_clients)
|
111
|
+
client.del('foo')
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
115
|
+
context 'with :safe_mode disabled' do
|
116
|
+
it 'does not rebuild clients when no communication from Node Manager within certain time window' do
|
117
|
+
client = ClientStub.new(:zkservers => 'localhost:9281', :safe_mode => false)
|
118
|
+
client.instance_variable_set(:@last_znode_timestamp, Time.at(0))
|
119
|
+
client.should_not_receive(:build_clients)
|
120
|
+
client.del('foo')
|
121
|
+
end
|
97
122
|
end
|
98
123
|
end
|
99
124
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: nogara-redis_failover
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.9.0
|
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-15 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: redis
|
@@ -129,7 +129,7 @@ dependencies:
|
|
129
129
|
- - ! '>='
|
130
130
|
- !ruby/object:Gem::Version
|
131
131
|
version: '0'
|
132
|
-
description:
|
132
|
+
description: redis_failover is a ZooKeeper-based automatic master/slave failover solution
|
133
133
|
for Ruby
|
134
134
|
email:
|
135
135
|
- lecompte@gmail.com
|
@@ -198,7 +198,7 @@ rubyforge_project:
|
|
198
198
|
rubygems_version: 1.8.24
|
199
199
|
signing_key:
|
200
200
|
specification_version: 3
|
201
|
-
summary:
|
201
|
+
summary: redis_failover is a ZooKeeper-based automatic master/slave failover solution
|
202
202
|
for Ruby
|
203
203
|
test_files:
|
204
204
|
- spec/cli_spec.rb
|