diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2011-08-28 22:27:48 -0400 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2011-08-28 22:27:48 -0400 |
commit | 6e1f1fee97839599cf59f37f7051786a09f3b240 (patch) | |
tree | 7866682ea76adfc31f15cf56c04da3ed43fdccf6 | |
parent | d6e7abe45a64378113c1c717a831b7aac9c451df (diff) | |
download | postgresql-6e1f1fee97839599cf59f37f7051786a09f3b240.tar.gz postgresql-6e1f1fee97839599cf59f37f7051786a09f3b240.zip |
Actually, all of parallel restore's limitations should be tested earlier.
On closer inspection, whining in restore_toc_entries_parallel is really
much too late for any user-facing error case. The right place to do it
is at the start of RestoreArchive(), before we've done anything interesting
(suh as trying to DROP all the targets ...)
Back-patch to 8.4, where parallel restore was introduced.
-rw-r--r-- | src/bin/pg_dump/pg_backup_archiver.c | 38 |
1 files changed, 23 insertions, 15 deletions
diff --git a/src/bin/pg_dump/pg_backup_archiver.c b/src/bin/pg_dump/pg_backup_archiver.c index e091d87a529..62206ecda4d 100644 --- a/src/bin/pg_dump/pg_backup_archiver.c +++ b/src/bin/pg_dump/pg_backup_archiver.c @@ -213,6 +213,7 @@ void RestoreArchive(Archive *AHX, RestoreOptions *ropt) { ArchiveHandle *AH = (ArchiveHandle *) AHX; + bool parallel_mode; TocEntry *te; teReqs reqs; OutputContext sav; @@ -239,6 +240,27 @@ RestoreArchive(Archive *AHX, RestoreOptions *ropt) die_horribly(AH, modulename, "-C and -1 are incompatible options\n"); /* + * If we're going to do parallel restore, there are some restrictions. + */ + parallel_mode = (ropt->number_of_jobs > 1 && ropt->useDB); + if (parallel_mode) + { + /* We haven't got round to making this work for all archive formats */ + if (AH->ClonePtr == NULL || AH->ReopenPtr == NULL) + die_horribly(AH, modulename, "parallel restore is not supported with this archive file format\n"); + + /* Doesn't work if the archive represents dependencies as OIDs */ + if (AH->version < K_VERS_1_8) + die_horribly(AH, modulename, "parallel restore is not supported with archives made by pre-8.0 pg_dump\n"); + + /* + * It's also not gonna work if we can't reopen the input file, so + * let's try that immediately. + */ + (AH->ReopenPtr) (AH); + } + + /* * Make sure we won't need (de)compression we haven't got */ #ifndef HAVE_LIBZ @@ -385,7 +407,7 @@ RestoreArchive(Archive *AHX, RestoreOptions *ropt) * * In parallel mode, turn control over to the parallel-restore logic. */ - if (ropt->number_of_jobs > 1 && ropt->useDB) + if (parallel_mode) restore_toc_entries_parallel(AH); else { @@ -3257,20 +3279,6 @@ restore_toc_entries_parallel(ArchiveHandle *AH) ahlog(AH, 2, "entering restore_toc_entries_parallel\n"); - /* we haven't got round to making this work for all archive formats */ - if (AH->ClonePtr == NULL || AH->ReopenPtr == NULL) - die_horribly(AH, modulename, "parallel restore is not supported with this archive file format\n"); - - /* doesn't work if the archive represents dependencies as OIDs, either */ - if (AH->version < K_VERS_1_8) - die_horribly(AH, modulename, "parallel restore is not supported with archives made by pre-8.0 pg_dump\n"); - - /* - * It's also not gonna work if we can't reopen the input file, so let's - * try that immediately. - */ - (AH->ReopenPtr) (AH); - slots = (ParallelSlot *) calloc(sizeof(ParallelSlot), n_slots); /* Adjust dependency information */ |