lib/zfs_mgmt.rb in zfs_mgmt-0.2.6 vs lib/zfs_mgmt.rb in zfs_mgmt-0.2.7
- old
+ new
@@ -42,10 +42,11 @@
'manage',
'strategy',
'minage',
'matchsnaps',
'ignoresnaps',
+ 'prefersnaps',
'snapshot',
'snap_prefix',
'snap_timestamp',
].map do |p|
['zfsmgmt',p].join(':')
@@ -115,17 +116,15 @@
def self.snapshot_destroy_policy(zfs,props,snaps)
minage = 0
if props.has_key?('zfsmgmt:minage')
minage = timespec_to_seconds(props['zfsmgmt:minage'])
end
- strategy = 'youngest'
- if props.has_key?('zfsmgmt:strategy') and props['zfsmgmt:strategy'] == 'oldest'
- strategy = 'oldest'
+ strategy = 'oldest'
+ if props.has_key?('zfsmgmt:strategy') and props['zfsmgmt:strategy'] == 'youngest'
+ strategy = 'youngest'
end
sorted = snaps.keys.sort { |a,b| snaps[b]['creation'] <=> snaps[a]['creation'] }
- # never consider the latest snapshot for anything
- newest_snapshot_name = sorted.shift
counters = policy_parser(props['zfsmgmt:policy'])
$logger.debug(counters)
saved = {}
@@ -145,16 +144,20 @@
end
snaptime = local_epoch_to_datetime(snaps[snap_name]['creation'])
$date_patterns.each do |d,p|
pat = snaptime.strftime(p)
if saved[d].has_key?(pat)
- if strategy == 'youngest'
+ #pp props['zfsmgmt:prefersnaps'],snap_name.split('@')[1], saved[d][pat].split('@')[1]
+ if props.has_key?('zfsmgmt:prefersnaps') and /#{props['zfsmgmt:prefersnaps']}/ !~ saved[d][pat].split('@')[1] and /#{props['zfsmgmt:prefersnaps']}/ =~ snap_name.split('@')[1]
+ $logger.debug("updating the saved snapshot, we prefer this one: \"#{pat}\" to #{snap_name} at #{snaptime}")
+ saved[d][pat] = snap_name
+ elsif strategy == 'oldest' and ( not props.has_key?('zfsmgmt:prefersnaps') or /#{props['zfsmgmt:prefersnaps']}/ =~ snap_name.split('@')[1] )
# update the existing current save snapshot for this timeframe
$logger.debug("updating the saved snapshot for \"#{pat}\" to #{snap_name} at #{snaptime}")
saved[d][pat] = snap_name
else
- $logger.debug("not updating the saved snapshot for \"#{pat}\" to #{snap_name} at #{snaptime}, we have an older snap")
+ $logger.debug("not updating the saved snapshot for \"#{pat}\" to #{snap_name} at #{snaptime}, we have a younger snap")
end
elsif counters[d] > 0
# new pattern, and we want to save more snaps of this type
$logger.debug("new pattern \"#{pat}\" n#{counters[d]} #{d} snapshot, saving #{snap_name} at #{snaptime}")
counters[d] -= 1
@@ -176,9 +179,12 @@
if props.has_key?('zfsmgmt:ignoresnaps') and /#{props['zfsmgmt:ignoresnaps']}/ =~ snap.split('@')[1]
$logger.debug("skipping #{snap} because it matches ignoresnaps pattern: #{props['zfsmgmt:ignoresnaps']}")
false
elsif minage > 0 and Time.at(snaps[snap]['creation'] + minage) > Time.now()
$logger.debug("skipping due to minage: #{snap} #{local_epoch_to_datetime(snaps[snap]['creation']).strftime('%F %T')}")
+ false
+ elsif snap == sorted[0] # the very newest snap
+ $logger.debug("skipping due to newest: #{snap} #{local_epoch_to_datetime(snaps[snap]['creation']).strftime('%F %T')}")
false
else
true
end
}