help-tar
[Top][All Lists]
Advanced

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

Re: [Help-tar] --listed-incremental and tape full (tar 1.20 for now)


From: Ersek, Laszlo
Subject: Re: [Help-tar] --listed-incremental and tape full (tar 1.20 for now)
Date: Thu, 30 Dec 2010 00:55:51 +0100 (CET)

(Sorry for the long quote, I'd like to keep the context.)

On Wed, 29 Dec 2010, Jakob Bohm wrote:

I am having a problem with the behavior of --listed-incremental when the tape of a single-volume archive fills up.

To avoid the backups on subsequent days becoming increasingly larger, I want the incremental index to list the files that were actually backed up before the tape was full. However currently, I seem to get an index saying that nothing was backed up on the full tape (its uncompressed LTO-4 = 800Gio per tape).

One thing I have not tried (because it would create a multi-volume archive with the second and later volumes missing) would be to specify "--tape-length 800000000000 --info-script=/bin/false" however given the observed handling of tape full I would suspect that doing this would have the same result as a simple broken output pipe[2].

1. This is on a Debian 5.0.x(Lenny) system with its corresponding version of GNU tar 1.20, but compiling another tar version to make things work would not be much of a problem.

2. I am piping the output from tar through a double-buffering program similar to the classic "buffer" program in order to reduce shoe-shining in the tape drive caused by the disk being slower than the tape. The buffer is configured to buffer up about 792 MibiOctets of archive at a time, write lots of 100Kio tape blocks continuously in a burst at tape speed, then sleep until the buffer is full again. Thus tape full technically manifests itself as a broken output pipe rather than a real disk full error code in case that makes any difference to tar.

3. This is a production system, I really need the backup to work 5 days a week, 52 weeks/year. As each backup run may take up to 18 hours (2 hours lead time + 1 minute/burst), I cannot do much full scale experimenting.

4. This is all done by a cron job, no human interaction possible.


I tried to check the situation that I think you would be in if the disk could keep up with the tape:

- --listed-incremental
- tape full signalled with -1/ENOSPC on write()
- single volume

I created 10 files of '\0', 2 MB each (zf0 .. zf9). I created a 5.5 MB ext2 filesystem image and loop-mounted it (/mnt/tmp). Then I tried to create the single-volume archive, without any pre-existing metadata file.

  $ rpm -q tar
  tar-1.23-7.fc14.x86_64

  $ ls -goh zf? img
  -rw-------. 1 5.5M 2010-12-29 23:53:21 +0100 img
  -rw-------. 1 2.0M 2010-12-29 23:43:13 +0100 zf0
  -rw-------. 1 2.0M 2010-12-29 23:43:13 +0100 zf1
  -rw-------. 1 2.0M 2010-12-29 23:43:13 +0100 zf2
  -rw-------. 1 2.0M 2010-12-29 23:48:02 +0100 zf3
  -rw-------. 1 2.0M 2010-12-29 23:48:02 +0100 zf4
  -rw-------. 1 2.0M 2010-12-29 23:48:02 +0100 zf5
  -rw-------. 1 2.0M 2010-12-29 23:52:00 +0100 zf6
  -rw-------. 1 2.0M 2010-12-29 23:52:00 +0100 zf7
  -rw-------. 1 2.0M 2010-12-29 23:52:00 +0100 zf8
  -rw-------. 1 2.0M 2010-12-29 23:52:00 +0100 zf9

  $ tar -c -v -f /mnt/tmp/z.tar --listed-incremental=z.snar zf*
  zf0
  zf1
  zf2
  tar: /mnt/tmp/z.tar: Wrote only 2048 of 10240 bytes
  tar: Error is not recoverable: exiting now

  $ ls -goh z.snar
  -rw-------. 1 0 2010-12-30 00:04:15 +0100 z.snar

That is, without -M, the level 0 backup fails when it encounters ENOSPC and the metadata file remains empty, even though two files were written.

I removed the partial tar file and the empty snar file, and repeated the above with -M. At each prompt I simply removed the last volume.

  $ tar -M -c -v -f /mnt/tmp/z.tar --listed-incremental=z.snar zf*
  zf0
  zf1
  zf2
  Prepare volume #2 for `/mnt/tmp/z.tar' and hit return:
  ./GNUFileParts.10717/zf2.1
  zf3
  zf4
  zf5
  Prepare volume #3 for `/mnt/tmp/z.tar' and hit return:
  ./GNUFileParts.10717/zf5.2
  zf6
  zf7
  Prepare volume #4 for `/mnt/tmp/z.tar' and hit return:
  ./GNUFileParts.10717/zf7.3
  zf8
  zf9

  $ ls -goh z.snar
  -rw-------. 1 36 2010-12-30 00:08:56 +0100 z.snar

I did this in order to end up with a complete metadata file. Now I tried to update it, again by backing up to a single-volume file (level 1):

  $ rm /mnt/tmp/z.tar
  $ touch zf[5-8]
  $ cp z.snar z.snar.bak

  $ tar -c -v -f /mnt/tmp/z1.tar --listed-incremental=z.snar zf*
  zf5
  zf6
  zf7
  tar: /mnt/tmp/z1.tar: Wrote only 2048 of 10240 bytes
  tar: Error is not recoverable: exiting now

  $ cmp z.snar z.snar.bak

Thus the snar file was not updated, even though two files were archived. I removed the partial single-volume level 1 archive and retried the above (against the unchanged snar file) by backing up to a multi-volume level 1 archive. Again, I "changed" volumes by "rm".

  $ tar -M -c -v -f /mnt/tmp/z1.tar --listed-incremental=z.snar zf*
  zf5
  zf6
  zf7
  Prepare volume #2 for `/mnt/tmp/z1.tar' and hit return:
  ./GNUFileParts.10767/zf7.1
  zf8

  $ cmp z.snar.bak  z.snar
  z.snar.bak z.snar differ: char 23, line 2

This time the metadata file was updated correctly.

Until this point, I believe, this experiment has shown that without -M, the snar file won't be updated if tar runs out of space, even if you omit the buffering application and write directly to the tape. So adding --tape-length=XXXX (which implies -M) can't put you in a worse situation than you're presently in. The question is whether passing -M and then refusing to provide blank media would create a usable snar file (for level 0) or update it (for higher levels):

  $ rm z.snar* /mnt/tmp/z1.tar

  $ tar -M -c -v -f /mnt/tmp/z.tar --listed-incremental=z.snar zf*
  zf0
  zf1
  zf2
  Prepare volume #2 for `/mnt/tmp/z.tar' and hit return: q
  tar: No new volume; exiting.

  tar: WARNING: Archive is incomplete
  tar: Error is not recoverable: exiting now

  $ ls -goh z.snar
  -rw-------. 1 0 2010-12-30 00:21:39 +0100 z.snar

The answer is negative. You really need to complete the entire backup process to get a usable index, independently from whether you write to a tape or a pipe, and from single/multi volume.

I don't know about the structure of the snar file, but if it contains a single timestamp (for example the start or the end of the most recent backup, or the highest mtime encountered during backup), then it really may be updated only after all files were backed up. Otherwise it could advance past the mtime of a file tar intended to back up but missed because there was not enough space.

(I never found myself in the vicinity of a tape drive; caveat emptor.)

lacos



reply via email to

[Prev in Thread] Current Thread [Next in Thread]