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