67 lines
1.4 KiB
Ruby
67 lines
1.4 KiB
Ruby
|
# frozen_string_literal: true
|
||
|
|
||
|
module Gitlab
|
||
|
module HealthChecks
|
||
|
# This check is registered on master,
|
||
|
# and validated by worker
|
||
|
class MasterCheck
|
||
|
extend SimpleAbstractCheck
|
||
|
|
||
|
class << self
|
||
|
def register_master
|
||
|
# when we fork, we pass the read pipe to child
|
||
|
# child can then react on whether the other end
|
||
|
# of pipe is still available
|
||
|
@pipe_read, @pipe_write = IO.pipe
|
||
|
end
|
||
|
|
||
|
def finish_master
|
||
|
close_read
|
||
|
close_write
|
||
|
end
|
||
|
|
||
|
def register_worker
|
||
|
# fork needs to close the pipe
|
||
|
close_write
|
||
|
end
|
||
|
|
||
|
private
|
||
|
|
||
|
def close_read
|
||
|
@pipe_read&.close
|
||
|
@pipe_read = nil
|
||
|
end
|
||
|
|
||
|
def close_write
|
||
|
@pipe_write&.close
|
||
|
@pipe_write = nil
|
||
|
end
|
||
|
|
||
|
def metric_prefix
|
||
|
'master_check'
|
||
|
end
|
||
|
|
||
|
def successful?(result)
|
||
|
result
|
||
|
end
|
||
|
|
||
|
def check
|
||
|
# the lack of pipe is a legitimate failure of check
|
||
|
return false unless @pipe_read
|
||
|
|
||
|
@pipe_read.read_nonblock(1)
|
||
|
|
||
|
true
|
||
|
rescue IO::EAGAINWaitReadable
|
||
|
# if it is blocked, it means that the pipe is still open
|
||
|
# and there's no data waiting on it
|
||
|
true
|
||
|
rescue EOFError
|
||
|
# the pipe is closed
|
||
|
false
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|