]> granicus.if.org Git - postgresql/commitdiff
pg_restore: Don't allow non-positive number of jobs
authorStephen Frost <sfrost@snowman.net>
Wed, 11 Jan 2017 20:45:53 +0000 (15:45 -0500)
committerStephen Frost <sfrost@snowman.net>
Wed, 11 Jan 2017 20:45:53 +0000 (15:45 -0500)
pg_restore will currently accept invalid values for the number of
parallel jobs to run (eg: -1), unlike pg_dump which does check that the
value provided is reasonable.

Worse, '-1' is actually a valid, independent, parameter (as an alias for
--single-transaction), leading to potentially completely unexpected
results from a command line such as:

  -> pg_restore -j -1

Where a user would get neither parallel jobs nor a single-transaction.

Add in validity checking of the parallel jobs option, as we already have
in pg_dump, before we try to open up the archive.  Also move the check
that we haven't been asked to run more parallel jobs than possible on
Windows to the same place, so we do all the option validity checking
before opening the archive.

Back-patch all the way, though for 9.2 we're adding the Windows-specific
check against MAXIMUM_WAIT_OBJECTS as that check wasn't back-patched
originally.

Discussion: https://www.postgresql.org/message-id/20170110044815.GC18360%40tamriel.snowman.net

src/bin/pg_dump/pg_restore.c

index fb08e6bb8ef1eb53906ab7e3b9866f833ee2e9bb..41137a1b7d046467dfef5f284a7bb15ceb76846d 100644 (file)
@@ -325,6 +325,22 @@ main(int argc, char **argv)
                exit_nicely(1);
        }
 
+       if (numWorkers <= 0)
+       {
+               fprintf(stderr, _("%s: invalid number of parallel jobs\n"), progname);
+               exit(1);
+       }
+
+       /* See comments in pg_dump.c */
+#ifdef WIN32
+       if (numWorkers > MAXIMUM_WAIT_OBJECTS)
+       {
+               fprintf(stderr, _("%s: maximum number of parallel jobs is %d\n"),
+                               progname, MAXIMUM_WAIT_OBJECTS);
+               exit(1);
+       }
+#endif
+
        /* Can't do single-txn mode with multiple connections */
        if (opts->single_txn && numWorkers > 1)
        {
@@ -397,16 +413,6 @@ main(int argc, char **argv)
        if (opts->tocFile)
                SortTocFromFile(AH);
 
-       /* See comments in pg_dump.c */
-#ifdef WIN32
-       if (numWorkers > MAXIMUM_WAIT_OBJECTS)
-       {
-               fprintf(stderr, _("%s: maximum number of parallel jobs is %d\n"),
-                               progname, MAXIMUM_WAIT_OBJECTS);
-               exit(1);
-       }
-#endif
-
        AH->numWorkers = numWorkers;
 
        if (opts->tocSummary)