Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit4b59366

Browse files
committed
1. Checkpoint.undo may be after checkpoint itself:
- no more elog(STOP) in StartupXLOG(); - both checkpoint' undo & redo are used to define oldest on-line log file.2. Ability to pre-allocate a few log files at checkpoint time (wal_files option). Off by default.
1 parent329001a commit4b59366

File tree

2 files changed

+87
-27
lines changed

2 files changed

+87
-27
lines changed

‎src/backend/access/transam/xlog.c

Lines changed: 82 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
* Portions Copyright (c) 1996-2000, PostgreSQL, Inc
77
* Portions Copyright (c) 1994, Regents of the University of California
88
*
9-
* $Header: /cvsroot/pgsql/src/backend/access/transam/xlog.c,v 1.47 2000/12/30 06:52:34 vadim Exp $
9+
* $Header: /cvsroot/pgsql/src/backend/access/transam/xlog.c,v 1.48 2001/01/09 06:24:32 vadim Exp $
1010
*
1111
*-------------------------------------------------------------------------
1212
*/
@@ -40,6 +40,7 @@
4040
#include"miscadmin.h"
4141

4242
intXLOGbuffers=8;
43+
intXLOGfiles=0;/* how many files to pre-allocate */
4344
XLogRecPtrMyLastRecPtr= {0,0};
4445
uint32CritSectionCount=0;
4546
boolInRecovery= false;
@@ -182,6 +183,18 @@ typedef struct BkpBlock
182183
#defineXLogLastSeg(0xffffffff / XLogSegSize)
183184
#defineXLogFileSize(XLogLastSeg * XLogSegSize)
184185

186+
#defineNextLogSeg(_logId,_logSeg)\
187+
{\
188+
if (_logSeg >= XLogLastSeg)\
189+
{\
190+
_logId++;\
191+
_logSeg = 0;\
192+
}\
193+
else\
194+
_logSeg++;\
195+
}
196+
197+
185198
#defineXLogFileName(path,log,seg)\
186199
snprintf(path, MAXPGPATH, "%s%c%08X%08X",\
187200
XLogDir, SEP_CHAR, log, seg)
@@ -856,8 +869,8 @@ XLogWrite(char *buffer)
856869
UpdateControlFile();
857870
SpinRelease(ControlFileLockId);
858871
if (!usexistent)/* there was no file */
859-
elog(LOG,"XLogWrite:had to createnew log file - "
860-
"you probably should do checkpoints more often");
872+
elog(LOG,"XLogWrite: new log file created - "
873+
"try to increase WAL_FILES");
861874
}
862875

863876
if (logFile<0)
@@ -1186,7 +1199,7 @@ ReadRecord(XLogRecPtr *RecPtr, char *buffer)
11861199
tmpRecPtr.xrecoff+=SizeOfXLogPHD;
11871200
}
11881201
elseif (!XRecOffIsValid(RecPtr->xrecoff))
1189-
elog(STOP,"ReadRecord: invalid record offsetin (%u, %u)",
1202+
elog(STOP,"ReadRecord: invalid record offsetat (%u, %u)",
11901203
RecPtr->xlogid,RecPtr->xrecoff);
11911204

11921205
if (readFile >=0&& (RecPtr->xlogid!=readId||
@@ -1232,15 +1245,21 @@ ReadRecord(XLogRecPtr *RecPtr, char *buffer)
12321245
record= (XLogRecord*) ((char*)readBuf+RecPtr->xrecoff %BLCKSZ);
12331246

12341247
got_record:;
1248+
if (record->xl_len==0)
1249+
{
1250+
elog(emode,"ReadRecord: record with zero len at (%u, %u)",
1251+
RecPtr->xlogid,RecPtr->xrecoff);
1252+
gotonext_record_is_invalid;
1253+
}
12351254
if (record->xl_len>_INTL_MAXLOGRECSZ)
12361255
{
1237-
elog(emode,"ReadRecord: too long record len %uin (%u, %u)",
1256+
elog(emode,"ReadRecord: too long record len %uat (%u, %u)",
12381257
record->xl_len,RecPtr->xlogid,RecPtr->xrecoff);
12391258
gotonext_record_is_invalid;
12401259
}
12411260
if (record->xl_rmid>RM_MAX_ID)
12421261
{
1243-
elog(emode,"ReadRecord: invalid resource managed id %uin (%u, %u)",
1262+
elog(emode,"ReadRecord: invalid resource managed id %uat (%u, %u)",
12441263
record->xl_rmid,RecPtr->xlogid,RecPtr->xrecoff);
12451264
gotonext_record_is_invalid;
12461265
}
@@ -1841,8 +1860,6 @@ StartupXLOG()
18411860
elog(STOP,"Invalid redo in checkPoint record");
18421861
if (checkPoint.undo.xrecoff==0)
18431862
checkPoint.undo=RecPtr;
1844-
if (XLByteLT(RecPtr,checkPoint.undo))
1845-
elog(STOP,"Invalid undo in checkPoint record");
18461863

18471864
if (XLByteLT(checkPoint.undo,RecPtr)||
18481865
XLByteLT(checkPoint.redo,RecPtr))
@@ -1969,6 +1986,23 @@ StartupXLOG()
19691986
CreateCheckPoint(true);
19701987
XLogCloseRelationCache();
19711988
}
1989+
1990+
if (XLOGfiles>0)/* pre-allocate log files */
1991+
{
1992+
uint32_logId=logId,
1993+
_logSeg=logSeg;
1994+
intlf,i;
1995+
boolusexistent;
1996+
1997+
for (i=1;i <=XLOGfiles;i++)
1998+
{
1999+
NextLogSeg(_logId,_logSeg);
2000+
usexistent= false;
2001+
lf=XLogFileInit(_logId,_logSeg,&usexistent);
2002+
close(lf);
2003+
}
2004+
}
2005+
19722006
InRecovery= false;
19732007

19742008
ControlFile->state=DB_IN_PRODUCTION;
@@ -2117,48 +2151,70 @@ CreateCheckPoint(bool shutdown)
21172151

21182152
SpinAcquire(ControlFileLockId);
21192153
if (shutdown)
2154+
{
2155+
/* probably should delete extra log files */
21202156
ControlFile->state=DB_SHUTDOWNED;
2121-
else/* create new log file */
2157+
}
2158+
else/* create new log file(s) */
21222159
{
2123-
if (recptr.xrecoff %XLogSegSize >=
2124-
(uint32) (0.75*XLogSegSize))
2160+
intlf;
2161+
boolusexistent= true;
2162+
2163+
_logId=recptr.xlogid;
2164+
_logSeg= (recptr.xrecoff-1) /XLogSegSize;
2165+
if (XLOGfiles>0)
21252166
{
2126-
intlf;
2127-
boolusexistent= true;
2167+
structtimevaldelay;
2168+
inti;
21282169

2129-
_logId=recptr.xlogid;
2130-
_logSeg=recptr.xrecoff /XLogSegSize;
2131-
if (_logSeg >=XLogLastSeg)
2170+
for (i=1;i <=XLOGfiles;i++)
21322171
{
2133-
_logId++;
2134-
_logSeg=0;
2172+
usexistent= true;
2173+
NextLogSeg(_logId,_logSeg);
2174+
lf=XLogFileInit(_logId,_logSeg,&usexistent);
2175+
close(lf);
2176+
/*
2177+
* Give up ControlFileLockId for 1/50 sec to let other
2178+
* backends switch to new log file in XLogWrite()
2179+
*/
2180+
SpinRelease(ControlFileLockId);
2181+
delay.tv_sec=0;
2182+
delay.tv_usec=20000;
2183+
(void)select(0,NULL,NULL,NULL,&delay);
2184+
SpinAcquire(ControlFileLockId);
21352185
}
2136-
else
2137-
_logSeg++;
2186+
}
2187+
elseif ((recptr.xrecoff-1) %XLogSegSize >=
2188+
(uint32) (0.75*XLogSegSize))
2189+
{
2190+
NextLogSeg(_logId,_logSeg);
21382191
lf=XLogFileInit(_logId,_logSeg,&usexistent);
21392192
close(lf);
21402193
}
21412194
}
21422195

21432196
ControlFile->checkPoint=MyLastRecPtr;
2144-
2145-
_logId=ControlFile->logId;
2146-
_logSeg=ControlFile->logSeg-1;
21472197
strcpy(archdir,ControlFile->archdir);
2148-
21492198
ControlFile->time=time(NULL);
21502199
UpdateControlFile();
21512200
SpinRelease(ControlFileLockId);
21522201

21532202
/*
21542203
* Delete offline log files. Get oldest online
2155-
* log file from undo rec if it's valid.
2204+
* log file from redo or undo record, whatever
2205+
* is older.
21562206
*/
2157-
if (checkPoint.undo.xrecoff!=0)
2207+
if (checkPoint.undo.xrecoff!=0&&
2208+
XLByteLT(checkPoint.undo,checkPoint.redo))
21582209
{
21592210
_logId=checkPoint.undo.xlogid;
21602211
_logSeg=checkPoint.undo.xrecoff /XLogSegSize;
21612212
}
2213+
else
2214+
{
2215+
_logId=checkPoint.redo.xlogid;
2216+
_logSeg=checkPoint.redo.xrecoff /XLogSegSize;
2217+
}
21622218
if (_logId||_logSeg)
21632219
{
21642220
if (_logSeg)

‎src/backend/utils/misc/guc.c

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
* Support for grand unified configuration scheme, including SET
55
* command, configuration file, and command line options.
66
*
7-
* $Header: /cvsroot/pgsql/src/backend/utils/misc/guc.c,v 1.26 2000/12/03 14:36:46 petere Exp $
7+
* $Header: /cvsroot/pgsql/src/backend/utils/misc/guc.c,v 1.27 2001/01/09 06:24:33 vadim Exp $
88
*
99
* Copyright 2000 by PostgreSQL Global Development Group
1010
* Written by Peter Eisentraut <peter_e@gmx.net>.
@@ -38,6 +38,7 @@ extern bool Log_connections;
3838

3939
externintCheckPointTimeout;
4040
externintXLOGbuffers;
41+
externintXLOGfiles;
4142
externintXLOG_DEBUG;
4243
externintCommitDelay;
4344

@@ -274,6 +275,9 @@ ConfigureNamesInt[] =
274275
{"wal_buffers",PGC_POSTMASTER,&XLOGbuffers,
275276
8,4,INT_MAX},
276277

278+
{"wal_files",PGC_POSTMASTER,&XLOGfiles,
279+
0,0,64},
280+
277281
{"wal_debug",PGC_SUSET,&XLOG_DEBUG,
278282
0,0,16},
279283

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp