summaryrefslogtreecommitdiff
path: root/app/workers/concerns/waitable_worker.rb
diff options
context:
space:
mode:
authorConstance Okoghenun <cokoghenun@gitlab.com>2018-02-26 19:06:42 +0100
committerConstance Okoghenun <cokoghenun@gitlab.com>2018-02-26 19:06:42 +0100
commit8c122d65bfed5c5addd3245304895b98f8b83b36 (patch)
tree430ac6f1b2c30d0e0b8f0c6efa494918850e6004 /app/workers/concerns/waitable_worker.rb
parentfd598fd6bda91343d7e271c0fe485ead9e0011d2 (diff)
parent1553a34dbff167978f5dc81cc3a21e0b3b2b2bfa (diff)
downloadgitlab-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.rb44
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