ITPub博客

首页 > 数据库 > PostgreSQL > PostgreSQL异常重启postmaster.pid处理

PostgreSQL异常重启postmaster.pid处理

原创 PostgreSQL 作者:yzs87 时间:2020-06-05 22:38:15 0 删除 编辑

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

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) 最后将文件句柄关闭


来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/31493717/viewspace-2696595/ ,如需转载,请注明出处,否则将追究法律责任。

上一篇: PMDK优势
请登录后发表评论 登录
全部评论
专注于MySQL、Aerospike、PostgreSQL数据库

注册时间:2017-10-03

  • 博文量
    149
  • 访问量
    285476