@@ -119,7 +119,12 @@ def read_with_retry(session = nil, server_selector = nil, &block)
119
119
legacy_read_with_retry ( session , server_selector , &block )
120
120
else
121
121
server = select_server ( cluster , server_selector , session )
122
- yield server
122
+ begin
123
+ yield server
124
+ rescue Error ::SocketError , Error ::SocketTimeoutError , Error ::OperationFailure => e
125
+ e . add_note ( 'retries disabled' )
126
+ raise e
127
+ end
123
128
end
124
129
end
125
130
@@ -214,12 +219,14 @@ def write_with_retry(session, write_concern, ending_transaction = false, &block)
214
219
begin
215
220
yield ( server , txn_num , false )
216
221
rescue Error ::SocketError , Error ::SocketTimeoutError => e
222
+ e . add_note ( 'modern retry' )
217
223
e . add_note ( "attempt 1" )
218
224
if session . in_transaction? && !ending_transaction
219
225
raise e
220
226
end
221
227
retry_write ( e , session , txn_num , &block )
222
228
rescue Error ::OperationFailure => e
229
+ e . add_note ( 'modern retry' )
223
230
e . add_note ( "attempt 1" )
224
231
if e . unsupported_retryable_write?
225
232
raise_unsupported_error ( e )
@@ -250,7 +257,12 @@ def write_with_retry(session, write_concern, ending_transaction = false, &block)
250
257
def nro_write_with_retry ( session , write_concern , &block )
251
258
if session && session . client . options [ :retry_writes ]
252
259
server = select_server ( cluster , ServerSelector . primary , session )
253
- yield server
260
+ begin
261
+ yield server
262
+ rescue Error ::SocketError , Error ::SocketTimeoutError , Error ::OperationFailure => e
263
+ e . add_note ( 'retries disabled' )
264
+ raise e
265
+ end
254
266
else
255
267
legacy_write_with_retry ( nil , session , &block )
256
268
end
@@ -280,7 +292,8 @@ def legacy_write_with_retry(server = nil, session = nil)
280
292
server ||= select_server ( cluster , ServerSelector . primary , session )
281
293
yield server
282
294
rescue Error ::OperationFailure => e
283
- e . add_note ( "attempt #{ attempt + 1 } " )
295
+ e . add_note ( 'legacy retry' )
296
+ e . add_note ( "attempt #{ attempt } " )
284
297
server = nil
285
298
if attempt > client . max_write_retries
286
299
raise e
@@ -298,18 +311,19 @@ def legacy_write_with_retry(server = nil, session = nil)
298
311
private
299
312
300
313
def modern_read_with_retry ( session , server_selector , &block )
301
- attempt = 0
302
314
server = select_server ( cluster , server_selector , session )
303
315
begin
304
316
yield server
305
317
rescue Error ::SocketError , Error ::SocketTimeoutError => e
306
- e . add_note ( "attempt #{ attempt + 1 } " )
318
+ e . add_note ( 'modern retry' )
319
+ e . add_note ( "attempt 1" )
307
320
if session . in_transaction?
308
321
raise e
309
322
end
310
323
retry_read ( e , server_selector , session , &block )
311
324
rescue Error ::OperationFailure => e
312
- e . add_note ( "attempt #{ attempt + 1 } " )
325
+ e . add_note ( 'modern retry' )
326
+ e . add_note ( "attempt 1" )
313
327
if session . in_transaction? || !e . write_retryable?
314
328
raise e
315
329
end
@@ -324,15 +338,17 @@ def legacy_read_with_retry(session, server_selector)
324
338
attempt += 1
325
339
yield server
326
340
rescue Error ::SocketError , Error ::SocketTimeoutError => e
327
- e . add_note ( "attempt #{ attempt + 1 } " )
341
+ e . add_note ( 'legacy retry' )
342
+ e . add_note ( "attempt #{ attempt } " )
328
343
if attempt > client . max_read_retries || ( session && session . in_transaction? )
329
344
raise e
330
345
end
331
346
log_retry ( e , message : 'Legacy read retry' )
332
347
server = select_server ( cluster , server_selector , session )
333
348
retry
334
349
rescue Error ::OperationFailure => e
335
- e . add_note ( "attempt #{ attempt + 1 } " )
350
+ e . add_note ( 'legacy retry' )
351
+ e . add_note ( "attempt #{ attempt } " )
336
352
if e . retryable? && !( session && session . in_transaction? )
337
353
if attempt > client . max_read_retries
338
354
raise e
@@ -375,16 +391,19 @@ def retry_read(original_error, server_selector, session, &block)
375
391
begin
376
392
yield server , true
377
393
rescue Error ::SocketError , Error ::SocketTimeoutError => e
394
+ e . add_note ( 'modern retry' )
378
395
e . add_note ( "attempt 2" )
379
396
raise e
380
397
rescue Error ::OperationFailure => e
398
+ e . add_note ( 'modern retry' )
381
399
unless e . write_retryable?
382
400
original_error . add_note ( "later retry failed: #{ e . class } : #{ e } " )
383
401
raise original_error
384
402
end
385
403
e . add_note ( "attempt 2" )
386
404
raise e
387
405
rescue => e
406
+ e . add_note ( 'modern retry' )
388
407
original_error . add_note ( "later retry failed: #{ e . class } : #{ e } " )
389
408
raise original_error
390
409
end
@@ -398,15 +417,19 @@ def retry_write(original_error, session, txn_num, &block)
398
417
# server unknown). Here we just need to wait for server selection.
399
418
server = select_server ( cluster , ServerSelector . primary , session )
400
419
unless server . retry_writes?
420
+ # Do not need to add "modern retry" here, it should already be on
421
+ # the first exception.
401
422
original_error . add_note ( 'did not retry because server selected for retry does not supoprt retryable writes' )
402
423
raise original_error
403
424
end
404
425
log_retry ( original_error , message : 'Write retry' )
405
426
yield ( server , txn_num , true )
406
427
rescue Error ::SocketError , Error ::SocketTimeoutError => e
428
+ e . add_note ( 'modern retry' )
407
429
e . add_note ( 'attempt 2' )
408
430
raise e
409
431
rescue Error ::OperationFailure => e
432
+ e . add_note ( 'modern retry' )
410
433
if e . write_retryable?
411
434
e . add_note ( 'attempt 2' )
412
435
raise e
@@ -415,6 +438,8 @@ def retry_write(original_error, session, txn_num, &block)
415
438
raise original_error
416
439
end
417
440
rescue => e
441
+ # Do not need to add "modern retry" here, it should already be on
442
+ # the first exception.
418
443
original_error . add_note ( "later retry failed: #{ e . class } : #{ e } " )
419
444
raise original_error
420
445
end
0 commit comments