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:28:10 -0400 | 
| commit | 2de0fdeb68d7176df35a880c9180bd9e2d9eca4c (patch) | |
| tree | 002c728f3112cae4d4435510ce168c2ff7749fd7 | |
| parent | fbf776a2eb5a7dcca218458cb2139b97918382d5 (diff) | |
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 d4b414fbcfe..791251313ad 100644 --- a/src/bin/pg_dump/pg_backup_archiver.c +++ b/src/bin/pg_dump/pg_backup_archiver.c @@ -204,6 +204,7 @@ void  RestoreArchive(Archive *AHX, RestoreOptions *ropt)  {  	ArchiveHandle *AH = (ArchiveHandle *) AHX; +	bool		parallel_mode;  	TocEntry   *te;  	teReqs		reqs;  	OutputContext sav; @@ -230,6 +231,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 @@ -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 */ | 
