zoukankan      html  css  js  c++  java
  • 初步学习pg_control文件之二

    接前文:初步认识pg_control文件

    继续学习,pg_control文件在何处形成的?是在initdb的时候,运用的函数如下:
    /*
     * This func must be called ONCE on system install.  It creates pg_control
     * and the initial XLOG segment.
     */
    void
    BootStrapXLOG(void)
    {
    
        CheckPoint    checkPoint;
        char       *buffer;
        XLogPageHeader page;
        XLogLongPageHeader longpage;
        XLogRecord *record;
        bool        use_existent;
        uint64        sysidentifier;
        struct timeval tv;
        pg_crc32    crc;
    
        /*
         * Select a hopefully-unique system identifier code for this installation.
         * We use the result of gettimeofday(), including the fractional seconds
         * field, as being about as unique as we can easily get.  (Think not to
         * use random(), since it hasn't been seeded and there's no portable way
         * to seed it other than the system clock value...)  The upper half of the
         * uint64 value is just the tv_sec part, while the lower half is the XOR
         * of tv_sec and tv_usec.  This is to ensure that we don't lose uniqueness
         * unnecessarily if "uint64" is really only 32 bits wide.  A person
         * knowing this encoding can determine the initialization time of the
         * installation, which could perhaps be useful sometimes.
         */
        gettimeofday(&tv, NULL);
        sysidentifier = ((uint64) tv.tv_sec) << 32;
        sysidentifier |= (uint32) (tv.tv_sec | tv.tv_usec);
    
        ...
    
        /* Now create pg_control */
    
        memset(ControlFile, 0, sizeof(ControlFileData));
    
        /* Initialize pg_control status fields */
        ControlFile->system_identifier = sysidentifier;
        ControlFile->state = DB_SHUTDOWNED;
        ControlFile->time = checkPoint.time;
        ControlFile->checkPoint = checkPoint.redo;
        ControlFile->checkPointCopy = checkPoint;
    
        /* Set important parameter values for use when replaying WAL */
        ControlFile->MaxConnections = MaxConnections;
        ControlFile->max_prepared_xacts = max_prepared_xacts;
        ControlFile->max_locks_per_xact = max_locks_per_xact;
        ControlFile->wal_level = wal_level;
    
        /* some additional ControlFile fields are set in WriteControlFile() */
    
        WriteControlFile();
    
        /* Bootstrap the commit log, too */
        BootStrapCLOG();
        BootStrapSUBTRANS();
        BootStrapMultiXact();
    
        pfree(buffer);
    }
    说起来
    system_identifier 这个东西 ,是随机算出来的一个值:
        /*
         * Select a hopefully-unique system identifier code for this installation.
         * We use the result of gettimeofday(), including the fractional seconds
         * field, as being about as unique as we can easily get.  (Think not to
         * use random(), since it hasn't been seeded and there's no portable way
         * to seed it other than the system clock value...)  The upper half of the
         * uint64 value is just the tv_sec part, while the lower half is the XOR
         * of tv_sec and tv_usec.  This is to ensure that we don't lose uniqueness
         * unnecessarily if "uint64" is really only 32 bits wide.  A person
         * knowing this encoding can determine the initialization time of the
         * installation, which could perhaps be useful sometimes.
         */
        gettimeofday(&tv, NULL);
        sysidentifier = ((uint64) tv.tv_sec) << 32;
        sysidentifier |= (uint32) (tv.tv_sec | tv.tv_usec);
    
    ...
        ControlFile->system_identifier = sysidentifier;

     state 在初始化的时候,是有SHUTDOWNED。另外可能的值也都可以在pg_control.h中看到:

    /*
     * System status indicator.  Note this is stored in pg_control; if you change
     * it, you must bump PG_CONTROL_VERSION
     */
    typedef enum DBState
    {
        DB_STARTUP = 0,
        DB_SHUTDOWNED,
        DB_SHUTDOWNED_IN_RECOVERY,
        DB_SHUTDOWNING,
        DB_IN_CRASH_RECOVERY,
        DB_IN_ARCHIVE_RECOVERY,
        DB_IN_PRODUCTION
    } DBState;

    这几个值何时用,状态如何变化,应该是一个很有意思的话题。  

  • 相关阅读:
    论单页Web应用和RESTful架构
    [译]作为一个web开发人员,哪些技术细节是在发布站点前你需要考虑到的
    JavaScript模块化规范
    一个Option请求引发的深度解析
    读《JavaScript语言精粹》的一些感言
    深圳积分入户经验之谈
    windows下的node-canvas历程
    linux服务器部署.net core 3.1
    Windows下Redis的安装、配置
    Linux Centos 安装宝塔面板一句命令解决
  • 原文地址:https://www.cnblogs.com/gaojian/p/3227577.html
Copyright © 2011-2022 走看看