Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Actually, all of parallel restore's limitations should be tested earlier.
authorTom Lane <tgl@sss.pgh.pa.us>
Mon, 29 Aug 2011 02:27:48 +0000 (22:27 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
Mon, 29 Aug 2011 02:28:10 +0000 (22:28 -0400)
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.

src/bin/pg_dump/pg_backup_archiver.c

index d4b414fbcfe6f545c6fb3390ed827fb906c5d4a7..791251313ada34d6691642c37c3ee8ba11afe24c 100644 (file)
@@ -204,6 +204,7 @@ void
 RestoreArchive(Archive *AHX, RestoreOptions *ropt)
 {
    ArchiveHandle *AH = (ArchiveHandle *) AHX;
+   bool        parallel_mode;
    TocEntry   *te;
    teReqs      reqs;
    OutputContext sav;
@@ -229,6 +230,27 @@ RestoreArchive(Archive *AHX, RestoreOptions *ropt)
    if (ropt->createDB && ropt->single_txn)
        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
     */
@@ -375,7 +397,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
    {
@@ -3192,20 +3214,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 */