修复启动流程走异常恢复
【问题描述】
写入unlogged表,gs_ctl正常停进程后,启动进程,数据丢失,和开源pg不一致
【问题定位】
1)启动读值数据错导致走recovery流程
checkPoint.redo=decoder->main_data
RecPtr=checkPointLoc = t_thrd.shemem_ptr_cxt.ControlFile->checkPoint;
if (XLByteLT(checkPoint.redo, RecPtr))
recovery=true #xlog.cppL9893
2)停进程前这两个字段为什么不相等
CreateCheckPoint更新时序
a)checkPoint.redo = curMinRecLSN
b)写两行standby的xlog,#开源没有这两个,导致c里的值变大
c)t_thrd.shemem_ptr_cxt.ControlFile->checkPoint = t_thrd.xlog_cxt.ProcLastRecPtr;
【修复方法】
1)把上面的两行xlog提前到a前面
2)必须放在StartSuspendWalInsert前,不然写不了
【测试效果】
1)停进程前插入数据
create unlogged table test(n int,n1 int);
CREATE TABLE
openGauss=# insert into test(n, n1) values(1,1);
INSERT 0 1
openGauss=# select * from test;
n | n1
---+----
1 | 1
(1 row)
2)启动后数据还在