Skip to content

Commit 1f75cdd

Browse files
committed
Ensure that kernel error code is included in smgr-level error reports.
Tweak mdcreate a little bit so that it returns the right errno.
1 parent 81b30f2 commit 1f75cdd

File tree

2 files changed

+36
-26
lines changed

2 files changed

+36
-26
lines changed

src/backend/storage/smgr/md.c

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
*
99
*
1010
* IDENTIFICATION
11-
* $Header: /cvsroot/pgsql/src/backend/storage/smgr/md.c,v 1.70 2000/06/02 15:57:26 momjian Exp $
11+
* $Header: /cvsroot/pgsql/src/backend/storage/smgr/md.c,v 1.71 2000/06/19 23:37:08 tgl Exp $
1212
*
1313
*-------------------------------------------------------------------------
1414
*/
@@ -130,34 +130,41 @@ mdcreate(Relation reln)
130130
char *path;
131131

132132
Assert(reln->rd_unlinked && reln->rd_fd < 0);
133+
133134
path = relpath(RelationGetPhysicalRelationName(reln));
134135
fd = FileNameOpenFile(path, O_RDWR | O_CREAT | O_EXCL | PG_BINARY, 0600);
135136

136137
/*
137-
* During bootstrap processing, we skip that check, because pg_time,
138-
* pg_variable, and pg_log get created before their .bki file entries
139-
* are processed.
140-
*
141-
* For cataloged relations,pg_class is guaranteed to have an unique
138+
* For cataloged relations, pg_class is guaranteed to have a unique
142139
* record with the same relname by the unique index. So we are able to
143-
* reuse existent files for new catloged relations. Currently we reuse
140+
* reuse existent files for new cataloged relations. Currently we reuse
144141
* them in the following cases. 1. they are empty. 2. they are used
145142
* for Index relations and their size == BLCKSZ * 2.
143+
*
144+
* During bootstrap processing, we skip that check, because pg_time,
145+
* pg_variable, and pg_log get created before their .bki file entries
146+
* are processed.
146147
*/
147148

148149
if (fd < 0)
149150
{
151+
int save_errno = errno;
152+
150153
if (!IsBootstrapProcessingMode() &&
151154
reln->rd_rel->relkind == RELKIND_UNCATALOGED)
152155
return -1;
153156

154157
fd = FileNameOpenFile(path, O_RDWR | PG_BINARY, 0600);
155158
if (fd < 0)
159+
{
160+
/* be sure to return the error reported by create, not open */
161+
errno = save_errno;
156162
return -1;
163+
}
157164
if (!IsBootstrapProcessingMode())
158165
{
159166
bool reuse = false;
160-
int len = FileSeek(fd, 0L, SEEK_END);
167+
long len = FileSeek(fd, 0L, SEEK_END);
161168

162169
if (len == 0)
163170
reuse = true;
@@ -167,9 +174,12 @@ mdcreate(Relation reln)
167174
if (!reuse)
168175
{
169176
FileClose(fd);
177+
/* be sure to return the error reported by create */
178+
errno = save_errno;
170179
return -1;
171180
}
172181
}
182+
errno = 0;
173183
}
174184
reln->rd_unlinked = false;
175185

src/backend/storage/smgr/smgr.c

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
*
1212
*
1313
* IDENTIFICATION
14-
* $Header: /cvsroot/pgsql/src/backend/storage/smgr/smgr.c,v 1.36 2000/06/05 07:28:47 tgl Exp $
14+
* $Header: /cvsroot/pgsql/src/backend/storage/smgr/smgr.c,v 1.37 2000/06/19 23:37:08 tgl Exp $
1515
*
1616
*-------------------------------------------------------------------------
1717
*/
@@ -105,7 +105,7 @@ smgrinit()
105105
if (smgrsw[i].smgr_init)
106106
{
107107
if ((*(smgrsw[i].smgr_init)) () == SM_FAIL)
108-
elog(FATAL, "initialization failed on %s",
108+
elog(FATAL, "initialization failed on %s: %m",
109109
DatumGetCString(DirectFunctionCall1(smgrout,
110110
Int16GetDatum(i))));
111111
}
@@ -127,7 +127,7 @@ smgrshutdown(int dummy)
127127
if (smgrsw[i].smgr_shutdown)
128128
{
129129
if ((*(smgrsw[i].smgr_shutdown)) () == SM_FAIL)
130-
elog(FATAL, "shutdown failed on %s",
130+
elog(FATAL, "shutdown failed on %s: %m",
131131
DatumGetCString(DirectFunctionCall1(smgrout,
132132
Int16GetDatum(i))));
133133
}
@@ -146,7 +146,7 @@ smgrcreate(int16 which, Relation reln)
146146
int fd;
147147

148148
if ((fd = (*(smgrsw[which].smgr_create)) (reln)) < 0)
149-
elog(ERROR, "cannot create %s", RelationGetRelationName(reln));
149+
elog(ERROR, "cannot create %s: %m", RelationGetRelationName(reln));
150150

151151
return fd;
152152
}
@@ -162,7 +162,7 @@ smgrunlink(int16 which, Relation reln)
162162
int status;
163163

164164
if ((status = (*(smgrsw[which].smgr_unlink)) (reln)) == SM_FAIL)
165-
elog(ERROR, "cannot unlink %s", RelationGetRelationName(reln));
165+
elog(ERROR, "cannot unlink %s: %m", RelationGetRelationName(reln));
166166

167167
return status;
168168
}
@@ -181,7 +181,7 @@ smgrextend(int16 which, Relation reln, char *buffer)
181181
status = (*(smgrsw[which].smgr_extend)) (reln, buffer);
182182

183183
if (status == SM_FAIL)
184-
elog(ERROR, "%s: cannot extend. Check free disk space.",
184+
elog(ERROR, "cannot extend %s: %m.\n\tCheck free disk space.",
185185
RelationGetRelationName(reln));
186186

187187
return status;
@@ -200,7 +200,7 @@ smgropen(int16 which, Relation reln)
200200

201201
if ((fd = (*(smgrsw[which].smgr_open)) (reln)) < 0 &&
202202
!reln->rd_unlinked)
203-
elog(ERROR, "cannot open %s", RelationGetRelationName(reln));
203+
elog(ERROR, "cannot open %s: %m", RelationGetRelationName(reln));
204204

205205
return fd;
206206
}
@@ -220,7 +220,7 @@ int
220220
smgrclose(int16 which, Relation reln)
221221
{
222222
if ((*(smgrsw[which].smgr_close)) (reln) == SM_FAIL)
223-
elog(ERROR, "cannot close %s", RelationGetRelationName(reln));
223+
elog(ERROR, "cannot close %s: %m", RelationGetRelationName(reln));
224224

225225
return SM_SUCCESS;
226226
}
@@ -243,7 +243,7 @@ smgrread(int16 which, Relation reln, BlockNumber blocknum, char *buffer)
243243
status = (*(smgrsw[which].smgr_read)) (reln, blocknum, buffer);
244244

245245
if (status == SM_FAIL)
246-
elog(ERROR, "cannot read block %d of %s",
246+
elog(ERROR, "cannot read block %d of %s: %m",
247247
blocknum, RelationGetRelationName(reln));
248248

249249
return status;
@@ -265,7 +265,7 @@ smgrwrite(int16 which, Relation reln, BlockNumber blocknum, char *buffer)
265265
status = (*(smgrsw[which].smgr_write)) (reln, blocknum, buffer);
266266

267267
if (status == SM_FAIL)
268-
elog(ERROR, "cannot write block %d of %s",
268+
elog(ERROR, "cannot write block %d of %s: %m",
269269
blocknum, RelationGetRelationName(reln));
270270

271271
return status;
@@ -282,7 +282,7 @@ smgrflush(int16 which, Relation reln, BlockNumber blocknum, char *buffer)
282282
status = (*(smgrsw[which].smgr_flush)) (reln, blocknum, buffer);
283283

284284
if (status == SM_FAIL)
285-
elog(ERROR, "cannot flush block %d of %s to stable store",
285+
elog(ERROR, "cannot flush block %d of %s to stable store: %m",
286286
blocknum, RelationGetRelationName(reln));
287287

288288
return status;
@@ -323,7 +323,7 @@ smgrblindwrt(int16 which,
323323
blkno, buffer, dofsync);
324324

325325
if (status == SM_FAIL)
326-
elog(ERROR, "cannot write block %d of %s [%s] blind",
326+
elog(ERROR, "cannot write block %d of %s [%s] blind: %m",
327327
blkno, relstr, dbstr);
328328

329329
pfree(dbstr);
@@ -352,7 +352,7 @@ smgrmarkdirty(int16 which,
352352
status = (*(smgrsw[which].smgr_markdirty)) (reln, blkno);
353353

354354
if (status == SM_FAIL)
355-
elog(ERROR, "cannot mark block %d of %s",
355+
elog(ERROR, "cannot mark block %d of %s: %m",
356356
blkno, RelationGetRelationName(reln));
357357

358358
return status;
@@ -384,7 +384,7 @@ smgrblindmarkdirty(int16 which,
384384
blkno);
385385

386386
if (status == SM_FAIL)
387-
elog(ERROR, "cannot mark block %d of %s [%s] blind",
387+
elog(ERROR, "cannot mark block %d of %s [%s] blind: %m",
388388
blkno, relstr, dbstr);
389389

390390
pfree(dbstr);
@@ -406,7 +406,7 @@ smgrnblocks(int16 which, Relation reln)
406406
int nblocks;
407407

408408
if ((nblocks = (*(smgrsw[which].smgr_nblocks)) (reln)) < 0)
409-
elog(ERROR, "cannot count blocks for %s",
409+
elog(ERROR, "cannot count blocks for %s: %m",
410410
RelationGetRelationName(reln));
411411

412412
return nblocks;
@@ -428,7 +428,7 @@ smgrtruncate(int16 which, Relation reln, int nblocks)
428428
if (smgrsw[which].smgr_truncate)
429429
{
430430
if ((newblks = (*(smgrsw[which].smgr_truncate)) (reln, nblocks)) < 0)
431-
elog(ERROR, "cannot truncate %s to %d blocks",
431+
elog(ERROR, "cannot truncate %s to %d blocks: %m",
432432
RelationGetRelationName(reln), nblocks);
433433
}
434434

@@ -449,7 +449,7 @@ smgrcommit()
449449
if (smgrsw[i].smgr_commit)
450450
{
451451
if ((*(smgrsw[i].smgr_commit)) () == SM_FAIL)
452-
elog(FATAL, "transaction commit failed on %s",
452+
elog(FATAL, "transaction commit failed on %s: %m",
453453
DatumGetCString(DirectFunctionCall1(smgrout,
454454
Int16GetDatum(i))));
455455
}
@@ -468,7 +468,7 @@ smgrabort()
468468
if (smgrsw[i].smgr_abort)
469469
{
470470
if ((*(smgrsw[i].smgr_abort)) () == SM_FAIL)
471-
elog(FATAL, "transaction abort failed on %s",
471+
elog(FATAL, "transaction abort failed on %s: %m",
472472
DatumGetCString(DirectFunctionCall1(smgrout,
473473
Int16GetDatum(i))));
474474
}

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy