Class: Gemkeeper::CompactIndexServer::CacheStore

Inherits:
Object
  • Object
show all
Defined in:
lib/gemkeeper/compact_index_server/cache_store.rb

Overview

Handles on-disk cache I/O: atomic writes, sidecar metadata, TTL checks. All paths are resolved relative to a base directory.

Constant Summary collapse

ENTRIES =
{
  versions: "versions",
  versions_merged: "versions.merged",
  versions_meta: "versions.meta",
  names: "names",
  names_merged: "names.merged",
  names_meta: "names.meta"
}.freeze

Instance Method Summary collapse

Constructor Details

#initialize(base_dir) ⇒ CacheStore

Returns a new instance of CacheStore.



23
24
25
26
# File 'lib/gemkeeper/compact_index_server/cache_store.rb', line 23

def initialize(base_dir)
  @base_dir = base_dir
  FileUtils.mkdir_p([base_dir, File.join(base_dir, "info"), File.join(base_dir, "gems")])
end

Instance Method Details

#atomic_write(full_path, content) ⇒ Object



47
48
49
50
51
52
53
54
# File 'lib/gemkeeper/compact_index_server/cache_store.rb', line 47

def atomic_write(full_path, content)
  tmp = "#{full_path}.tmp.#{Process.pid}.#{Thread.current.object_id}"
  File.binwrite(tmp, content)
  File.rename(tmp, full_path)
rescue StandardError
  File.unlink(tmp) if tmp && File.exist?(tmp)
  raise
end

#etag_for(key) ⇒ Object



56
57
58
59
60
61
# File 'lib/gemkeeper/compact_index_server/cache_store.rb', line 56

def etag_for(key)
  full_path = path(key)
  return nil unless File.exist?(full_path)

  Digest::SHA256.hexdigest(File.binread(full_path))
end

#path(key_or_filename) ⇒ Object



28
29
30
31
# File 'lib/gemkeeper/compact_index_server/cache_store.rb', line 28

def path(key_or_filename)
  filename = ENTRIES.fetch(key_or_filename, key_or_filename)
  File.join(@base_dir, filename.to_s)
end

#read_meta(filename) ⇒ Object



33
34
35
36
37
38
39
40
# File 'lib/gemkeeper/compact_index_server/cache_store.rb', line 33

def read_meta(filename)
  full_path = File.join(@base_dir, "#{filename}.meta")
  return nil unless File.exist?(full_path)

  CacheMeta.load(YAML.safe_load_file(full_path))
rescue StandardError
  nil
end

#write_meta(filename, etag:) ⇒ Object



42
43
44
45
# File 'lib/gemkeeper/compact_index_server/cache_store.rb', line 42

def write_meta(filename, etag:)
  meta = CacheMeta.new(etag, Time.now.utc.iso8601)
  atomic_write(File.join(@base_dir, "#{filename}.meta"), meta.to_h.to_yaml)
end