mirror of
				https://github.com/postgres/postgres.git
				synced 2025-10-31 00:03:57 -04:00 
			
		
		
		
	Ensure write failure reports no-disk-space
A few places calling fwrite and gzwrite were not setting errno to ENOSPC when reporting errors, as is customary; this led to some failures being reported as "could not write file: Success" which makes us look silly. Make a few of these places in pg_dump and pg_basebackup use our customary pattern. Backpatch-to: 9.5 Author: Justin Pryzby <pryzby@telsasoft.com> Author: Tom Lane <tgl@sss.pgh.pa.us> Author: Álvaro Herrera <alvherre@alvh.no-ip.org> Discussion: https://postgr.es/m/20200611153753.GU14879@telsasoft.com
This commit is contained in:
		
							parent
							
								
									2c8ef9363d
								
							
						
					
					
						commit
						ae3259c550
					
				| @ -992,8 +992,12 @@ writeTarData(WriteTarState *state, char *buf, int r) | ||||
| #ifdef HAVE_LIBZ | ||||
| 	if (state->ztarfile != NULL) | ||||
| 	{ | ||||
| 		errno = 0; | ||||
| 		if (gzwrite(state->ztarfile, buf, r) != r) | ||||
| 		{ | ||||
| 			/* if write didn't set errno, assume problem is no disk space */ | ||||
| 			if (errno == 0) | ||||
| 				errno = ENOSPC; | ||||
| 			pg_log_error("could not write to compressed file \"%s\": %s", | ||||
| 						 state->filename, get_gz_error(state->ztarfile)); | ||||
| 			exit(1); | ||||
| @ -1002,8 +1006,12 @@ writeTarData(WriteTarState *state, char *buf, int r) | ||||
| 	else | ||||
| #endif | ||||
| 	{ | ||||
| 		errno = 0; | ||||
| 		if (fwrite(buf, r, 1, state->tarfile) != 1) | ||||
| 		{ | ||||
| 			/* if write didn't set errno, assume problem is no disk space */ | ||||
| 			if (errno == 0) | ||||
| 				errno = ENOSPC; | ||||
| 			pg_log_error("could not write to file \"%s\": %m", | ||||
| 						 state->filename); | ||||
| 			exit(1); | ||||
| @ -1691,8 +1699,12 @@ ReceiveTarAndUnpackCopyChunk(size_t r, char *copybuf, void *callback_data) | ||||
| 			return; | ||||
| 		} | ||||
| 
 | ||||
| 		errno = 0; | ||||
| 		if (fwrite(copybuf, r, 1, state->file) != 1) | ||||
| 		{ | ||||
| 			/* if write didn't set errno, assume problem is no disk space */ | ||||
| 			if (errno == 0) | ||||
| 				errno = ENOSPC; | ||||
| 			pg_log_error("could not write to file \"%s\": %m", state->filename); | ||||
| 			exit(1); | ||||
| 		} | ||||
| @ -1743,8 +1755,12 @@ ReceiveBackupManifestChunk(size_t r, char *copybuf, void *callback_data) | ||||
| { | ||||
| 	WriteManifestState *state = callback_data; | ||||
| 
 | ||||
| 	errno = 0; | ||||
| 	if (fwrite(copybuf, r, 1, state->file) != 1) | ||||
| 	{ | ||||
| 		/* if write didn't set errno, assume problem is no disk space */ | ||||
| 		if (errno == 0) | ||||
| 			errno = ENOSPC; | ||||
| 		pg_log_error("could not write to file \"%s\": %m", state->filename); | ||||
| 		exit(1); | ||||
| 	} | ||||
|  | ||||
| @ -346,9 +346,15 @@ _WriteData(ArchiveHandle *AH, const void *data, size_t dLen) | ||||
| { | ||||
| 	lclContext *ctx = (lclContext *) AH->formatData; | ||||
| 
 | ||||
| 	errno = 0; | ||||
| 	if (dLen > 0 && cfwrite(data, dLen, ctx->dataFH) != dLen) | ||||
| 	{ | ||||
| 		/* if write didn't set errno, assume problem is no disk space */ | ||||
| 		if (errno == 0) | ||||
| 			errno = ENOSPC; | ||||
| 		fatal("could not write to output file: %s", | ||||
| 			  get_cfp_error(ctx->dataFH)); | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| /*
 | ||||
| @ -481,9 +487,15 @@ _WriteByte(ArchiveHandle *AH, const int i) | ||||
| 	unsigned char c = (unsigned char) i; | ||||
| 	lclContext *ctx = (lclContext *) AH->formatData; | ||||
| 
 | ||||
| 	errno = 0; | ||||
| 	if (cfwrite(&c, 1, ctx->dataFH) != 1) | ||||
| 	{ | ||||
| 		/* if write didn't set errno, assume problem is no disk space */ | ||||
| 		if (errno == 0) | ||||
| 			errno = ENOSPC; | ||||
| 		fatal("could not write to output file: %s", | ||||
| 			  get_cfp_error(ctx->dataFH)); | ||||
| 	} | ||||
| 
 | ||||
| 	return 1; | ||||
| } | ||||
| @ -511,9 +523,15 @@ _WriteBuf(ArchiveHandle *AH, const void *buf, size_t len) | ||||
| { | ||||
| 	lclContext *ctx = (lclContext *) AH->formatData; | ||||
| 
 | ||||
| 	errno = 0; | ||||
| 	if (cfwrite(buf, len, ctx->dataFH) != len) | ||||
| 	{ | ||||
| 		/* if write didn't set errno, assume problem is no disk space */ | ||||
| 		if (errno == 0) | ||||
| 			errno = ENOSPC; | ||||
| 		fatal("could not write to output file: %s", | ||||
| 			  get_cfp_error(ctx->dataFH)); | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| /*
 | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user