aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2011-08-28 22:27:48 -0400
committerTom Lane <tgl@sss.pgh.pa.us>2011-08-28 22:28:21 -0400
commitce530adf8e3a483e48a8d98ebe421b6963aa639c (patch)
treef69be39263cb63cb9b670c9ed5981f8cd883f80a /src
parent2719a7478db67d5ec081daa76691892ced04077f (diff)
downloadpostgresql-ce530adf8e3a483e48a8d98ebe421b6963aa639c.tar.gz
postgresql-ce530adf8e3a483e48a8d98ebe421b6963aa639c.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.
Diffstat (limited to 'src')
-rw-r--r--src/bin/pg_dump/pg_backup_archiver.c38
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 31915ae94c1..19c2e6b86b8 100644
--- a/src/bin/pg_dump/pg_backup_archiver.c
+++ b/src/bin/pg_dump/pg_backup_archiver.c
@@ -194,6 +194,7 @@ void
RestoreArchive(Archive *AHX, RestoreOptions *ropt)
{
ArchiveHandle *AH = (ArchiveHandle *) AHX;
+ bool parallel_mode;
TocEntry *te;
teReqs reqs;
OutputContext sav;
@@ -220,6 +221,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
@@ -357,7 +379,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
{
@@ -3117,20 +3139,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 */