- 浏览: 231010 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
chenxliang:
2016年10月26、27日,上海浦东,Postgres中国用 ...
PostgreSQL的用户、角色和权限管理 -
gejiod:
最近出了SQL:2011標準,希望樓主也更新下
SQL2008标准 -
lincon77:
太长了,又是E文,要是有些例子可能好理解些
SQL2003标准 -
少主丶无翼:
很谢,找了很久
SQL2003标准 -
zeeeitch:
...
PostgreSQL启动过程中的那些事七:初始化共享内存和信号二十:shmem中初始化堆同步扫描、pg子进程相关结构
1 先上个图,看一下函数调用过程梗概,中间细节有略
GUC 参数初始化分两步,第一步先读取 buildin/ compiled-in 的 GUC 参数默认值,这里包括全部的 GUC 参数,建立 GUC 参数相关结构变量,第二步读取 postgresql.conf 配置文件中的参数设置之。从上图中能看出来,这个读取并设置 postgresql.conf 中参数的过程还是挺复杂的。
2 初始化 GUC 相关数据结构并取 hardcode/buildin 的参数值。
pg 里的GUC 参数按设置的值分五种类型,分别是bool 、int 、real 、string 、enum ,根据这五种类型,定义了五种结构类型,再根据这五种结构,每个类型建一个对应的静态数组,用于存储这些相应类型的GUC 参数。这五种类型是config_bool 、config_int 、config_real 、config_string 、config_enum ,对应的静态数组是ConfigureNamesBool 、ConfigureNamesInt 、ConfigureNamesReal 、ConfigureNamesString 、ConfigureNamesEnum 。具体结构和数组定义见下面。
五个结构定义:
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 每一个元素指向ConfigureNamesBool 、ConfigureNamesInt 、ConfigureNamesReal 、ConfigureNamesString 、ConfigureNamesEnum 这五个数组的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 打开文件,其中ProcessConfigFile 、ParseConfigFile 在文件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
发表评论
-
PostgreSQL服务过程中的那些事三:pg服务进程中的内存上下文
2012-12-31 15:07 2065题外话:年底了,就以这篇博文结束2012 ... -
PostgreSQL服务过程中的那些事二:Pg服务进程处理简单查询六:执行器执行
2012-11-07 20:13 1824话说 查询“ select c ... -
PostgreSQL服务过程中的那些事二:Pg服务进程处理简单查询五:规划成plantree
2012-10-31 20:37 1732话说 查询“ select cname, comp ... -
PostgreSQL服务过程中的那些事二:Pg服务进程处理简单查询四:分析重写成querytree
2012-10-24 19:27 1437话说 查询“ select cname, comp ... -
postgresql 小技巧
2012-10-16 19:36 1379Note : #PostgreSQL and ... -
PostgreSQL服务过程中的那些事二:Pg服务进程处理简单查询三:获取内存快照
2012-10-16 19:31 1762话说 查询“ select cname, comp ... -
PostgreSQL服务过程中的那些事二:Pg服务进程处理简单查询二:SQL解析为parsetree
2012-10-09 19:50 1529话说 查询“ select cname, comp fr ... -
PostgreSQL服务过程中的那些事二:Pg服务进程处理简单查询一:开启事务
2012-09-25 19:55 1886在《 PostgreSQL 服务过程中的那些事二: ... -
PostgreSQL服务过程中的那些事一:启动postgres服务进程一.八:加载DB基础设施,完成服务进程初始化
2012-09-18 21:02 1805话说调用 InitPostgres ... -
PostgreSQL服务过程中的那些事一:启动postgres服务进程一.七:初始化portal管理环境
2012-09-11 19:58 1631话说调用 In ... -
PostgreSQL服务过程中的那些事一:启动postgres服务进程一.六:初始化系统表缓存catcache
2012-09-04 20:51 1856话说调用 InitPostgres ... -
PostgreSQL服务过程中的那些事一:启动postgres服务进程一.五:初始化relcache管理环境
2012-08-28 20:47 1314话说调用 InitPostgres ... -
PostgreSQL服务过程中的那些事一:启动postgres服务进程三:初始化relcache管理环境
2012-08-28 20:46 0<!-- [if gte mso 9]><x ... -
PostgreSQL服务过程中的那些事二:Pg服务进程处理简单查询梗概
2012-08-21 21:04 1258话说客户端发起请求, pg 服务器为该请求启动一个 ... -
PostgreSQL服务过程中的那些事一:启动postgres服务进程二:建立连接完成
2012-08-13 18:50 15773 这节主要讨论 pg 服务进程 pos ... -
PostgreSQL服务过程中的那些事一:启动postgres服务进程一
2012-08-08 14:42 5686到pg 服务进程了,打算搞一个完整但简单的查询例子,从 ... -
PostgreSQL启动过程中的那些事十九:walwriter进程二
2012-08-03 16:53 13813 这节主要讨论 walwrit ... -
PostgreSQL启动过程中的那些事十九:walwriter进程一
2012-08-01 17:26 1613话说 main()->Po ... -
PostgreSQL启动过程中的那些事十八:bgwriter进程二
2012-07-27 07:25 14313 这节主要讨论 bgwr ... -
PostgreSQL启动过程中的那些事十八:bgwriter进程一
2012-07-23 20:18 1641话说 main()->Postm ...
相关推荐
固高GUC-T系列嵌入式多轴运动控制器是一款高性能的运动控制设备,适用于各种自动化设备和生产线。这款控制器以其强大的功能、灵活的配置和易用的编程接口,深受工程师们的喜爱。用户手册是理解并有效利用该产品的...
固高科技(GUC)是一家专注于运动控制技术的公司,其产品包括GE系列和GUC系列的运动控制器。这些控制器在工业自动化、精密机械设备等领域有着广泛的应用。本使用手册旨在为用户提供全面的编程和操作指导,帮助他们...
GUC-EtherCAT系列控制器通过 EtherCAT 协议实现对电机和其他执行器的高效控制,确保生产过程的精度和稳定性。 4. 技术参数:产品技术参数通常包括控制器的处理能力(如处理器类型和速度)、内存大小、输入/输出接口...
基于保密及匿名的身份基公钥加密(IBE)方案及其用户私钥盲生成协议给出联结算子的 2-方保密计算协议的一种通用的、不依赖于随机 oracle(即标准模型)的有效构造,并证明该构造具有GUC(generlized universal ...
固高GUC系列资料
博客:PostgreSQL的学习心得和知识总结(三十八)|源码级实现PostgreSQL数据库插件Orafce时区 GUC参数orafce.timezone 的功能逻辑
10. 设置GUC参数:GUC(Grand Unified Configuration)参数是PostgreSQL中的配置参数系统,用于调整数据库的运行行为。GaussDB(DWS)允许用户动态地更新GUC参数,例如,命令gs_gucreload可以立即生效。如果GUC参数...
GUC员工路线 功能:登录路线:常规/登录请求类型:POST 请求参数:- 路线示例:- 请求正文:{“电子邮件”:“ ”,“密码:“ 123456”}} 回应类型和格式:- 响应示例:- 功能:注销路线:员工/登出请求类型:POST...
CPAC-GUC-X00-TPX Ideabox3.lib
在选型过程中,用户可以通过提供的产品技术参数来评估控制器是否符合自身需求。这些参数包括但不限于:控制器的处理能力(CPU速度)、内存容量、轴数、最大脉冲频率、通讯接口类型、功耗等。尺寸信息则有助于确定...
GUC-E系列嵌入式多轴运动控制器编程手册zip,提供“GUC-E系列嵌入式多轴运动控制器编程手册”免费资料下载,主要包括指令列表、系统配置、运动状态检测、点位运动、连续轨迹运动、Home/Index高速捕获、安全机制、数字...
GUC-EtherCAT系列嵌入式网络运动控制器用户手册zip,提供“GUC-EtherCAT系列嵌入式网络运动控制器用户手册”免费资料下载,主要包括快速使用、硬件接口、硬件连接、软件调试等内容,可供安装、调试操作使用。
在Ubuntu 16.04操作系统中,遇到更新过程中提示缺少`kbl_guc_ver9_14.bin`和`bxt_guc_ver8_7.bin`这两个核心bin文件的问题,意味着系统正在尝试升级或安装与Intel图形处理器相关的固件。这些文件是Intel GPU固件的一...
GUC-T系列嵌入式多轴运动控制器编程手册zip,提供“GUC-T系列嵌入式多轴运动控制器编程手册”免费资料下载,主要包括运动控制器函数库的使用、系统配置、运动状态检测、运动模式、运动程序、访问硬件资源、高速硬件...
pg_rage_terminator 关于 后台工作者能够根据可配置的机会终止随机连接。 它基于迈克尔·帕奎尔(Michael Paquier)的后台工作者“ kill_idle”...以下配置选项(GUC)控制pg_rage_terminator的行为。 pg_rage_termina
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柏林MET训练营所以你找到了 github 仓库! 这是一个示例 git 存储库,我们将在其中保留一些文档和文件供您参考。 我们还将有一个小型 git 练习会话,您将在其中克隆此存储库并对其进行一些更改! 请阅读! 在我们...
GUC-EtherCAT系列嵌入式多轴运动控制器是一款基于EtherCAT总线的嵌入式运动控制器,它集成了EtherCAT主站解决方案,可控制 多达64轴,同时支持gLink-I IO模块和EtherCAT IO模块扩展,为用户提供了多轴数、多IO点数的...