class Mongo::Error::OperationFailure

Raised when an operation fails for some reason.

@since 2.0.0

Constants

CHANGE_STREAM_NOT_RESUME_ERRORS

Error codes and code names that should result in a failing getMore command on a change stream NOT being resumed.

@since 2.6.0 @api private

CHANGE_STREAM_RESUME_MESSAGES

Change stream can be resumed when these error messages are encountered.

@since 2.6.0 @api private

RETRY_MESSAGES

These are magic error messages that could indicate a cluster reconfiguration behind a mongos.

@since 2.1.1 @api private

WRITE_RETRY_ERRORS

Error codes and code names that should result in a failing write being retried.

@since 2.6.0 @api private

WRITE_RETRY_MESSAGES

These are magic error messages that could indicate a master change.

@since 2.4.2 @api private

Attributes

code[R]

@return [ Integer ] code The error code parsed from the document. @since 2.6.0

code_name[R]

@return [ String ] code_name The error code name parsed from the document. @since 2.6.0

Public Class Methods

new(message = nil, result = nil, options = {}) click to toggle source

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 [ Array<String> ] :labels The set of labels associated

with the error

@option options [ true | false ] :wtimeout Whether the error is a wtimeout

@since 2.5.0, options added in 2.6.0

Calls superclass method Mongo::Error::new
# File lib/mongo/error/operation_failure.rb, line 184
def initialize(message = nil, result = nil, options = {})
  @result = result
  @code = options[:code]
  @code_name = options[:code_name]
  @labels = options[:labels]
  @wtimeout = !!options[:wtimeout]
  super(message)
end

Public Instance Methods

change_stream_resumable?() click to toggle source

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 142
def change_stream_resumable?
  if @result && @result.is_a?(Mongo::Operation::GetMore::Result)
    change_stream_resumable_message? ||
    change_stream_resumable_code?
  else
    false
  end
end
retryable?() click to toggle source

Whether the error is a retryable error according to the legacy read retry logic.

@return [ true, false ]

@since 2.1.1 @deprecated

# File lib/mongo/error/operation_failure.rb, line 88
def retryable?
  RETRY_MESSAGES.any?{ |m| message.include?(m) }
end
write_retryable?() click to toggle source

Whether the error is a retryable error according to the modern retryable reads and retryable writes specifications.

This method is also used by the legacy retryable write logic to determine whether an error is a retryable one.

@return [ true, false ]

@since 2.4.2

# File lib/mongo/error/operation_failure.rb, line 101
def write_retryable?
  WRITE_RETRY_MESSAGES.any? { |m| message.include?(m) } ||
  write_retryable_code?
end
wtimeout?() click to toggle source

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 198
def wtimeout?
  @wtimeout
end

Private Instance Methods

change_stream_resumable_code?() click to toggle source
# File lib/mongo/error/operation_failure.rb, line 156
def change_stream_resumable_code?
  if code
    !CHANGE_STREAM_NOT_RESUME_ERRORS.any? { |e| e[:code] == code }
  else
    true
  end
end
change_stream_resumable_message?() click to toggle source
# File lib/mongo/error/operation_failure.rb, line 151
def change_stream_resumable_message?
  CHANGE_STREAM_RESUME_MESSAGES.any? { |m| message.include?(m) }
end
write_retryable_code?() click to toggle source
# File lib/mongo/error/operation_failure.rb, line 106
def write_retryable_code?
  if code
    WRITE_RETRY_ERRORS.any? { |e| e[:code] == code }
  else
    # return false rather than nil
    false
  end
end