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

 

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

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

 
pg启动过程中的那些事五:初始化世界上现有行政区时区_第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()-> ->PostmasterMain()-> -> pg_timezone_abbrev_initialize () 以后用“ -> 表示调用 ,检查 静态全局变量 timezone_abbreviations_string ,如果是UNKONWN -> SetConfigOption() 从默认时区文件加载时区并设置该变量。

先创建 临时 MemoryContext "TZParserMemory" ,再调用 MemoryContextAlloc (直接调用AllocSetAlloc )在 "TZParserMemory" 里分配128 tzEntry 元素的数组空间 ,再 -> ParseTzFile 来有序加载并解析 %PostgreSQL Home%\share\timezonesets\Default 文件。把数组逐个元素以(abbrev 转成小写赋给datetkn ,根据is_dst (是否国家)typeoffset /60/15 赋给value )转换后赋给TopMemoryContext 里的 datekn 类型数组 使datekn * 类型静态全局变量timezonetktbl 指向该数组。 删除 临时 MemoryContext "TZParserMemory" ,这个到pg 内存管理机制时再讨论。最后 ->set_string_field GUC 参数timezone_abbreviations_string 从“UNKNOWN ”置成“Default ”。

 

下面是结构 datetkn 定义

typedef struct

{

    char         token[TOKMAXLEN];

    char         type;

    char         value;          /* this may be unsigned, alas */

} datetkn;

 

下图是创建了 临时 MemoryContext "TZParserMemory" ,把世界上各行政区时区缩写和相对于格林威治时间的偏移加载并解析到 tzEntry 数组,而且已经把tzEntry 数组经过换算放到了 MemoryContext "TopMemoryContext" 里的datekn 数组,还没有删除 临时 MemoryContext "TZParserMemory" 时的内存结构图。

 


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

 

你可能感兴趣的:(timezone,memorycontext)