Class: Gizzard::PairCommand

Inherits:
Command
  • Object
show all
Defined in:
lib/gizzard/commands.rb

Instance Attribute Summary

Attributes inherited from Command

#argv, #buffer, #command_options, #global_options, #job_injector, #manager

Instance Method Summary collapse

Methods inherited from Command

classify, #confirm!, #get_base_name, #help!, #initialize, make_job_injector, make_manager, #output, #require_tables, #require_template_options, run

Constructor Details

This class inherits a constructor from Gizzard::Command

Instance Method Details

#runObject



397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
# File 'lib/gizzard/commands.rb', line 397

def run
  ids = []
  @argv.map do |host|
    manager.shards_for_hostname(host).each do |shard|
      ids << shard.id
    end
  end

  ids_by_table = {}
  ids.map do |id|
    ids_by_table[id.table_prefix] ||= []
    ids_by_table[id.table_prefix] << id
  end

  ids_by_host = {}
  ids.map do |id|
    ids_by_host[id.hostname] ||= []
    ids_by_host[id.hostname] << id
  end

  overlaps = {}
  ids_by_table.values.each do |arr|
    key = arr.map { |id| id.hostname }.sort
    overlaps[key] ||= 0
    overlaps[key] += 1
  end

  displayed = {}
  overlaps.sort_by { |hosts, count| count }.reverse.each do |(host_a, host_b), count|
    next if !host_a || !host_b || displayed[host_a] || displayed[host_b]
    id_a = ids_by_host[host_a].find {|id| manager.list_upward_links(id).size > 0 }
    id_b = ids_by_host[host_b].find {|id| manager.list_upward_links(id).size > 0 }
    next unless id_a && id_b
    weight_a = manager.list_upward_links(id_a).first.weight
    weight_b = manager.list_upward_links(id_b).first.weight
    if weight_a > weight_b
      puts "#{host_a}\t#{host_b}"
    else
      puts "#{host_b}\t#{host_a}"
    end
    displayed[host_a] = true
    displayed[host_b] = true
  end
  remaining = @argv - displayed.keys
  loop do
    a = remaining.shift
    b = remaining.shift
    break unless a && b
    puts "#{a}\t#{b}"
  end
end