From 1f75cdd5ed4a93d171ff979a7a66ae69dbd0d69f Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Mon, 19 Jun 2000 23:37:08 +0000 Subject: [PATCH] Ensure that kernel error code is included in smgr-level error reports. Tweak mdcreate a little bit so that it returns the right errno. --- src/backend/storage/smgr/md.c | 26 ++++++++++++++++-------- src/backend/storage/smgr/smgr.c | 36 ++++++++++++++++----------------- 2 files changed, 36 insertions(+), 26 deletions(-) diff --git a/src/backend/storage/smgr/md.c b/src/backend/storage/smgr/md.c index 81fe7fd667..19433ae29a 100644 --- a/src/backend/storage/smgr/md.c +++ b/src/backend/storage/smgr/md.c @@ -8,7 +8,7 @@ * * * 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 $ * *------------------------------------------------------------------------- */ @@ -130,34 +130,41 @@ mdcreate(Relation reln) 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; @@ -167,9 +174,12 @@ mdcreate(Relation reln) if (!reuse) { FileClose(fd); + /* be sure to return the error reported by create */ + errno = save_errno; return -1; } } + errno = 0; } reln->rd_unlinked = false; diff --git a/src/backend/storage/smgr/smgr.c b/src/backend/storage/smgr/smgr.c index 419cc8610f..1d0445660f 100644 --- a/src/backend/storage/smgr/smgr.c +++ b/src/backend/storage/smgr/smgr.c @@ -11,7 +11,7 @@ * * * 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 $ * *------------------------------------------------------------------------- */ @@ -105,7 +105,7 @@ smgrinit() 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)))); } @@ -127,7 +127,7 @@ smgrshutdown(int dummy) 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)))); } @@ -146,7 +146,7 @@ smgrcreate(int16 which, Relation reln) 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; } @@ -162,7 +162,7 @@ smgrunlink(int16 which, Relation reln) 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; } @@ -181,7 +181,7 @@ smgrextend(int16 which, Relation reln, char *buffer) 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; @@ -200,7 +200,7 @@ smgropen(int16 which, Relation reln) 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; } @@ -220,7 +220,7 @@ int 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; } @@ -243,7 +243,7 @@ smgrread(int16 which, Relation reln, BlockNumber blocknum, char *buffer) 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; @@ -265,7 +265,7 @@ smgrwrite(int16 which, Relation reln, BlockNumber blocknum, char *buffer) 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; @@ -282,7 +282,7 @@ smgrflush(int16 which, Relation reln, BlockNumber blocknum, char *buffer) 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; @@ -323,7 +323,7 @@ smgrblindwrt(int16 which, 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); @@ -352,7 +352,7 @@ smgrmarkdirty(int16 which, 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; @@ -384,7 +384,7 @@ smgrblindmarkdirty(int16 which, 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); @@ -406,7 +406,7 @@ smgrnblocks(int16 which, Relation reln) 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; @@ -428,7 +428,7 @@ smgrtruncate(int16 which, Relation reln, int 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); } @@ -449,7 +449,7 @@ smgrcommit() 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)))); } @@ -468,7 +468,7 @@ smgrabort() 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)))); } -- GitLab