lib/prometheus/client/helper/mmaped_file.rb in prometheus-client-mmap-0.7.0.beta16 vs lib/prometheus/client/helper/mmaped_file.rb in prometheus-client-mmap-0.7.0.beta17
- old
+ new
@@ -3,10 +3,50 @@
module Prometheus
module Client
module Helper
class MmapedFile < Mmap
+ class << self
+ def open_readonly(filepath)
+ MmapedFile.new(filepath, 'r', Mmap::MAP_PRIVATE)
+ end
+
+ def open(filepath)
+ MmapedFile.new(filepath, 'rw', Mmap::MAP_SHARED)
+ end
+
+ def lock_to_process(filepath)
+ m = open(filepath)
+ if m.lock_to_process
+ Kernel.at_exit do
+ open(filepath).unlock
+ end
+ true
+ else
+ false
+ end
+ ensure
+ m.close
+ end
+
+ def ensure_process_exclusive_file(file_prefix = 'mmaped_file')
+ path = nil
+ filename_number = 0
+ until path && Helper::MmapedFile.lock_to_process(path)
+ filename = "#{file_prefix}_#{Prometheus::Client.pid}-#{filename_number}.db"
+ path = File.join(Prometheus::Client.configuration.multiprocess_files_dir, filename)
+ filename_number += 1
+ end
+ path
+ end
+
+ def open_process_exclusive_file(file_prefix = 'mmaped_file')
+ filename = Helper::MmapedFile.ensure_process_exclusive_file(file_prefix)
+ open(filename)
+ end
+ end
+
MINIMUM_SIZE = 8
attr_reader :filepath, :size
def initialize(filepath, mode = 'r', protection = Mmap::MAP_SHARED, options = {})
@filepath = filepath
@@ -34,11 +74,11 @@
def used=(value)
self[4..7] = [value].pack('l')
end
def locked_to_process?
- pid > 0
+ pid > 0 && pid_alive?(pid)
end
def lock_owner?
pid == Process.pid
end
@@ -106,46 +146,17 @@
def close
munmap
end
- class << self
- def open_readonly(filepath)
- MmapedFile.new(filepath, 'r', Mmap::MAP_PRIVATE)
- end
+ private
- def open(filepath)
- MmapedFile.new(filepath, 'rw', Mmap::MAP_SHARED)
- end
-
- def lock_to_process(filepath)
- m = open(filepath)
- if m.lock_to_process
- Kernel.at_exit do
- open(filepath).unlock
- end
- true
- else
- false
- end
- ensure
- m.close
- end
-
- def ensure_process_exclusive_file(file_prefix = 'mmaped_file')
- path = nil
- filename_number = 0
- until path && Helper::MmapedFile.lock_to_process(path)
- filename = "#{file_prefix}_#{Prometheus::Client.pid}-#{filename_number}.db"
- path = File.join(Prometheus::Client.configuration.multiprocess_files_dir, filename)
- filename_number += 1
- end
- path
- end
-
- def open_process_exclusive_file(file_prefix = 'mmaped_file')
- filename = Helper::MmapedFile.ensure_process_exclusive_file(file_prefix)
- open(filename)
+ def pid_alive?(pid)
+ begin
+ Process.getpgid(pid)
+ true
+ rescue Errno::ESRCH
+ false
end
end
end
end
end