From 142c3e3ad98b639d94808008108baf9bd82efcd2 Mon Sep 17 00:00:00 2001 From: JulianZhang Date: Mon, 8 Jul 2024 11:08:01 +0800 Subject: [PATCH 1/2] advance xlog files --- .../storage/access/transam/xlog.cpp | 22 ++++++++++++++----- src/include/access/xlog.h | 5 +---- .../regress/expected/advance_xlog_files.out | 21 ++++++++++++++++++ src/test/regress/parallel_schedule0 | 1 + src/test/regress/sql/advance_xlog_files.sql | 19 ++++++++++++++++ 5 files changed, 59 insertions(+), 9 deletions(-) create mode 100644 src/test/regress/expected/advance_xlog_files.out create mode 100644 src/test/regress/sql/advance_xlog_files.sql diff --git a/src/gausskernel/storage/access/transam/xlog.cpp b/src/gausskernel/storage/access/transam/xlog.cpp index 2c2be96c3..08ed674aa 100755 --- a/src/gausskernel/storage/access/transam/xlog.cpp +++ b/src/gausskernel/storage/access/transam/xlog.cpp @@ -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); } diff --git a/src/include/access/xlog.h b/src/include/access/xlog.h index fa5931dc1..5284da1b9 100755 --- a/src/include/access/xlog.h +++ b/src/include/access/xlog.h @@ -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); diff --git a/src/test/regress/expected/advance_xlog_files.out b/src/test/regress/expected/advance_xlog_files.out new file mode 100644 index 000000000..8f070cab7 --- /dev/null +++ b/src/test/regress/expected/advance_xlog_files.out @@ -0,0 +1,21 @@ +-- show wal_file_init_num, the default value should be 10 +show wal_file_init_num; + wal_file_init_num +------------------- + 10 +(1 row) + +-- create test table with large row size +create table test_advance_xlog_files (c1 int, c2 varchar(500)); +-- insert rows to make xlog files consumed, then trigger to init xlog files. +insert into test_advance_xlog_files (c1, c2) select generate_series(1, 300000), generate_series(1, 300000); +insert into test_advance_xlog_files (c1, c2) select generate_series(1, 300000), generate_series(1, 300000); +insert into test_advance_xlog_files (c1, c2) select generate_series(1, 300000), generate_series(1, 300000); +insert into test_advance_xlog_files (c1, c2) select generate_series(1, 300000), generate_series(1, 300000); +insert into test_advance_xlog_files (c1, c2) select generate_series(1, 300000), generate_series(1, 300000); +insert into test_advance_xlog_files (c1, c2) select generate_series(1, 300000), generate_series(1, 300000); +insert into test_advance_xlog_files (c1, c2) select generate_series(1, 300000), generate_series(1, 300000); +insert into test_advance_xlog_files (c1, c2) select generate_series(1, 300000), generate_series(1, 300000); +insert into test_advance_xlog_files (c1, c2) select generate_series(1, 300000), generate_series(1, 300000); +insert into test_advance_xlog_files (c1, c2) select generate_series(1, 300000), generate_series(1, 300000); +drop table test_advance_xlog_files; diff --git a/src/test/regress/parallel_schedule0 b/src/test/regress/parallel_schedule0 index 95c8b87ee..425d47075 100644 --- a/src/test/regress/parallel_schedule0 +++ b/src/test/regress/parallel_schedule0 @@ -1127,3 +1127,4 @@ test: enable_expr_fusion_flatten test: on_update_session1 on_update_session2 test: ts_gb18030_utf8 +test: advance_xlog_files diff --git a/src/test/regress/sql/advance_xlog_files.sql b/src/test/regress/sql/advance_xlog_files.sql new file mode 100644 index 000000000..62615a0fa --- /dev/null +++ b/src/test/regress/sql/advance_xlog_files.sql @@ -0,0 +1,19 @@ +-- show wal_file_init_num, the default value should be 10 +show wal_file_init_num; + +-- create test table with large row size +create table test_advance_xlog_files (c1 int, c2 varchar(500)); + +-- insert rows to make xlog files consumed, then trigger to init xlog files. +insert into test_advance_xlog_files (c1, c2) select generate_series(1, 300000), generate_series(1, 300000); +insert into test_advance_xlog_files (c1, c2) select generate_series(1, 300000), generate_series(1, 300000); +insert into test_advance_xlog_files (c1, c2) select generate_series(1, 300000), generate_series(1, 300000); +insert into test_advance_xlog_files (c1, c2) select generate_series(1, 300000), generate_series(1, 300000); +insert into test_advance_xlog_files (c1, c2) select generate_series(1, 300000), generate_series(1, 300000); +insert into test_advance_xlog_files (c1, c2) select generate_series(1, 300000), generate_series(1, 300000); +insert into test_advance_xlog_files (c1, c2) select generate_series(1, 300000), generate_series(1, 300000); +insert into test_advance_xlog_files (c1, c2) select generate_series(1, 300000), generate_series(1, 300000); +insert into test_advance_xlog_files (c1, c2) select generate_series(1, 300000), generate_series(1, 300000); +insert into test_advance_xlog_files (c1, c2) select generate_series(1, 300000), generate_series(1, 300000); + +drop table test_advance_xlog_files; \ No newline at end of file From 1241891e7d1234d113b34103639e7fd961f560aa Mon Sep 17 00:00:00 2001 From: JulianZhang Date: Thu, 11 Jul 2024 11:15:31 +0800 Subject: [PATCH 2/2] advance xlog files, remove test case --- .../regress/expected/advance_xlog_files.out | 21 ------------------- src/test/regress/parallel_schedule0 | 1 - src/test/regress/sql/advance_xlog_files.sql | 19 ----------------- 3 files changed, 41 deletions(-) delete mode 100644 src/test/regress/expected/advance_xlog_files.out delete mode 100644 src/test/regress/sql/advance_xlog_files.sql diff --git a/src/test/regress/expected/advance_xlog_files.out b/src/test/regress/expected/advance_xlog_files.out deleted file mode 100644 index 8f070cab7..000000000 --- a/src/test/regress/expected/advance_xlog_files.out +++ /dev/null @@ -1,21 +0,0 @@ --- show wal_file_init_num, the default value should be 10 -show wal_file_init_num; - wal_file_init_num -------------------- - 10 -(1 row) - --- create test table with large row size -create table test_advance_xlog_files (c1 int, c2 varchar(500)); --- insert rows to make xlog files consumed, then trigger to init xlog files. -insert into test_advance_xlog_files (c1, c2) select generate_series(1, 300000), generate_series(1, 300000); -insert into test_advance_xlog_files (c1, c2) select generate_series(1, 300000), generate_series(1, 300000); -insert into test_advance_xlog_files (c1, c2) select generate_series(1, 300000), generate_series(1, 300000); -insert into test_advance_xlog_files (c1, c2) select generate_series(1, 300000), generate_series(1, 300000); -insert into test_advance_xlog_files (c1, c2) select generate_series(1, 300000), generate_series(1, 300000); -insert into test_advance_xlog_files (c1, c2) select generate_series(1, 300000), generate_series(1, 300000); -insert into test_advance_xlog_files (c1, c2) select generate_series(1, 300000), generate_series(1, 300000); -insert into test_advance_xlog_files (c1, c2) select generate_series(1, 300000), generate_series(1, 300000); -insert into test_advance_xlog_files (c1, c2) select generate_series(1, 300000), generate_series(1, 300000); -insert into test_advance_xlog_files (c1, c2) select generate_series(1, 300000), generate_series(1, 300000); -drop table test_advance_xlog_files; diff --git a/src/test/regress/parallel_schedule0 b/src/test/regress/parallel_schedule0 index 425d47075..95c8b87ee 100644 --- a/src/test/regress/parallel_schedule0 +++ b/src/test/regress/parallel_schedule0 @@ -1127,4 +1127,3 @@ test: enable_expr_fusion_flatten test: on_update_session1 on_update_session2 test: ts_gb18030_utf8 -test: advance_xlog_files diff --git a/src/test/regress/sql/advance_xlog_files.sql b/src/test/regress/sql/advance_xlog_files.sql deleted file mode 100644 index 62615a0fa..000000000 --- a/src/test/regress/sql/advance_xlog_files.sql +++ /dev/null @@ -1,19 +0,0 @@ --- show wal_file_init_num, the default value should be 10 -show wal_file_init_num; - --- create test table with large row size -create table test_advance_xlog_files (c1 int, c2 varchar(500)); - --- insert rows to make xlog files consumed, then trigger to init xlog files. -insert into test_advance_xlog_files (c1, c2) select generate_series(1, 300000), generate_series(1, 300000); -insert into test_advance_xlog_files (c1, c2) select generate_series(1, 300000), generate_series(1, 300000); -insert into test_advance_xlog_files (c1, c2) select generate_series(1, 300000), generate_series(1, 300000); -insert into test_advance_xlog_files (c1, c2) select generate_series(1, 300000), generate_series(1, 300000); -insert into test_advance_xlog_files (c1, c2) select generate_series(1, 300000), generate_series(1, 300000); -insert into test_advance_xlog_files (c1, c2) select generate_series(1, 300000), generate_series(1, 300000); -insert into test_advance_xlog_files (c1, c2) select generate_series(1, 300000), generate_series(1, 300000); -insert into test_advance_xlog_files (c1, c2) select generate_series(1, 300000), generate_series(1, 300000); -insert into test_advance_xlog_files (c1, c2) select generate_series(1, 300000), generate_series(1, 300000); -insert into test_advance_xlog_files (c1, c2) select generate_series(1, 300000), generate_series(1, 300000); - -drop table test_advance_xlog_files; \ No newline at end of file