`

pg启动过程中的那些事三:加载GUC参数

 
阅读更多

1 先上个图,看一下函数调用过程梗概,中间细节有略

 


      GUC 参数初始化分两步,第一步先读取 buildin/ compiled-in GUC 参数默认值,这里包括全部的 GUC 参数,建立 GUC 参数相关结构变量,第二步读取 postgresql.conf 配置文件中的参数设置之。从上图中能看出来,这个读取并设置 postgresql.conf 中参数的过程还是挺复杂的。


2 初始化 GUC 相关数据结构并取 hardcode/buildin 的参数值。

       pg 里的GUC 参数按设置的值分五种类型,分别是boolintrealstringenum ,根据这五种类型,定义了五种结构类型,再根据这五种结构,每个类型建一个对应的静态数组,用于存储这些相应类型的GUC 参数。这五种类型是config_boolconfig_intconfig_realconfig_stringconfig_enum ,对应的静态数组是ConfigureNamesBoolConfigureNamesIntConfigureNamesRealConfigureNamesStringConfigureNamesEnum 。具体结构和数组定义见下面。

 

五个结构定义:

struct config_bool

{

    struct config_generic gen;

    /* these fields must be set correctly in initial value: */

    /* (all but reset_val are constants) */

    bool        *variable;

    bool         boot_val;

    GucIntCheckHook check_hook;

    GucBoolAssignHook assign_hook;

    GucShowHook show_hook;

    /* variable fields, initialized at runtime: */

    bool         reset_val;

    void         * reset_extra

};

 

struct config_int

{

    struct config_generic gen;

/* constant fields, must be set correctly in initial value: */

    int         *variable;

    int          boot_val;

    int          min;

    int          max;

    GucIntCheckHook check_hook;

    GucIntAssignHook assign_hook;

    GucShowHook show_hook;

    /* variable fields, initialized at runtime: */

    int          reset_val;

    void         * reset_extra

};

 

struct config_real

{

    struct config_generic gen;

/* constant fields, must be set correctly in initial value: */

    double      *variable;

    double       boot_val;

    double       min;

    double       max;

    GucIntCheckHook check_hook;

    GucRealAssignHook assign_hook;

    GucShowHook show_hook;

    /* variable fields, initialized at runtime: */

    double       reset_val;

    void         * reset_extra

};

 

struct config_string

{

    struct config_generic gen;

/* constant fields, must be set correctly in initial value: */

    char       **variable;

    const char *boot_val;

    GucIntCheckHook check_hook;

    GucStringAssignHook assign_hook;

    GucShowHook show_hook;

    /* variable fields, initialized at runtime: */

    char        *reset_val;

void         * reset_extra

};

struct config_enum

{

    struct config_generic gen;

/* constant fields, must be set correctly in initial value: */

    int   *variable;

    int     boot_val;

    GucIntCheckHook check_hook;

    GucStringAssignHook assign_hook;

    GucShowHook show_hook;

    /* variable fields, initialized at runtime: */

    int    reset_val;

void         * reset_extra

};

 

和结构类型对应的五个静态数组:

static struct config_bool ConfigureNamesBool[] =

{

       {

              {"enable_seqscan", PGC_USERSET, QUERY_TUNING_METHOD,

                     gettext_noop("Enables the planner's use of sequential-scan plans."),

                     NULL

              },

              &enable_seqscan,

              true,

              NULL, NULL, NULL

       },

……

       /* End-of-list marker */

       {

              {NULL, 0, 0, NULL, NULL}, NULL, false, NULL, NULL, NULL

       }

};

 

static struct config_int ConfigureNamesInt[] =

{

       {

              {"archive_timeout", PGC_SIGHUP, WAL_ARCHIVING,

                     gettext_noop("Forces a switch to the next xlog file if a "

                                            "new file has not been started within N seconds."),

                     NULL,

                     GUC_UNIT_S

              },

              &XLogArchiveTimeout,

              0, 0, INT_MAX,

              NULL, NULL, NULL

       },

……

       /* End-of-list marker */

       {

              {NULL, 0, 0, NULL, NULL}, NULL, 0, 0, 0, NULL, NULL, NULL

       }

};

 

 

static struct config_real ConfigureNamesReal[] =

{

       {

              {"seq_page_cost", PGC_USERSET, QUERY_TUNING_COST,

                     gettext_noop("Sets the planner's estimate of the cost of a "

                                            "sequentially fetched disk page."),

                     NULL

              },

              &seq_page_cost,

              DEFAULT_SEQ_PAGE_COST, 0, DBL_MAX,

              NULL, NULL, NULL

       },

       /* End-of-list marker */

       {

              {NULL, 0, 0, NULL, NULL}, NULL, 0.0, 0.0, 0.0, NULL, NULL, NULL

       }

};

 

 

static struct config_string ConfigureNamesString[] =

{

       {

              {"archive_command", PGC_SIGHUP, WAL_ARCHIVING,

                     gettext_noop("Sets the shell command that will be called to archive a WAL file."),

                     NULL

              },

              &XLogArchiveCommand,

              "",

              NULL, NULL, show_archive_command

       },

……

       /* End-of-list marker */

       {

              {NULL, 0, 0, NULL, NULL}, NULL, NULL, NULL, NULL, NULL

       }

};

 

 

static struct config_enum ConfigureNamesEnum[] =

{

       {

              {"backslash_quote", PGC_USERSET, COMPAT_OPTIONS_PREVIOUS,

                     gettext_noop("Sets whether \"\\'\" is allowed in string literals."),

                     NULL

              },

              &backslash_quote,

              BACKSLASH_QUOTE_SAFE_ENCODING, backslash_quote_options,

              NULL, NULL, NULL

       },

……

       /* End-of-list marker */

       {

              {NULL, 0, 0, NULL, NULL}, NULL, 0, NULL, NULL, NULL, NULL

       }

};

 

上面五个结构定义中,每个结构的第一个成员变量都是一个 config_generic 结构的 gen 成员,下面是 config_generic 的结构定义:

struct config_generic

{

       /* constant fields, must be set correctly in initial value: */

       const char *name;                 /* name of variable - MUST BE FIRST */

       GucContext       context;              /* context required to set the variable */

       enum config_group group;   /* to help organize variables by function */

       const char *short_desc;         /* short desc. of this variable's purpose */

       const char *long_desc;          /* long desc. of this variable's purpose */

       int                  flags;                   /* flag bits, see below */

       /* variable fields, initialized at runtime: */

       enum config_type vartype;  /* type of variable (set only at startup) */

       int                  status;                 /* status bits, see below */

       GucSource  reset_source;      /* source of the reset_value */

       GucSource  source;                /* source of the current actual value */

       GucStack   *stack;               /* stacked outside-of-transaction states */

       void           *extra;                   /* "extra" pointer for current actual value */

       char          *sourcefile;           /* file current setting is from (NULL if not

                                  * file) */

       int                  sourceline;          /* line in source file */

};

 

然后,定义一个 config_generic ** 类型的 静态变量数组 guc_variables 再计算参数总数,所有参数以 config_generic * 类型计算所需内存空间,冗余 25% 内存后 malloc 分配内存空间。 guc_variables 每一个元素指向ConfigureNamesBoolConfigureNamesIntConfigureNamesRealConfigureNamesStringConfigureNamesEnum 这五个数组的config_generic 类型成员gen 的地址,然后按照参数名称把所有元素做了快速排序。这个过程中还设置了一些GUC 参数的默认值。

static struct config_generic **guc_variables;

    后面查询GUC 参数都是在guc_variables 这个已排序的数组里找。这样GUC 参数的数据结构就搭建完成了,下面看看GUC 参数相关的数据结构图吧。

    先把涉及到的结构的图分别列出,再画个这些结构的组织关系示意图。

 




 

 

3 加载 postgresql.conf 参数配置文件里的参数设置

       main->PostmasterMain->SelectConfigFiles->ProcessConfigFile 开始处理参数配置文件 postgresql.conf 读取 postgresql.conf 配置文件的调用过程是 ProcessConfigFile -> ParseConfigFile -> AllocateFile->fopen ,最后用fopen 打开文件,其中ProcessConfigFileParseConfigFile 在文件src\backend\utils\misc\guc-file.l 中,AllocateFile 在文件src\backend\storage\file\fd.c 中。

    pg 使用 flex 去处理 conf 文件 ParseConfig File 中把配置文件中的配置项组织成一个链表,调用 set_config_option 检查这些值是否有效,若可以设置就调用 set_config_option 设置这些值。

 

这里以 "max_connections" 做例子 ,从配置文件读取 "max_connections" ,然后 guc_variables 数组 中找元素 " max_connections " 比较参数结构的 GucContext (枚举类参数能被设置的时机。定义见下面)枚举类型成员 context 和当前时间,看是否可以此刻修改。接着比较参数结构的 GucSource (枚举了当前 GUC 参数设置的来源。除非参数新值的来源等级不小于原参数的来源等级时,新设置才能生效。例如,修改配置文件不能覆盖 postmaster command line 的设置。定义见下面)枚举类型成员 source 和新参数值的来源,看是否可以修改。如果可以, config_generic 结构类型的元素 " max_connections " 类型转换为 config_int 类型,修改variable 成员为新值,修改该参数的来源source 为当前来源PGC_S_FILE ,如果 元素 " max_connections " reset_source <= source ,修改reset_val 成员为新值,修改该参数的reset_source 为当前来源PGC_S_FILE

 

typedef enum

{

    PGC_INTERNAL,

    PGC_POSTMASTER,

    PGC_SIGHUP,

    PGC_BACKEND,

    PGC_SUSET,

    PGC_USERSET

} GucContext;

 

typedef enum

{

    PGC_S_DEFAULT,              /* wired-in default */

    PGC_S_ENV_VAR,              /* postmaster environment variable */

    PGC_S_FILE,                 /* postgresql.conf */

    PGC_S_ARGV,                 /* postmaster command line */

    PGC_S_DATABASE,             /* per-database setting */

    PGC_S_USER,                 /* per-user setting */

    PGC_S_CLIENT,               /* from client connection request */

    PGC_S_OVERRIDE,             /* special case to forcibly set default */

    PGC_S_INTERACTIVE,          /* dividing line for error reporting */

    PGC_S_TEST,                 /* test per-database or per-user setting */

    PGC_S_SESSION               /* SET command */

} GucSource

 

 

 

 

  • 大小: 16.3 KB
  • 大小: 34.4 KB
  • 大小: 24 KB
  • 大小: 18.3 KB
分享到:
评论

相关推荐

    4固高GUC-T系列嵌入式多轴运动控制器用户手册_固高guc手册_固高控制_

    固高GUC-T系列嵌入式多轴运动控制器是一款高性能的运动控制设备,适用于各种自动化设备和生产线。这款控制器以其强大的功能、灵活的配置和易用的编程接口,深受工程师们的喜爱。用户手册是理解并有效利用该产品的...

    固高GUC使用手册

    固高科技(GUC)是一家专注于运动控制技术的公司,其产品包括GE系列和GUC系列的运动控制器。这些控制器在工业自动化、精密机械设备等领域有着广泛的应用。本使用手册旨在为用户提供全面的编程和操作指导,帮助他们...

    GUC-EtherCAT系列嵌入式网络运动控制器产品资料.zip

    GUC-EtherCAT系列控制器通过 EtherCAT 协议实现对电机和其他执行器的高效控制,确保生产过程的精度和稳定性。 4. 技术参数:产品技术参数通常包括控制器的处理能力(如处理器类型和速度)、内存大小、输入/输出接口...

    GUC安全的关系联结算子保密计算协议

    基于保密及匿名的身份基公钥加密(IBE)方案及其用户私钥盲生成协议给出联结算子的 2-方保密计算协议的一种通用的、不依赖于随机 oracle(即标准模型)的有效构造,并证明该构造具有GUC(generlized universal ...

    固高GUC系列资料

    固高GUC系列资料

    orafce.patch

    博客:PostgreSQL的学习心得和知识总结(三十八)|源码级实现PostgreSQL数据库插件Orafce时区 GUC参数orafce.timezone 的功能逻辑

    华为GaussDB(DWS)最佳实践系列之集群操作类.md

    10. 设置GUC参数:GUC(Grand Unified Configuration)参数是PostgreSQL中的配置参数系统,用于调整数据库的运行行为。GaussDB(DWS)允许用户动态地更新GUC参数,例如,命令gs_gucreload可以立即生效。如果GUC参数...

    guc-portal:使用MERN堆栈创建的大学门户

    GUC员工路线 功能:登录路线:常规/登录请求类型:POST 请求参数:- 路线示例:- 请求正文:{“电子邮件”:“ ”,“密码:“ 123456”}} 回应类型和格式:- 响应示例:- 功能:注销路线:员工/登出请求类型:POST...

    CPAC-GUC-X00-TPX Ideabox3.lib

    CPAC-GUC-X00-TPX Ideabox3.lib

    GUC-MECHATROLINK系列嵌入式运动控制器.zip

    在选型过程中,用户可以通过提供的产品技术参数来评估控制器是否符合自身需求。这些参数包括但不限于:控制器的处理能力(CPU速度)、内存容量、轴数、最大脉冲频率、通讯接口类型、功耗等。尺寸信息则有助于确定...

    GUC-E系列嵌入式多轴运动控制器编程手册.zip

    GUC-E系列嵌入式多轴运动控制器编程手册zip,提供“GUC-E系列嵌入式多轴运动控制器编程手册”免费资料下载,主要包括指令列表、系统配置、运动状态检测、点位运动、连续轨迹运动、Home/Index高速捕获、安全机制、数字...

    GUC-EtherCAT系列嵌入式网络运动控制器用户手册.zip

    GUC-EtherCAT系列嵌入式网络运动控制器用户手册zip,提供“GUC-EtherCAT系列嵌入式网络运动控制器用户手册”免费资料下载,主要包括快速使用、硬件接口、硬件连接、软件调试等内容,可供安装、调试操作使用。

    ubuntu16.04缺少的核心bin文件

    在Ubuntu 16.04操作系统中,遇到更新过程中提示缺少`kbl_guc_ver9_14.bin`和`bxt_guc_ver8_7.bin`这两个核心bin文件的问题,意味着系统正在尝试升级或安装与Intel图形处理器相关的固件。这些文件是Intel GPU固件的一...

    GUC-T系列嵌入式多轴运动控制器编程手册.zip

    GUC-T系列嵌入式多轴运动控制器编程手册zip,提供“GUC-T系列嵌入式多轴运动控制器编程手册”免费资料下载,主要包括运动控制器函数库的使用、系统配置、运动状态检测、运动模式、运动程序、访问硬件资源、高速硬件...

    pg_rage_terminator:Postgres的随机后端终结器

    pg_rage_terminator 关于 后台工作者能够根据可配置的机会终止随机连接。 它基于迈克尔·帕奎尔(Michael Paquier)的后台工作者“ kill_idle”...以下配置选项(GUC)控制pg_rage_terminator的行为。 pg_rage_termina

    guc.c.tar.gz_ARGUMENT!_GUC

    Number of buffers in pool : you can either ...pg_ctl when you restart the server. The following demonstrates this for the 64 buffer case: $ pg _ctl start - l $PGDATA/Log - o - B 64 server starting

    guc-berlin-met-bootcamp-2015:GUC Berlin MET Bootcamp - 课程文件和文件

    GUC柏林MET训练营所以你找到了 github 仓库! 这是一个示例 git 存储库,我们将在其中保留一些文档和文件供您参考。 我们还将有一个小型 git 练习会话,您将在其中克隆此存储库并对其进行一些更改! 请阅读! 在我们...

    GUC-EtherCAT系列嵌入式网络运动控制器

    GUC-EtherCAT系列嵌入式多轴运动控制器是一款基于EtherCAT总线的嵌入式运动控制器,它集成了EtherCAT主站解决方案,可控制 多达64轴,同时支持gLink-I IO模块和EtherCAT IO模块扩展,为用户提供了多轴数、多IO点数的...

Global site tag (gtag.js) - Google Analytics