设为首页 收藏本站
查看: 1303|回复: 0

[经验分享] PostgreSQL启动过程中的那些事五:初始化世界上现有行政区时区

[复制链接]

尚未签到

发表于 2016-11-21 06:26:42 | 显示全部楼层 |阅读模式
  话说初始化完全局时区后,初始化全部的时区。 从默认时区文件%PostgreSQL Home%\share\timezone\Default中读、解析世界上按行政区划现有的时区以及这些时区和UTC的以秒记的时差到临时MemoryContext "TZParserMemory"里的有序tzEntry **类型的timezone数组base里。然后把base数组拷贝到MemoryContext "TopMemoryContext"里,使datekn *类型静态全局变量timezonetktbl指向该数组。最后删除临时MemoryContext"TZParserMemory"。
  1先上个图,看一下函数调用过程梗概,中间略过部分细节
  
DSC0000.bmp
  初始化全部时区的方法调用过程图
  
  这一节写图中红色方框圈起来的部分,上面的部分基本上在前面已经写过了,有小部分有略过。红色框中的部分就是初始化全部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。如果我们haveany 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(是否国家)type,offset /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 maybe unsigned, alas */
  } datetkn;
  下图是创建了临时MemoryContext "TZParserMemory",把世界上各行政区时区缩写和相对于格林威治时间的偏移加载并解析到tzEntry数组,而且已经把tzEntry数组经过换算放到了MemoryContext"TopMemoryContext"里的datekn数组,还没有删除临时MemoryContext "TZParserMemory"时的内存结构图。
DSC0001.bmp

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-303064-1-1.html 上篇帖子: 通过liquibase将PostgreSQL数据库导入到H2数据库 下篇帖子: [转]PostgreSQL的FTI(TSearch)与中文全文索引的实践
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表