Class: Polyrun::Queue::FileStore
- Inherits:
-
Object
- Object
- Polyrun::Queue::FileStore
- Defined in:
- lib/polyrun/queue/file_store.rb,
lib/polyrun/queue/file_store_pending.rb
Overview
File-backed queue (spec_queue.md): queue.json, pending/*.json chunks, done.jsonl, leases.json (OS flock).
Path lifecycle (lease transitions):
init! → paths in pending chunks only
claim! → pending −batch → active lease in leases.json
ack! → lease removed; paths appended to done.jsonl
reclaim! → stale or matching lease → paths returned to pending
reclaim_lease! → one lease by id → paths returned to pending
Constant Summary collapse
- CHUNK_SIZE =
500
Instance Attribute Summary collapse
-
#root ⇒ Object
readonly
Returns the value of attribute root.
Instance Method Summary collapse
- #ack!(lease_id:, worker_id:) ⇒ Object
- #claim!(worker_id:, batch_size:) ⇒ Object
- #init!(items) ⇒ Object
-
#initialize(root) ⇒ FileStore
constructor
A new instance of FileStore.
-
#reclaim!(older_than: nil, worker_id: nil) ⇒ Integer
Reclaim leases older than
older_thanseconds and/or matchingworker_idwhen set. - #reclaim_lease!(lease_id) ⇒ Object
- #status(detailed: false) ⇒ Object
Constructor Details
Instance Attribute Details
#root ⇒ Object (readonly)
Returns the value of attribute root.
19 20 21 |
# File 'lib/polyrun/queue/file_store.rb', line 19 def root @root end |
Instance Method Details
#ack!(lease_id:, worker_id:) ⇒ Object
65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 |
# File 'lib/polyrun/queue/file_store.rb', line 65 def ack!(lease_id:, worker_id:) with_lock do leases = read_leases lease = leases[lease_id] raise Polyrun::Error, "unknown lease: #{lease_id}" unless lease if lease["worker_id"].to_s != worker_id.to_s raise Polyrun::Error, "lease worker mismatch" end leases.delete(lease_id) write_leases!(leases) paths = lease["paths"] || [] = ["done_count"] = Integer(["done_count"]) + paths.size append_done_lines!(paths) () append_ledger("ACK" => lease_id, "worker_id" => worker_id.to_s, "paths" => paths) end true end |
#claim!(worker_id:, batch_size:) ⇒ Object
38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 |
# File 'lib/polyrun/queue/file_store.rb', line 38 def claim!(worker_id:, batch_size:) batch_size = Integer(batch_size) raise Polyrun::Error, "batch_size must be >= 1" if batch_size < 1 lease_id = SecureRandom.uuid batch = [] with_lock do = batch = take_pending_batch!(, batch_size) leases = read_leases leases[lease_id] = { "worker_id" => worker_id.to_s, "paths" => batch, "claimed_at" => Time.now.utc.iso8601 } () write_leases!(leases) append_ledger( "CLAIM" => lease_id, "worker_id" => worker_id.to_s, "paths" => batch, "pending_remaining" => ["pending_count"] ) end {"lease_id" => lease_id, "paths" => batch} end |
#init!(items) ⇒ Object
25 26 27 28 29 30 31 32 33 34 35 36 |
# File 'lib/polyrun/queue/file_store.rb', line 25 def init!(items) FileUtils.mkdir_p(@root) raise Polyrun::Error, "queue already exists: #{queue_path}" if File.file?(queue_path) items = items.map(&:to_s) = (items.size) FileUtils.mkdir_p(pending_dir) write_pending_chunks!(items, ) atomic_write(queue_path, JSON.generate()) atomic_write(ledger_path, "") true end |
#reclaim!(older_than: nil, worker_id: nil) ⇒ Integer
Reclaim leases older than older_than seconds and/or matching worker_id when set.
105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 |
# File 'lib/polyrun/queue/file_store.rb', line 105 def reclaim!(older_than: nil, worker_id: nil) reclaimed_paths = 0 with_lock do = leases = read_leases keep = {} leases.each do |lease_id, lease| if reclaim_lease?(lease, older_than: older_than, worker_id: worker_id) paths = lease["paths"] || [] return_paths_to_pending!(, paths) reclaimed_paths += paths.size append_ledger( "RECLAIM" => lease_id, "worker_id" => lease["worker_id"], "paths" => paths ) else keep[lease_id] = lease end end write_leases!(keep) () end reclaimed_paths end |
#reclaim_lease!(lease_id) ⇒ Object
131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 |
# File 'lib/polyrun/queue/file_store.rb', line 131 def reclaim_lease!(lease_id) reclaimed = 0 with_lock do leases = read_leases lease = leases[lease_id] return 0 unless lease leases.delete(lease_id) write_leases!(leases) = paths = lease["paths"] || [] return_paths_to_pending!(, paths) () reclaimed = paths.size append_ledger("RECLAIM" => lease_id, "worker_id" => lease["worker_id"], "paths" => paths) end reclaimed end |
#status(detailed: false) ⇒ Object
88 89 90 91 92 93 94 95 96 97 98 99 100 101 |
# File 'lib/polyrun/queue/file_store.rb', line 88 def status(detailed: false) with_lock do = leases = read_leases base = { "pending" => Integer(["pending_count"]), "done" => Integer(["done_count"]), "leases" => leases.keys.size } return base unless detailed base.merge("lease_details" => lease_details(leases)) end end |