/
node_manager_spec.rb
112 lines (96 loc) · 3.16 KB
/
node_manager_spec.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
require 'spec_helper'
module RedisFailover
describe NodeManager do
let(:manager) { NodeManagerStub.new({}) }
before(:each) do
manager.discover_nodes
end
describe '#nodes' do
it 'returns current master and slave nodes' do
manager.current_nodes.should == {
:master => 'master:6379',
:slaves => ['slave:6379'],
:unavailable => []
}
end
end
describe '#handle_unavailable' do
context 'slave dies' do
it 'moves slave to unavailable list' do
slave = manager.slaves.first
manager.force_unavailable(slave)
manager.current_nodes[:unavailable].should include(slave.to_s)
end
end
context 'master dies' do
before(:each) do
@slave = manager.slaves.first
@master = manager.master
manager.force_unavailable(@master)
end
it 'promotes slave to master' do
manager.master.should == @slave
end
it 'moves master to unavailable list' do
manager.current_nodes[:unavailable].should include(@master.to_s)
end
end
end
describe '#handle_available' do
before(:each) do
# force to be unavailable first
@slave = manager.slaves.first
manager.force_unavailable(@slave)
end
context 'slave node with a master present' do
it 'removes slave from unavailable list' do
manager.force_available(@slave)
manager.current_nodes[:unavailable].should be_empty
manager.current_nodes[:slaves].should include(@slave.to_s)
end
it 'makes node a slave of new master' do
manager.master = Node.new(:host => 'foo', :port => '7892')
manager.force_available(@slave)
@slave.fetch_info.should == {
:role => 'slave',
:master_host => 'foo',
:master_port => '7892'}
end
it 'does not invoke slaveof operation if master has not changed' do
@slave.redis.should_not_receive(:slaveof)
manager.force_available(@slave)
end
end
context 'slave node with no master present' do
before(:each) do
@master = manager.master
manager.force_unavailable(@master)
end
it 'promotes slave to master' do
manager.force_available(@slave)
manager.master.should == @slave
end
it 'slaves list remains empty' do
manager.current_nodes[:slaves].should be_empty
end
end
end
describe '#handle_syncing' do
context 'prohibits stale reads' do
it 'adds node to unavailable list' do
slave = manager.slaves.first
manager.force_syncing(slave, false)
manager.current_nodes[:unavailable].should include(slave.to_s)
end
end
context 'allows stale reads' do
it 'makes node available' do
slave = manager.slaves.first
manager.force_syncing(slave, true)
manager.current_nodes[:unavailable].should_not include(slave.to_s)
manager.current_nodes[:slaves].should include(slave.to_s)
end
end
end
end
end