backup-usedump-20070623
authorGarry Zacheiss <zacheiss@mit.edu>
Sat, 23 Jun 2007 16:13:17 +0000 (16:13 +0000)
committerDerrick Brashear <shadow@dementia.org>
Sat, 23 Jun 2007 16:13:17 +0000 (16:13 +0000)
FIXES 55704

restore from specific dump id

src/bucoord/commands.c
src/bucoord/main.c
src/bucoord/restore.c

index 02a4624..4ff455c 100644 (file)
@@ -1139,6 +1139,7 @@ bc_VolRestoreCmd(as, arock)
     afs_int32 code;
     int oldFlag;
     afs_int32 fromDate;
+    afs_int32 dumpID = 0;
     char *newExt, *timeString;
     afs_int32 i;
     afs_int32 *ports = NULL;
@@ -1233,13 +1234,20 @@ bc_VolRestoreCmd(as, arock)
 
     dontExecute = (as->parms[6].items ? 1 : 0);        /* -n */
 
+    if (as->parms[7].items)
+      {
+       dumpID = atoi(as->parms[7].items->data);
+       if (dumpID <= 0)
+         dumpID = 0;
+      }
+    
     /*
      * Perform the call to start the restore.
      */
     code =
        bc_StartDmpRst(bc_globalConfig, "volume", "restore", volsToRestore,
                       &destServ, destPartition, fromDate, newExt, oldFlag,
-                      /*parentDump */ 0, /*dumpLevel */ 0,
+                      /*parentDump */ dumpID, /*dumpLevel */ 0,
                       bc_Restorer, ports, portCount,
                       /*dumpSched */ NULL, /*append */ 0, dontExecute);
     if (code)
index 1aa62a2..bf586b6 100644 (file)
@@ -544,6 +544,8 @@ main(argc, argv)
                "date from which to restore");
     cmd_AddParm(ts, "-portoffset", CMD_LIST, CMD_OPTIONAL, "TC port offsets");
     cmd_AddParm(ts, "-n", CMD_FLAG, CMD_OPTIONAL, "don't really execute it");
+    cmd_AddParm(ts, "-usedump", CMD_SINGLE, CMD_OPTIONAL,
+               "specify the dumpID to restore from");
     if (!interact)
        add_std_args(ts);
 
index bbecd91..bdf97e8 100644 (file)
@@ -216,26 +216,52 @@ bc_Restorer(aindex)
     for (tvol = dumpTaskPtr->volumes; tvol; tvol = tvol->next) {       /*tvol */
        strcpy(vname, tvol->name);
        dumpDescr = &dumpDescr1;
-       code = bcdb_FindDump(vname, dumpTaskPtr->fromDate, dumpDescr);
-
-       if (!BackupName(vname)) {       /* See if backup volume is there */
-           strcat(vname, ".backup");
-           dumpDescr = &dumpDescr2;
-           tcode = code;
+       if (dumpTaskPtr->parentDumpID > 0) /* Told which dump to try */
+         {
+           /* Right now, this assumes that all volumes listed will be
+            * from the given dumpID.  FIXME
+            */
+           code = bcdb_FindDumpByID(dumpTaskPtr->parentDumpID, dumpDescr);
+           if (code)
+             {
+               com_err(whoami, "Couldn't look up info for dump %d\n",
+                       dumpTaskPtr->parentDumpID);
+               continue;
+             }
+           code = bcdb_FindVolumes(dumpTaskPtr->parentDumpID, vname, volumeEntries,
+                                   last, &next, MAXTAPESATONCE, &vecount);
+           if (code)
+             {
+               if (!BackupName(vname))
+                 {
+                   strcat(vname, ".backup");
+                   code = bcdb_FindVolumes(dumpTaskPtr->parentDumpID, vname, volumeEntries,
+                                           last, &next, MAXTAPESATONCE, &vecount);
+                 }
+             }
+         }
+       else
+         {
            code = bcdb_FindDump(vname, dumpTaskPtr->fromDate, dumpDescr);
+           if (!BackupName(vname)) {   /* See if backup volume is there */
+             strcat(vname, ".backup");
+             dumpDescr = &dumpDescr2;
+             tcode = code;
+             code = bcdb_FindDump(vname, dumpTaskPtr->fromDate, dumpDescr);
 
-           if (code) {         /* Can't find backup, go with first results */
+             if (code) {       /* Can't find backup, go with first results */
                strcpy(vname, tvol->name);
                dumpDescr = &dumpDescr1;
                code = tcode;
-           } else if (!tcode) {        /* Both found an entry, go with latest result */
+             } else if (!tcode) {      /* Both found an entry, go with latest result */
                if (dumpDescr1.created > dumpDescr2.created) {
-                   strcpy(vname, tvol->name);
-                   dumpDescr = &dumpDescr1;
-                   code = tcode;
+                 strcpy(vname, tvol->name);
+                 dumpDescr = &dumpDescr1;
+                 code = tcode;
                }
+             }
            }
-       }
+         }
 
        if (code) {             /* If FindDump took an error */
            afs_com_err(whoami, code, "; Can't find any dump for volume %s",