如何在 PostgreSQL 源代码中添加可在前端和后端运行的标志?

如何在 PostgreSQL 源代码中添加可在前端和后端运行的标志?

我正在尝试对 postgresql 源代码进行一些更改。我想添加一个在前端和后端都有效的标志。以下是我目前所做的。

1-我创建了头文件 mine.h,在其中声明了我的全局标志,如下所示。

extern int CMD_FLAG;
extern void init_vars();// this function to initialize CMD_FLAG

2- 我将 mine.h 包含在 pgsql/src/include/ch 中,因为前端和后端都可以看到它。

3- 在 pgsql/src/port/exec.c 中我编写了初始化 CMD_FLAG 的 init_vars() 函数主体,如下所示:

int CMD_FLAG;

void init_vars(){
   CMD_FLAG =-1;
}

4-在 pgsql/src/backend/main/main.c 中,我调用

init_vars(); 

当我编译 Postgresql 时,没有收到任何错误。但是,当我尝试打印标志值时,后端和前端的值不同。

例如,当我在前端的函数“HandleSlashCmds”中打印它时,该值为 0,而它应该是 -1。

如果我对前端的标志进行任何更改,则更改仅适用于前端功能。另一方面,如果我对后端的标志进行任何更改,则更改仅适用于后端功能。

我认为不知何故,每个端点都有两个标志副本。我怎样才能让两端访问相同的值?

答案1

前端和后端是不同的进程,通过网络协议进行通信。

最接近您想要的是 GUC(“大统一配置”)变量。您可以在后端服务器中定义自定义 GUCDefineCustomIntVariable并在其上设置GUC_REPORT标志,这样当它被语句等更改时SET,新值会使用有线协议上的异步通知报告给客户端。客户端应用程序可以检测到此更改并应用新设置。

类似地,当客户端上的变量发生变化时,它可以发送SET查询以在服务器上分配新值。

这显然会带来延迟,特别是因为协议只允许SET在特定时间进行查询和通知响应。实际上,您只会在查询完成后看到变量的变化。因此不是与在内存中设置变量相同。

此外,GUC 还可以具有独立价值在 PostgreSQL 中的每个后端会话中,因为它是一种默认不共享的多进程架构。因此,如果您想在所有会话中设置一个变量,GUC 就不合适了,您需要使用扩展在共享内存中分配一个变量……但在这种情况下,您无法自动将值报告给客户端。

无论您想做什么,我都强烈怀疑这不是解决问题的方法。


顺便说一句,您真的不必为此修补 PostgreSQL。_PG_init()如果扩展在 中列出,则可以在服务器启动时运行shared_preload_libraries。它可以在那时分配共享内存段、定义 GUC 等。


如果你真的必须确保前端和后端之间有一个相同的变量,如果前端和后端在同一主机上运行,​​并且由同一用户运行,您可能能够使用 mmap 匿名内存和原子来执行某些操作。要做到这一点很难,而且在您目前的水平上,这将涉及很多的學習。

相关内容