Class: SlowDown::Group

Inherits:
Object
  • Object
show all
Defined in:
lib/slow_down/group.rb

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(name, options = {}) ⇒ Group

Returns a new instance of Group.



41
42
43
44
# File 'lib/slow_down/group.rb', line 41

def initialize(name, options = {})
  @name = name
  @config = Configuration.new({ lock_namespace: name }.merge(options))
end

Instance Attribute Details

#configObject (readonly)

Returns the value of attribute config.



39
40
41
# File 'lib/slow_down/group.rb', line 39

def config
  @config
end

#nameObject (readonly)

Returns the value of attribute name.



39
40
41
# File 'lib/slow_down/group.rb', line 39

def name
  @name
end

Class Method Details

.allObject



7
8
9
# File 'lib/slow_down/group.rb', line 7

def self.all
  @groups ||= {} # rubocop:disable Naming/MemoizedInstanceVariableName
end

.create(name, options = {}) ⇒ Object



15
16
17
18
# File 'lib/slow_down/group.rb', line 15

def self.create(name, options = {})
  @groups ||= {}
  @groups[name] = Group.new(name, options)
end

.find(name) ⇒ Object



11
12
13
# File 'lib/slow_down/group.rb', line 11

def self.find(name)
  all[name]
end

.find_or_create(name, options = {}) ⇒ Object



20
21
22
23
24
25
26
27
# File 'lib/slow_down/group.rb', line 20

def self.find_or_create(name, options = {})
  if all[name] && !options.empty?
    all[name].config.logger.error(name) { "Group #{name} has already been configured elsewhere" }
    raise ConfigError, "Group #{name} has already been configured elsewhere - you may not override configurations"
  end

  all[name] || create(name, options)
end

.remove(group_name) ⇒ Object



29
30
31
32
33
# File 'lib/slow_down/group.rb', line 29

def self.remove(group_name)
  group = Group.find(group_name) || return
  group.reset
  @groups.delete(group_name)
end

.remove_allObject



35
36
37
# File 'lib/slow_down/group.rb', line 35

def self.remove_all
  all.each_value(&:remove)
end

Instance Method Details

#free?Boolean

Returns:

  • (Boolean)


65
66
67
68
69
70
71
72
73
74
# File 'lib/slow_down/group.rb', line 65

def free?
  config.locks.each do |key|
    if config.redis.set(key, 1, px: config.milliseconds_per_request_per_lock, nx: true)
      config.logger.info(name) { "Lock #{key} was acquired for #{config.milliseconds_per_request_per_lock}ms" }
      return true
    end
  end

  false
end

#removeObject



80
81
82
# File 'lib/slow_down/group.rb', line 80

def remove
  Group.remove(@name)
end

#resetObject



76
77
78
# File 'lib/slow_down/group.rb', line 76

def reset
  config.locks.each { |key| config.redis.del(key) }
end

#runObject



46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
# File 'lib/slow_down/group.rb', line 46

def run
  expires_at = Time.now + config.timeout
  iteration = 0
  config.logger.info(name) { "Run attempt initiatied, times out at #{expires_at}" }

  loop do
    return yield if free?

    wait(iteration += 1)
    break if Time.now > expires_at
  end

  config.logger.info(name) { "Run attempt timed out" }
  if config.raise_on_timeout # rubocop:disable Style/GuardClause
    config.logger.error(name) { "Timeout error raised" }
    raise Timeout
  end
end