diff options
author | Patrick J Cherry <patrick@bytemark.co.uk> | 2014-12-05 17:50:54 +0000 |
---|---|---|
committer | Patrick J Cherry <patrick@bytemark.co.uk> | 2014-12-05 17:50:54 +0000 |
commit | 5129820f2f2535086c0634cb0b6ea14f5e3d5d1c (patch) | |
tree | fd4de769d3a0a46d548745808dba5208e2916213 /lib/byteback/backup_directory.rb | |
parent | ea336814acc5fd51c385ae837f280670d0fc3a45 (diff) |
Re-jigged least-relevant backup selection. ALSO PARSE FILE PATHS AS TIMES CORRECTLY
Diffstat (limited to 'lib/byteback/backup_directory.rb')
-rw-r--r-- | lib/byteback/backup_directory.rb | 42 |
1 files changed, 25 insertions, 17 deletions
diff --git a/lib/byteback/backup_directory.rb b/lib/byteback/backup_directory.rb index 6404cd8..a31c290 100644 --- a/lib/byteback/backup_directory.rb +++ b/lib/byteback/backup_directory.rb @@ -8,27 +8,35 @@ module Byteback # Order backups by their closeness to defined backup times, which are # listed in a set order (i.e. today's backup is more important than yesterday's). # - BACKUP_IMPORTANCE = [0, 1, 2, 7, 14, 21, 28, 56, 112] + BACKUP_IMPORTANCE = [1, 2, 7, 14, 21, 28, 56, 112] def sort_by_importance(snapshots_unsorted, now=Time.now) snapshots_sorted = [] + scores = Array.new{|h,k| h[k] = []} + times = snapshots_unsorted.map(&:time) - # FIXME: takes about a minute to sort 900 items, - # seems like that ought to be quicker than O(n^2) + BACKUP_IMPORTANCE.each_with_index do |days, backup_idx| + target_time = now.to_i - (days*86400) + weight = days.to_f - (backup_idx == 0 ? 0 : BACKUP_IMPORTANCE[backup_idx-1]) + scores << times.map{|t| (t.to_i - target_time).abs/weight } + end + + # + # Find the index of the lowest score from the list of BACKUP_IMPORTANCE # - while !snapshots_unsorted.empty? - BACKUP_IMPORTANCE.each do |days| - target_time = now - (days*86400) - closest = snapshots_unsorted.inject(nil) do |best, snapshot| - if best.nil? || (snapshot.time-target_time).abs < (best.time-target_time).abs - snapshot - else - best - end - end - break unless closest - snapshots_sorted << snapshots_unsorted.delete(closest) - end + nearest_target = scores.transpose.map{|s| s.find_index(s.min)} + + BACKUP_IMPORTANCE.each_index do |backup_idx| + # + # Find the indicies of the snapshots that match the current BACKUP_IMPORTANCE index, and sort them according to their score. + best_snapshot_idxs = nearest_target.each_index. + select{|i| nearest_target[i] == backup_idx}. + sort{|a,b| scores[backup_idx][a] <=> scores[backup_idx][b]} + + # + # Append them to the array. + # + snapshots_sorted += snapshots_unsorted.values_at(*best_snapshot_idxs) end snapshots_sorted @@ -45,7 +53,7 @@ module Byteback end def time - Time.parse(path) + Time.parse(File.basename(path)) end def <=>(b) |