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;

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

  • 相关阅读:
    快讯:优酷四季度净盈余570万美元
    陈诉称谷歌Apps受大企业欢迎 或对微软构成要挟
    Bus.fm:有颜色的“巴士电台”
    摩根大通预计全球PC市场疲软 中国为主因
    中国联通首批沃Phone终端将于3月上市销售
    酷派将推800元Android智好手机推行3G终端
    谷歌预计将来几年在线告白局限打破1000亿美元
    Facebook与日本电通协作展开告白营销业务
    动静称苹果2日将推出小企业手艺支撑办事
    C# 调用C++生成的dll
  • 原文地址:https://www.cnblogs.com/gaojian/p/3227577.html
Copyright © 2011-2022 走看看