aboutsummaryrefslogtreecommitdiff
path: root/src/backend/access/transam
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/access/transam')
-rw-r--r--src/backend/access/transam/twophase.c2
-rw-r--r--src/backend/access/transam/xlog.c31
-rw-r--r--src/backend/access/transam/xlogfuncs.c4
3 files changed, 16 insertions, 21 deletions
diff --git a/src/backend/access/transam/twophase.c b/src/backend/access/transam/twophase.c
index b715152e8d0..321da9f5f67 100644
--- a/src/backend/access/transam/twophase.c
+++ b/src/backend/access/transam/twophase.c
@@ -1735,8 +1735,8 @@ restoreTwoPhaseData(void)
DIR *cldir;
struct dirent *clde;
- cldir = AllocateDir(TWOPHASE_DIR);
LWLockAcquire(TwoPhaseStateLock, LW_EXCLUSIVE);
+ cldir = AllocateDir(TWOPHASE_DIR);
while ((clde = ReadDir(cldir, TWOPHASE_DIR)) != NULL)
{
if (strlen(clde->d_name) == 8 &&
diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c
index fba201f6599..a11406c741c 100644
--- a/src/backend/access/transam/xlog.c
+++ b/src/backend/access/transam/xlog.c
@@ -3764,10 +3764,16 @@ PreallocXlogFiles(XLogRecPtr endptr)
* existed while the server has been running, as this function always
* succeeds if no WAL segments have been removed since startup.
* 'tli' is only used in the error message.
+ *
+ * Note: this function guarantees to keep errno unchanged on return.
+ * This supports callers that use this to possibly deliver a better
+ * error message about a missing file, while still being able to throw
+ * a normal file-access error afterwards, if this does return.
*/
void
CheckXLogRemoved(XLogSegNo segno, TimeLineID tli)
{
+ int save_errno = errno;
XLogSegNo lastRemovedSegNo;
SpinLockAcquire(&XLogCtl->info_lck);
@@ -3779,11 +3785,13 @@ CheckXLogRemoved(XLogSegNo segno, TimeLineID tli)
char filename[MAXFNAMELEN];
XLogFileName(filename, tli, segno, wal_segment_size);
+ errno = save_errno;
ereport(ERROR,
(errcode_for_file_access(),
errmsg("requested WAL segment %s has already been removed",
filename)));
}
+ errno = save_errno;
}
/*
@@ -3837,13 +3845,6 @@ RemoveOldXlogFiles(XLogSegNo segno, XLogRecPtr PriorRedoPtr, XLogRecPtr endptr)
struct dirent *xlde;
char lastoff[MAXFNAMELEN];
- xldir = AllocateDir(XLOGDIR);
- if (xldir == NULL)
- ereport(ERROR,
- (errcode_for_file_access(),
- errmsg("could not open write-ahead log directory \"%s\": %m",
- XLOGDIR)));
-
/*
* Construct a filename of the last segment to be kept. The timeline ID
* doesn't matter, we ignore that in the comparison. (During recovery,
@@ -3854,6 +3855,8 @@ RemoveOldXlogFiles(XLogSegNo segno, XLogRecPtr PriorRedoPtr, XLogRecPtr endptr)
elog(DEBUG2, "attempting to remove WAL segments older than log file %s",
lastoff);
+ xldir = AllocateDir(XLOGDIR);
+
while ((xlde = ReadDir(xldir, XLOGDIR)) != NULL)
{
/* Ignore files that are not XLOG segments */
@@ -3912,13 +3915,6 @@ RemoveNonParentXlogFiles(XLogRecPtr switchpoint, TimeLineID newTLI)
XLByteToPrevSeg(switchpoint, endLogSegNo, wal_segment_size);
- xldir = AllocateDir(XLOGDIR);
- if (xldir == NULL)
- ereport(ERROR,
- (errcode_for_file_access(),
- errmsg("could not open write-ahead log directory \"%s\": %m",
- XLOGDIR)));
-
/*
* Construct a filename of the last segment to be kept.
*/
@@ -3927,6 +3923,8 @@ RemoveNonParentXlogFiles(XLogRecPtr switchpoint, TimeLineID newTLI)
elog(DEBUG2, "attempting to remove WAL segments newer than log file %s",
switchseg);
+ xldir = AllocateDir(XLOGDIR);
+
while ((xlde = ReadDir(xldir, XLOGDIR)) != NULL)
{
/* Ignore files that are not XLOG segments */
@@ -4108,11 +4106,6 @@ CleanupBackupHistory(void)
char path[MAXPGPATH + sizeof(XLOGDIR)];
xldir = AllocateDir(XLOGDIR);
- if (xldir == NULL)
- ereport(ERROR,
- (errcode_for_file_access(),
- errmsg("could not open write-ahead log directory \"%s\": %m",
- XLOGDIR)));
while ((xlde = ReadDir(xldir, XLOGDIR)) != NULL)
{
diff --git a/src/backend/access/transam/xlogfuncs.c b/src/backend/access/transam/xlogfuncs.c
index 443ccd64112..48d85c1ce5d 100644
--- a/src/backend/access/transam/xlogfuncs.c
+++ b/src/backend/access/transam/xlogfuncs.c
@@ -89,7 +89,9 @@ pg_start_backup(PG_FUNCTION_ARGS)
dir = AllocateDir("pg_tblspc");
if (!dir)
ereport(ERROR,
- (errmsg("could not open directory \"%s\": %m", "pg_tblspc")));
+ (errcode_for_file_access(),
+ errmsg("could not open directory \"%s\": %m",
+ "pg_tblspc")));
if (exclusive)
{