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|