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

pg启动过程中的那些事四:初始化全局时区global_timezone

?

话说初始化和设置完 GUC 参数后,改变了当前工作文件夹,给数据集文件夹加了文件锁 postmaster.pid ,接着就是初始化时区设置,这些都跳过去了,后来发现初始化时区用到了 pg 里的动态哈希表,决定还是把这个写出来。

动态哈希表在 pg 里使用的地方很多, pg 使用它管理共享内存 shared memory 、锁、市区 timezone 等。 Linux 使用哈希表来管理内存、连接等。后面再讨论 pg 里的动态哈希表 dynmaic hashtable

?

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

?

?

初始化 Timezones 的方法调用过程图

?

?????? 这一节写图中红色方框圈起来的部分,上面的部分基本上在前面已经写过了,有小部分有略过。红色框中的部分就是初始化 Timezones 的过程调用,这主要做了两件事,一是创建了一个 ”Timezones” AllocSet/MemoryContext ,二是建了一个 pg 中的动态哈希表,来管理 / 存放 timezone

2 初始化全局时区 global_t imezones 的过程

话说 main()-> ->PostmasterMain()-> -> pg_timezone_initialize () 以后用“ -> 表示调用 ,先到前面的文章《 pg 启动过程中的那些事三》里提到的 config_generic ** 类型的有序 GUC 参数数组 guc_variables 里用二分法查找 config_string 类型参数timezone ,此时该参数还没有设置,接着 -> select_default_ timezone() -> identify_system_timezone() 函数根据 OS 环境变量识别操作系统的 timezone 设置,再