class Fluent::Plugin::RoundRobinOutput

Attributes

weights[R]

Public Class Methods

new() click to toggle source
Calls superclass method Fluent::Plugin::MultiOutput.new
# File lib/fluent/plugin/out_roundrobin.rb, line 28
def initialize
  super
  @weights = []
end

Public Instance Methods

configure(conf) click to toggle source
Calls superclass method Fluent::Plugin::MultiOutput#configure
# File lib/fluent/plugin/out_roundrobin.rb, line 35
def configure(conf)
  super

  @stores.each do |store|
    @weights << store.weight
  end
  @rr = -1  # starts from @output[0]
  @rand_seed = Random.new.seed
end
multi_workers_ready?() click to toggle source
# File lib/fluent/plugin/out_roundrobin.rb, line 45
def multi_workers_ready?
  true
end
process(tag, es) click to toggle source
# File lib/fluent/plugin/out_roundrobin.rb, line 54
def process(tag, es)
  next_output.emit_events(tag, es)
end
start() click to toggle source
Calls superclass method Fluent::Plugin::MultiOutput#start
# File lib/fluent/plugin/out_roundrobin.rb, line 49
def start
  super
  rebuild_weight_array
end

Private Instance Methods

next_output() click to toggle source
# File lib/fluent/plugin/out_roundrobin.rb, line 60
def next_output
  @rr = 0 if (@rr += 1) >= @weight_array.size
  @weight_array[@rr]
end
rebuild_weight_array() click to toggle source
# File lib/fluent/plugin/out_roundrobin.rb, line 65
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