Sha256: 171854a7bac88978bc698b10c5128c0aa0742240c408823b04d3e6ab5ff4e80e

Contents?: true

Size: 1.74 KB

Versions: 4

Compression:

Stored size: 1.74 KB

Contents

# encoding: utf-8
module Mongoid #:nodoc:
  module Collections #:nodoc:

    # Provides behaviour for retrying commands on connection failure.
    module Retry

      # Retries command on connection failures.
      #
      # This is useful when using replica sets. When a primary server wents
      # down and a command is issued, the driver will raise a
      # Mongo::ConnectionFailure. We wait a little bit, because nodes are
      # electing themselves, and then retry the given command.
      #
      # By setting Mongoid.max_retries_on_connection_failure to a value of 0,
      # no attempt will be made, immediately raising connection failure.
      # Otherwise it will attempt to make the specified number of retries
      # and then raising the exception to clients.
      #
      # @example Retry the command.
      #   retry_on_connection_failure do
      #     collection.send(name, *args)
      #   end
      #
      # @since 2.0.0
      def retry_on_connection_failure
        retries = 0
        begin
          yield
        rescue Mongo::ConnectionFailure => ex
          retries = increase_retry_attempts(retries, ex)
          retry
        rescue Mongo::OperationFailure => ex
          if ex.message =~ /not master/
            retries = increase_retry_attempts(retries, ex)
            retry
          else
            raise ex
          end
        end
      end

      private

      def increase_retry_attempts(retries, ex)
        retries += 1
        raise ex if retries > Mongoid.max_retries_on_connection_failure
        Kernel.sleep(0.5)
        log_retry retries, ex
        retries
      end

      def log_retry(retry_number, ex)
        Mongoid.logger.warn "A #{ex.class.name} was raised. Retry attempt ##{retry_number}."
      end
    end
  end
end

Version data entries

4 entries across 4 versions & 1 rubygems

Version Path
mongoid-2.4.3 lib/mongoid/collections/retry.rb
mongoid-2.4.2 lib/mongoid/collections/retry.rb
mongoid-2.4.1 lib/mongoid/collections/retry.rb
mongoid-2.4.0 lib/mongoid/collections/retry.rb