PostgreSQL配置参数处理系统(三)参数值的变更

配置参数(或者叫GUC变量,grand unified configuration)常见的就是出现在 postgresql.conf 中的设置项,更多信息可查看文档 19. Server Configuration ,我主要讲他们在代码中是如何设置和发挥作用。

本篇主要讲参数值的变更和上下文检查。

1、参数值变更函数定义

void
SetConfigOption(const char *name, const char *value,
				GucContext context, GucSource source)

第一个参数是参数名,第二个是字符串表示的值,第三个是调用它的修改动作上下文,第四个是参数来源。

2、初始化时的两个例子

	SetConfigOption("transaction_deferrable", "no",
					PGC_POSTMASTER, PGC_S_OVERRIDE);

和读取环境变量(InitializeGUCOptionsFromEnvironment()

SetConfigOption("port", env, PGC_POSTMASTER, PGC_S_ENV_VAR);

读到一个 config_generic 结构体成员 vartype 是 PGC_BOOL,既可以知道它实际指向的是一个 config_bool 类型结构体。

SetConfigOption 只是封装调用 set_config_option,下边我们从后者的代码逻辑看参数各定义的作用。

3、函数 set_config_option 第三个参数

前边我们提到参数上下文,并且大家也知道有些参数是不允许启动后修改,就是这个上下文控制:

else if (context != PGC_POSTMASTER)
{
  ereport(elevel,
      (errcode(ERRCODE_CANT_CHANGE_RUNTIME_PARAM),
       errmsg("parameter \"%s\" cannot be changed without restarting the server",
          name)));
  return 0;
}

参数修改方式可以知道它由什么方式(比如SET 命令)修改,也就知道修改时的上下文,与参数的定义比较,很容易就知道应该接受还是拒绝新值。

4、参数值的解析转换

设定的值其实都是字符串,也就是第二个参数const char *value,它需要转换成相应的值,比如枚举,折回去看枚举参数的定义:

  {
    {"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
  },

再来看 backslash_quote_options

static const struct config_enum_entry backslash_quote_options[] = {
	{"safe_encoding", BACKSLASH_QUOTE_SAFE_ENCODING, false},
	{"on", BACKSLASH_QUOTE_ON, false},
	{"off", BACKSLASH_QUOTE_OFF, false},
	{"true", BACKSLASH_QUOTE_ON, true},
	{"false", BACKSLASH_QUOTE_OFF, true},
	{"yes", BACKSLASH_QUOTE_ON, true},
	{"no", BACKSLASH_QUOTE_OFF, true},
	{"1", BACKSLASH_QUOTE_ON, true},
	{"0", BACKSLASH_QUOTE_OFF, true},
	{NULL, 0, false}
};

这里最后是由函数 parse_and_validate_value 进行检查和解析,有兴趣可以自行读代码。

5、带单位的值

shared_buffer = 128MB,我们应该都见过,它的定义是整数,由函数 parse_int 处理。它是内存单位(GUC_UNIT_BLOCKS),通过转换表 memory_unit_conversion_table 计算最终大小,也就是 shared_buffer 的转换定义:1MB = 1024 / (BLCKSZ / 1024) 个块。

 

欢迎关注我的公众号

 

欢迎关注我们公司公众号,很多优秀译文

转载于:https://my.oschina.net/quanzl/blog/3082756

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值