diff --git a/src/gausskernel/storage/smgr/segment/segxlog.cpp b/src/gausskernel/storage/smgr/segment/segxlog.cpp index 264c8bb86acd1a39fd125af33ed25878663aaedf..8efa9fa38ec6c760d217aa963efdc25920291ff3 100644 --- a/src/gausskernel/storage/smgr/segment/segxlog.cpp +++ b/src/gausskernel/storage/smgr/segment/segxlog.cpp @@ -780,20 +780,25 @@ void seg_redo_new_page_copy_and_flush(BufferTag *tag, char *data, XLogRecPtr lsn update_max_page_flush_lsn(lsn, t_thrd.proc_cxt.MyProcPid, false); } - bool flush_old_file = false; - uint32 pos = seg_dw_single_flush_without_buffer(*tag, (Block)page, &flush_old_file); - t_thrd.proc->dw_pos = pos; - t_thrd.proc->flush_new_dw = !flush_old_file; - - SegSpace *spc = spc_open(tag->rnode.spcNode, tag->rnode.dbNode, false); - SegmentCheck(spc != NULL); - seg_physical_write(spc, tag->rnode, tag->forkNum, tag->blockNum, page, true); - if (flush_old_file) { - g_instance.dw_single_cxt.recovery_buf.single_flush_state[pos] = true; + if (dw_enabled() && pg_atomic_read_u32(&g_instance.ckpt_cxt_ctl->current_page_writer_count) > 0) { + bool flush_old_file = false; + uint16 pos = seg_dw_single_flush_without_buffer(*tag, (Block)page, &flush_old_file); + t_thrd.proc->dw_pos = pos; + t_thrd.proc->flush_new_dw = !flush_old_file; + SegSpace *spc = spc_open(tag->rnode.spcNode, tag->rnode.dbNode, false); + SegmentCheck(spc != NULL); + seg_physical_write(spc, tag->rnode, tag->forkNum, tag->blockNum, page, true); + if (flush_old_file) { + g_instance.dw_single_cxt.recovery_buf.single_flush_state[pos] = true; + } else { + g_instance.dw_single_cxt.single_flush_state[pos] = true; + } + t_thrd.proc->dw_pos = -1; } else { - g_instance.dw_single_cxt.single_flush_state[pos] = true; + SegSpace *spc = spc_open(tag->rnode.spcNode, tag->rnode.dbNode, false); + SegmentCheck(spc != NULL); + seg_physical_write(spc, tag->rnode, tag->forkNum, tag->blockNum, page, true); } - t_thrd.proc->dw_pos = -1; } diff --git a/src/gausskernel/storage/smgr/segment/space.cpp b/src/gausskernel/storage/smgr/segment/space.cpp index 122ff7884cfba7311960ada2178bebbf597e8116..be034f835ba3f33c51d466b781f562c418e8273c 100644 --- a/src/gausskernel/storage/smgr/segment/space.cpp +++ b/src/gausskernel/storage/smgr/segment/space.cpp @@ -582,20 +582,23 @@ static void copy_extent(SegExtentGroup *seg, RelFileNode logic_rnode, uint32 log PageSetLSN(pagedata, recptr); /* 2. double write */ - bool flush_old_file = false; - uint32 pos = seg_dw_single_flush_without_buffer(tag, (Block)pagedata, &flush_old_file); - t_thrd.proc->dw_pos = pos; - t_thrd.proc->flush_new_dw = !flush_old_file; - - /* 3. checksum and write to file */ - PageSetChecksumInplace((Page)pagedata, to_block); - df_pwrite_block(seg->segfile, pagedata, to_block); - if (flush_old_file) { - g_instance.dw_single_cxt.recovery_buf.single_flush_state[pos] = true; + if (dw_enabled() && pg_atomic_read_u32(&g_instance.ckpt_cxt_ctl->current_page_writer_count) > 0) { + bool flush_old_file = false; + uint16 pos = seg_dw_single_flush_without_buffer(tag, (Block)pagedata, &flush_old_file); + t_thrd.proc->dw_pos = pos; + t_thrd.proc->flush_new_dw = !flush_old_file; + PageSetChecksumInplace((Page)pagedata, to_block); + df_pwrite_block(seg->segfile, pagedata, to_block); + if (flush_old_file) { + g_instance.dw_single_cxt.recovery_buf.single_flush_state[pos] = true; + } else { + g_instance.dw_single_cxt.single_flush_state[pos] = true; + } + t_thrd.proc->dw_pos = -1; } else { - g_instance.dw_single_cxt.single_flush_state[pos] = true; + PageSetChecksumInplace((Page)pagedata, to_block); + df_pwrite_block(seg->segfile, pagedata, to_block); } - t_thrd.proc->dw_pos = -1; } END_CRIT_SECTION();