diff options
author | Constance Okoghenun <cokoghenun@gitlab.com> | 2018-02-26 19:06:42 +0100 |
---|---|---|
committer | Constance Okoghenun <cokoghenun@gitlab.com> | 2018-02-26 19:06:42 +0100 |
commit | 8c122d65bfed5c5addd3245304895b98f8b83b36 (patch) | |
tree | 430ac6f1b2c30d0e0b8f0c6efa494918850e6004 /app/workers/concerns/waitable_worker.rb | |
parent | fd598fd6bda91343d7e271c0fe485ead9e0011d2 (diff) | |
parent | 1553a34dbff167978f5dc81cc3a21e0b3b2b2bfa (diff) | |
download | gitlab-ce-8c122d65bfed5c5addd3245304895b98f8b83b36.tar.gz |
Resolved conflicts in app/assets/javascripts/pages/projects/settings/repository/show/index.js
Diffstat (limited to 'app/workers/concerns/waitable_worker.rb')
-rw-r--r-- | app/workers/concerns/waitable_worker.rb | 44 |
1 files changed, 44 insertions, 0 deletions
diff --git a/app/workers/concerns/waitable_worker.rb b/app/workers/concerns/waitable_worker.rb new file mode 100644 index 00000000000..48ebe862248 --- /dev/null +++ b/app/workers/concerns/waitable_worker.rb @@ -0,0 +1,44 @@ +module WaitableWorker + extend ActiveSupport::Concern + + module ClassMethods + # Schedules multiple jobs and waits for them to be completed. + def bulk_perform_and_wait(args_list, timeout: 10) + # Short-circuit: it's more efficient to do small numbers of jobs inline + return bulk_perform_inline(args_list) if args_list.size <= 3 + + waiter = Gitlab::JobWaiter.new(args_list.size) + + # Point all the bulk jobs at the same JobWaiter. Converts, [[1], [2], [3]] + # into [[1, "key"], [2, "key"], [3, "key"]] + waiting_args_list = args_list.map { |args| [*args, waiter.key] } + bulk_perform_async(waiting_args_list) + + waiter.wait(timeout) + end + + # Performs multiple jobs directly. Failed jobs will be put into sidekiq so + # they can benefit from retries + def bulk_perform_inline(args_list) + failed = [] + + args_list.each do |args| + begin + new.perform(*args) + rescue + failed << args + end + end + + bulk_perform_async(failed) if failed.present? + end + end + + def perform(*args) + notify_key = args.pop if Gitlab::JobWaiter.key?(args.last) + + super(*args) + ensure + Gitlab::JobWaiter.notify(notify_key, jid) if notify_key + end +end |