加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

PostgreSQL语句中断代码

发布时间:2020-12-13 17:34:01 所属栏目:百科 来源:网络整理
导读:前几天发表的《PostgreSQL完全刷缓存补

前几天发表的《PostgreSQL完全刷缓存补丁》一文,其实稍微有点缺憾,就是没有语句中断机制。刷缓存过程是纯内存访问,理论上速度会非常快,而且以PG的机制,一个进程获得锁之后会立即释放,所以本文纯粹作为补充说明,演示如何实现。

另外,当前的缓存锁获取机制,是一直尝试,直到超时发出PANIC错误。
见:src/backend/storage/lmgr/s_lock.c 中的 s_lock 函数

我们从代码可以看到,在整个语句的执行过程中,经常出现CHECK_FOR_INTERRUPTS();,这就是中断检测。典型场景,我们在psql下运行一个长时语句,这时我们想中断它,按下Ctrl+C,最终就是这个宏在起作用。它的定义在src/include/miscadmin.h中:

#define CHECK_FOR_INTERRUPTS() 

do { 

	if (InterruptPending) 

		ProcessInterrupts(); 

} while(0)

ProcessInterrupts();的定义请自行查看,这里关键就是这个InterruptPending,它是在服务器端收到用户中断信号之后变为true。

这个信号的收取关系到cancel_key,每次启动后端进程会随机分配,客户端发送中断信号必须带有这个key作为证明,见src/backend/postmaster/postmaster.c中的processCancelRequest()函数。

要吃饭了,到这里其实就已经很明白,偷个懒,不继续写了。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读