|
3 | 3 | describe 'Retryable writes tests' do |
4 | 4 |
|
5 | 5 | let(:client) do |
6 | | - authorized_client.with(retry_writes: true) |
| 6 | + subscribed_client |
7 | 7 | end |
8 | 8 |
|
9 | 9 | let(:collection) do |
|
41 | 41 | client['retryable-writes-error-spec', read: {mode: :secondary_preferred}] |
42 | 42 | end |
43 | 43 |
|
44 | | - it 'is reported on the server of the second attempt' do |
45 | | - first_primary = client.cluster.next_primary |
| 44 | + let(:events) do |
| 45 | + events = EventSubscriber.command_started_events('find') |
| 46 | + end |
| 47 | + |
| 48 | + let(:first_server) do |
| 49 | + client.cluster.servers_list.detect do |server| |
| 50 | + server.address.seed == events.first.address.seed |
| 51 | + end |
| 52 | + end |
| 53 | + |
| 54 | + let(:second_server) do |
| 55 | + client.cluster.servers_list.detect do |server| |
| 56 | + server.address.seed == events.last.address.seed |
| 57 | + end |
| 58 | + end |
46 | 59 |
|
| 60 | + let(:perform_read) do |
47 | 61 | client.cluster.servers_list.each do |server| |
48 | 62 | server.monitor.stop! |
49 | 63 | end |
|
52 | 66 | client.use(:admin).database.command(fail_point_command) |
53 | 67 | end |
54 | 68 |
|
55 | | - # Retry should happen on a server other than the one used for |
56 | | - # initial attempt |
57 | | - expected_hosts = client.cluster.servers.reject do |server| |
58 | | - server.address == first_primary.address |
59 | | - end.map(&:address).map(&:host) |
60 | | - |
61 | 69 | begin |
62 | 70 | collection.find(a: 1).to_a |
63 | | - rescue Mongo::Error::OperationFailure => e |
| 71 | + rescue Mongo::Error::OperationFailure => @exception |
64 | 72 | else |
65 | 73 | fail('Expected operation to fail') |
66 | 74 | end |
67 | 75 |
|
68 | | - puts e.message |
| 76 | + puts @exception.message |
69 | 77 |
|
70 | | - found = expected_hosts.any? do |host| |
71 | | - e.message.include?(host) |
72 | | - end |
73 | | - expect(found).to be true |
| 78 | + expect(events.length).to eq(2) |
| 79 | + expect(events.first.address.seed).not_to eq(events.last.address.seed) |
| 80 | + end |
| 81 | + |
| 82 | + it 'is reported on the server of the second attempt' do |
| 83 | + perform_read |
| 84 | + |
| 85 | + expect(@exception.message).not_to include(first_server.address.seed) |
| 86 | + expect(@exception.message).to include(second_server.address.seed) |
| 87 | + end |
| 88 | + |
| 89 | + it 'marks servers used in both attempts unknown' do |
| 90 | + perform_read |
74 | 91 |
|
75 | | - expect(e.message).not_to include("on #{first_primary.address.seed}") |
| 92 | + expect(first_server).to be_unknown |
76 | 93 |
|
77 | | - current_primary = client.cluster.next_primary |
| 94 | + expect(second_server).to be_unknown |
78 | 95 | end |
79 | 96 | end |
80 | 97 | end |
0 commit comments