前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >PostgreSQL异常重启postmaster.pid处理

PostgreSQL异常重启postmaster.pid处理

作者头像
yzsDBA
发布2020-10-28 10:21:10
1.6K0
发布2020-10-28 10:21:10
举报
文章被收录于专栏:PostgreSQL研究与原理解析

本文介绍启动时pid文件即锁文件的处理。

若异常宕机,导致pid文件残留,那么重启时会自动将这个文件删除吗?

代码语言:javascript
复制
main>PostmasterMain->CreateDataDirLockFile->CreateLockFile::
  for (ntries = 0;; ntries++){
    // O_EXCL若存在则返回失败,errno是17
    fd = open(filename, O_RDWR | O_CREAT | O_EXCL, pg_file_create_mode);
    if (fd >= 0)
      break;  
    if ((errno != EEXIST && errno != EACCES) || ntries > 100)//重试100次
    could not create lock file
    fd = open(filename, O_RDONLY, pg_file_create_mode);
    ...
    if ((len = read(fd, buffer, sizeof(buffer) - 1)) < 0)
    ...
    close(fd);
    //0表示检查进程是否存在。ESRCH:没有这个进程;EPERM:操作不允许
    if (kill(other_pid, 0) == 0 ||(errno != ESRCH && errno != EPERM)){
      lock file \"%s\" already exists
    }
    if (unlink(filename) < 0)//删除,然后循环再试创建
      ...
    }
    //此时创建成功
    if (write(fd, buffer, strlen(buffer)) != strlen(buffer))//写入pid内容
      ...
    if (pg_fsync(fd) != 0)
      ...
    if (close(fd) != 0)
      ...

说明:

1)会以O_RDWR | O_CREAT | O_EXCL形式open,若存在的话会返回创建文件失败。

2)若创建失败则会重试100次

3)若文件已存在,则以只读的形式再次open并读取文件内容

4)解析出pid,并通过kill(pid,0)判断进程是否存在(注意,若有子进程残留也会判断出来)

5)若有进程不存在,则将这个文件删除,然后进行重试

6)创建成功后,将当前进程信息写入文件并sync持久化。

7)最后将文件句柄关闭

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-06-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 yanzongshuaiDBA 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档