@@ -206,19 +206,25 @@ def write_with_retry(session, write_concern, ending_transaction = false, &block)
206
206
return legacy_write_with_retry ( server , session , &block )
207
207
end
208
208
209
+ txn_num = if session . in_transaction?
210
+ session . txn_num
211
+ else
212
+ session . next_txn_num
213
+ end
209
214
begin
210
- txn_num = session . in_transaction? ? session . txn_num : session . next_txn_num
211
215
yield ( server , txn_num , false )
212
216
rescue Error ::SocketError , Error ::SocketTimeoutError => e
217
+ e . add_note ( "attempt 1" )
213
218
if session . in_transaction? && !ending_transaction
214
- raise
219
+ raise e
215
220
end
216
221
retry_write ( e , session , txn_num , &block )
217
222
rescue Error ::OperationFailure => e
223
+ e . add_note ( "attempt 1" )
218
224
if e . unsupported_retryable_write?
219
225
raise_unsupported_error ( e )
220
226
elsif ( session . in_transaction? && !ending_transaction ) || !e . write_retryable?
221
- raise
227
+ raise e
222
228
end
223
229
224
230
retry_write ( e , session , txn_num , &block )
@@ -274,16 +280,17 @@ def legacy_write_with_retry(server = nil, session = nil)
274
280
server ||= select_server ( cluster , ServerSelector . primary , session )
275
281
yield server
276
282
rescue Error ::OperationFailure => e
283
+ e . add_note ( "attempt #{ attempt + 1 } " )
277
284
server = nil
278
285
if attempt > client . max_write_retries
279
- raise
286
+ raise e
280
287
end
281
288
if e . write_retryable? && !( session && session . in_transaction? )
282
289
log_retry ( e , message : 'Legacy write retry' )
283
290
cluster . scan! ( false )
284
291
retry
285
292
else
286
- raise
293
+ raise e
287
294
end
288
295
end
289
296
end
@@ -296,13 +303,15 @@ def modern_read_with_retry(session, server_selector, &block)
296
303
begin
297
304
yield server
298
305
rescue Error ::SocketError , Error ::SocketTimeoutError => e
306
+ e . add_note ( "attempt #{ attempt + 1 } " )
299
307
if session . in_transaction?
300
- raise
308
+ raise e
301
309
end
302
310
retry_read ( e , server_selector , session , &block )
303
311
rescue Error ::OperationFailure => e
312
+ e . add_note ( "attempt #{ attempt + 1 } " )
304
313
if session . in_transaction? || !e . write_retryable?
305
- raise
314
+ raise e
306
315
end
307
316
retry_read ( e , server_selector , session , &block )
308
317
end
@@ -315,23 +324,25 @@ def legacy_read_with_retry(session, server_selector)
315
324
attempt += 1
316
325
yield server
317
326
rescue Error ::SocketError , Error ::SocketTimeoutError => e
327
+ e . add_note ( "attempt #{ attempt + 1 } " )
318
328
if attempt > client . max_read_retries || ( session && session . in_transaction? )
319
- raise
329
+ raise e
320
330
end
321
331
log_retry ( e , message : 'Legacy read retry' )
322
332
server = select_server ( cluster , server_selector , session )
323
333
retry
324
334
rescue Error ::OperationFailure => e
335
+ e . add_note ( "attempt #{ attempt + 1 } " )
325
336
if cluster . sharded? && e . retryable? && !( session && session . in_transaction? )
326
337
if attempt > client . max_read_retries
327
- raise
338
+ raise e
328
339
end
329
340
log_retry ( e , message : 'Legacy read retry' )
330
341
sleep ( client . read_retry_interval )
331
342
server = select_server ( cluster , server_selector , session )
332
343
retry
333
344
else
334
- raise
345
+ raise e
335
346
end
336
347
end
337
348
end
@@ -354,7 +365,8 @@ def retry_write_allowed?(session, write_concern)
354
365
def retry_read ( original_error , server_selector , session , &block )
355
366
begin
356
367
server = select_server ( cluster , server_selector , session )
357
- rescue
368
+ rescue => e
369
+ original_error . add_note ( "later retry failed: #{ e . class } : #{ e } " )
358
370
raise original_error
359
371
end
360
372
@@ -363,11 +375,17 @@ def retry_read(original_error, server_selector, session, &block)
363
375
begin
364
376
yield server , true
365
377
rescue Error ::SocketError , Error ::SocketTimeoutError => e
378
+ e . add_note ( "attempt 2" )
366
379
raise e
367
380
rescue Error ::OperationFailure => e
368
- raise original_error unless e . write_retryable?
381
+ unless e . write_retryable?
382
+ original_error . add_note ( "later retry failed: #{ e . class } : #{ e } " )
383
+ raise original_error
384
+ end
385
+ e . add_note ( "attempt 2" )
369
386
raise e
370
- rescue
387
+ rescue => e
388
+ original_error . add_note ( "later retry failed: #{ e . class } : #{ e } " )
371
389
raise original_error
372
390
end
373
391
end
@@ -379,15 +397,25 @@ def retry_write(original_error, session, txn_num, &block)
379
397
# a socket error or a not master error should have marked the respective
380
398
# server unknown). Here we just need to wait for server selection.
381
399
server = select_server ( cluster , ServerSelector . primary , session )
382
- raise original_error unless ( server . retry_writes? && txn_num )
400
+ unless server . retry_writes?
401
+ original_error . add_note ( 'did not retry because server selected for retry does not supoprt retryable writes' )
402
+ raise original_error
403
+ end
383
404
log_retry ( original_error , message : 'Write retry' )
384
405
yield ( server , txn_num , true )
385
406
rescue Error ::SocketError , Error ::SocketTimeoutError => e
407
+ e . add_note ( 'attempt 2' )
386
408
raise e
387
409
rescue Error ::OperationFailure => e
388
- raise original_error unless e . write_retryable?
389
- raise e
390
- rescue
410
+ if e . write_retryable?
411
+ e . add_note ( 'attempt 2' )
412
+ raise e
413
+ else
414
+ original_error . add_note ( "later retry failed: #{ e . class } : #{ e } " )
415
+ raise original_error
416
+ end
417
+ rescue => e
418
+ original_error . add_note ( "later retry failed: #{ e . class } : #{ e } " )
391
419
raise original_error
392
420
end
393
421
0 commit comments