@@ -206,19 +206,25 @@ def write_with_retry(session, write_concern, ending_transaction = false, &block)
206206 return legacy_write_with_retry ( server , session , &block )
207207 end
208208
209+ txn_num = if session . in_transaction?
210+ session . txn_num
211+ else
212+ session . next_txn_num
213+ end
209214 begin
210- txn_num = session . in_transaction? ? session . txn_num : session . next_txn_num
211215 yield ( server , txn_num , false )
212216 rescue Error ::SocketError , Error ::SocketTimeoutError => e
217+ e . add_note ( "attempt 1" )
213218 if session . in_transaction? && !ending_transaction
214- raise
219+ raise e
215220 end
216221 retry_write ( e , session , txn_num , &block )
217222 rescue Error ::OperationFailure => e
223+ e . add_note ( "attempt 1" )
218224 if e . unsupported_retryable_write?
219225 raise_unsupported_error ( e )
220226 elsif ( session . in_transaction? && !ending_transaction ) || !e . write_retryable?
221- raise
227+ raise e
222228 end
223229
224230 retry_write ( e , session , txn_num , &block )
@@ -274,16 +280,17 @@ def legacy_write_with_retry(server = nil, session = nil)
274280 server ||= select_server ( cluster , ServerSelector . primary , session )
275281 yield server
276282 rescue Error ::OperationFailure => e
283+ e . add_note ( "attempt #{ attempt + 1 } " )
277284 server = nil
278285 if attempt > client . max_write_retries
279- raise
286+ raise e
280287 end
281288 if e . write_retryable? && !( session && session . in_transaction? )
282289 log_retry ( e , message : 'Legacy write retry' )
283290 cluster . scan! ( false )
284291 retry
285292 else
286- raise
293+ raise e
287294 end
288295 end
289296 end
@@ -296,13 +303,15 @@ def modern_read_with_retry(session, server_selector, &block)
296303 begin
297304 yield server
298305 rescue Error ::SocketError , Error ::SocketTimeoutError => e
306+ e . add_note ( "attempt #{ attempt + 1 } " )
299307 if session . in_transaction?
300- raise
308+ raise e
301309 end
302310 retry_read ( e , server_selector , session , &block )
303311 rescue Error ::OperationFailure => e
312+ e . add_note ( "attempt #{ attempt + 1 } " )
304313 if session . in_transaction? || !e . write_retryable?
305- raise
314+ raise e
306315 end
307316 retry_read ( e , server_selector , session , &block )
308317 end
@@ -315,23 +324,25 @@ def legacy_read_with_retry(session, server_selector)
315324 attempt += 1
316325 yield server
317326 rescue Error ::SocketError , Error ::SocketTimeoutError => e
327+ e . add_note ( "attempt #{ attempt + 1 } " )
318328 if attempt > client . max_read_retries || ( session && session . in_transaction? )
319- raise
329+ raise e
320330 end
321331 log_retry ( e , message : 'Legacy read retry' )
322332 server = select_server ( cluster , server_selector , session )
323333 retry
324334 rescue Error ::OperationFailure => e
335+ e . add_note ( "attempt #{ attempt + 1 } " )
325336 if cluster . sharded? && e . retryable? && !( session && session . in_transaction? )
326337 if attempt > client . max_read_retries
327- raise
338+ raise e
328339 end
329340 log_retry ( e , message : 'Legacy read retry' )
330341 sleep ( client . read_retry_interval )
331342 server = select_server ( cluster , server_selector , session )
332343 retry
333344 else
334- raise
345+ raise e
335346 end
336347 end
337348 end
@@ -354,7 +365,8 @@ def retry_write_allowed?(session, write_concern)
354365 def retry_read ( original_error , server_selector , session , &block )
355366 begin
356367 server = select_server ( cluster , server_selector , session )
357- rescue
368+ rescue => e
369+ original_error . add_note ( "later retry failed: #{ e . class } : #{ e } " )
358370 raise original_error
359371 end
360372
@@ -363,11 +375,17 @@ def retry_read(original_error, server_selector, session, &block)
363375 begin
364376 yield server , true
365377 rescue Error ::SocketError , Error ::SocketTimeoutError => e
378+ e . add_note ( "attempt 2" )
366379 raise e
367380 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" )
369386 raise e
370- rescue
387+ rescue => e
388+ original_error . add_note ( "later retry failed: #{ e . class } : #{ e } " )
371389 raise original_error
372390 end
373391 end
@@ -379,15 +397,25 @@ def retry_write(original_error, session, txn_num, &block)
379397 # a socket error or a not master error should have marked the respective
380398 # server unknown). Here we just need to wait for server selection.
381399 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
383404 log_retry ( original_error , message : 'Write retry' )
384405 yield ( server , txn_num , true )
385406 rescue Error ::SocketError , Error ::SocketTimeoutError => e
407+ e . add_note ( 'attempt 2' )
386408 raise e
387409 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 } " )
391419 raise original_error
392420 end
393421
0 commit comments