Class: Smplkit::Management::ConfigRegistrationBuffer
- Inherits:
-
Object
- Object
- Smplkit::Management::ConfigRegistrationBuffer
- Defined in:
- lib/smplkit/management/buffer.rb
Overview
Thread-safe batch buffer for config declarations. Mirrors Python’s _ConfigRegistrationBuffer: per-config metadata is retained across flushes so post-drain deltas re-attribute correctly, and items are dedup’d per (config_id, item_key) so an already-sent item is never re-sent.
Instance Method Summary collapse
-
#add_item(config_id, item_key, item_type, default, description = nil) ⇒ Object
Queue an item declaration for an already-declared config.
-
#declare(config_id, service:, environment:, parent: nil, name: nil, description: nil) ⇒ Object
Idempotent — first writer’s metadata wins.
-
#drain ⇒ Object
Returns and clears the pending batch; records sent items.
-
#initialize ⇒ ConfigRegistrationBuffer
constructor
A new instance of ConfigRegistrationBuffer.
- #pending_count ⇒ Object
Constructor Details
#initialize ⇒ ConfigRegistrationBuffer
Returns a new instance of ConfigRegistrationBuffer.
99 100 101 102 103 104 |
# File 'lib/smplkit/management/buffer.rb', line 99 def initialize @pending = {} # config_id -> { id:, items: {}, ...meta } @meta = {} # config_id -> { service:, environment:, parent:, name:, description: } @sent_items = {} # "#{config_id}::#{item_key}" -> true @lock = Mutex.new end |
Instance Method Details
#add_item(config_id, item_key, item_type, default, description = nil) ⇒ Object
Queue an item declaration for an already-declared config. Items already sent in a previous drain are skipped.
121 122 123 124 125 126 127 128 129 130 131 132 133 |
# File 'lib/smplkit/management/buffer.rb', line 121 def add_item(config_id, item_key, item_type, default, description = nil) @lock.synchronize do next unless @meta.key?(config_id) next if @sent_items.key?("#{config_id}::#{item_key}") entry = (@pending[config_id] ||= build_entry(config_id)) next if entry["items"].key?(item_key) item = { "value" => default, "type" => item_type } item["description"] = description unless description.nil? entry["items"][item_key] = item end end |
#declare(config_id, service:, environment:, parent: nil, name: nil, description: nil) ⇒ Object
Idempotent — first writer’s metadata wins.
107 108 109 110 111 112 113 114 115 116 117 |
# File 'lib/smplkit/management/buffer.rb', line 107 def declare(config_id, service:, environment:, parent: nil, name: nil, description: nil) @lock.synchronize do next if @meta.key?(config_id) @meta[config_id] = { service: service, environment: environment, parent: parent, name: name, description: description } @pending[config_id] = build_entry(config_id) end end |
#drain ⇒ Object
Returns and clears the pending batch; records sent items.
136 137 138 139 140 141 142 143 144 145 |
# File 'lib/smplkit/management/buffer.rb', line 136 def drain @lock.synchronize do entries = @pending.values entries.each do |entry| entry["items"].each_key { |item_key| @sent_items["#{entry["id"]}::#{item_key}"] = true } end @pending = {} entries end end |
#pending_count ⇒ Object
147 148 149 |
# File 'lib/smplkit/management/buffer.rb', line 147 def pending_count @lock.synchronize { @pending.size } end |