Sha256: 8040d9ea0fe68a15c1546954cc348c2e4f3b3ff61b6739f5dd40e859af8071f9

Contents?: true

Size: 1.1 KB

Versions: 1

Compression:

Stored size: 1.1 KB

Contents

module SyncMachine
  class EnsurePublication
    # Ensures that the current job is not:
    # 1. Currently being run by another worker
    # 2. Rendered unnecessary by the fact another job with the same subject was
    #    completed since the time this job was requested.
    class Deduper
      def initialize(enqueue_time_str:, last_job_finished_at:, job_class:, subject_id:)
        @enqueue_time_str = enqueue_time_str
        @job_class = job_class
        @last_job_finished_at = last_job_finished_at
        @subject_id = subject_id
      end

      def dedupe
        lock = RedisLock.new("#{@job_class.name}:#{@subject_id}")
        lock.acquire do
          yield unless performed_since_enqueue_time?
        end
        lock.acquired? || reschedule_job
      end

      private

      def enqueue_time
        @enqueue_time ||= Time.parse(@enqueue_time_str)
      end

      def performed_since_enqueue_time?
        @last_job_finished_at && @last_job_finished_at > enqueue_time
      end

      def reschedule_job
        @job_class.perform_in(1 + rand(10), @subject_id, @enqueue_time_str)
      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
sync_machine-1.4.0 lib/sync_machine/ensure_publication/deduper.rb