日期:2014-05-16  浏览次数:20552 次

pg启动过程中的那些事五:初始化世界上现有行政区时区

?

话说初始化完全局时区后,初始化全部的时区。 从默认时区文件 %PostgreSQL Home%\share\timezone\Default 中读、解析世界上按行政区划现有的时区以及这些时区和UTC 的以秒记的时差到 临时 MemoryContext "TZParserMemory" 里的有序tzEntry ** 类型的timezone 数组base 里。然后把base 数组拷贝到 MemoryContext "TopMemoryContext" , 使datekn * 类型静态全局变量timezonetktbl 指向该数组 。最后删除 临时 MemoryContext "TZParserMemory"

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

?

?

初始化 全部时区 的方法调用过程图

?

?????? 这一节写图中红色方框圈起来的部分,上面的部分基本上在前面已经写过了,有小部分有略过。红色框中的部分就是初始化全部 timezone 的过程调用,主要是从以 PG_BINARY 格式存储的 默认时区文件 %PostgreSQL Home%\share\timezonesets\Default 中读并解析到 临时 MemoryContext "TZParserMemory" 里的tzEntry ** 类型的timezone 有序数组base 里。然后把base 数组拷贝到TopMemoryContext, 使datekn * 类型静态全局变量timezonetktbl 指向该数组 。最后删除 临时 MemoryContext "TZParserMemory"

2 初始化 ” Timezones” AllocSet/MemoryContext 的过程

GUC grand unified configuration )参数

pg 启动时 timezone_abbreviations_string 的值是“UNKNOWN ”。看到这个时pg 什么也不做。如果timezone_abbreviations_string 的值还没有被配置文件中的值重置, pg_timezone_abbrev_initialize () 会设置 timezone_abbreviations_string 为“Default ”。这么做有两个目的:一是避免重复从配置文件加载时区设置,二是为了在InitializeGUCOptions() 过程中再读时区配置文件。后者在一个EXEC_BACKEND 子进程中不工作,因为my_exec_path 还没有设置且因此pg 不能定位PGSHAREDIR 。(实际上同样的hack 被用在延迟初始化TimeZone 。如果我们have any more ,我们应该试着清除和centralize 这个机制)

话说 main()->