3 # * net-http-persistent RubyGem
5 # * upstream MogileFS::Server 2.45 or later
6 $stdout.sync = $stderr.sync = true
10 require 'net/http/persistent'
11 Thread.abort_on_exception = true
15 x.banner = "Usage: #$0 -t TRACKERS"
17 x.on('-t', '--trackers=host1[,host2]', '--hosts=host1[,host2]',
18 Array, 'hostnames/IP addresses of trackers') do |args|
24 adm = MogileFS::Admin.new(:hosts => trackers)
25 NHP = Net::HTTP::Persistent.new(File.basename($0))
27 def start_perdev_thread(pfx)
31 while fid_path = todo.shift
32 path = "#{pfx}#{fid_path}"
35 resp = NHP.request(uri, Net::HTTP::Head.new(uri.path))
36 done << [ path, resp ]
45 def setup_devices(dev_map, adm)
47 adm.get_hosts.each do |host|
48 hosts[host["hostid"]] = "http://#{host['hostip']}:#{host['http_port']}/"
51 adm.get_devices.each do |device|
52 pfx = hosts[device["hostid"]] + "dev#{device['devid']}"
53 todo, done = start_perdev_thread(pfx)
58 def check(bad, curfid, rv)
61 when Net::HTTPNotFound # good
63 bad << "#{curfid} #{resp.content_length} #{path}\n"
65 warn "E: #{resp.inspect} (#{resp.class}) #{path}"
70 setup_devices(dev_map, adm)
76 (next_fid..(fidid - 1)).each do |curfid|
77 nfid = sprintf("%010u", curfid)
78 /\A(\d)(\d{3})(\d{3})(?:\d{3})\z/ =~ nfid
79 fid_path = "/#$1/#$2/#$3/#{nfid}.fid"
81 dev_map.each_key { |todo| todo << fid_path }
82 dev_map.each_value { |done| check(bad, curfid, done.shift) }