暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

PostgreSQL异常重启postmaster.pid处理

原创 闫宗帅 2020-06-05
1261
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)
  ...
复制

介绍启动时pid文件即锁文件的处理,若异常宕机,导致pid文件残留,那么重启时会自动将这个文件删除吗?
1)会以O_RDWR | O_CREAT | O_EXCL形式open,若存在的话会返回创建文件失败。
2)若创建失败则会重试100次
3)若文件已存在,则以只读的形式再次open并读取文件内容
4)解析出pid,并通过kill(pid,0)判断进程是否存在(注意,若有子进程残留也会判断出来)
5)若有进程不存在,则将这个文件删除,然后进行重试
6)创建成功后,将当前进程信息写入文件并sync持久化。
7)最后将文件句柄关闭

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论