class Sidekiq::Batch::Callback::Finalize

Public Instance Methods

cleanup_redis(bid, callback_bid=nil) click to toggle source
# File lib/sidekiq/batch/callback.rb, line 97
def cleanup_redis bid, callback_bid=nil
  Sidekiq::Batch.cleanup_redis bid
  Sidekiq::Batch.cleanup_redis callback_bid if callback_bid
end
complete(bid, status, parent_bid) click to toggle source
# File lib/sidekiq/batch/callback.rb, line 62
def complete(bid, status, parent_bid)
  pending, children, success = Sidekiq.redis do |r|
    r.multi do
      r.hincrby("BID-#{bid}", "pending", 0)
      r.hincrby("BID-#{bid}", "children", 0)
      r.scard("BID-#{bid}-success")
    end
  end

  # if we batch was successful run success callback
  if pending.to_i.zero? && children == success
    Batch.enqueue_callbacks(:success, bid)

  elsif parent_bid
    # if batch was not successfull check and see if its parent is complete
    # if the parent is complete we trigger the complete callback
    # We don't want to run this if the batch was successfull because the success
    # callback may add more jobs to the parent batch

    Sidekiq.logger.debug {"Finalize parent complete bid: #{parent_bid}"}
    _, complete, pending, children, failure = Sidekiq.redis do |r|
      r.multi do
        r.sadd("BID-#{parent_bid}-complete", bid)
        r.scard("BID-#{parent_bid}-complete")
        r.hincrby("BID-#{parent_bid}", "pending", 0)
        r.hincrby("BID-#{parent_bid}", "children", 0)
        r.scard("BID-#{parent_bid}-failed")
      end
    end
    if complete == children && pending == failure
      Batch.enqueue_callbacks(:complete, parent_bid)
    end
  end
end
dispatch(status, opts) click to toggle source
# File lib/sidekiq/batch/callback.rb, line 21
def dispatch status, opts
  bid = opts["bid"]
  callback_bid = status.bid
  event = opts["event"].to_sym
  callback_batch = bid != callback_bid

  Sidekiq.logger.debug {"Finalize #{event} batch id: #{opts["bid"]}, callback batch id: #{callback_bid} callback_batch #{callback_batch}"}

  batch_status = Status.new bid
  send(event, bid, batch_status, batch_status.parent_bid)


  # Different events are run in different callback batches
  Sidekiq::Batch.cleanup_redis callback_bid if callback_batch
  Sidekiq::Batch.cleanup_redis bid if event == :success
end
success(bid, status, parent_bid) click to toggle source
# File lib/sidekiq/batch/callback.rb, line 38
def success(bid, status, parent_bid)
  return unless parent_bid

  _, _, success, _, complete, pending, children, failure = Sidekiq.redis do |r|
    r.multi do
      r.sadd("BID-#{parent_bid}-success", bid)
      r.expire("BID-#{parent_bid}-success", Sidekiq::Batch::BID_EXPIRE_TTL)
      r.scard("BID-#{parent_bid}-success")
      r.sadd("BID-#{parent_bid}-complete", bid)
      r.scard("BID-#{parent_bid}-complete")
      r.hincrby("BID-#{parent_bid}", "pending", 0)
      r.hincrby("BID-#{parent_bid}", "children", 0)
      r.scard("BID-#{parent_bid}-failed")
    end
  end
  # if job finished successfully and parent batch completed call parent complete callback
  # Success callback is called after complete callback
  if complete == children && pending == failure
    Sidekiq.logger.debug {"Finalize parent complete bid: #{parent_bid}"}
    Batch.enqueue_callbacks(:complete, parent_bid)
  end

end