修复启动流程走异常恢复


【问题描述】

写入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)启动后数据还在