Class: Smplkit::Management::ConfigRegistrationBuffer

Inherits:
Object
  • Object
show all
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

Constructor Details

#initializeConfigRegistrationBuffer

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

#drainObject

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_countObject



147
148
149
# File 'lib/smplkit/management/buffer.rb', line 147

def pending_count
  @lock.synchronize { @pending.size }
end