class Mongo::Error::OperationFailure
Raised when an operation fails for some reason.
@since 2.0.0
Constants
- CHANGE_STREAM_RESUME_ERRORS
Error codes and code names that should result in a failing getMore command on a change stream NOT being resumed.
@api private
- CHANGE_STREAM_RESUME_MESSAGES
Change stream can be resumed when these error messages are encountered.
@since 2.6.0 @api private
Attributes
@return [ Integer ] The error code parsed from the document.
@since 2.6.0
@return [ String ] The error code name parsed from the document.
@since 2.6.0
@return [ String | nil ] The details of the error.
For WriteConcernErrors this is `document['writeConcernError']['errInfo']`. For WriteErrors this is `document['writeErrors'][0]['errInfo']`. For all other errors this is nil.
@return [ BSON::Document | nil ] The server-returned error document.
@api experimental
@return [ String ] The server-returned error message
parsed from the response.
@api experimental
@return [ Integer | nil ] The error code for the write concern error,
if a write concern error is present and has a code.
@since 2.10.0
@return [ String | nil ] The code name for the write concern error,
if a write concern error is present and has a code name.
@since 2.10.0
Returns the write concern error document as it was reported by the server, if any.
@return [ Hash | nil ] Write concern error as reported to the server.
Public Class Methods
Create the operation failure.
@example Create the error object
OperationFailure.new(message, result)
@example Create the error object with a code and a code name
OperationFailure.new(message, result, :code => code, :code_name => code_name)
@param [ String ] message The error message. @param [ Operation::Result ] result The result object. @param [ Hash ] options Additional parameters.
@option options [ Integer ] :code Error code. @option options [ String ] :code_name Error code name. @option options [ BSON::Document ] :document The server-returned
error document.
@option options [ String ] #server_message The server-returned
error message parsed from the response.
@option options [ Hash ] :write_concern_error_document The
server-supplied write concern error document, if any.
@option options [ Integer ] :write_concern_error_code Error code for
write concern error, if any.
@option options [ String ] :write_concern_error_code_name Error code
name for write concern error, if any.
@option options [ Array<String> ] :write_concern_error_labels Error
labels for the write concern error, if any.
@option options [ Array<String> ] :labels The set of labels associated
with the error.
@option options [ true | false ] :wtimeout Whether the error is a wtimeout.
# File lib/mongo/error/operation_failure.rb, line 186 def initialize(message = nil, result = nil, options = {}) @details = retrieve_details(options[:document]) super(append_details(message, @details)) @result = result @code = options[:code] @code_name = options[:code_name] @write_concern_error_document = options[:write_concern_error_document] @write_concern_error_code = options[:write_concern_error_code] @write_concern_error_code_name = options[:write_concern_error_code_name] @write_concern_error_labels = options[:write_concern_error_labels] || [] @labels = options[:labels] || [] @wtimeout = !!options[:wtimeout] @document = options[:document] @server_message = options[:server_message] end
Public Instance Methods
Can the change stream on which this error occurred be resumed, provided the operation that triggered this error was a getMore?
@example Is the error resumable for the change stream?
error.change_stream_resumable?
@return [ true, false ] Whether the error is resumable.
@since 2.6.0
# File lib/mongo/error/operation_failure.rb, line 95 def change_stream_resumable? if @result && @result.is_a?(Mongo::Operation::GetMore::Result) # CursorNotFound exceptions are always resumable because the server # is not aware of the cursor id, and thus cannot determine if # the cursor is a change stream and cannot add the # ResumableChangeStreamError label. return true if code == 43 # Connection description is not populated for unacknowledged writes. if connection_description.max_wire_version >= 9 label?('ResumableChangeStreamError') else change_stream_resumable_code? end else false end end
Whether the error is MaxTimeMSExpired.
@return [ true | false ] Whether the error is MaxTimeMSExpired.
@since 2.10.0
# File lib/mongo/error/operation_failure.rb, line 217 def max_time_ms_expired? code == 50 # MaxTimeMSExpired end
Whether the error is caused by an attempted retryable write on a storage engine that does not support retryable writes.
@return [ true | false ] Whether the error is caused by an attempted retryable write on a storage engine that does not support retryable writes.
@since 2.10.0
# File lib/mongo/error/operation_failure.rb, line 228 def unsupported_retryable_write? # code 20 is IllegalOperation. # Note that the document is expected to be a BSON::Document, thus # either having string keys or providing indifferent access. code == 20 && server_message&.start_with?("Transaction numbers") || false end
@return [ true | false ] Whether the failure includes a write
concern error. A failure may have a top level error and a write concern error or either one of the two.
@since 2.10.0
# File lib/mongo/error/operation_failure.rb, line 124 def write_concern_error? !!@write_concern_error_document end
Whether the error is a write concern timeout.
@return [ true | false ] Whether the error is a write concern timeout.
@since 2.7.1
# File lib/mongo/error/operation_failure.rb, line 208 def wtimeout? @wtimeout end
Private Instance Methods
Append the details to the message
@return [ String ] the message with the details appended to it
# File lib/mongo/error/operation_failure.rb, line 252 def append_details(message, details) return message unless details && message message + " -- #{details.to_json}" end
# File lib/mongo/error/operation_failure.rb, line 114 def change_stream_resumable_code? CHANGE_STREAM_RESUME_ERRORS.any? { |e| e[:code] == code } end
Retrieve the details from a document
@return [ Hash | nil ] the details extracted from the document
# File lib/mongo/error/operation_failure.rb, line 240 def retrieve_details(document) return nil unless document if wce = document['writeConcernError'] return wce['errInfo'] elsif we = document['writeErrors']&.first return we['errInfo'] end end