[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Using the --snaptime option



I asked Colin about this earlier, and have included his email below.
Since ZFS tracks when the snapshot was taken, I use the following in a
zsh script to create the file:

  snaptimetemp=`mktemp /tmp/snaptime.XXXXXXXXXXXX`
  latest=<get the name of the snapshot to backup>
  timestamp=`zfs get -Hp -o value creation $latest`
  log "Snapshot creation timestamp: $timestamp (`date -jr $timestamp`)"
  touch -t `date -jr $timestamp '+%Y%m%d%H%M.%S'` "$snaptimetemp"
  tarsnap -c --keyfile "$2" -f "$latest" --snaptime "$snaptimetemp"
--print-stats --totals "$backuproot"

You're really just interested in the timestamp and touch parts, but I
included the rest for context.

===========
Colin's Reply:
===========

Hi Nick,

On 04/29/13 13:57, Nick Sivo wrote:
> I'm working on setting up nightly backups of our live server.  We run
> FreeBSD and I've configured a nightly UFS snapshot to be taken, and
> I'd like to back up some directories from that snapshot.  Can I just
> mount it and point tarsnap to the right place?  Do I need the
> --snaptime option?  If so, can I just set it to the timestamp of the
> snapshot itself?

You need the --snaptime option, and it should point at something with a
modification time prior to when the snapshot creation started.  The
easiest way to do this is probably to touch a file on the filesystem
immediately before taking the snapshot, then to use that file as the
snaptime marker.

> To the best of my knowledge tarsnap shouldn't need to know that it's
> reading from a snapshot, but I figured I'd ask since there's an
> option.

This is necessary because of Tarsnap's "this file hasn't changed since I
last read it so I won't waste time re-reading it" logic.  Normally if a
file has the same path, size, inode #, and modification time, Tarsnap
assumes that it hasn't changed and doesn't need to be re-read; but the
file times have limited precision, so the following situation is possible:

t=12345.0001: file is modified
t=12345.0100: tarsnap reads file
t=12345.0500: file is modified again
t=54321.0000: tarsnap is run again and encounters file again

in which case the second tarsnap run will see a timestamp of "12345" even
though it's a "later" 12345.

To prevent this race condition, tarsnap flags files which with modification
times equal to when tarsnap is running; however, that doesn't work in the
following case:

t=12345.0001: file is modified
t=12345.0100: filesystem snapshot #1 is created
t=12345.0500: file is modified again
t=13000.0000: tarsnap is run against filesystem snapshot #1
t=50000.0000: filesystem snapshot #2 is created
t=54321.0000: tarsnap is run against filesystem snapshot #2

since both snapshots will show the file with an mtime of 12345.  Tarsnap
uses the snaptime marker to identify cases like this.

In short: It's a sneaky race condition which you'd have to be very unlucky
to hit, but using the --snaptime option allows tarsnap to identify when it
might be running into the race and play it safe instead.

On Thu, Jan 23, 2014 at 3:43 AM, Albert Peschar <albert@peschar.net> wrote:
> Hi all,
>
>
>
> I've been using tarsnap for some months to do all kinds of backups.
>
> Now, I'd like to use tarsnap to archive ZFS filesystem snapshots. What
>
> is unclear to me is whether and how I should be using the --snaptime
>
> option.
>
>
>
> From the manual:
>
>
>
>      --snaptime file
>
>              (c mode only) This option MUST be specified when
>
>              creating a backup from a filesystem snapshot, and
>
>              file must have a modification time prior to when
>
>              the filesystem snapshot was created.  (This is nec‐
>
>              essary to prevent races between file modification
>
>              and snapshot creation which could result in tarsnap
>
>              failing to recognize that a file has been modi‐
>
>              fied.)
>
>
>
> Should I just specify any file that hasn't been modified during the
>
> snapshot?
>
>
>
> And would someone be willing to explain why this is at all necessary?
>
>
>
>
>
> Thanks,
>
>
>
> Albert