Sha256: 5747d3408344cddfcb4f9255588a5c7ccfd3f1cc6f3192f81dd9b84eb22312d4

Contents?: true

Size: 1.15 KB

Versions: 2

Compression:

Stored size: 1.15 KB

Contents

require 'tengine/core'

module Tengine::Core::SafeUpdatable
  extend ActiveSupport::Concern

  module InstanceMethods
    def update_in_safe_mode(collection, selector, document, opts=nil)
      options = { :upsert => false, :multiple => false }
      options.update(opts) if opts

      options = options.merge({ :safe => safemode(collection) })

      max_retries = 100
      retries = 0
      begin
        # Return a Hash containing the last error object if running safe mode.
        # Otherwise, returns true
        result = collection.driver.update(selector, document, options)
      rescue Mongo::ConnectionFailure, Mongo::OperationFailure => ex
        case ex when Mongo::OperationFailure then
          raise ex unless ex.message =~ /wtimeout/
        end
        retries += 1
        raise ex if retries > max_retries
        Tengine.logger.debug "retrying due to mongodb error #{ex.inspect}"
        sleep 0.5
        retry
      end
    end

    def safemode(collection)
      res = true
      case collection.driver.db.connection when Mongo::ReplSetConnection then
        res = { :w => "majority", :wtimeout => 1024, }
      end
      res
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
tengine_core-0.5.32 lib/tengine/core/safe_updatable.rb
tengine_core-0.5.31 lib/tengine/core/safe_updatable.rb