2.4.2 配置参数(3)
3.读取配置文件
当完成了命令行参数的设置之后,接着读配置文件重新配置参数。需要注意的是,在配置文件中设置的参数都不能修改之前通过命令行已经设置的参数,因为其优先级没有通过命令行设置的优先级高。
这个过程主要是调用SelectConfigFiles(const char *userDoption,const char *progname)函数来实现的,其中第一个参数是通过命令行设置的用户的数据目录,如果没有设置会通过环境变量PGDATA找到;第二个参数为程序名,主要用于错误处理。
该函数首先在数据目录下找到配置文件,然后调用词法分析程序解析文件。对于解析到的每个参数及其参数值,调用SetConfigOption来完成参数的修改。
通过上述三个步骤设置完参数后还要检验参数的合法性。比如,数据目录的用户ID应该等于当前进程的有效用户ID、数据目录应该禁止组用户和其他用户的一切访问、缓冲区的数量至少是允许连接的进程数的两倍并且至少为16,等等。如果一切合法,则将当前目录转入数据目录,然后进行后续的操作。
在创建监听套接字之前,Postmaster需要保证当前只有一个Postmaster在运行且没有任何独立后台进程运行,这是通过CreateDataDirLockFile函数来完成的。该函数通过调用CreateLockFile函数在数据目录中创建锁文件postmaster.pid,每次Postmaster或独立后台进程Postgres启动时都会在数据目录中创建这个独一无二的文件(创建文件的模式中置O_EXCL标志位)。因此可以通过尝试去创建该文件来检测当前是否还有别的Postmaster在运行。若创建成功则说明当前没有其他Postmaster或者Postgres正在运行,写入自己的pid;若创建失败,从文件中取出创建该文件的进程的pid(若其中的pid<0说明有一个独立后台进程Postgres在运行;若pid>0说明有一个Postmaster在运行),然后通过kill系统函数检测该进程是否依然存在,若还存在则当前的启动过程就会退出。还有一种特殊情况,就是先前的Postmaster被强行终止,留下了孤立的后台进程,此时可以通过检查PostgreSQL专用的共享内存段是否仍然在使用来判断,若仍然有进程使用则退出。若前面的情况都没有发生,就删除这个文件,然后再次创建该文件并写入当前进程的pid和数据目录并返回。
当确定了只有自己在运行时,还将调用RemovePgTempFiles函数删除PGDATA/base/pgsql_tmp中的临时文件pgsql_tmp*以及非默认表空间中的临时文件。
【责任编辑:云霞 TEL:(010)68476606】