*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/storage/smgr/md.c,v 1.70 2000/06/02 15:57:26 momjian Exp $
+ * $Header: /cvsroot/pgsql/src/backend/storage/smgr/md.c,v 1.71 2000/06/19 23:37:08 tgl Exp $
*
*-------------------------------------------------------------------------
*/
char *path;
Assert(reln->rd_unlinked && reln->rd_fd < 0);
+
path = relpath(RelationGetPhysicalRelationName(reln));
fd = FileNameOpenFile(path, O_RDWR | O_CREAT | O_EXCL | PG_BINARY, 0600);
/*
- * During bootstrap processing, we skip that check, because pg_time,
- * pg_variable, and pg_log get created before their .bki file entries
- * are processed.
- *
- * For cataloged relations,pg_class is guaranteed to have an unique
+ * For cataloged relations, pg_class is guaranteed to have a unique
* record with the same relname by the unique index. So we are able to
- * reuse existent files for new catloged relations. Currently we reuse
+ * reuse existent files for new cataloged relations. Currently we reuse
* them in the following cases. 1. they are empty. 2. they are used
* for Index relations and their size == BLCKSZ * 2.
+ *
+ * During bootstrap processing, we skip that check, because pg_time,
+ * pg_variable, and pg_log get created before their .bki file entries
+ * are processed.
*/
if (fd < 0)
{
+ int save_errno = errno;
+
if (!IsBootstrapProcessingMode() &&
reln->rd_rel->relkind == RELKIND_UNCATALOGED)
return -1;
fd = FileNameOpenFile(path, O_RDWR | PG_BINARY, 0600);
if (fd < 0)
+ {
+ /* be sure to return the error reported by create, not open */
+ errno = save_errno;
return -1;
+ }
if (!IsBootstrapProcessingMode())
{
bool reuse = false;
- int len = FileSeek(fd, 0L, SEEK_END);
+ long len = FileSeek(fd, 0L, SEEK_END);
if (len == 0)
reuse = true;
if (!reuse)
{
FileClose(fd);
+ /* be sure to return the error reported by create */
+ errno = save_errno;
return -1;
}
}
+ errno = 0;
}
reln->rd_unlinked = false;
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/storage/smgr/smgr.c,v 1.36 2000/06/05 07:28:47 tgl Exp $
+ * $Header: /cvsroot/pgsql/src/backend/storage/smgr/smgr.c,v 1.37 2000/06/19 23:37:08 tgl Exp $
*
*-------------------------------------------------------------------------
*/
if (smgrsw[i].smgr_init)
{
if ((*(smgrsw[i].smgr_init)) () == SM_FAIL)
- elog(FATAL, "initialization failed on %s",
+ elog(FATAL, "initialization failed on %s: %m",
DatumGetCString(DirectFunctionCall1(smgrout,
Int16GetDatum(i))));
}
if (smgrsw[i].smgr_shutdown)
{
if ((*(smgrsw[i].smgr_shutdown)) () == SM_FAIL)
- elog(FATAL, "shutdown failed on %s",
+ elog(FATAL, "shutdown failed on %s: %m",
DatumGetCString(DirectFunctionCall1(smgrout,
Int16GetDatum(i))));
}
int fd;
if ((fd = (*(smgrsw[which].smgr_create)) (reln)) < 0)
- elog(ERROR, "cannot create %s", RelationGetRelationName(reln));
+ elog(ERROR, "cannot create %s: %m", RelationGetRelationName(reln));
return fd;
}
int status;
if ((status = (*(smgrsw[which].smgr_unlink)) (reln)) == SM_FAIL)
- elog(ERROR, "cannot unlink %s", RelationGetRelationName(reln));
+ elog(ERROR, "cannot unlink %s: %m", RelationGetRelationName(reln));
return status;
}
status = (*(smgrsw[which].smgr_extend)) (reln, buffer);
if (status == SM_FAIL)
- elog(ERROR, "%s: cannot extend. Check free disk space.",
+ elog(ERROR, "cannot extend %s: %m.\n\tCheck free disk space.",
RelationGetRelationName(reln));
return status;
if ((fd = (*(smgrsw[which].smgr_open)) (reln)) < 0 &&
!reln->rd_unlinked)
- elog(ERROR, "cannot open %s", RelationGetRelationName(reln));
+ elog(ERROR, "cannot open %s: %m", RelationGetRelationName(reln));
return fd;
}
smgrclose(int16 which, Relation reln)
{
if ((*(smgrsw[which].smgr_close)) (reln) == SM_FAIL)
- elog(ERROR, "cannot close %s", RelationGetRelationName(reln));
+ elog(ERROR, "cannot close %s: %m", RelationGetRelationName(reln));
return SM_SUCCESS;
}
status = (*(smgrsw[which].smgr_read)) (reln, blocknum, buffer);
if (status == SM_FAIL)
- elog(ERROR, "cannot read block %d of %s",
+ elog(ERROR, "cannot read block %d of %s: %m",
blocknum, RelationGetRelationName(reln));
return status;
status = (*(smgrsw[which].smgr_write)) (reln, blocknum, buffer);
if (status == SM_FAIL)
- elog(ERROR, "cannot write block %d of %s",
+ elog(ERROR, "cannot write block %d of %s: %m",
blocknum, RelationGetRelationName(reln));
return status;
status = (*(smgrsw[which].smgr_flush)) (reln, blocknum, buffer);
if (status == SM_FAIL)
- elog(ERROR, "cannot flush block %d of %s to stable store",
+ elog(ERROR, "cannot flush block %d of %s to stable store: %m",
blocknum, RelationGetRelationName(reln));
return status;
blkno, buffer, dofsync);
if (status == SM_FAIL)
- elog(ERROR, "cannot write block %d of %s [%s] blind",
+ elog(ERROR, "cannot write block %d of %s [%s] blind: %m",
blkno, relstr, dbstr);
pfree(dbstr);
status = (*(smgrsw[which].smgr_markdirty)) (reln, blkno);
if (status == SM_FAIL)
- elog(ERROR, "cannot mark block %d of %s",
+ elog(ERROR, "cannot mark block %d of %s: %m",
blkno, RelationGetRelationName(reln));
return status;
blkno);
if (status == SM_FAIL)
- elog(ERROR, "cannot mark block %d of %s [%s] blind",
+ elog(ERROR, "cannot mark block %d of %s [%s] blind: %m",
blkno, relstr, dbstr);
pfree(dbstr);
int nblocks;
if ((nblocks = (*(smgrsw[which].smgr_nblocks)) (reln)) < 0)
- elog(ERROR, "cannot count blocks for %s",
+ elog(ERROR, "cannot count blocks for %s: %m",
RelationGetRelationName(reln));
return nblocks;
if (smgrsw[which].smgr_truncate)
{
if ((newblks = (*(smgrsw[which].smgr_truncate)) (reln, nblocks)) < 0)
- elog(ERROR, "cannot truncate %s to %d blocks",
+ elog(ERROR, "cannot truncate %s to %d blocks: %m",
RelationGetRelationName(reln), nblocks);
}
if (smgrsw[i].smgr_commit)
{
if ((*(smgrsw[i].smgr_commit)) () == SM_FAIL)
- elog(FATAL, "transaction commit failed on %s",
+ elog(FATAL, "transaction commit failed on %s: %m",
DatumGetCString(DirectFunctionCall1(smgrout,
Int16GetDatum(i))));
}
if (smgrsw[i].smgr_abort)
{
if ((*(smgrsw[i].smgr_abort)) () == SM_FAIL)
- elog(FATAL, "transaction abort failed on %s",
+ elog(FATAL, "transaction abort failed on %s: %m",
DatumGetCString(DirectFunctionCall1(smgrout,
Int16GetDatum(i))));
}