class Flare::Tools::Cli::Dump

Constants

Formats
Iterators
SizeOfByte

Public Class Methods

new() click to toggle source
Calls superclass method
# File lib/flare/tools/cli/dump.rb, line 126
def initialize
  super
  @output = nil
  @format = nil
  @bwlimit = 0
  @all = false
  @raw = false
  @partition_size = 1
end

Public Instance Methods

execute(config, args) click to toggle source
# File lib/flare/tools/cli/dump.rb, line 136
def execute(config, args)
  parse_index_server(config, args)
  STDERR.puts "please install tokyocabinet via gem command." unless defined? TokyoCabinet

  cluster = nil
  Flare::Tools::IndexServer.open(config[:index_server_hostname], config[:index_server_port], @timeout) do |s|
    cluster = Flare::Tools::Cluster.new(s.host, s.port, s.stats_nodes)
  end
  return S_NG if cluster.nil?

  partition_size = cluster.partition_size

  if @all
    if args.size > 0
      STDERR.puts "don't specify any nodes with --all option."
      return S_NG
    else
      args = cluster.master_nodekeys
    end
  else
    if args.size == 0
      STDERR.puts "please specify --all option to get complete dump."
      return S_NG
    end
  end

  unless Formats.include?(@format)
    STDERR.puts "unknown format: #{@format}"
    return S_NG
  end

  hosts = args.map {|x| x.split(':')}
  hosts.each do |x|
    if x.size == 2
      x << cluster.partition_of_nodename("#{x[0]}:#{x[1]}")
    elsif x.size == 4
      if x[3] =~ /^\d+$/
        STDERR.puts "invalid partition number '#{x.join(':')}'."
        x[3] = x[3].to_i
      else
        STDERR.puts "invalid partition number '#{x.join(':')}'."
        return S_NG
      end
    else
      STDERR.puts "invalid argument '#{x.join(':')}'."
      return S_NG
    end
  end

  dumper = case @format
           when CsvDumper.myname
             CsvDumper.new(@output || STDOUT)
           when TchDumper.myname
             TchDumper.new @output
           else
             DefaultDumper.new(@output || STDOUT)
           end

  hosts.each do |hostname,port,partition|
    Flare::Tools::Node.open(hostname, port.to_i, @timeout, 0, @bwlimit) do |n|
      interval = 0
      part, partsize = if @raw
                         [0, 1]
                       else
                         [partition, partition_size]
                       end
      bwlimit = @bwlimit/1024/SizeOfByte
      count = 0
      STDERR.print "dumping from #{hostname}:#{port}::#{part} of #{partsize} partitions ... "
      n.dump(interval, part, partsize, bwlimit) do |data, key, flag, len, version, expire|
        dumper.write data, key, flag, len, version, expire
        count += 1
        false
      end
      STDERR.puts "#{count}"
    end
  end

  dumper.close

  S_OK
end
setup() click to toggle source
Calls superclass method
# File lib/flare/tools/cli/dump.rb, line 114
def setup
  super
  set_option_index_server
  @optp.on('-o', '--output=FILE',            "output to file") {|v| @output = v}
  @optp.on('-f', '--format=FORMAT',          "specify output format [#{Formats.join(',')}]") {|v| @format = v}
  @optp.on(      '--bwlimit=BANDWIDTH',      "specify bandwidth limit (bps)") {|v|
    @bwlimit = Flare::Util::Bwlimit.bps(v)
  }
  @optp.on('--all',                            "dump from all master nodes") {|v| @all = true}
  @optp.on('--raw',                            "raw dump mode (for debugging)") {|v| @raw = true}
end