lib/prometheus/client/mmaped_dict.rb in prometheus-client-mmap-0.7.0.beta23 vs lib/prometheus/client/mmaped_dict.rb in prometheus-client-mmap-0.7.0.beta24

- old
+ new

@@ -39,25 +39,20 @@ rescue StandardError => e raise ParsingError, "exception #{e} while processing metrics file #{path}" end def read_value(key) - @mutex.synchronize do - init_value(key) unless @positions.key?(key) + init_value(key) unless @positions.key?(key) - pos = @positions[key] - @m[pos..pos + 7].unpack('d')[0] - end + @m.get_double(@positions[key]) end def write_value(key, value) - @mutex.synchronize do - init_value(key) unless @positions.key?(key) + init_value(key) unless @positions.key?(key) - pos = @positions[key] - @m[pos..pos + 7] = [value].pack('d') - end + pos = @positions[key] + @m[pos..pos + 7] = [value].pack('d') end def path @m.filepath if @m end @@ -69,24 +64,27 @@ Prometheus::Client.logger.warn("munmap raised error #{e}") end private - # Initialize a value. Lock must be held by caller. def init_value(key) - until @m.try_add_entry(key, 0.0) do - filepath = @m.filepath - size = @m.size - @m.close + @mutex.synchronize do + return if @positions.key?(key) - File.truncate(filepath, size * 2) - @m = Helper::MmapedFile.open(filepath) - end + until @m.try_add_entry(key, 0.0) do + filepath = @m.filepath + size = @m.size + @m.close - # Update how much space we've used. - @used = @m.used + File.truncate(filepath, size * 2) + @m = Helper::MmapedFile.open(filepath) + end - @positions[key] = @used - 8 + # Update how much space we've used. + @used = @m.used + + @positions[key] = @used - 8 + end end # Yield (key, pos). No locking is performed. def read_all_positions @m.entries.map do |data, encoded_len, _, absolute_pos|