Module: Regurgitator::FileInfo

Includes:
Device, Domain
Included in:
Endpoint
Defined in:
lib/regurgitator/file_info.rb

Overview

:nodoc:

Instance Method Summary collapse

Methods included from Device

#device_init, #device_uris!, extended, #refresh_device, #refresh_device_unlocked

Methods included from ServerSettings

extended, #refresh_zone, #refresh_zone_unlocked, #server_settings_init, #zone_for

Methods included from Domain

#domain_init, #get_dmid, #refresh_domain, #refresh_domain_unlocked

Instance Method Details

#file_info(env, domain, dkey, update = false) ⇒ Object

returns a hash with file information and URIs for accessing the file: {

:fid => 3149113,
:length => 17,
:uris => {
  "east" => [ [read_write,read_only], [read_write,read_only] ],
  "west" => [ [read_write,read_only], [read_write,read_only] ],
  nil => [ [read_write,read_only], [read_write,read_only] ],
}

}



25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
# File 'lib/regurgitator/file_info.rb', line 25

def file_info(env, domain, dkey, update = false)
  dmid = get_dmid(domain) or return
  devices = refresh_device(update)

  info = @db[
    'SELECT fid,length FROM file WHERE dmid = ? AND dkey = ? LIMIT 1'.freeze,
    dmid, dkey
  ].first or return
  0 == info[:length] and return info
  fid = info[:fid]
  read_uris = Hash.new { |h,k| h[k] = [] }
  drain_uris = Hash.new { |h,k| h[k] = [] }

  zone = env['regurgitator.zone']

  @db['SELECT devid FROM file_on WHERE fid = ?'.freeze, fid].each do |x|
    devinfo = devices[x[:devid]] or next
    fid >= 10_000_000_000 and next # TODO: support larger FIDs

    uris = devinfo[:uris][:pri]
    nfid = sprintf('%010u'.freeze, fid)
    /\A(\d)(\d{3})(\d{3})(?:\d{3})\z/ =~ nfid
    fid_path = "/#$1/#$2/#$3/#{nfid}.fid"
    uris = uris.map do |u|
      u = u.dup
      u.path += fid_path # must be a copy
      u
    end
    (devinfo[:preferred] ? read_uris : drain_uris)[devinfo[:zone]] << uris
  end
  uris = info[:uris] = read_uris.empty? ? drain_uris : read_uris
  (uris.empty? && ! update) ? file_info(env, domain, dkey, true) : info
end

#file_info_initObject



10
11
12
13
# File 'lib/regurgitator/file_info.rb', line 10

def file_info_init
  domain_init
  device_init
end