Class: BBK::App::Middlewares::SelfKiller

Inherits:
Object
  • Object
show all
Defined in:
lib/bbk/app/middlewares/self_killer.rb,
sig/bbk/app/middlewares/self_killer.rbs

Constant Summary collapse

SELF_KILLER_LOG_INTERVAL =
300

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(dispatcher, delay: 10 * 60, threshold: 10_000, logger: ::Logger.new(STDOUT)) ⇒ SelfKiller

Returns a new instance of SelfKiller.

Parameters:

  • (Object)
  • delay: (Integer) (defaults to: 10 * 60)
  • threshold: (Integer) (defaults to: 10_000)
  • logger: (_Logger) (defaults to: ::Logger.new(STDOUT))


11
12
13
14
15
16
17
18
19
20
# File 'lib/bbk/app/middlewares/self_killer.rb', line 11

def initialize(dispatcher, delay: 10 * 60, threshold: 10_000, logger: ::Logger.new(STDOUT))
  @dispatcher = dispatcher
  @threshold = threshold
  @count = 0
  @stop_time = Process.clock_gettime(Process::CLOCK_MONOTONIC) + delay
  @stopping = false
  @logger = logger
  @logger.info "[SelfKiller] Initializing: #{@count}/#{@threshold}"
  reset_log_timer
end

Instance Attribute Details

#countInteger (readonly)

Returns the value of attribute count.

Returns:

  • (Integer)


9
10
11
# File 'lib/bbk/app/middlewares/self_killer.rb', line 9

def count
  @count
end

#dispatcherObject (readonly)

Returns the value of attribute dispatcher.

Returns:

  • (Object)


9
10
11
# File 'lib/bbk/app/middlewares/self_killer.rb', line 9

def dispatcher
  @dispatcher
end

#stop_timeInteger, Float (readonly)

Returns the value of attribute stop_time.

Returns:

  • (Integer, Float)


9
10
11
# File 'lib/bbk/app/middlewares/self_killer.rb', line 9

def stop_time
  @stop_time
end

#thresholdInteger (readonly)

Returns the value of attribute threshold.

Returns:

  • (Integer)


9
10
11
# File 'lib/bbk/app/middlewares/self_killer.rb', line 9

def threshold
  @threshold
end

Instance Method Details

#build(app) ⇒ void

This method returns an undefined value.

Parameters:

  • (Object)


22
23
24
25
# File 'lib/bbk/app/middlewares/self_killer.rb', line 22

def build(app)
  @app = app
  self
end

#call(msg) ⇒ void

This method returns an undefined value.

Parameters:

  • (Object)


27
28
29
30
31
32
33
34
35
36
# File 'lib/bbk/app/middlewares/self_killer.rb', line 27

def call(msg)
  @count += 1
  if time_exceed?(@log_timer)
    @logger.info "[SelfKiller] Threshold status: #{@count}/#{@threshold}, delayed: #{!time_exceed?}"
    reset_log_timer
  end
  close_dispatcher if stop?

  @app.call(msg)
end

#close_dispatchervoid

This method returns an undefined value.



56
57
58
59
60
# File 'lib/bbk/app/middlewares/self_killer.rb', line 56

def close_dispatcher
  @stopping = true
  @logger.warn '[SelfKiller] Threshold exceeded, closing dispatcher...'
  Thread.new { @dispatcher.close } # Don't block current call
end

#reset_log_timevoid

This method returns an undefined value.



17
# File 'sig/bbk/app/middlewares/self_killer.rbs', line 17

def reset_log_time: () -> void

#stop?Boolean

Returns:

  • (Boolean)


44
45
46
# File 'lib/bbk/app/middlewares/self_killer.rb', line 44

def stop?
  !@stopping && threshold_exceed? && time_exceed?
end

#threshold_exceed?Boolean

Returns:

  • (Boolean)


48
49
50
# File 'lib/bbk/app/middlewares/self_killer.rb', line 48

def threshold_exceed?
  @count > @threshold
end

#time_exceed?(time = @stop_time) ⇒ Boolean

Parameters:

  • (Float)

Returns:

  • (Boolean)


52
53
54
# File 'lib/bbk/app/middlewares/self_killer.rb', line 52

def time_exceed?(time = @stop_time)
  Process.clock_gettime(Process::CLOCK_MONOTONIC) > time
end