diff options
author | Kamil Trzciński <ayufan@ayufan.eu> | 2019-08-20 22:09:04 +0300 |
---|---|---|
committer | Kamil Trzciński <ayufan@ayufan.eu> | 2019-08-21 13:06:10 +0300 |
commit | 3683d2d251889865334f861791e5e743dca48898 (patch) | |
tree | d17ab39389c1e9e009a0a9e7854aa8dcf7cfaab3 /lib | |
parent | c2cbfc5c4afbe8385659f97769db8450284639cf (diff) |
Perform cheap thread find
If we process message that is not designated to us
previously we would fire a separate Thread for that.
We don't need to do it. We can cheaply check if thread
is available, if it is, we can perform expensive operation
then.
Diffstat (limited to 'lib')
-rw-r--r-- | lib/gitlab/sidekiq_monitor.rb | 25 |
1 files changed, 16 insertions, 9 deletions
diff --git a/lib/gitlab/sidekiq_monitor.rb b/lib/gitlab/sidekiq_monitor.rb index 0d4709508a0..bfbf998b3a0 100644 --- a/lib/gitlab/sidekiq_monitor.rb +++ b/lib/gitlab/sidekiq_monitor.rb @@ -110,11 +110,13 @@ module Gitlab def process_job_cancel(jid) return unless jid - # since this might take time, process cancel in a new thread - Thread.new do - find_thread(jid) do |thread| - next unless thread + # try to find thread without lock + return unless find_thread_unsafe(jid) + Thread.new do + # try to find a thread, but with guaranteed + # handle that this thread corresponds to actually running job + find_thread_with_lock(jid) do |thread| Sidekiq.logger.warn( class: self.class, action: 'cancel', @@ -130,13 +132,18 @@ module Gitlab # This method needs to be thread-safe # This is why it passes thread in block, # to ensure that we do process this thread - def find_thread(jid) - return unless jid + def find_thread_unsafe(jid) + jobs_thread[jid] + end + + def find_thread_with_lock(jid) + # don't try to lock if we cannot find the thread + return unless find_thread_unsafe(jid) jobs_mutex.synchronize do - thread = jobs_thread[jid] - yield(thread) - thread + find_thread_unsafe(jid).tap do |thread| + yield(thread) if thread + end end end |