BUG #2727: pg_restore error on BLOB COMMENTS

Started by Konstantin Pelepelinover 19 years ago2 messagesbugs
Jump to latest

The following bug has been logged online:

Bug reference: 2727
Logged by: Konstantin Pelepelin
Email address: cat@dtf.ru
PostgreSQL version: 8.1.5
Operating system: RHEL4
Description: pg_restore error on BLOB COMMENTS
Details:

I think, it is part of bug #2452 (
http://archives.postgresql.org/pgsql-bugs/2006-05/msg00113.php ), it is not
fixed in 8.1.5

$ pg_restore -v -U postgres -d mydb --disable-triggers -S postgres mydb.tar

...
pg_restore: restoring large object OID 70380132
pg_restore: restored 5116 large objects
pg_restore: restoring BLOB COMMENTS
pg_restore: [tar archiver] could not find header for file 2004.dat in tar
archive
pg_restore: *** aborted because of error

$ pg_restore -l mydb.tar |grep 2004
2004; 0 0 BLOB COMMENTS - BLOB COMMENTS

2004.dat exists in archive and consists of single LF

Workaround:
(pg_restore -l $DBFILE | fgrep -v '0 0 BLOB COMMENTS - BLOB COMMENTS'

pg_restore_list.txt)

pg_restore -v -U postgres -d $DB --disable-triggers -S postgres -L
pg_restore_list.txt $DBFILE
rm -f pg_restore_list.txt

#2Tom Lane
tgl@sss.pgh.pa.us
In reply to: Konstantin Pelepelin (#1)
Re: BUG #2727: pg_restore error on BLOB COMMENTS

"Konstantin Pelepelin" <cat@dtf.ru> writes:

pg_restore: restoring large object OID 70380132
pg_restore: restored 5116 large objects
pg_restore: restoring BLOB COMMENTS
pg_restore: [tar archiver] could not find header for file 2004.dat in tar
archive
pg_restore: *** aborted because of error

Hmm ... it looks like blob comments never have worked in tar format,
or not recently anyway. _LoadBlobs() runs off the end of the archive
file and then there's no mechanism for backing up --- not that that
would work anyway if reading from a pipe. I'm thinking of fixing it
like this (against HEAD, but the code hasn't changed much lately):

*** src/bin/pg_dump/pg_backup_tar.c.orig	Tue Oct  3 23:16:46 2006
--- src/bin/pg_dump/pg_backup_tar.c	Tue Oct 31 17:27:54 2006
***************
*** 701,706 ****
--- 701,707 ----
  	lclContext *ctx = (lclContext *) AH->formatData;
  	TAR_MEMBER *th;
  	size_t		cnt;
+ 	bool		foundBlob = false;
  	char		buf[4096];

StartRestoreBlobs(AH);
***************
*** 725,734 ****
ahwrite(buf, 1, cnt, AH);
}
EndRestoreBlob(AH, oid);
}
}
-
- tarClose(AH, th);

  		th = tarOpen(AH, NULL, 'r');
  	}
--- 726,745 ----
  					ahwrite(buf, 1, cnt, AH);
  				}
  				EndRestoreBlob(AH, oid);
+ 				foundBlob = true;
  			}
+ 			tarClose(AH, th);
+ 		}
+ 		else
+ 		{
+ 			tarClose(AH, th);
+ 			/*
+ 			 * Once we have found the first blob, stop at the first
+ 			 * non-blob entry (which will be 'blobs.toc').
+ 			 */
+ 			if (foundBlob)
+ 				break;
  		}

th = tarOpen(AH, NULL, 'r');
}

Thanks for the report!

regards, tom lane