class Fluent::Plugin::RoundRobinOutput
def configure(conf)
def configure(conf) super @stores.each do |store| @weights << store.weight end @rr = -1 # starts from @output[0] @rand_seed = Random.new.seed end
def initialize
def initialize super @weights = [] end
def multi_workers_ready?
def multi_workers_ready? true end
def next_output
def next_output @rr = 0 if (@rr += 1) >= @weight_array.size @weight_array[@rr] end
def process(tag, es)
def process(tag, es) next_output.emit_events(tag, es) end
def rebuild_weight_array
def rebuild_weight_array gcd = @weights.inject(0) {|r,w| r.gcd(w) } weight_array = [] @outputs.zip(@weights).each {|output,weight| (weight / gcd).times { weight_array << output } } # don't randomize order if all weight is 1 (=default) if @weights.any? {|w| w > 1 } r = Random.new(@rand_seed) weight_array.sort_by! { r.rand } end @weight_array = weight_array end
def start
def start super rebuild_weight_array end