PostgreSQL在VFD管理上是一套还是多套

本文涉及的产品
云原生数据库 PolarDB PostgreSQL 版,标准版 2核4GB 50GB
云原生数据库 PolarDB MySQL 版,通用型 2核4GB 50GB
简介:

VFD是为了解决文件句柄的限制,防止把OS级别的文件句柄用光。

原来我认为VFD是各个进程间共有的。但是根据观察,发现每一个进程都拥有自己的VFD数组指针。

看看下面两段加了调试信息后的代码:

InitFileAccess:

从 VfdCache = (Vfd *) malloc(sizeof(Vfd)) 基本可以断定,没有使用共享内存方式

复制代码
/*
 * InitFileAccess --- initialize this module during backend startup
 *
 * This is called during either normal or standalone backend start.
 * It is *not* called in the postmaster.
 */
void
InitFileAccess(void)
{

    fprintf(stderr,"In %s ...by Process %d\n", __FUNCTION__,getpid());
    fprintf(stderr,"----------------------------------------------------\n\n");

    Assert(SizeVfdCache == 0);    /* call me only once */

    /* initialize cache header entry */
    VfdCache = (Vfd *) malloc(sizeof(Vfd));
    if (VfdCache == NULL)
        ereport(FATAL,
                (errcode(ERRCODE_OUT_OF_MEMORY),
                 errmsg("out of memory")));

    MemSet((char *) &(VfdCache[0]), 0, sizeof(Vfd));
    VfdCache->fd = VFD_CLOSED;

    SizeVfdCache = 1;

    /* register proc-exit hook to ensure temp files are dropped at exit */
    on_proc_exit(AtProcExit_Files, 0);
}
复制代码

AllocateVfd:

会因为扩充内存结构数组的需要,进行 realloc,这导致 VfdCache指针的值会在进程的范畴里发生变化。

复制代码
static File
AllocateVfd(void)
{
    Index        i;
    File        file;

    DO_DB(elog(LOG, "AllocateVfd. Size %lu", SizeVfdCache));
    Assert(SizeVfdCache > 0);    /* InitFileAccess not called? */

    if (VfdCache[0].nextFree == 0)
    {
        /*
         * The free list is empty so it is time to increase the size of the
         * array.  We choose to double it each time this happens. However,
         * there's not much point in starting *real* small.
         */
        Size        newCacheSize = SizeVfdCache * 2;
        Vfd           *newVfdCache;

        if (newCacheSize < 32)
            newCacheSize = 32;

        /*
         * Be careful not to clobber VfdCache ptr if realloc fails.
         */
        newVfdCache = (Vfd *) realloc(VfdCache, sizeof(Vfd) * newCacheSize);
        if (newVfdCache == NULL)
            ereport(ERROR,
                    (errcode(ERRCODE_OUT_OF_MEMORY),
                     errmsg("out of memory")));
        VfdCache = newVfdCache;

    ...

    file = VfdCache[0].nextFree;
    VfdCache[0].nextFree = VfdCache[file].nextFree;
    return file;
}
复制代码

PathNameOpenFile:

复制代码
/*
 * open a file in an arbitrary directory
 *
 * NB: if the passed pathname is relative (which it usually is),
 * it will be interpreted relative to the process' working directory
 * (which should always be $PGDATA when this code is running).
 */
File
PathNameOpenFile(FileName fileName, int fileFlags, int fileMode)
{
    char       *fnamecopy;
    File        file;
    Vfd           *vfdP;

    DO_DB(elog(LOG, "PathNameOpenFile: %s %x %o",
               fileName, fileFlags, fileMode));

    /*
     * We need a malloc'd copy of the file name; fail cleanly if no room.
     */
    fnamecopy = strdup(fileName);
    if (fnamecopy == NULL)
        ereport(ERROR,
                (errcode(ERRCODE_OUT_OF_MEMORY),
                 errmsg("out of memory")));

    //VfdCache
    fprintf(stderr,"In %s ...by Process %d...", __FUNCTION__,getpid());
    fprintf(stderr,"VfdCache Address is: %p \n\n +++++++++++++++++++++++++++++++++++\n",VfdCache);

    file = AllocateVfd();
    vfdP = &VfdCache[file];
    ...
    return file;
}
复制代码

实际运行的结果如下(开两个psql客户端,一个pid为 6518,另一个为6584):

复制代码
+
In BaseInit ...by Process 6518
In InitFileAccess ...by Process 6518
----------------------------------------------------

In PathNameOpenFile ...by Process 6518...VfdCache Address is: 0x10dfff50 

 +++++++++++++++++++++++++++++++++++
In PathNameOpenFile ...by Process 6518...VfdCache Address is: 0x10e9c450 

 +++++++++++++++++++++++++++++++++++
In PathNameOpenFile ...by Process 6518...VfdCache Address is: 0x10e9c450 

 +++++++++++++++++++++++++++++++++++
In PathNameOpenFile ...by Process 6518...VfdCache Address is: 0x10e9c450 

 +++++++++++++++++++++++++++++++++++
In PathNameOpenFile ...by Process 6518...VfdCache Address is: 0x10e9c450 

 +++++++++++++++++++++++++++++++++++
In PathNameOpenFile ...by Process 6518...VfdCache Address is: 0x10e9c450 

 +++++++++++++++++++++++++++++++++++
In PathNameOpenFile ...by Process 6518...VfdCache Address is: 0x10e9c450 

 +++++++++++++++++++++++++++++++++++
In PathNameOpenFile ...by Process 6518...VfdCache Address is: 0x10e9c450 

 +++++++++++++++++++++++++++++++++++
In PathNameOpenFile ...by Process 6518...VfdCache Address is: 0x10e9c450 

 +++++++++++++++++++++++++++++++++++
In PathNameOpenFile ...by Process 6518...VfdCache Address is: 0x10e9c450 

 +++++++++++++++++++++++++++++++++++
In PathNameOpenFile ...by Process 6518...VfdCache Address is: 0x10e9c450 

 +++++++++++++++++++++++++++++++++++
In PathNameOpenFile ...by Process 6518...VfdCache Address is: 0x10e9c450 

 +++++++++++++++++++++++++++++++++++
In PathNameOpenFile ...by Process 6518...VfdCache Address is: 0x10e9c450 

 +++++++++++++++++++++++++++++++++++
In PathNameOpenFile ...by Process 6518...VfdCache Address is: 0x10e9c450 

 +++++++++++++++++++++++++++++++++++
In PathNameOpenFile ...by Process 6518...VfdCache Address is: 0x10e9c450 


In BaseInit ...by Process 6584
In InitFileAccess ...by Process 6584
----------------------------------------------------

In PathNameOpenFile ...by Process 6584...VfdCache Address is: 0x10e04e00 

 +++++++++++++++++++++++++++++++++++
In PathNameOpenFile ...by Process 6584...VfdCache Address is: 0x10ecaad0 
复制代码

两个进程里面的 VfdCache 地址是不同的。

我想,可能是出于效率的原因,各进程各自保持VFD指针。







本文转自健哥的数据花园博客园博客,原文链接:http://www.cnblogs.com/gaojian/archive/2013/05/24/3096926.html,如需转载请自行联系原作者

相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
目录
相关文章
|
7月前
|
存储 Oracle 关系型数据库
postgresql数据库|wal日志的开启以及如何管理
postgresql数据库|wal日志的开启以及如何管理
1185 0
|
消息中间件 存储 关系型数据库
PostgreSQL技术大讲堂 - 第33讲:并行查询管理
PostgreSQL从小白到专家,技术大讲堂 - 第33讲:并行查询管理
464 1
|
5月前
|
关系型数据库 分布式数据库 数据库
PolarDB产品使用问题之如何进行PostgreSQL(简称PG)的全量和增量备份管理
PolarDB产品使用合集涵盖了从创建与管理、数据管理、性能优化与诊断、安全与合规到生态与集成、运维与支持等全方位的功能和服务,旨在帮助企业轻松构建高可用、高性能且易于管理的数据库环境,满足不同业务场景的需求。用户可以通过阿里云控制台、API、SDK等方式便捷地使用这些功能,实现数据库的高效运维与持续优化。
|
6月前
|
存储 关系型数据库 数据库
经验大分享:PostgreSQL学习之【用户权限管理】说明
经验大分享:PostgreSQL学习之【用户权限管理】说明
92 0
|
7月前
|
SQL 存储 缓存
PostgreSQL函数管理接口
学习PostgreSQL服务端开发必须要对函数管理接口有比较深入的了解
|
7月前
|
关系型数据库 数据库 PostgreSQL
|
关系型数据库 PostgreSQL
PostgreSQL VFD机制
PostgreSQL VFD机制
119 0
PostgreSQL VFD机制
|
7月前
|
缓存 关系型数据库 MySQL
postgresql|数据库|序列Sequence的创建和管理
postgresql|数据库|序列Sequence的创建和管理
139 0
|
缓存 关系型数据库 数据库
PostgreSQL技术大讲堂 - 第22讲:CLOG作用与管理
从零开始学PostgreSQL技术大讲堂 - 第22讲:CLOG作用与管理
339 1
|
关系型数据库 数据库 数据安全/隐私保护
PostgreSQL技术大讲堂 - Part 6:PG用户与角色管理
PostgreSQL技术大讲堂 - Part 6:PG用户与角色管理
361 1
PostgreSQL技术大讲堂 - Part 6:PG用户与角色管理
下一篇
无影云桌面