看啥推荐读物
专栏名称: sinwaj
今天看啥  ›  专栏  ›  sinwaj

Postgres · 源码阅读 · GUC参数

sinwaj  · 简书  ·  · 2020-11-29 20:15


一、背景

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参数过程比较简单,但在使用过程中要,注意不同的变量如果有多个源,会根据优先级进行覆盖。




原文地址:访问原文地址
快照地址: 访问文章快照