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 113
|
# frozen_string_literal: true
# rubocop:todo all
module PerformsNoRetries
shared_examples 'it performs no retries' do
# required for failCommand
min_server_fcv '4.0'
context 'for connection error' do
before do
client.use('admin').command(
configureFailPoint: 'failCommand',
mode: { times: 1 },
data: {
failCommands: [command_name],
closeConnection: true,
}
)
end
it 'does not retry the operation' do
expect(Mongo::Logger.logger).not_to receive(:warn)
expect do
perform_operation
end.to raise_error(Mongo::Error::SocketError)
end
end
context 'for ETIMEDOUT' do
min_server_fcv '4.4'
# shorten socket timeout so these tests take less time to run
let(:socket_timeout) { 1 }
before do
client.use('admin').command(
configureFailPoint: 'failCommand',
mode: { times: 1 },
data: {
failCommands: [command_name],
blockConnection: true,
blockTimeMS: 1100,
}
)
end
it 'does not retry the operation' do
expect(Mongo::Logger.logger).not_to receive(:warn)
expect do
perform_operation
end.to raise_error(Mongo::Error::SocketTimeoutError)
end
after do
# Assure that the server has completed the operation before moving
# on to the next test.
sleep 1
end
end
context 'on server versions >= 4.4' do
min_server_fcv '4.4'
# These tests will be implemented in a follow-up PR
end
context 'on server versions <= 4.4' do
max_server_fcv '4.2'
context 'for OperationFailure with retryable code' do
before do
client.use('admin').command(
configureFailPoint: 'failCommand',
mode: { times: 1 },
data: {
failCommands: [command_name],
errorCode: 91, # a retryable error code
}
)
end
it 'does not retry the operation' do
expect(Mongo::Logger.logger).not_to receive(:warn)
expect do
perform_operation
end.to raise_error(Mongo::Error::OperationFailure, /91/)
end
end
context 'for OperationFailure with non-retryable code' do
before do
client.use('admin').command(
configureFailPoint: 'failCommand',
mode: { times: 1 },
data: {
failCommands: [command_name],
errorCode: 5, # a non-retryable error code
}
)
end
it 'does not retry the operation' do
expect(Mongo::Logger.logger).not_to receive(:warn)
expect do
perform_operation
end.to raise_error(Mongo::Error::OperationFailure, /5/)
end
end
end
end
end
|