From d5366fc4b3cc155e2e58b1ed7e638c01b60560dc Mon Sep 17 00:00:00 2001 From: Garry Zacheiss Date: Sat, 23 Jun 2007 16:14:53 +0000 Subject: [PATCH] DEVEL15-backup-usedump-20070623 FIXES 55704 restore from specific dump id (cherry picked from commit a2cd5f5ec0cf20cca2f4a568f23759eda42e1fcc) --- src/bucoord/commands.c | 10 ++++++++- src/bucoord/main.c | 2 ++ src/bucoord/restore.c | 50 ++++++++++++++++++++++++++++++++---------- 3 files changed, 49 insertions(+), 13 deletions(-) diff --git a/src/bucoord/commands.c b/src/bucoord/commands.c index 02a4624a3..4ff455c8b 100644 --- a/src/bucoord/commands.c +++ b/src/bucoord/commands.c @@ -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) diff --git a/src/bucoord/main.c b/src/bucoord/main.c index 1aa62a27d..bf586b679 100644 --- a/src/bucoord/main.c +++ b/src/bucoord/main.c @@ -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); diff --git a/src/bucoord/restore.c b/src/bucoord/restore.c index bbecd9124..bdf97e876 100644 --- a/src/bucoord/restore.c +++ b/src/bucoord/restore.c @@ -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", -- 2.39.5