NetBSD-Bugs archive

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

bin/42883: dump(8) needs "true incremental backup" capacity



>Number:         42883
>Category:       bin
>Synopsis:       dump(8) needs "true incremental backup" capacity
>Confidential:   no
>Severity:       non-critical
>Priority:       medium
>Responsible:    bin-bug-people
>State:          open
>Class:          change-request
>Submitter-Id:   net
>Arrival-Date:   Thu Feb 25 01:25:00 +0000 2010
>Originator:     Greywolf
>Release:        NetBSD-5.0_RC1
>Organization:
Random Spherical Collisions
>Environment:
NetBSD lothlorien.starwolf.com 5.0_RC1 NetBSD 5.0_RC1 (GENERIC) #0: Wed Jan 28 
10:59:04 PST 2009  
builds@wb25:/home/builds/ab/netbsd-5/i386/200901280002Z-obj/home/builds/ab/netbsd-5/src/sys/arch/i386/compile/GENERIC
 i386

[code patch is against NetBSD-current]
>Description:
** this report supersedes bin/42880 **

Dump(8) will not perform an incremental dump once a level 9 dump
(with a record saved into /etc/dumpdates) is performed; all dumps
are incremental after that.

>How-To-Repeat:
# dump 9auf $output_file /file/system
# dump 9auf $output_file2 /file/system

$output_file will contain everything modified since the last
recorded level 8 (or lower) dump.  $output_file2 will also contain
everything modified thence, because dump doesn't look at the
last level 9 record.

The patches below allow a dump with level 'i' to dump at level 9,
but to take the _previous_ recorded level 9 into account, i.e.
# : assume previous dump was not level 9:
# dump 9auf $output_file /file/system
[everything modified since the last lower level dump and now
gets spit to the file, and the level 9 dump date is recorded]
# : and some time later...
# dump iauf $output_file2 /file/system
[everything modified since the last level 9 dump gets spit to
the output file #2, and a level 9 dump date is recorded,
overwriting the previous one.]
#

>Fix:
#/* this report supersedes bin/42880 */
--- main.c.orig 2010-02-24 00:16:39.000000000 -0800
+++ main.c      2010-02-24 01:50:29.000000000 -0800
@@ -134,7 +134,7 @@

        obsolete(&argc, &argv);
        while ((ch = getopt(argc, argv,
-           "0123456789aB:b:cd:eFf:h:k:l:L:nr:s:StT:uWwx:X")) != -1)
+           "0123456789iaB:b:cd:eFf:h:k:l:L:nr:s:StT:uWwx:X")) != -1)
                switch (ch) {
                /* dump level */
                case '0': case '1': case '2': case '3': case '4':
@@ -142,6 +142,11 @@
                        level = ch;
                        break;

+               case 'i':       /* "true incremental" regardless level 9 */
+                       level = '9';
+                       trueinc = 1;
+                       break;
+
                case 'a':               /* `auto-size', Write to EOM. */
                        unlimited = 1;
                        break;
--- itime.c.orig        2010-02-24 00:28:59.000000000 -0800
+++ itime.c     2010-02-24 01:23:42.000000000 -0800
@@ -145,12 +145,14 @@
        initdumptimes();
        /*
         *      Go find the entry with the same name for a lower increment
-        *      and older date
+        *      and older date.  If we are doing a true incremental, then
+        *      we can use level 9 as a ref point
         */
        ITITERATE(i, ddp) {
                if (strncmp(fname, ddp->dd_name, sizeof (ddp->dd_name)) != 0)
                        continue;
-               if (ddp->dd_level >= level)
+               if ((!trueinc && (ddp->dd_level >= level)) ||
+                   (trueinc && (ddp->dd_level > level)))
                        continue;
                if (ddp->dd_ddate <= iswap32(spcl.c_ddate))
                        continue;
--- dump.h.orig 2010-02-24 00:26:52.000000000 -0800
+++ dump.h      2010-02-24 00:26:56.000000000 -0800
@@ -110,6 +110,7 @@
 int    diskfd;         /* disk file descriptor */
 int    tapefd;         /* tape file descriptor */
 int    pipeout;        /* true => output to standard output */
+int    trueinc;        /* true => "true incremental", i.e use last 9 as ref */
 ino_t  curino;         /* current inumber; used globally */
 int    newtape;        /* new tape flag */
 u_int64_t      tapesize;       /* estimated tape size, blocks */
--- dump.8.orig 2010-02-24 02:54:31.000000000 -0800
+++ dump.8      2010-02-24 17:03:34.000000000 -0800
@@ -39,7 +39,7 @@
 .Nd file system backup
 .Sh SYNOPSIS
 .Nm
-.Op Fl 0123456789aceFnStuX
+.Op Fl 0123456789aceFinStuX
 .Bk -words
 .Op Fl B Ar records
 .Ek
@@ -147,7 +147,9 @@
 option below).
 A level number above 0, incremental backup,
 tells dump to copy all files new or modified since the
-last dump of a lower level.
+last dump of a lower level (but see also the
+.Fl i
+option below).
 The default level is 9.
 .It Fl a
 .Dq auto-size .
@@ -221,6 +223,10 @@
 The default honor level is 1,
 so that incremental backups omit such files
 but full backups retain them.
+.It Fl i Ar incremental
+The dump is treated as level 9 but takes into account a previous
+level 9, if one exists.  This makes it possible to perform a "true
+incremental" dump.
 .It Fl k Ar read-blocksize
 The size in kilobyte of the read buffers, rounded up to a multiple of the
 file system block size.
@@ -551,6 +557,12 @@
 .Nm
 command appeared in
 .At v6 .
+.Pp
+The
+.Fl i
+flag was inspired by the
+.Fl x
+flag from Sun's Solstice Backup utility.
 .Sh BUGS
 Fewer than 32 read errors on the file system are ignored.
 .Pp



Home | Main Index | Thread Index | Old Index