Skip to content
Snippets Groups Projects
Commit 60c3ccff authored by Tom Lane's avatar Tom Lane
Browse files

Comment out FileUnlink of excess segments during mdtruncate().

This is unsafe in 6.5 because other backends may be able to access the file
before noticing the shared cache inval message that tells 'em to re-open
the file.  We have fixed this for 6.6 but the changes seem too risky to
back-patch for 6.5.2.
Also, back-patch Tatsuo's change to prevent creation of files during
mdopen().
parent 958e45a8
No related branches found
Tags
No related merge requests found
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/storage/smgr/md.c,v 1.46.2.1 1999/09/02 04:07:16 tgl Exp $ * $Header: /cvsroot/pgsql/src/backend/storage/smgr/md.c,v 1.46.2.2 1999/09/06 20:00:15 tgl Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -284,13 +284,23 @@ mdopen(Relation reln) ...@@ -284,13 +284,23 @@ mdopen(Relation reln)
fd = FileNameOpenFile(path, O_RDWR | O_BINARY, 0600); fd = FileNameOpenFile(path, O_RDWR | O_BINARY, 0600);
#endif #endif
/* this should only happen during bootstrap processing */
if (fd < 0) if (fd < 0)
{
/* in bootstrap mode, accept mdopen as substitute for mdcreate */
if (IsBootstrapProcessingMode())
{
#ifndef __CYGWIN32__ #ifndef __CYGWIN32__
fd = FileNameOpenFile(path, O_RDWR | O_CREAT | O_EXCL, 0600); fd = FileNameOpenFile(path, O_RDWR | O_CREAT | O_EXCL, 0600);
#else #else
fd = FileNameOpenFile(path, O_RDWR | O_CREAT | O_EXCL | O_BINARY, 0600); fd = FileNameOpenFile(path, O_RDWR | O_CREAT | O_EXCL | O_BINARY, 0600);
#endif #endif
}
if (fd < 0)
{
elog(ERROR, "mdopen: couldn't open %s: %m", path);
return -1;
}
}
vfd = _fdvec_alloc(); vfd = _fdvec_alloc();
if (vfd < 0) if (vfd < 0)
...@@ -755,7 +765,16 @@ mdtruncate(Relation reln, int nblocks) ...@@ -755,7 +765,16 @@ mdtruncate(Relation reln, int nblocks)
* a big file... * a big file...
*/ */
FileTruncate(v->mdfd_vfd, 0); FileTruncate(v->mdfd_vfd, 0);
/* In 6.5, it is not safe to unlink apparently-unused segments,
* because another backend could store tuples in one of those
* segments before it notices the shared-cache-invalidation
* message that would warn it to re-open the file. So, don't
* unlink 'em, just truncate 'em. This is fixed properly for 6.6
* but back-patching the changes was judged too risky.
*/
#if 0
FileUnlink(v->mdfd_vfd); FileUnlink(v->mdfd_vfd);
#endif
v = v->mdfd_chain; v = v->mdfd_chain;
Assert(ov != &Md_fdvec[fd]); /* we never drop the 1st segment */ Assert(ov != &Md_fdvec[fd]); /* we never drop the 1st segment */
pfree(ov); pfree(ov);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment