Class Nearline::Models::Manifest
In: lib/nearline/manifest.rb
Parent: ActiveRecord::Base

A Manifest represents the corpus of ArchivedFiles and set of Log messages resulting from a backup attempt

Methods

Attributes

backup_exclusions  [RW]  Just needed when you create a manifest
backup_paths  [RW]  Just needed when you create a manifest

Public Class methods

[Source]

    # File lib/nearline/manifest.rb, line 52
52:       def self.backup(system, backup_paths, backup_exclusions)
53:         manifest = self.new(:system => system)
54:         manifest.save!
55:         manifest.backup(backup_paths, backup_exclusions)
56:       end

Find all Manifest entries (across all Systems) which have never finished.

They are:

  • Currently under-way
  • Have failed in some untimely way

[Source]

     # File lib/nearline/manifest.rb, line 119
119:       def self.incomplete_manifests
120:         self.find_all_by_completed_at(nil)
121:       end

[Source]

    # File lib/nearline/manifest.rb, line 45
45:       def self.new_for_name(system_name)
46:         system = System.for_name(system_name)
47:         system.manifests << m = Nearline::Models::Manifest.new
48:         system.save!
49:         m        
50:       end

[Source]

     # File lib/nearline/manifest.rb, line 123
123:       def self.restore_all_missing(system, latest_date_time = Time.now)
124:         manifest = system.latest_manifest_as_of(latest_date_time)
125:         manifest.iterate_all_missing do |af|
126:           af.restore
127:         end 
128:       end

[Source]

     # File lib/nearline/manifest.rb, line 130
130:       def self.what_would_restore(system, latest_date_time = Time.now)
131:         manifest = system.latest_manifest_as_of(latest_date_time)        
132:         manifest.iterate_all_missing {}
133:       end

Public Instance methods

[Source]

     # File lib/nearline/manifest.rb, line 149
149:       def add_log(message)
150:         puts message
151:         log = Nearline::Models::Log.new({:message => message, :manifest_id => self.id})
152:         log.save!
153:       end

[Source]

    # File lib/nearline/manifest.rb, line 58
58:       def backup(backup_paths, backup_exclusions)
59:         FileFinder.recurse(backup_paths, backup_exclusions) do |file_path|
60:           handle_file_path(file_path)
61:         end
62:         finish_remaining_file_infos
63:         
64:         self.completed_at = Time.now
65:         self.save!
66:         self        
67:       end

[Source]

     # File lib/nearline/manifest.rb, line 155
155:       def before_destroy
156:         destroy_archived_files_with_content
157:         destroy_archived_files_without_content
158:         destroy_archived_files_manifests
159:         destroy_logs
160:         self.destroy_without_habtm_shim_for_archived_files
161:       end

[Source]

     # File lib/nearline/manifest.rb, line 104
104:       def existing_archived_file_lookup
105:         return {} if @file_infos.size == 0
106:         path_hashes = @file_infos.collect {|e| "'#{e.path_hash}'"}.join(", ")
107:         conditions = "path_hash in (#{path_hashes})"
108:         hits = ArchivedFile.find(:all, :conditions => conditions)
109:         existing_files = {}
110:         hits.each { |e| existing_files[e.path_hash] = e }
111:         existing_files
112:       end

[Source]

    # File lib/nearline/manifest.rb, line 78
78:       def finish_remaining_file_infos
79:         process_file_infos
80:       end

[Source]

    # File lib/nearline/manifest.rb, line 69
69:       def handle_file_path(file_path)
70:         @file_infos = @file_infos || []
71:         @file_infos << FileInformation.new(file_path, self)
72:         
73:         if @file_infos.size > @@max_files_cached
74:           process_file_infos
75:         end
76:       end

Iterate all missing files from this manifest, yielding each

[Source]

     # File lib/nearline/manifest.rb, line 136
136:       def iterate_all_missing
137:         files_iterated = []
138:         self.archived_files.each do |af|
139:           begin
140:             File.lstat(af.path)
141:           rescue
142:             yield af
143:             files_iterated << af.path
144:           end
145:         end
146:         return files_iterated
147:       end

[Source]

     # File lib/nearline/manifest.rb, line 82
 82:       def process_file_infos
 83:         return if @file_infos.size == 0
 84: 
 85:         lookup = existing_archived_file_lookup        
 86:         @file_infos.each do |file_info|
 87:           $stdout.write file_info.file_path + " "
 88:           if (af = lookup[file_info.path_hash])
 89:             self.archived_files << af
 90:           else
 91:             af = ArchivedFile.create_for(file_info)            
 92:           end
 93:           if (!af.nil?)
 94:             $stdout.write "#{Time.at(af.mtime).asctime}"
 95:             if (!af.file_content.nil?)
 96:               $stdout.write" (#{af.file_content.file_size} bytes)"
 97:             end
 98:             $stdout.write("\n")
 99:           end
100:         end
101:         @file_infos = []
102:       end

A simple string reporting the performance of the manifest

[Source]

     # File lib/nearline/manifest.rb, line 247
247:       def summary
248:         completed = (completed_at.nil?) ? "DNF" : completed_at
249:         "#{system.name} started: #{created_at}\n finished: #{completed}\n " +
250:           "#{archived_files.size} files\n #{logs.size} Errors reported"
251:       end

[Source]

     # File lib/nearline/manifest.rb, line 236
236:       def total_size
237:         size = 0
238:         archived_files.each do |af|
239:           unless af.file_content.nil?
240:             size += af.file_content.file_size.to_i
241:           end
242:         end
243:         size
244:       end

[Validate]