lib/mongo/retryable.rb in mongo-2.7.2 vs lib/mongo/retryable.rb in mongo-2.8.0.rc0

- old
+ new

@@ -40,22 +40,26 @@ attempt = 0 begin attempt += 1 yield rescue Error::SocketError, Error::SocketTimeoutError => e - raise(e) if attempt > cluster.max_read_retries || (session && session.in_transaction?) + if attempt > cluster.max_read_retries || (session && session.in_transaction?) + raise + end log_retry(e) cluster.scan!(false) retry rescue Error::OperationFailure => e if cluster.sharded? && e.retryable? && !(session && session.in_transaction?) - raise(e) if attempt > cluster.max_read_retries + if attempt > cluster.max_read_retries + raise + end log_retry(e) sleep(cluster.read_retry_interval) retry else - raise e + raise end end end # Execute a read operation with a single retry. @@ -139,14 +143,18 @@ begin txn_num = session.in_transaction? ? session.txn_num : session.next_txn_num yield(server, txn_num, false) rescue Error::SocketError, Error::SocketTimeoutError => e - raise e if session.in_transaction? && !ending_transaction + if session.in_transaction? && !ending_transaction + raise + end retry_write(e, txn_num, &block) rescue Error::OperationFailure => e - raise e if (session.in_transaction? && !ending_transaction) || !e.write_retryable? + if (session.in_transaction? && !ending_transaction) || !e.write_retryable? + raise + end retry_write(e, txn_num, &block) end end private @@ -165,21 +173,23 @@ write_concern.acknowledged? end end def retry_write(original_error, txn_num, &block) - cluster.scan!(false) + # We do not request a scan of the cluster here, because error handling + # for the error which triggered the retry should have updated the + # server description and/or topology as necessary (specifically, + # a socket error or a not master error should have marked the respective + # server unknown). Here we just need to wait for server selection. server = cluster.next_primary raise original_error unless (server.retry_writes? && txn_num) log_retry(original_error) yield(server, txn_num, true) rescue Error::SocketError, Error::SocketTimeoutError => e - cluster.scan!(false) raise e rescue Error::OperationFailure => e raise original_error unless e.write_retryable? - cluster.scan!(false) raise e rescue raise original_error end @@ -191,16 +201,18 @@ begin attempt += 1 yield(server || cluster.next_primary) rescue Error::OperationFailure => e server = nil - raise(e) if attempt > Cluster::MAX_WRITE_RETRIES + if attempt > Cluster::MAX_WRITE_RETRIES + raise + end if e.write_retryable? && !(session && session.in_transaction?) log_retry(e) cluster.scan!(false) retry else - raise(e) + raise end end end # Log a warning so that any application slow down is immediately obvious.