【标题】(请简要描述下实现的内容)
修复build进程hang住的问题
【实现内容】:
修复build进程hang住的问题
【根因分析】:
build的主进程会创建子进程来与主机进行xlog日志同步,当子进程传输到目标日志点时退出,而该目标日志点由主进程创建完子进程后赋值,如下代码。
输入图片说明
issue中的场景为在赋值之前把主进程kill -2,导致该目标日志点没有被赋值。导致子进程无法因为传输到目标点而终止。
而正常子进程还会检查其当前的父进程pid是否为原主进程pid,方法是在ReceiveXlogStream内先获取当前的ppid,然后在日志同步的循环中判断当前的ppid是否为先前获取的ppid,如果不是,也可以退出。这存在一种场景是在子进程第一次获取ppid之前,主进程就被kill -2了,导致第一次获取的ppid就已经是发生了变化之后的(子进程的父进程退出后,会被挂在进程1下,即ppid=1)。

基于此,可通过分别在获取ppid和赋值目标日志点处加sleep复现(本身issue问题复现概率极小),build过程中将父进程kill -2
输入图片说明
输入图片说明
【实现方案】:
因此修改方案是该ppid应该为父进程传给子进程,才最为准确。
测试过程中还发现一个build子进程退不掉的场景,子进程创建的heartbeat子线程无法退出,导致阻塞在closeHearBeatTimer。gdb定位heartbeat线程的堆栈,发现变量heartbeatRunning为1,而该变量应该在closeHearBeatTimer由主线程设置为0,通过打印日志发现,主线程调用closeHearBeatTimer在子线程运行之前,导致heartbeatRunning先被主线程置为0,后被子线程置为1,导致子线程无法退出。
输入图片说明
修改方案是使用没有地方使用到的变量timerFlag,在closeHearBeatTimer的时候置为1,并在子线程的循环中判断该变量,如果为1则退出。

此外,gs_basebackup也有同样的问题,同步修改。

按照检视意见修改方案,创建子进程时添加prctl调用;修改heartbeatrunning为多状态变量,并通过原子修改。
【关联需求或issue】:
#I894YC:【测试类型:故障注入】【测试版本:5.0.1】【可靠性】【概率问题】备机重建过程中ctl+c故障后,1h无返回结果。再次重建失败后,stop集群时,主机无法stop
【开发自验报告】:

  1. 请附上自验结果(内容或者截图)
    按上述复现方法验证,build进程可以退出,主机能正常停止。
  2. 是否可以添加fastcheck测试用例,如是,请补充fastcheck用例
    故障注入,无法添加测试用例
  3. 是否涉及资料修改,如是,在docs仓库补充资料
    不涉及
  4. 是否考虑升级场景(系统表修改、日志持久化以及修改执行态数据格式)
    不涉及
  5. 是否考虑在线扩容等扩展场景
    不涉及
  6. 是否考虑异常场景/并发场景/前向兼容/性能场景
    不涉及
  7. 是否对其他模块产生影响
    不涉及

【其他说明】: