mirror of
https://github.com/postgres/postgres.git
synced 2025-04-24 10:47:04 +03:00
Use posix_fadvise() to avoid kernel caching of WAL contents on WAL file
close. ITAGAKI Takahiro
This commit is contained in:
parent
a584c12426
commit
94a5c4a01b
@ -7,7 +7,7 @@
|
|||||||
* Portions Copyright (c) 1996-2006, PostgreSQL Global Development Group
|
* Portions Copyright (c) 1996-2006, PostgreSQL Global Development Group
|
||||||
* Portions Copyright (c) 1994, Regents of the University of California
|
* Portions Copyright (c) 1994, Regents of the University of California
|
||||||
*
|
*
|
||||||
* $PostgreSQL: pgsql/src/backend/access/transam/xlog.c,v 1.237 2006/04/20 04:07:38 tgl Exp $
|
* $PostgreSQL: pgsql/src/backend/access/transam/xlog.c,v 1.238 2006/06/15 19:15:00 momjian Exp $
|
||||||
*
|
*
|
||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
@ -478,6 +478,7 @@ static bool InstallXLogFileSegment(uint32 *log, uint32 *seg, char *tmppath,
|
|||||||
bool use_lock);
|
bool use_lock);
|
||||||
static int XLogFileOpen(uint32 log, uint32 seg);
|
static int XLogFileOpen(uint32 log, uint32 seg);
|
||||||
static int XLogFileRead(uint32 log, uint32 seg, int emode);
|
static int XLogFileRead(uint32 log, uint32 seg, int emode);
|
||||||
|
static void XLogFileClose(void);
|
||||||
static bool RestoreArchivedFile(char *path, const char *xlogfname,
|
static bool RestoreArchivedFile(char *path, const char *xlogfname,
|
||||||
const char *recovername, off_t expectedSize);
|
const char *recovername, off_t expectedSize);
|
||||||
static int PreallocXlogFiles(XLogRecPtr endptr);
|
static int PreallocXlogFiles(XLogRecPtr endptr);
|
||||||
@ -1384,14 +1385,7 @@ XLogWrite(XLogwrtRqst WriteRqst, bool flexible)
|
|||||||
*/
|
*/
|
||||||
Assert(npages == 0);
|
Assert(npages == 0);
|
||||||
if (openLogFile >= 0)
|
if (openLogFile >= 0)
|
||||||
{
|
XLogFileClose();
|
||||||
if (close(openLogFile))
|
|
||||||
ereport(PANIC,
|
|
||||||
(errcode_for_file_access(),
|
|
||||||
errmsg("could not close log file %u, segment %u: %m",
|
|
||||||
openLogId, openLogSeg)));
|
|
||||||
openLogFile = -1;
|
|
||||||
}
|
|
||||||
XLByteToPrevSeg(LogwrtResult.Write, openLogId, openLogSeg);
|
XLByteToPrevSeg(LogwrtResult.Write, openLogId, openLogSeg);
|
||||||
|
|
||||||
/* create/use new log file */
|
/* create/use new log file */
|
||||||
@ -1567,14 +1561,7 @@ XLogWrite(XLogwrtRqst WriteRqst, bool flexible)
|
|||||||
{
|
{
|
||||||
if (openLogFile >= 0 &&
|
if (openLogFile >= 0 &&
|
||||||
!XLByteInPrevSeg(LogwrtResult.Write, openLogId, openLogSeg))
|
!XLByteInPrevSeg(LogwrtResult.Write, openLogId, openLogSeg))
|
||||||
{
|
XLogFileClose();
|
||||||
if (close(openLogFile))
|
|
||||||
ereport(PANIC,
|
|
||||||
(errcode_for_file_access(),
|
|
||||||
errmsg("could not close log file %u, segment %u: %m",
|
|
||||||
openLogId, openLogSeg)));
|
|
||||||
openLogFile = -1;
|
|
||||||
}
|
|
||||||
if (openLogFile < 0)
|
if (openLogFile < 0)
|
||||||
{
|
{
|
||||||
XLByteToPrevSeg(LogwrtResult.Write, openLogId, openLogSeg);
|
XLByteToPrevSeg(LogwrtResult.Write, openLogId, openLogSeg);
|
||||||
@ -2152,6 +2139,34 @@ XLogFileRead(uint32 log, uint32 seg, int emode)
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Close the current logfile segment for writing.
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
XLogFileClose(void)
|
||||||
|
{
|
||||||
|
Assert(openLogFile >= 0);
|
||||||
|
|
||||||
|
#ifdef _POSIX_ADVISORY_INFO
|
||||||
|
/*
|
||||||
|
* WAL caches will not be accessed in the future, so we advise OS to
|
||||||
|
* free them. But we will not do so if WAL archiving is active,
|
||||||
|
* because archivers might use the caches to read the WAL segment.
|
||||||
|
* While O_DIRECT works for O_SYNC, posix_fadvise() works for fsync()
|
||||||
|
* and O_SYNC, and some platforms only have posix_fadvise().
|
||||||
|
*/
|
||||||
|
if (!XLogArchivingActive())
|
||||||
|
posix_fadvise(openLogFile, 0, 0, POSIX_FADV_DONTNEED);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (close(openLogFile))
|
||||||
|
ereport(PANIC,
|
||||||
|
(errcode_for_file_access(),
|
||||||
|
errmsg("could not close log file %u, segment %u: %m",
|
||||||
|
openLogId, openLogSeg)));
|
||||||
|
openLogFile = -1;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Attempt to retrieve the specified file from off-line archival storage.
|
* Attempt to retrieve the specified file from off-line archival storage.
|
||||||
* If successful, fill "path" with its complete path (note that this will be
|
* If successful, fill "path" with its complete path (note that this will be
|
||||||
@ -5609,14 +5624,7 @@ assign_xlog_sync_method(const char *method, bool doit, GucSource source)
|
|||||||
errmsg("could not fsync log file %u, segment %u: %m",
|
errmsg("could not fsync log file %u, segment %u: %m",
|
||||||
openLogId, openLogSeg)));
|
openLogId, openLogSeg)));
|
||||||
if (open_sync_bit != new_sync_bit)
|
if (open_sync_bit != new_sync_bit)
|
||||||
{
|
XLogFileClose();
|
||||||
if (close(openLogFile))
|
|
||||||
ereport(PANIC,
|
|
||||||
(errcode_for_file_access(),
|
|
||||||
errmsg("could not close log file %u, segment %u: %m",
|
|
||||||
openLogId, openLogSeg)));
|
|
||||||
openLogFile = -1;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
sync_method = new_sync_method;
|
sync_method = new_sync_method;
|
||||||
open_sync_bit = new_sync_bit;
|
open_sync_bit = new_sync_bit;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user