暂无图片
暂无图片
暂无图片
暂无图片
暂无图片
PostgreSQL异常重启postmaster.pid处理
1047
1页
0次
2020-08-14
5墨值下载
main>PostmasterMain->CreateDataDirLockFile->CreateLockFile
::
for (ntries = 0;; ntries++){
// O_EXCL
若存在则返回失败,
errno
17
fd = open('lename, O_RDWR | O_CREAT | O_EXCL,
pg_'le_create_mode);
if (fd >= 0)
break;
if ((errno != EEXIST && errno != EACCES) || ntries > 100)//
重试
100
could not create lock 'le
fd = open('lename, O_RDONLY, pg_'le_create_mode);
...
if ((len = read(fd, bu8er, sizeof(bu8er) - 1)) < 0)
...
close(fd);
//0
表示检查进程是否存在。
ESRCH
:没有这个进程;
EPERM
:操作不允许
if (kill(other_pid, 0) == 0 ||(errno != ESRCH && errno != EPERM)){
lock 'le \"%s\" already exists
}
if (unlink('lename) < 0)//
删除,然后循环再试创建
...
}
//
此时创建成功
if (write(fd, bu8er, strlen(bu8er)) != strlen(bu8er))//
写入
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
)最后将文件句柄关闭
of 1
5墨值下载
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文档的来源(墨天轮),文档链接,文档作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论

关注
最新上传
暂无内容,敬请期待...
下载排行榜
Top250 周榜 月榜