summaryrefslogtreecommitdiff
path: root/lib/gitlab/temporarily_allow.rb
blob: 880e55f71df04c3989b202d60cc58b00f907db1c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
module Gitlab
  module TemporarilyAllow
    TEMPORARILY_ALLOW_MUTEX = Mutex.new

    def temporarily_allow(key)
      temporarily_allow_add(key, 1)
      yield
    ensure
      temporarily_allow_add(key, -1)
    end

    def temporarily_allowed?(key)
      if RequestStore.active?
        temporarily_allow_request_store[key] > 0
      else
        TEMPORARILY_ALLOW_MUTEX.synchronize do
          temporarily_allow_ivar[key] > 0
        end
      end
    end

    private

    def temporarily_allow_ivar
      @temporarily_allow ||= Hash.new(0)
    end

    def temporarily_allow_request_store
      RequestStore[:temporarily_allow] ||= Hash.new(0)
    end

    def temporarily_allow_add(key, value)
      if RequestStore.active?
        temporarily_allow_request_store[key] += value
      else
        TEMPORARILY_ALLOW_MUTEX.synchronize do
          temporarily_allow_ivar[key] += value
        end
      end
    end
  end
end