!5573 根据阈值预分配xlog文件

Merge pull request !5573 from JulianZhang/pre_init_xlog_files
This commit is contained in:
opengauss_bot
2024-07-12 06:39:24 +00:00
committed by Gitee
2 changed files with 18 additions and 9 deletions

View File

@ -2647,6 +2647,7 @@ static void XLogWrite(const XLogwrtRqst &WriteRqst, bool flexible)
bool last_iteration = false;
bool finishing_seg = false;
bool use_existent = false;
bool segs_enough = true;
int curridx = 0;
int npages = 0;
int startidx = 0;
@ -2716,12 +2717,19 @@ static void XLogWrite(const XLogwrtRqst &WriteRqst, bool flexible)
t_thrd.xlog_cxt.openLogFile = XLogFileInit(t_thrd.xlog_cxt.openLogSegNo, &use_existent, true);
t_thrd.xlog_cxt.openLogOff = 0;
segs_enough = true;
if (g_instance.attr.attr_storage.wal_file_init_num > 0 && g_instance.wal_cxt.globalEndPosSegNo != InvalidXLogSegPtr &&
g_instance.wal_cxt.globalEndPosSegNo >= t_thrd.xlog_cxt.openLogSegNo) {
segs_enough = (g_instance.wal_cxt.globalEndPosSegNo - t_thrd.xlog_cxt.openLogSegNo)
> (g_instance.attr.attr_storage.wal_file_init_num * 0.2);
}
/*
* Unlock WalAuxiliary thread to init new xlog segment if we are running out
* of xlog segments.
* of xlog segments, or available segments is less than wal_file_init_num * 0.2.
*/
if (!use_existent) {
g_instance.wal_cxt.globalEndPosSegNo = t_thrd.xlog_cxt.openLogSegNo;
if (!use_existent || !segs_enough) {
g_instance.wal_cxt.globalEndPosSegNo = Max(g_instance.wal_cxt.globalEndPosSegNo, t_thrd.xlog_cxt.openLogSegNo);
WakeupWalSemaphore(&g_instance.wal_cxt.walInitSegLock->l.sem);
}
}
@ -4242,7 +4250,7 @@ bool PreInitXlogFileForStandby(XLogRecPtr requestLsn)
return true;
}
void PreInitXlogFileForPrimary(int advance_xlog_file_num)
void PreInitXlogFileForPrimary(int wal_file_init_num)
{
XLogSegNo startSegNo, nextSegNo, target;
int lf;
@ -4254,7 +4262,7 @@ void PreInitXlogFileForPrimary(int advance_xlog_file_num)
return;
}
startSegNo = g_instance.wal_cxt.globalEndPosSegNo + 1;
target = startSegNo + advance_xlog_file_num - 1;
target = startSegNo + wal_file_init_num - 1;
for (nextSegNo = startSegNo; nextSegNo <= target; nextSegNo++) {
use_existent = true;
lf = XLogFileInit(nextSegNo, &use_existent, true);
@ -4496,6 +4504,10 @@ static bool InstallXLogFileSegment(XLogSegNo *segno, const char *tmppath, bool f
return false;
}
if (*segno > g_instance.wal_cxt.globalEndPosSegNo) {
g_instance.wal_cxt.globalEndPosSegNo = *segno;
}
if (use_lock) {
LWLockRelease(ControlFileLock);
}

View File

@ -361,7 +361,6 @@ typedef struct XLogwrtResult {
XLogRecPtr Flush; /* last byte + 1 flushed */
} XLogwrtResult;
extern void XLogMultiFileInit(int advance_xlog_file_num);
typedef struct XLogwrtPaxos {
XLogRecPtr Write; /* last byte + 1 written out */
XLogRecPtr Consensus; /* last byte + 1 consensus in DCF */
@ -708,8 +707,6 @@ extern XLogSegNo GetNewestXLOGSegNo(const char* workingPath);
#define XLOG_CONTAIN_CSN 0x80000000
#define XLOG_MASK_TERM 0x7FFFFFFF
extern void XLogMultiFileInit(int advance_xlog_file_num);
extern XLogRecPtr XLogInsertRecord(struct XLogRecData* rdata, XLogRecPtr fpw_lsn);
extern void XLogWaitFlush(XLogRecPtr recptr);
extern void XLogWaitBufferInit(XLogRecPtr recptr);
@ -719,7 +716,7 @@ extern bool XLogNeedsFlush(XLogRecPtr RecPtr);
extern int XLogFileInit(XLogSegNo segno, bool* use_existent, bool use_lock);
extern int XLogFileOpen(XLogSegNo segno);
extern bool PreInitXlogFileForStandby(XLogRecPtr requestLsn);
extern void PreInitXlogFileForPrimary(int advance_xlog_file_num);
extern void PreInitXlogFileForPrimary(int wal_file_init_num);
extern void CheckXLogRemoved(XLogSegNo segno, TimeLineID tli);
extern void XLogSetAsyncXactLSN(XLogRecPtr record);