一、背景
Postmaster会有各种参数,通过GUC(Grand unified configuration)模块来配置。
二、关键数据结构
1.变量数据类型
boolean、int、real、string、enum。
enum config_type
{
PGC_BOOL,
PGC_INT,
PGC_REAL,
PGC_STRING,
PGC_ENUM
};
源码位置:src/include/utils/guc_tables.h
2.GUC参数类型
typedef enum
{ PGC_INTERNAL, //内部进程设置,如版本号(server_version)
PGC_POSTMASTER, //postmaster启动时设置,来源配置文件或命令行参数
PGC_SIGHUP, //通过信号设置
PGC_SU_BACKEND, //postmaster启动时或发送 SIGHUP通知,异步方式。超级用户相关。
PGC_BACKEND, //postmaster启动时或发送 SIGHUP通知,异步方式。
PGC_SUSET, //postmaster启动时设置或超级用户通过SQL设置
PGC_USERSET //可以任意时候设置
}
GucContext;
源码位置:src/include/utils/guc.h
3.参数来源
typedef enum {
PGC_S_DEFAULT, //缺省配置
PGC_S_DYNAMIC_DEFAULT, //初始化时动态计算
PGC_S_ENV_VAR, //环境变量
PGC_S_FILE, // postgresql.conf
PGC_S_ARGV, //命令行参数
PGC_S_GLOBAL, //数据库全局设置
PGC_S_DATABASE, //数据库安装时指定
PGC_S_USER, //用户指定
PGC_S_DATABASE_USER, //数据库安装时用户指定
PGC_S_CLIENT,//客户端连接请求
PGC_S_OVERRIDE, //特殊情况强制设置为默认值
PGC_S_INTERACTIVE, //错误报告的分割符
PGC_S_TEST, //仅用于测试
PGC_S_SESSION //set命令
} GucSource;
源码位置:src/include/utils/guc.h
4.GUC共性部分
struct config_generic
{ /* constant字段,初始化时候必须设置正确 */
const char *name;//参数名
GucContext context; 参数操作类型源
enum config_group group; //根据功能对参数分组
const char *short_desc; //参数简要描述
const char *long_desc; //参数详细描述
int flags; //参数标志
enum config_type vartype; //参数值的数据类型
int status; //参数状态
GucSource source;//当前参数来源
GucSource reset_source; //参数值为reset_value时的来源
GucContext scontext; //当前参数操作源
GucContext reset_scontext; //重置参数操作源
GucStack *stack; //保存旧值以支持回滚
void *extra; //当前值的 "extra" 指针
char *sourcefile; //配置所在的源文件
int sourceline; //源文件中的行号
};
5.GUC特性部分
struct config_int
{
struct config_generic gen; //共性通用部分
int *variable;//参数当前被设置的值
int boot_val; //参数初始值
int min; //参数最小值
int max; //参数最大值
GucIntCheckHook check_hook;
GucIntAssignHook assign_hook; //函数指针,用来设置reset_val
GucShowHook show_hook; //目前没有用到
int reset_val; //重置值
void *reset_extra;
};
三.初始化流程
InitializeGUCOptions函数,代码位置src/backend/utils/misc/guc.c
1.build_guc_varibles()
i)初始化变量数据类型
ii)参数共性数据config_generic **guc_vars
iii)全局config_generic **guc_variables
iv)根据名称排序全局变量
2.初始化GUCOption
InitializeOneGUCOption(guc_variables[i]);
3.设置"transaction_isolation"."transaction_read_only"为指定缺省值
4.从环境变量中获取信息并设置
PGPORT、PGDATESTYLE、PGCLIENTENCODING
5.设置stack深度
max_stack_depth最多2MB
四.命令行参数设置GUC参数
1.getopt和setconfigoption两个函数实现
A:debug_assertions
B:shared_buffers
D:userDoption
d:set_debug_options
E:log_statement
e:datestyle
F:fsync
f:set_plan_disabling_options
h:listen_address
i:listen_address为"*"
k:unix_socket_direct
l:ssl
N:max_connections
n:Reinit=false
O:allow_system_table_mods
o:other其他参数项
P:ignore_system_indexes
p:port
S:work_mem
s:log_statement_stats
T:SendStop=true
t:统计信息设置
W:post_auth_delay
c/-:参数名标识
五.读配置文件
SelectConfigFiles ,代码位置:src/backend?utils/misc/guc.c
1.配置文件的绝对路径(make_absolute_path)
PGDATA或userDoption -D指定目录
2.设置configfile名称
3.ProcessConfigFile(PGC_POSTMASTER)
i)解析到name_value_pair *item
ii)循环item,设置参数变量
iii)yacc实现解析配置文件,涉及文件:gucfile.l/guc_file.c
4.设置hba_file
5.设置ident_file
六.总结
GUC参数过程比较简单,但在使用过程中要,注意不同的变量如果有多个源,会根据优先级进行覆盖。
网友评论